From: Arthur Cohen <arthur.co...@embecosm.com> gcc/rust/ChangeLog:
* ast/rust-ast-builder.cc (Builder::statementify): New. (Builder::function): Add generic params optional argument. (Builder::path_in_expression): Add opening_scope_resolution optional argument. (Builder::block): Add function for creating empty blocks. (Builder::generic_type_param): New. * ast/rust-ast-builder.h (ptrify): New. --- gcc/rust/ast/rust-ast-builder.cc | 39 ++++++++++++++++++++++++++++---- gcc/rust/ast/rust-ast-builder.h | 24 ++++++++++++++++++-- 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/gcc/rust/ast/rust-ast-builder.cc b/gcc/rust/ast/rust-ast-builder.cc index 82e6a5abe24..86290e199c6 100644 --- a/gcc/rust/ast/rust-ast-builder.cc +++ b/gcc/rust/ast/rust-ast-builder.cc @@ -33,6 +33,14 @@ namespace Rust { namespace AST { +std::unique_ptr<Stmt> +Builder::statementify (std::unique_ptr<Expr> &&value, + bool semicolon_followed) const +{ + return std::make_unique<ExprStmt> (std::move (value), loc, + semicolon_followed); +} + std::unique_ptr<Expr> Builder::literal_string (std::string &&content) const { @@ -150,13 +158,14 @@ Builder::function (std::string function_name, std::vector<std::unique_ptr<Param>> params, std::unique_ptr<Type> return_type, std::unique_ptr<BlockExpr> block, + std::vector<std::unique_ptr<GenericParam>> generic_params, FunctionQualifiers qualifiers, WhereClause where_clause, Visibility visibility) const { return std::unique_ptr<Function> ( - new Function (function_name, qualifiers, {}, std::move (params), - std::move (return_type), where_clause, std::move (block), - visibility, {}, loc)); + new Function (function_name, qualifiers, std::move (generic_params), + std::move (params), std::move (return_type), where_clause, + std::move (block), visibility, {}, loc)); } PathExprSegment @@ -277,13 +286,14 @@ Builder::reference_type (std::unique_ptr<TypeNoBounds> &&inner_type, } PathInExpression -Builder::path_in_expression (std::vector<std::string> &&segments) const +Builder::path_in_expression (std::vector<std::string> &&segments, + bool opening_scope) const { auto path_segments = std::vector<PathExprSegment> (); for (auto &seg : segments) path_segments.emplace_back (path_segment (seg)); - return PathInExpression (std::move (path_segments), {}, loc); + return PathInExpression (std::move (path_segments), {}, loc, opening_scope); } PathInExpression @@ -312,6 +322,14 @@ Builder::block (tl::optional<std::unique_ptr<Stmt>> &&stmt, return block (std::move (stmts), std::move (tail_expr)); } +std::unique_ptr<BlockExpr> +Builder::block () const +{ + auto stmts = std::vector<std::unique_ptr<Stmt>> (); + + return block (std::move (stmts)); +} + std::unique_ptr<BlockExpr> Builder::block (std::vector<std::unique_ptr<Stmt>> &&stmts, std::unique_ptr<Expr> &&tail_expr) const @@ -493,6 +511,17 @@ Builder::trait_impl (TypePath trait_path, std::unique_ptr<Type> target, visibility, {}, {}, loc)); } +std::unique_ptr<GenericParam> +Builder::generic_type_param ( + std::string type_representation, + std::vector<std::unique_ptr<TypeParamBound>> &&bounds, + std::unique_ptr<Type> &&type) +{ + return std::make_unique<TypeParam> (type_representation, loc, + std::move (bounds), std::move (type), + std::vector<Attribute> ()); +} + std::unique_ptr<Type> Builder::new_type (Type &type) { diff --git a/gcc/rust/ast/rust-ast-builder.h b/gcc/rust/ast/rust-ast-builder.h index faf3cf74df9..41ce118e771 100644 --- a/gcc/rust/ast/rust-ast-builder.h +++ b/gcc/rust/ast/rust-ast-builder.h @@ -51,6 +51,14 @@ vec (std::unique_ptr<T> &&t1, std::unique_ptr<T> &&t2) return v; } +/* Pointer-ify something */ +template <typename T> +static std::unique_ptr<T> +ptrify (T value) +{ + return std::unique_ptr<T> (new T (value)); +} + // TODO: Use this builder when expanding regular macros /* Builder class with helper methods to create AST nodes. This builder is * tailored towards generating multiple AST nodes from a single location, and @@ -60,6 +68,10 @@ class Builder public: Builder (location_t loc) : loc (loc) {} + /* Create an expression statement from an expression */ + std::unique_ptr<Stmt> statementify (std::unique_ptr<Expr> &&value, + bool semicolon_followed = true) const; + /* Create a string literal expression ("content") */ std::unique_ptr<Expr> literal_string (std::string &&content) const; @@ -102,6 +114,8 @@ public: std::unique_ptr<BlockExpr> block (tl::optional<std::unique_ptr<Stmt>> &&stmt, std::unique_ptr<Expr> &&tail_expr = nullptr) const; + /* Create an empty block */ + std::unique_ptr<BlockExpr> block () const; /* Create an early return expression with an optional expression */ std::unique_ptr<Expr> return_expr (std::unique_ptr<Expr> &&to_return @@ -151,6 +165,7 @@ public: function (std::string function_name, std::vector<std::unique_ptr<Param>> params, std::unique_ptr<Type> return_type, std::unique_ptr<BlockExpr> block, + std::vector<std::unique_ptr<GenericParam>> generic_params = {}, FunctionQualifiers qualifiers = FunctionQualifiers (UNKNOWN_LOCATION, Async::No, Const::No, Unsafety::Normal), @@ -197,8 +212,8 @@ public: * do not need to separate the segments using `::`, you can simply provide a * vector of strings to the functions which will get turned into path segments */ - PathInExpression - path_in_expression (std::vector<std::string> &&segments) const; + PathInExpression path_in_expression (std::vector<std::string> &&segments, + bool opening_scope = false) const; /** * Create a path in expression from a lang item. @@ -265,6 +280,11 @@ public: WhereClause where_clause = WhereClause::create_empty (), Visibility visibility = Visibility::create_private ()) const; + std::unique_ptr<GenericParam> + generic_type_param (std::string type_representation, + std::vector<std::unique_ptr<TypeParamBound>> &&bounds, + std::unique_ptr<Type> &&type = nullptr); + static std::unique_ptr<Type> new_type (Type &type); static std::unique_ptr<GenericParam> -- 2.45.2