Branch data Line data Source code
1 : : // Copyright (C) 2020-2024 Free Software Foundation, Inc.
2 : :
3 : : // This file is part of GCC.
4 : :
5 : : // GCC is free software; you can redistribute it and/or modify it under
6 : : // the terms of the GNU General Public License as published by the Free
7 : : // Software Foundation; either version 3, or (at your option) any later
8 : : // version.
9 : :
10 : : // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 : : // WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 : : // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 : : // for more details.
14 : :
15 : : // You should have received a copy of the GNU General Public License
16 : : // along with GCC; see the file COPYING3. If not see
17 : : // <http://www.gnu.org/licenses/>.
18 : :
19 : : #ifndef AST_BUILDER_H
20 : : #define AST_BUILDER_H
21 : :
22 : : #include "rust-ast-full.h"
23 : :
24 : : namespace Rust {
25 : : namespace AST {
26 : :
27 : : // TODO: Use this builder when expanding regular macros
28 : : /* Builder class with helper methods to create AST nodes. This builder is
29 : : * tailored towards generating multiple AST nodes from a single location, and
30 : : * may not be suitable to other purposes */
31 : : class Builder
32 : : {
33 : : public:
34 : 25 : Builder (location_t loc) : loc (loc) {}
35 : :
36 : : /* Create a string literal expression ("content") */
37 : : std::unique_ptr<Expr> literal_string (std::string &&content) const;
38 : :
39 : : /* Create an identifier expression (`variable`) */
40 : : std::unique_ptr<Expr> identifier (std::string name) const;
41 : :
42 : : /* Create a tuple index expression (`receiver.0`) */
43 : : std::unique_ptr<Expr> tuple_idx (std::string receiver, int idx) const;
44 : :
45 : : /* Create a reference to an expression (`&of`) */
46 : : std::unique_ptr<Expr> ref (std::unique_ptr<Expr> &&of,
47 : : bool mut = false) const;
48 : :
49 : : /* Create a dereference of an expression (`*of`) */
50 : : std::unique_ptr<Expr> deref (std::unique_ptr<Expr> &&of) const;
51 : :
52 : : /* Create a block with an optional tail expression */
53 : : std::unique_ptr<Expr> block (std::vector<std::unique_ptr<Stmt>> &&stmts,
54 : : std::unique_ptr<Expr> &&tail_expr
55 : : = nullptr) const;
56 : :
57 : : /* Create a let binding with an optional type and initializer (`let <name> :
58 : : * <type> = <init>`) */
59 : : std::unique_ptr<Stmt> let (std::unique_ptr<Pattern> pattern,
60 : : std::unique_ptr<Type> type = nullptr,
61 : : std::unique_ptr<Expr> init = nullptr) const;
62 : :
63 : : /**
64 : : * Create a call expression to a function, struct or enum variant, given its
65 : : * arguments (`path(arg0, arg1, arg2)`)
66 : : */
67 : : std::unique_ptr<Expr> call (std::unique_ptr<Expr> &&path,
68 : : std::vector<std::unique_ptr<Expr>> &&args) const;
69 : :
70 : : /**
71 : : * Create an array expression (`[member0, member1, member2]`)
72 : : */
73 : : std::unique_ptr<Expr>
74 : : array (std::vector<std::unique_ptr<Expr>> &&members) const;
75 : :
76 : : /* Empty function qualifiers, with no specific qualifiers */
77 : : FunctionQualifiers fn_qualifiers () const;
78 : :
79 : : /* Create a single path segment from one string */
80 : : PathExprSegment path_segment (std::string seg) const;
81 : :
82 : : /* And similarly for type path segments */
83 : : std::unique_ptr<TypePathSegment> type_path_segment (std::string seg) const;
84 : :
85 : : /* Create a Type from a single string - the most basic kind of type in our AST
86 : : */
87 : : std::unique_ptr<Type> single_type_path (std::string type) const;
88 : :
89 : : /**
90 : : * Create a path in expression from multiple segments (`Clone::clone`). You
91 : : * do not need to separate the segments using `::`, you can simply provide a
92 : : * vector of strings to the functions which will get turned into path segments
93 : : */
94 : : PathInExpression
95 : : path_in_expression (std::vector<std::string> &&segments) const;
96 : :
97 : : /* Create a struct expression for unit structs (`S`) */
98 : : std::unique_ptr<Expr> struct_expr_struct (std::string struct_name) const;
99 : :
100 : : /**
101 : : * Create an expression for struct instantiation with fields (`S { a, b: c }`)
102 : : */
103 : : std::unique_ptr<Expr>
104 : : struct_expr (std::string struct_name,
105 : : std::vector<std::unique_ptr<StructExprField>> &&fields) const;
106 : :
107 : : /* Create a field expression for struct instantiation (`field_name: value`) */
108 : : std::unique_ptr<StructExprField>
109 : : struct_expr_field (std::string field_name,
110 : : std::unique_ptr<Expr> &&value) const;
111 : :
112 : : /* Create a field access expression (`instance.field`) */
113 : : std::unique_ptr<Expr> field_access (std::unique_ptr<Expr> &&instance,
114 : : std::string field) const;
115 : :
116 : : /* Create a wildcard pattern (`_`) */
117 : : std::unique_ptr<Pattern> wildcard () const;
118 : :
119 : : private:
120 : : /**
121 : : * Location of the generated AST nodes
122 : : */
123 : : location_t loc;
124 : : };
125 : :
126 : : } // namespace AST
127 : : } // namespace Rust
128 : :
129 : : #endif // AST_BUILDER_H
|