16
16
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
17
17
//
18
18
// ===----------------------------------------------------------------------===//
19
- //
20
- // This file defines the SyntaxFactory, one of the most important client-facing
21
- // types in lib/Syntax and likely to be very commonly used.
22
- //
23
- // Effectively a namespace, SyntaxFactory is never instantiated, but is *the*
24
- // one-stop shop for making new Syntax nodes. Putting all of these into a
25
- // collection of static methods provides a single point of API lookup for
26
- // clients' convenience and also allows the library to hide all of the
27
- // constructors for all Syntax nodes, as the SyntaxFactory is friend to all.
28
- //
29
- // ===----------------------------------------------------------------------===//
30
19
31
20
#ifndef SWIFT_SYNTAX_FACTORY_H
32
21
#define SWIFT_SYNTAX_FACTORY_H
@@ -43,41 +32,39 @@ namespace syntax {
43
32
class SyntaxArena ;
44
33
45
34
// / The Syntax factory - the one-stop shop for making new Syntax nodes.
46
- struct SyntaxFactory {
35
+ class SyntaxFactory {
36
+ RC<SyntaxArena> Arena;
37
+
38
+ public:
39
+ explicit SyntaxFactory (const RC<SyntaxArena> &Arena) : Arena(Arena) {}
40
+
47
41
// / Make any kind of token.
48
- static TokenSyntax makeToken (tok Kind,
42
+ TokenSyntax makeToken (tok Kind,
49
43
StringRef Text,
50
44
StringRef LeadingTrivia,
51
45
StringRef TrailingTrivia,
52
- SourcePresence Presence,
53
- const RC<SyntaxArena> &Arena
46
+ SourcePresence Presence
54
47
);
55
48
56
49
// / Collect a list of tokens into a piece of "unknown" syntax.
57
- static UnknownSyntax makeUnknownSyntax (
58
- llvm::ArrayRef<TokenSyntax> Tokens,
59
- const RC<SyntaxArena> &Arena
60
- );
50
+ UnknownSyntax makeUnknownSyntax (llvm::ArrayRef<TokenSyntax> Tokens);
61
51
62
- static Optional<Syntax> createSyntax (
52
+ Optional<Syntax> createSyntax (
63
53
SyntaxKind Kind,
64
- llvm::ArrayRef<Syntax> Elements,
65
- const RC<SyntaxArena> &Arena
54
+ llvm::ArrayRef<Syntax> Elements
66
55
);
67
56
68
- static const RawSyntax *createRaw (
57
+ const RawSyntax *createRaw (
69
58
SyntaxKind Kind,
70
- llvm::ArrayRef<const RawSyntax *> Elements,
71
- const RC<SyntaxArena> &Arena
59
+ llvm::ArrayRef<const RawSyntax *> Elements
72
60
);
73
61
74
62
// / Count the number of children for a given syntax node kind,
75
63
// / returning a pair of mininum and maximum count of children. The gap
76
64
// / between these two numbers is the number of optional children.
77
65
static std::pair<unsigned , unsigned > countChildren (SyntaxKind Kind);
78
66
79
- static Syntax
80
- makeBlankCollectionSyntax (SyntaxKind Kind, const RC<SyntaxArena> &Arena);
67
+ Syntax makeBlankCollectionSyntax (SyntaxKind Kind);
81
68
82
69
% for node in SYNTAX_NODES:
83
70
% if node.children:
@@ -90,117 +77,98 @@ struct SyntaxFactory {
90
77
% child_params.append(" %s %s" % (param_type, child.name))
91
78
% end
92
79
% child_params = ' , ' .join(child_params)
93
- static ${node.name } make${node.syntax_kind }(${child_params},
94
- const RC<SyntaxArena> &Arena
95
- );
80
+ ${node.name } make${node.syntax_kind }(${child_params});
96
81
% elif node.is_syntax_collection():
97
- static ${node.name } make${node.syntax_kind }(
98
- const std::vector<${node.collection_element_type }> &elts,
99
- const RC<SyntaxArena> &Arena
82
+ ${node.name } make${node.syntax_kind }(
83
+ const std::vector<${node.collection_element_type }> &elts
100
84
);
101
85
% end
102
86
103
- static ${node.name } makeBlank${node.syntax_kind }(
104
- const RC<SyntaxArena> &Arena
105
- );
87
+ ${node.name } makeBlank${node.syntax_kind }();
106
88
% end
107
89
108
90
% for token in SYNTAX_TOKENS:
109
91
% if token.is_keyword:
110
- static TokenSyntax make${token.name }Keyword(
92
+ TokenSyntax make${token.name }Keyword(
111
93
StringRef LeadingTrivia,
112
- StringRef TrailingTrivia,
113
- const RC<SyntaxArena> &Arena
94
+ StringRef TrailingTrivi
114
95
);
115
96
% elif token.text:
116
- static TokenSyntax make${token.name }Token(
97
+ TokenSyntax make${token.name }Token(
117
98
StringRef LeadingTrivia,
118
- StringRef TrailingTrivia,
119
- const RC<SyntaxArena> &Arena
99
+ StringRef TrailingTrivia
120
100
);
121
101
% else :
122
- static TokenSyntax make${token.name }(
102
+ TokenSyntax make${token.name }(
123
103
StringRef Text,
124
- StringRef LeadingTrivia, StringRef TrailingTrivia,
125
- const RC<SyntaxArena> &Arena
104
+ StringRef LeadingTrivia, StringRef TrailingTrivia
126
105
);
127
106
% end
128
107
% end
129
108
130
109
#pragma mark - Convenience APIs
131
110
132
- static TupleTypeSyntax makeVoidTupleType (
133
- const RC<SyntaxArena> &Arena
134
- );
111
+ TupleTypeSyntax makeVoidTupleType ();
135
112
136
113
// / Creates an labelled TupleTypeElementSyntax with the provided label,
137
114
// / colon, type and optional trailing comma.
138
- static TupleTypeElementSyntax makeTupleTypeElement (
115
+ TupleTypeElementSyntax makeTupleTypeElement (
139
116
llvm::Optional<TokenSyntax> Label,
140
117
llvm::Optional<TokenSyntax> Colon, TypeSyntax Type,
141
- llvm::Optional<TokenSyntax> TrailingComma,
142
- const RC<SyntaxArena> &Arena
118
+ llvm::Optional<TokenSyntax> TrailingComma
143
119
);
144
120
145
121
// / Creates an unlabelled TupleTypeElementSyntax with the provided type and
146
122
// / optional trailing comma.
147
- static TupleTypeElementSyntax
123
+ TupleTypeElementSyntax
148
124
makeTupleTypeElement (
149
125
TypeSyntax Type,
150
- llvm::Optional<TokenSyntax> TrailingComma,
151
- const RC<SyntaxArena> &Arena
126
+ llvm::Optional<TokenSyntax> TrailingComma
152
127
);
153
128
154
129
// / Creates a TypeIdentifierSyntax with the provided name and leading/trailing
155
130
// / trivia.
156
- static TypeSyntax makeTypeIdentifier (
131
+ TypeSyntax makeTypeIdentifier (
157
132
StringRef TypeName,
158
- StringRef LeadingTrivia, StringRef TrailingTrivia,
159
- const RC<SyntaxArena> &Arena
133
+ StringRef LeadingTrivia, StringRef TrailingTrivia
160
134
);
161
135
162
136
// / Creates a GenericParameterSyntax with no inheritance clause and an
163
137
// / optional trailing comma.
164
- static GenericParameterSyntax
138
+ GenericParameterSyntax
165
139
makeGenericParameter (
166
140
TokenSyntax Name,
167
- llvm::Optional<TokenSyntax> TrailingComma,
168
- const RC<SyntaxArena> &Arena
141
+ llvm::Optional<TokenSyntax> TrailingComma
169
142
);
170
143
171
144
// / Creates a TypeIdentifierSyntax for the `Any` type.
172
- static TypeSyntax makeAnyTypeIdentifier (
145
+ TypeSyntax makeAnyTypeIdentifier (
173
146
StringRef LeadingTrivia,
174
- StringRef TrailingTrivia,
175
- const RC<SyntaxArena> &Arena
147
+ StringRef TrailingTrivia
176
148
);
177
149
178
150
// / Creates a TypeIdentifierSyntax for the `Self` type.
179
- static TypeSyntax makeSelfTypeIdentifier (
151
+ TypeSyntax makeSelfTypeIdentifier (
180
152
StringRef LeadingTrivia,
181
- StringRef TrailingTrivia,
182
- const RC<SyntaxArena> &Arena
153
+ StringRef TrailingTrivia
183
154
);
184
155
185
156
// / Creates a TokenSyntax for the `Type` identifier.
186
- static TokenSyntax makeTypeToken (
157
+ TokenSyntax makeTypeToken (
187
158
StringRef LeadingTrivia,
188
- StringRef TrailingTrivia,
189
- const RC<SyntaxArena> &Arena
159
+ StringRef TrailingTrivia
190
160
);
191
161
192
162
// / Creates a TokenSyntax for the `Protocol` identifier.
193
- static TokenSyntax makeProtocolToken (
163
+ TokenSyntax makeProtocolToken (
194
164
StringRef LeadingTrivia,
195
- StringRef TrailingTrivia,
196
- const RC<SyntaxArena> &Arena
165
+ StringRef TrailingTrivia
197
166
);
198
167
199
168
// / Creates an `==` operator token.
200
- static TokenSyntax makeEqualityOperator (
169
+ TokenSyntax makeEqualityOperator (
201
170
StringRef LeadingTrivia,
202
- StringRef TrailingTrivia,
203
- const RC<SyntaxArena> &Arena
171
+ StringRef TrailingTrivia
204
172
);
205
173
206
174
// / Whether a raw node kind `MemberKind` can serve as a member in a syntax
0 commit comments