40
40
namespace swift {
41
41
namespace syntax {
42
42
43
+ class SyntaxArena ;
44
+
43
45
// / The Syntax factory - the one-stop shop for making new Syntax nodes.
44
46
struct SyntaxFactory {
45
47
// / Make any kind of token.
46
- static TokenSyntax
47
- makeToken (tok Kind, OwnedString Text, SourcePresence Presence,
48
- const Trivia &LeadingTrivia, const Trivia &TrailingTrivia);
48
+ static TokenSyntax makeToken (tok Kind,
49
+ OwnedString Text, const Trivia &LeadingTrivia,
50
+ const Trivia &TrailingTrivia,
51
+ SourcePresence Presence,
52
+ SyntaxArena *Arena = nullptr );
49
53
50
54
// / Collect a list of tokens into a piece of "unknown" syntax.
51
- static UnknownSyntax
52
- makeUnknownSyntax (llvm::ArrayRef<TokenSyntax> Tokens );
55
+ static UnknownSyntax makeUnknownSyntax (llvm::ArrayRef<TokenSyntax> Tokens,
56
+ SyntaxArena *Arena = nullptr );
53
57
54
58
static Optional<Syntax> createSyntax (SyntaxKind Kind,
55
- llvm::ArrayRef<Syntax> Elements);
59
+ llvm::ArrayRef<Syntax> Elements,
60
+ SyntaxArena *Arena = nullptr );
56
61
57
62
static RC<RawSyntax> createRaw (SyntaxKind Kind,
58
- llvm::ArrayRef<RC<RawSyntax>> Elements);
63
+ llvm::ArrayRef<RC<RawSyntax>> Elements,
64
+ SyntaxArena *Arena = nullptr );
59
65
60
66
// / Count the number of children for a given syntax node kind,
61
67
// / returning a pair of mininum and maximum count of children. The gap
@@ -76,74 +82,91 @@ struct SyntaxFactory {
76
82
% child_params.append(" %s %s" % (param_type, child.name))
77
83
% end
78
84
% child_params = ' , ' .join(child_params)
79
- static ${node.name } make${node.syntax_kind }(${child_params});
85
+ static ${node.name } make${node.syntax_kind }(${child_params},
86
+ SyntaxArena *Arena = nullptr );
80
87
% elif node.is_syntax_collection():
81
88
static ${node.name } make${node.syntax_kind }(
82
- const std::vector<${node.collection_element_type }> &elts);
89
+ const std::vector<${node.collection_element_type }> &elts,
90
+ SyntaxArena *Arena = nullptr );
83
91
% end
84
92
85
- static ${node.name } makeBlank${node.syntax_kind }();
93
+ static ${node.name } makeBlank${node.syntax_kind }(SyntaxArena *Arena = nullptr );
86
94
% end
87
95
88
96
% for token in SYNTAX_TOKENS:
89
97
% if token.is_keyword:
90
98
static TokenSyntax make${token.name }Keyword(const Trivia &LeadingTrivia,
91
- const Trivia &TrailingTrivia);
99
+ const Trivia &TrailingTrivia,
100
+ SyntaxArena *Arena = nullptr );
92
101
% elif token.text:
93
102
static TokenSyntax make${token.name }Token(const Trivia &LeadingTrivia,
94
- const Trivia &TrailingTrivia);
103
+ const Trivia &TrailingTrivia,
104
+ SyntaxArena *Arena = nullptr );
95
105
% else :
96
106
static TokenSyntax make${token.name }(OwnedString Text,
97
107
const Trivia &LeadingTrivia,
98
- const Trivia &TrailingTrivia);
108
+ const Trivia &TrailingTrivia,
109
+ SyntaxArena *Arena = nullptr );
99
110
% end
100
111
% end
101
112
102
113
#pragma mark - Convenience APIs
103
114
104
- static TupleTypeSyntax makeVoidTupleType ();
115
+ static TupleTypeSyntax makeVoidTupleType (SyntaxArena *Arena = nullptr );
105
116
106
117
// / Creates an labelled TupleTypeElementSyntax with the provided label,
107
118
// / colon, type and optional trailing comma.
108
119
static TupleTypeElementSyntax makeTupleTypeElement (
109
- llvm::Optional<TokenSyntax> Label,
110
- llvm::Optional<TokenSyntax> Colon, TypeSyntax Type,
111
- llvm::Optional<TokenSyntax> TrailingComma = llvm::None);
120
+ llvm::Optional<TokenSyntax> Label,
121
+ llvm::Optional<TokenSyntax> Colon, TypeSyntax Type,
122
+ llvm::Optional<TokenSyntax> TrailingComma = llvm::None,
123
+ SyntaxArena *Arena = nullptr );
112
124
113
125
// / Creates an unlabelled TupleTypeElementSyntax with the provided type and
114
126
// / optional trailing comma.
115
- static TupleTypeElementSyntax makeTupleTypeElement (TypeSyntax Type,
116
- llvm::Optional<TokenSyntax> TrailingComma = llvm::None);
127
+ static TupleTypeElementSyntax
128
+ makeTupleTypeElement (TypeSyntax Type,
129
+ llvm::Optional<TokenSyntax> TrailingComma = llvm::None,
130
+ SyntaxArena *Arena = nullptr );
117
131
118
132
// / Creates a TypeIdentifierSyntax with the provided name and leading/trailing
119
133
// / trivia.
120
134
static TypeSyntax makeTypeIdentifier (OwnedString TypeName,
121
- const Trivia &LeadingTrivia = {}, const Trivia &TrailingTrivia = {});
135
+ const Trivia &LeadingTrivia = {},
136
+ const Trivia &TrailingTrivia = {},
137
+ SyntaxArena *Arena = nullptr );
122
138
123
139
// / Creates a GenericParameterSyntax with no inheritance clause and an
124
140
// / optional trailing comma.
125
- static GenericParameterSyntax makeGenericParameter (TokenSyntax Name,
126
- llvm::Optional<TokenSyntax> TrailingComma);
141
+ static GenericParameterSyntax
142
+ makeGenericParameter (TokenSyntax Name,
143
+ llvm::Optional<TokenSyntax> TrailingComma,
144
+ SyntaxArena *Arena = nullptr );
127
145
128
146
// / Creates a TypeIdentifierSyntax for the `Any` type.
129
- static TypeSyntax makeAnyTypeIdentifier (
130
- const Trivia &LeadingTrivia = {}, const Trivia &TrailingTrivia = {});
147
+ static TypeSyntax makeAnyTypeIdentifier (const Trivia &LeadingTrivia = {},
148
+ const Trivia &TrailingTrivia = {},
149
+ SyntaxArena *Arena = nullptr );
131
150
132
151
// / Creates a TypeIdentifierSyntax for the `Self` type.
133
- static TypeSyntax makeSelfTypeIdentifier (
134
- const Trivia &LeadingTrivia = {}, const Trivia &TrailingTrivia = {});
152
+ static TypeSyntax makeSelfTypeIdentifier (const Trivia &LeadingTrivia = {},
153
+ const Trivia &TrailingTrivia = {},
154
+ SyntaxArena *Arena = nullptr );
135
155
136
156
// / Creates a TokenSyntax for the `Type` identifier.
137
- static TokenSyntax makeTypeToken (
138
- const Trivia &LeadingTrivia = {}, const Trivia &TrailingTrivia = {});
157
+ static TokenSyntax makeTypeToken (const Trivia &LeadingTrivia = {},
158
+ const Trivia &TrailingTrivia = {},
159
+ SyntaxArena *Arena = nullptr );
139
160
140
161
// / Creates a TokenSyntax for the `Protocol` identifier.
141
- static TokenSyntax makeProtocolToken (
142
- const Trivia &LeadingTrivia = {}, const Trivia &TrailingTrivia = {});
162
+ static TokenSyntax makeProtocolToken (const Trivia &LeadingTrivia = {},
163
+ const Trivia &TrailingTrivia = {},
164
+ SyntaxArena *Arena = nullptr );
143
165
144
166
// / Creates an `==` operator token.
145
- static TokenSyntax makeEqualityOperator (
146
- const Trivia &LeadingTrivia = {}, const Trivia &TrailingTrivia = {});
167
+ static TokenSyntax makeEqualityOperator (const Trivia &LeadingTrivia = {},
168
+ const Trivia &TrailingTrivia = {},
169
+ SyntaxArena *Arena = nullptr );
147
170
148
171
// / Whether a raw node `Member` can serve as a member in a syntax collection
149
172
// / of the given syntax collection kind.
0 commit comments