Skip to content

Commit 73cece2

Browse files
committed
[libSyntax] Make SyntaxFactory methods instance methods
This saves us from passing in the SyntaxArena every time a new node is created.
1 parent 68877f9 commit 73cece2

10 files changed

+824
-898
lines changed

Diff for: include/swift/Syntax/Syntax.h

-2
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ const auto NoParent = llvm::None;
5353
/// Essentially, this is a wrapper around \c SyntaxData that provides
5454
/// convenience methods based on the node's kind.
5555
class Syntax {
56-
friend struct SyntaxFactory;
57-
5856
protected:
5957
SyntaxData Data;
6058

Diff for: include/swift/Syntax/SyntaxCollection.h

-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ struct SyntaxCollectionIterator {
5353
/// A generic unbounded collection of syntax nodes
5454
template <SyntaxKind CollectionKind, typename Element>
5555
class SyntaxCollection : public Syntax {
56-
friend struct SyntaxFactory;
5756
friend class Syntax;
5857

5958
private:

Diff for: include/swift/Syntax/SyntaxFactory.h.gyb

+43-75
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,6 @@
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 {
4332
class 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

Comments
 (0)