// Copyright (C) 2020-2024 Free Software Foundation, Inc. // This file is part of GCC. // GCC is free software; you can redistribute it and/or modify it under // the terms of the GNU General Public License as published by the Free // Software Foundation; either version 3, or (at your option) any later // version. // GCC is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // You should have received a copy of the GNU General Public License // along with GCC; see the file COPYING3. If not see // . #ifndef AST_BUILDER_H #define AST_BUILDER_H #include "rust-ast-full.h" namespace Rust { namespace AST { // 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 * may not be suitable to other purposes */ class Builder { public: Builder (location_t loc) : loc (loc) {} /* Create a string literal expression ("content") */ std::unique_ptr literal_string (std::string &&content) const; /* Create an identifier expression (`variable`) */ std::unique_ptr identifier (std::string name) const; /* Create a tuple index expression (`receiver.0`) */ std::unique_ptr tuple_idx (std::string receiver, int idx) const; /* Create a reference to an expression (`&of`) */ std::unique_ptr ref (std::unique_ptr &&of, bool mut = false) const; /* Create a dereference of an expression (`*of`) */ std::unique_ptr deref (std::unique_ptr &&of) const; /* Create a block with an optional tail expression */ std::unique_ptr block (std::vector> &&stmts, std::unique_ptr &&tail_expr = nullptr) const; /* Create a let binding with an optional type and initializer (`let : * = `) */ std::unique_ptr let (std::unique_ptr pattern, std::unique_ptr type = nullptr, std::unique_ptr init = nullptr) const; /** * Create a call expression to a function, struct or enum variant, given its * arguments (`path(arg0, arg1, arg2)`) */ std::unique_ptr call (std::unique_ptr &&path, std::vector> &&args) const; /** * Create an array expression (`[member0, member1, member2]`) */ std::unique_ptr array (std::vector> &&members) const; /* Empty function qualifiers, with no specific qualifiers */ FunctionQualifiers fn_qualifiers () const; /* Create a single path segment from one string */ PathExprSegment path_segment (std::string seg) const; /* And similarly for type path segments */ std::unique_ptr type_path_segment (std::string seg) const; /* Create a Type from a single string - the most basic kind of type in our AST */ std::unique_ptr single_type_path (std::string type) const; /** * Create a path in expression from multiple segments (`Clone::clone`). You * 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 &&segments) const; /* Create a struct expression for unit structs (`S`) */ std::unique_ptr struct_expr_struct (std::string struct_name) const; /** * Create an expression for struct instantiation with fields (`S { a, b: c }`) */ std::unique_ptr struct_expr (std::string struct_name, std::vector> &&fields) const; /* Create a field expression for struct instantiation (`field_name: value`) */ std::unique_ptr struct_expr_field (std::string field_name, std::unique_ptr &&value) const; /* Create a field access expression (`instance.field`) */ std::unique_ptr field_access (std::unique_ptr &&instance, std::string field) const; /* Create a wildcard pattern (`_`) */ std::unique_ptr wildcard () const; private: /** * Location of the generated AST nodes */ location_t loc; }; } // namespace AST } // namespace Rust #endif // AST_BUILDER_H