aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/hir/rust-ast-lower-pattern.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/hir/rust-ast-lower-pattern.cc')
-rw-r--r--gcc/rust/hir/rust-ast-lower-pattern.cc102
1 files changed, 57 insertions, 45 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-pattern.cc b/gcc/rust/hir/rust-ast-lower-pattern.cc
index 8aabcd8..4250adb 100644
--- a/gcc/rust/hir/rust-ast-lower-pattern.cc
+++ b/gcc/rust/hir/rust-ast-lower-pattern.cc
@@ -81,26 +81,45 @@ ASTLoweringPattern::visit (AST::TupleStructPattern &pattern)
auto &items = pattern.get_items ();
switch (items.get_item_type ())
{
- case AST::TupleStructItems::RANGE:
+ case AST::TupleStructItems::HAS_REST:
{
- // TODO
- rust_unreachable ();
+ AST::TupleStructItemsHasRest &items_has_rest
+ = static_cast<AST::TupleStructItemsHasRest &> (items);
+
+ std::vector<std::unique_ptr<HIR::Pattern>> lower_patterns;
+ lower_patterns.reserve (items_has_rest.get_lower_patterns ().size ());
+ for (auto &pattern_member : items_has_rest.get_lower_patterns ())
+ {
+ lower_patterns.emplace_back (
+ ASTLoweringPattern::translate (*pattern_member));
+ }
+
+ std::vector<std::unique_ptr<HIR::Pattern>> upper_patterns;
+ upper_patterns.reserve (items_has_rest.get_upper_patterns ().size ());
+ for (auto &pattern_member : items_has_rest.get_upper_patterns ())
+ {
+ upper_patterns.emplace_back (
+ ASTLoweringPattern::translate (*pattern_member));
+ }
+
+ lowered = new HIR::TupleStructItemsHasRest (std::move (lower_patterns),
+ std::move (upper_patterns));
}
break;
- case AST::TupleStructItems::NO_RANGE:
+ case AST::TupleStructItems::NO_REST:
{
- AST::TupleStructItemsNoRange &items_no_range
- = static_cast<AST::TupleStructItemsNoRange &> (items);
+ AST::TupleStructItemsNoRest &items_no_rest
+ = static_cast<AST::TupleStructItemsNoRest &> (items);
std::vector<std::unique_ptr<HIR::Pattern>> patterns;
- for (auto &inner_pattern : items_no_range.get_patterns ())
- {
- HIR::Pattern *p = ASTLoweringPattern::translate (*inner_pattern);
- patterns.push_back (std::unique_ptr<HIR::Pattern> (p));
- }
+ patterns.reserve (items_no_rest.get_patterns ().size ());
+
+ for (auto &inner_pattern : items_no_rest.get_patterns ())
+ patterns.emplace_back (
+ ASTLoweringPattern::translate (*inner_pattern));
- lowered = new HIR::TupleStructItemsNoRange (std::move (patterns));
+ lowered = new HIR::TupleStructItemsNoRest (std::move (patterns));
}
break;
}
@@ -121,7 +140,6 @@ ASTLoweringPattern::visit (AST::StructPattern &pattern)
= ASTLowerPathInExpression::translate (pattern.get_path ());
auto &raw_elems = pattern.get_struct_pattern_elems ();
- rust_assert (!raw_elems.has_etc ());
std::vector<std::unique_ptr<HIR::StructPatternField>> fields;
for (auto &field : raw_elems.get_struct_pattern_fields ())
@@ -196,7 +214,7 @@ ASTLoweringPattern::visit (AST::StructPattern &pattern)
mappings.insert_node_to_hir (field_node_id, field_id);
// add it to the lowered fields list
- fields.push_back (std::unique_ptr<HIR::StructPatternField> (f));
+ fields.emplace_back (f);
}
auto crate_num = mappings.get_current_crate ();
@@ -204,7 +222,8 @@ ASTLoweringPattern::visit (AST::StructPattern &pattern)
mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
- HIR::StructPatternElements elems (std::move (fields));
+ HIR::StructPatternElements elems (
+ std::move (fields), pattern.get_struct_pattern_elems ().has_rest ());
translated = new HIR::StructPattern (mapping, *path, std::move (elems));
}
@@ -223,21 +242,20 @@ void
ASTLoweringPattern::visit (AST::TuplePattern &pattern)
{
std::unique_ptr<HIR::TuplePatternItems> items;
- switch (pattern.get_items ().get_pattern_type ())
+ switch (pattern.get_items ().get_item_type ())
{
- case AST::TuplePatternItems::TuplePatternItemType::MULTIPLE:
+ case AST::TuplePatternItems::ItemType::NO_REST:
{
- AST::TuplePatternItemsMultiple &ref
- = static_cast<AST::TuplePatternItemsMultiple &> (
- pattern.get_items ());
+ AST::TuplePatternItemsNoRest &ref
+ = static_cast<AST::TuplePatternItemsNoRest &> (pattern.get_items ());
items = lower_tuple_pattern_multiple (ref);
}
break;
- case AST::TuplePatternItems::TuplePatternItemType::RANGED:
+ case AST::TuplePatternItems::ItemType::HAS_REST:
{
- AST::TuplePatternItemsRanged &ref
- = static_cast<AST::TuplePatternItemsRanged &> (pattern.get_items ());
+ AST::TuplePatternItemsHasRest &ref
+ = static_cast<AST::TuplePatternItemsHasRest &> (pattern.get_items ());
items = lower_tuple_pattern_ranged (ref);
}
break;
@@ -268,8 +286,6 @@ ASTLoweringPattern::visit (AST::LiteralPattern &pattern)
void
ASTLoweringPattern::visit (AST::RangePattern &pattern)
{
- if (pattern.get_range_kind () == AST::RangeKind::EXCLUDED)
- rust_unreachable (); // Not supported yet
auto upper_bound = lower_range_pattern_bound (pattern.get_upper_bound ());
auto lower_bound = lower_range_pattern_bound (pattern.get_lower_bound ());
@@ -278,9 +294,11 @@ ASTLoweringPattern::visit (AST::RangePattern &pattern)
mappings.get_next_hir_id (crate_num),
UNKNOWN_LOCAL_DEFID);
- translated
- = new HIR::RangePattern (mapping, std::move (lower_bound),
- std::move (upper_bound), pattern.get_locus ());
+ bool is_inclusive = (pattern.get_range_kind () == AST::RangeKind::INCLUDED);
+
+ translated = new HIR::RangePattern (mapping, std::move (lower_bound),
+ std::move (upper_bound),
+ pattern.get_locus (), is_inclusive);
}
void
@@ -322,26 +340,22 @@ ASTLoweringPattern::visit (AST::ReferencePattern &pattern)
void
ASTLoweringPattern::visit (AST::SlicePattern &pattern)
{
- std::vector<std::unique_ptr<HIR::Pattern>> items;
+ std::unique_ptr<HIR::SlicePatternItems> items;
- switch (pattern.get_items ().get_pattern_type ())
+ switch (pattern.get_items ().get_item_type ())
{
- case AST::SlicePatternItems::SlicePatternItemType::NO_REST:
+ case AST::SlicePatternItems::ItemType::NO_REST:
{
- AST::SlicePatternItemsNoRest &ref
+ auto &ref
= static_cast<AST::SlicePatternItemsNoRest &> (pattern.get_items ());
- for (auto &p : ref.get_patterns ())
- {
- HIR::Pattern *item = ASTLoweringPattern::translate (*p);
- items.push_back (std::unique_ptr<HIR::Pattern> (item));
- }
+ items = ASTLoweringBase::lower_slice_pattern_no_rest (ref);
}
break;
- case AST::SlicePatternItems::SlicePatternItemType::HAS_REST:
+ case AST::SlicePatternItems::ItemType::HAS_REST:
{
- rust_error_at (pattern.get_locus (),
- "lowering of slice patterns with rest elements are not "
- "supported yet");
+ auto &ref
+ = static_cast<AST::SlicePatternItemsHasRest &> (pattern.get_items ());
+ items = ASTLoweringBase::lower_slice_pattern_has_rest (ref);
}
break;
}
@@ -364,12 +378,10 @@ ASTLoweringPattern::visit (AST::AltPattern &pattern)
UNKNOWN_LOCAL_DEFID);
std::vector<std::unique_ptr<HIR::Pattern>> alts;
+ alts.reserve (pattern.get_alts ().size ());
for (auto &alt : pattern.get_alts ())
- {
- alts.push_back (
- std::unique_ptr<HIR::Pattern> (ASTLoweringPattern::translate (*alt)));
- }
+ alts.emplace_back (ASTLoweringPattern::translate (*alt));
translated
= new HIR::AltPattern (mapping, std::move (alts), pattern.get_locus ());