Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions gcc/rust/ast/rust-expr.h
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,12 @@ class BorrowExpr : public OperatorExpr
return *main_or_left_expr;
}

std::unique_ptr<Expr> &get_borrowed_expr_ptr ()
{
rust_assert (main_or_left_expr != nullptr);
return main_or_left_expr;
}

bool has_borrow_expr () const { return main_or_left_expr != nullptr; }

bool get_is_mut () const { return mutability == Mutability::Mut; }
Expand Down Expand Up @@ -488,6 +494,12 @@ class ErrorPropagationExpr : public OperatorExpr
return *main_or_left_expr;
}

std::unique_ptr<Expr> &get_propagating_expr_ptr ()
{
rust_assert (main_or_left_expr != nullptr);
return main_or_left_expr;
}

Expr::Kind get_expr_kind () const override
{
return Expr::Kind::ErrorPropagation;
Expand Down Expand Up @@ -2293,6 +2305,12 @@ class MethodCallExpr : public ExprWithoutBlock
return *receiver;
}

std::unique_ptr<Expr> &get_receiver_expr_ptr ()
{
rust_assert (receiver != nullptr);
return receiver;
}

const PathExprSegment &get_method_name () const { return method_name; }
PathExprSegment &get_method_name () { return method_name; }

Expand Down Expand Up @@ -4892,6 +4910,12 @@ class MatchExpr : public ExprWithBlock
return *branch_value;
}

std::unique_ptr<Expr> &get_scrutinee_expr_ptr ()
{
rust_assert (branch_value != nullptr);
return branch_value;
}

const std::vector<MatchCase> &get_match_cases () const { return match_arms; }
std::vector<MatchCase> &get_match_cases () { return match_arms; }

Expand Down
20 changes: 17 additions & 3 deletions gcc/rust/expand/rust-expand-visitor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -541,10 +541,16 @@ void
ExpandVisitor::visit (AST::MetaItemPathExpr &)
{}

void
ExpandVisitor::visit (AST::BorrowExpr &expr)
{
maybe_expand_expr (expr.get_borrowed_expr_ptr ());
}

void
ExpandVisitor::visit (AST::ErrorPropagationExpr &expr)
{
visit (expr.get_propagating_expr ());
maybe_expand_expr (expr.get_propagating_expr_ptr ());
}

void
Expand Down Expand Up @@ -588,6 +594,14 @@ ExpandVisitor::visit (AST::GroupedExpr &expr)
maybe_expand_expr (expr.get_expr_in_parens_ptr ());
}

void
ExpandVisitor::visit (AST::TupleExpr &expr)
{
// TODO: expand as multiple expressions?
for (auto &elem : expr.get_tuple_elems ())
maybe_expand_expr (elem);
}

void
ExpandVisitor::visit (AST::StructExprStruct &expr)
{}
Expand All @@ -604,7 +618,7 @@ ExpandVisitor::visit (AST::CallExpr &expr)
void
ExpandVisitor::visit (AST::MethodCallExpr &expr)
{
visit (expr.get_receiver_expr ());
maybe_expand_expr (expr.get_receiver_expr_ptr ());

for (auto &param : expr.get_params ())
maybe_expand_expr (param);
Expand Down Expand Up @@ -679,7 +693,7 @@ ExpandVisitor::visit (AST::IfLetExprConseqElse &expr)
void
ExpandVisitor::visit (AST::MatchExpr &expr)
{
visit (expr.get_scrutinee_expr ());
maybe_expand_expr (expr.get_scrutinee_expr_ptr ());

for (auto &match_case : expr.get_match_cases ())
{
Expand Down
2 changes: 2 additions & 0 deletions gcc/rust/expand/rust-expand-visitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -210,13 +210,15 @@ class ExpandVisitor : public AST::DefaultASTVisitor
void visit (AST::AttrInputMacro &) override;
void visit (AST::MetaItemLitExpr &) override;
void visit (AST::MetaItemPathExpr &) override;
void visit (AST::BorrowExpr &) override;
void visit (AST::ErrorPropagationExpr &expr) override;
void visit (AST::ArithmeticOrLogicalExpr &expr) override;
void visit (AST::ComparisonExpr &expr) override;
void visit (AST::LazyBooleanExpr &expr) override;
void visit (AST::AssignmentExpr &expr) override;
void visit (AST::CompoundAssignmentExpr &expr) override;
void visit (AST::GroupedExpr &expr) override;
void visit (AST::TupleExpr &expr) override;
void visit (AST::StructExprStruct &expr) override;

void visit (AST::CallExpr &expr) override;
Expand Down
Loading