1616// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
1717//
1818// ===----------------------------------------------------------------------===//
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- // ===----------------------------------------------------------------------===//
3019
3120#ifndef SWIFT_SYNTAX_FACTORY_H
3221#define SWIFT_SYNTAX_FACTORY_H
@@ -43,41 +32,39 @@ namespace syntax {
4332class SyntaxArena ;
4433
4534// / 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+
4741 // / Make any kind of token.
48- static TokenSyntax makeToken (tok Kind,
42+ TokenSyntax makeToken (tok Kind,
4943 StringRef Text,
5044 StringRef LeadingTrivia,
5145 StringRef TrailingTrivia,
52- SourcePresence Presence,
53- const RC<SyntaxArena> &Arena
46+ SourcePresence Presence
5447 );
5548
5649 // / 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);
6151
62- static Optional<Syntax> createSyntax (
52+ Optional<Syntax> createSyntax (
6353 SyntaxKind Kind,
64- llvm::ArrayRef<Syntax> Elements,
65- const RC<SyntaxArena> &Arena
54+ llvm::ArrayRef<Syntax> Elements
6655 );
6756
68- static const RawSyntax *createRaw (
57+ const RawSyntax *createRaw (
6958 SyntaxKind Kind,
70- llvm::ArrayRef<const RawSyntax *> Elements,
71- const RC<SyntaxArena> &Arena
59+ llvm::ArrayRef<const RawSyntax *> Elements
7260 );
7361
7462 // / Count the number of children for a given syntax node kind,
7563 // / returning a pair of mininum and maximum count of children. The gap
7664 // / between these two numbers is the number of optional children.
7765 static std::pair<unsigned , unsigned > countChildren (SyntaxKind Kind);
7866
79- static Syntax
80- makeBlankCollectionSyntax (SyntaxKind Kind, const RC<SyntaxArena> &Arena);
67+ Syntax makeBlankCollectionSyntax (SyntaxKind Kind);
8168
8269% for node in SYNTAX_NODES:
8370% if node.children:
@@ -90,117 +77,98 @@ struct SyntaxFactory {
9077% child_params.append(" %s %s" % (param_type, child.name))
9178% end
9279% 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});
9681% 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
10084 );
10185% end
10286
103- static ${node.name } makeBlank${node.syntax_kind }(
104- const RC<SyntaxArena> &Arena
105- );
87+ ${node.name } makeBlank${node.syntax_kind }();
10688% end
10789
10890% for token in SYNTAX_TOKENS:
10991% if token.is_keyword:
110- static TokenSyntax make${token.name }Keyword(
92+ TokenSyntax make${token.name }Keyword(
11193 StringRef LeadingTrivia,
112- StringRef TrailingTrivia,
113- const RC<SyntaxArena> &Arena
94+ StringRef TrailingTrivi
11495 );
11596% elif token.text:
116- static TokenSyntax make${token.name }Token(
97+ TokenSyntax make${token.name }Token(
11798 StringRef LeadingTrivia,
118- StringRef TrailingTrivia,
119- const RC<SyntaxArena> &Arena
99+ StringRef TrailingTrivia
120100 );
121101% else :
122- static TokenSyntax make${token.name }(
102+ TokenSyntax make${token.name }(
123103 StringRef Text,
124- StringRef LeadingTrivia, StringRef TrailingTrivia,
125- const RC<SyntaxArena> &Arena
104+ StringRef LeadingTrivia, StringRef TrailingTrivia
126105 );
127106% end
128107% end
129108
130109#pragma mark - Convenience APIs
131110
132- static TupleTypeSyntax makeVoidTupleType (
133- const RC<SyntaxArena> &Arena
134- );
111+ TupleTypeSyntax makeVoidTupleType ();
135112
136113 // / Creates an labelled TupleTypeElementSyntax with the provided label,
137114 // / colon, type and optional trailing comma.
138- static TupleTypeElementSyntax makeTupleTypeElement (
115+ TupleTypeElementSyntax makeTupleTypeElement (
139116 llvm::Optional<TokenSyntax> Label,
140117 llvm::Optional<TokenSyntax> Colon, TypeSyntax Type,
141- llvm::Optional<TokenSyntax> TrailingComma,
142- const RC<SyntaxArena> &Arena
118+ llvm::Optional<TokenSyntax> TrailingComma
143119 );
144120
145121 // / Creates an unlabelled TupleTypeElementSyntax with the provided type and
146122 // / optional trailing comma.
147- static TupleTypeElementSyntax
123+ TupleTypeElementSyntax
148124 makeTupleTypeElement (
149125 TypeSyntax Type,
150- llvm::Optional<TokenSyntax> TrailingComma,
151- const RC<SyntaxArena> &Arena
126+ llvm::Optional<TokenSyntax> TrailingComma
152127 );
153128
154129 // / Creates a TypeIdentifierSyntax with the provided name and leading/trailing
155130 // / trivia.
156- static TypeSyntax makeTypeIdentifier (
131+ TypeSyntax makeTypeIdentifier (
157132 StringRef TypeName,
158- StringRef LeadingTrivia, StringRef TrailingTrivia,
159- const RC<SyntaxArena> &Arena
133+ StringRef LeadingTrivia, StringRef TrailingTrivia
160134 );
161135
162136 // / Creates a GenericParameterSyntax with no inheritance clause and an
163137 // / optional trailing comma.
164- static GenericParameterSyntax
138+ GenericParameterSyntax
165139 makeGenericParameter (
166140 TokenSyntax Name,
167- llvm::Optional<TokenSyntax> TrailingComma,
168- const RC<SyntaxArena> &Arena
141+ llvm::Optional<TokenSyntax> TrailingComma
169142 );
170143
171144 // / Creates a TypeIdentifierSyntax for the `Any` type.
172- static TypeSyntax makeAnyTypeIdentifier (
145+ TypeSyntax makeAnyTypeIdentifier (
173146 StringRef LeadingTrivia,
174- StringRef TrailingTrivia,
175- const RC<SyntaxArena> &Arena
147+ StringRef TrailingTrivia
176148 );
177149
178150 // / Creates a TypeIdentifierSyntax for the `Self` type.
179- static TypeSyntax makeSelfTypeIdentifier (
151+ TypeSyntax makeSelfTypeIdentifier (
180152 StringRef LeadingTrivia,
181- StringRef TrailingTrivia,
182- const RC<SyntaxArena> &Arena
153+ StringRef TrailingTrivia
183154 );
184155
185156 // / Creates a TokenSyntax for the `Type` identifier.
186- static TokenSyntax makeTypeToken (
157+ TokenSyntax makeTypeToken (
187158 StringRef LeadingTrivia,
188- StringRef TrailingTrivia,
189- const RC<SyntaxArena> &Arena
159+ StringRef TrailingTrivia
190160 );
191161
192162 // / Creates a TokenSyntax for the `Protocol` identifier.
193- static TokenSyntax makeProtocolToken (
163+ TokenSyntax makeProtocolToken (
194164 StringRef LeadingTrivia,
195- StringRef TrailingTrivia,
196- const RC<SyntaxArena> &Arena
165+ StringRef TrailingTrivia
197166 );
198167
199168 // / Creates an `==` operator token.
200- static TokenSyntax makeEqualityOperator (
169+ TokenSyntax makeEqualityOperator (
201170 StringRef LeadingTrivia,
202- StringRef TrailingTrivia,
203- const RC<SyntaxArena> &Arena
171+ StringRef TrailingTrivia
204172 );
205173
206174 // / Whether a raw node kind `MemberKind` can serve as a member in a syntax
0 commit comments