Skip to content

Commit 64b17d4

Browse files
committed
Deprecate SyntaxFactory
Instead of always writing `SyntaxFactory.make*` we can just use the initializers of the nodes that should be created, which leads to a lot nicer code IMO. rdar://97910890
1 parent c9042c0 commit 64b17d4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+9458
-4760
lines changed

Sources/SwiftSyntax/SyntaxAnyVisitor.swift.gyb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# -*- mode: Swift -*-
44
# Ignore the following admonition it applies to the resulting .swift file only
55
}%
6-
//// Automatically Generated From SyntaxFactory.swift.gyb.
6+
//// Automatically Generated From SyntaxAnyVisitor.swift.gyb.
77
//// Do Not Edit Directly!
88
//===--------- SyntaxAnyVisitor.swift - Syntax any visitor class ----------===//
99
//

Sources/SwiftSyntax/SyntaxCollections.swift.gyb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,24 @@ public struct ${node.name}: SyntaxCollection, SyntaxHashable {
5555
self._syntaxNode = Syntax(data)
5656
}
5757

58+
public init(_ children: [${node.collection_element_type}]) {
59+
let raw = RawSyntax.createAndCalcLength(kind: SyntaxKind.${node.swift_syntax_kind},
60+
layout: children.map { $0.raw }, presence: SourcePresence.present)
61+
let data = SyntaxData.forRoot(raw)
62+
self.init(data)
63+
}
64+
65+
public static func blank(presence: SourcePresence = .present) -> ${node.name} {
66+
let raw = RawSyntax.create(
67+
kind: .${node.swift_syntax_kind},
68+
layout: [],
69+
length: .zero,
70+
presence: presence
71+
)
72+
let data = SyntaxData.forRoot(raw)
73+
return ${node.name}(data)
74+
}
75+
5876
public var syntaxNodeType: SyntaxProtocol.Type {
5977
return Swift.type(of: self)
6078
}

Sources/SwiftSyntax/SyntaxFactory.swift.gyb

Lines changed: 84 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,19 @@
2828
//===----------------------------------------------------------------------===//
2929

3030
public enum SyntaxFactory {
31+
@available(*, deprecated, message: "Use initializer on TokenSyntax")
3132
public static func makeToken(_ kind: TokenKind, presence: SourcePresence,
3233
leadingTrivia: Trivia = [],
3334
trailingTrivia: Trivia = []) -> TokenSyntax {
34-
let raw = RawSyntax.createAndCalcLength(kind: kind, leadingTrivia: leadingTrivia,
35-
trailingTrivia: trailingTrivia, presence: presence)
36-
let data = SyntaxData.forRoot(raw)
37-
return TokenSyntax(data)
35+
return TokenSyntax(
36+
kind,
37+
presence: presence,
38+
leadingTrivia: leadingTrivia,
39+
trailingTrivia: trailingTrivia
40+
)
3841
}
3942

43+
@available(*, deprecated, message: "Use initializer on UnknownSyntax")
4044
public static func makeUnknownSyntax(tokens: [TokenSyntax]) -> UnknownSyntax {
4145
let raw = RawSyntax.createAndCalcLength(kind: .unknown,
4246
layout: tokens.map { $0.raw }, presence: .present)
@@ -51,50 +55,33 @@ public enum SyntaxFactory {
5155
% pass
5256
% elif node.children:
5357
% child_params = []
58+
% initializer_args = []
5459
% for child in node.children:
55-
% param_type = child.type_name
56-
% if child.is_optional:
57-
% param_type = param_type + "?"
58-
% child_params.append("%s: %s" % (child.swift_name, param_type))
59-
% child_params = ', '.join(child_params)
60-
public static func make${node.syntax_kind}(${child_params}) -> ${node.name} {
61-
let layout: [RawSyntax?] = [
62-
% for child in node.children:
60+
% param_type = child.type_name
6361
% if child.is_optional:
64-
${child.swift_name}?.raw,
65-
% else:
66-
${child.swift_name}.raw,
62+
% param_type = param_type + "?"
6763
% end
64+
% child_params.append("%s: %s" % (child.swift_name, param_type))
65+
% initializer_args.append(f"{child.swift_name}: {child.swift_name}")
6866
% end
69-
]
70-
let raw = RawSyntax.createAndCalcLength(kind: SyntaxKind.${node.swift_syntax_kind},
71-
layout: layout, presence: SourcePresence.present)
72-
let data = SyntaxData.forRoot(raw)
73-
return ${node.name}(data)
67+
% child_params_str = ', '.join(child_params)
68+
% initializer_args_str = ', '.join(initializer_args)
69+
@available(*, deprecated, message: "Use initializer on ${node.name}")
70+
public static func make${node.syntax_kind}(${child_params_str}) -> ${node.name} {
71+
return ${node.name}(${initializer_args_str})
7472
}
7573
% elif node.is_syntax_collection():
74+
@available(*, deprecated, message: "Use initializer on ${node.name}")
7675
public static func make${node.syntax_kind}(
7776
_ elements: [${node.collection_element_type}]) -> ${node.name} {
78-
let raw = RawSyntax.createAndCalcLength(kind: SyntaxKind.${node.swift_syntax_kind},
79-
layout: elements.map { $0.raw }, presence: SourcePresence.present)
80-
let data = SyntaxData.forRoot(raw)
81-
return ${node.name}(data)
77+
return ${node.name}(elements)
8278
}
8379
% end
8480

8581
% if not node.is_base():
82+
@available(*, deprecated, message: "Use ${node.name}.blank(presence:) instead")
8683
public static func makeBlank${node.syntax_kind}(presence: SourcePresence = .present) -> ${node.name} {
87-
let data = SyntaxData.forRoot(RawSyntax.create(kind: .${node.swift_syntax_kind},
88-
layout: [
89-
% for child in node.children:
90-
% if child.is_optional:
91-
nil,
92-
% else:
93-
${make_missing_swift_child(child)},
94-
% end
95-
% end
96-
], length: .zero, presence: presence))
97-
return ${node.name}(data)
84+
return ${node.name}.blank(presence: presence)
9885
}
9986
% end
10087
% end
@@ -110,129 +97,150 @@ public enum SyntaxFactory {
11097
% leading_trivia = token_trivia(token.requires_leading_space)
11198
% trailing_trivia = token_trivia(token.requires_trailing_space)
11299
% if token.is_keyword:
100+
@available(*, deprecated, message: "Use TokenSyntax.${token.swift_kind()}Keyword instead")
113101
public static func make${token.name}Keyword(
114102
leadingTrivia: Trivia = ${leading_trivia},
115103
trailingTrivia: Trivia = ${trailing_trivia}
116104
) -> TokenSyntax {
117-
return makeToken(.${token.swift_kind()}, presence: .present,
118-
leadingTrivia: leadingTrivia,
119-
trailingTrivia: trailingTrivia)
105+
return TokenSyntax.${token.swift_kind()}(
106+
leadingTrivia: leadingTrivia,
107+
trailingTrivia: trailingTrivia
108+
)
120109
}
121110
% elif token.text:
111+
@available(*, deprecated, message: "Use TokenSyntax.${token.swift_kind()}Token instead")
122112
public static func make${token.name}Token(
123113
leadingTrivia: Trivia = ${leading_trivia},
124114
trailingTrivia: Trivia = ${trailing_trivia}
125115
) -> TokenSyntax {
126-
return makeToken(.${token.swift_kind()}, presence: .present,
127-
leadingTrivia: leadingTrivia,
128-
trailingTrivia: trailingTrivia)
116+
return TokenSyntax.${token.swift_kind()}Token(
117+
leadingTrivia: leadingTrivia,
118+
trailingTrivia: trailingTrivia
119+
)
129120
}
130121
% else:
122+
@available(*, deprecated, message: "Use TokenSyntax.${token.swift_kind()} instead")
131123
public static func make${token.name}(
132124
_ text: String,
133125
leadingTrivia: Trivia = ${leading_trivia},
134126
trailingTrivia: Trivia = ${trailing_trivia}
135127
) -> TokenSyntax {
136-
return makeToken(.${token.swift_kind()}(text), presence: .present,
137-
leadingTrivia: leadingTrivia,
138-
trailingTrivia: trailingTrivia)
128+
return TokenSyntax.${token.swift_kind()}(
129+
text,
130+
leadingTrivia: leadingTrivia,
131+
trailingTrivia: trailingTrivia
132+
)
139133
}
140134
% end
141135
% end
142136

143137
/// MARK: Convenience APIs
144138

139+
@available(*, deprecated, message: "Use initializer on TupleTypeSyntax")
145140
public static func makeVoidTupleType() -> TupleTypeSyntax {
146-
return makeTupleType(leftParen: makeLeftParenToken(),
147-
elements: makeBlankTupleTypeElementList(),
148-
rightParen: makeRightParenToken())
141+
return TupleTypeSyntax(leftParen: makeLeftParenToken(),
142+
elements: makeBlankTupleTypeElementList(),
143+
rightParen: makeRightParenToken())
149144
}
150145

146+
@available(*, deprecated, message: "Use initializer on TupleTypeSyntax")
151147
public static func makeTupleTypeElement(name: TokenSyntax?,
152148
colon: TokenSyntax?, type: TypeSyntax,
153149
trailingComma: TokenSyntax?) -> TupleTypeElementSyntax {
154-
return makeTupleTypeElement(inOut: nil, name: name, secondName: nil,
155-
colon: colon, type: type, ellipsis: nil,
156-
initializer: nil, trailingComma: trailingComma)
150+
return TupleTypeElementSyntax(inOut: nil, name: name, secondName: nil,
151+
colon: colon, type: type, ellipsis: nil,
152+
initializer: nil, trailingComma: trailingComma)
157153
}
158154

155+
@available(*, deprecated, message: "Use initializer on TupleTypeSyntax")
159156
public static func makeTupleTypeElement(type: TypeSyntax,
160157
trailingComma: TokenSyntax?) -> TupleTypeElementSyntax {
161-
return makeTupleTypeElement(name: nil, colon: nil,
162-
type: type, trailingComma: trailingComma)
158+
return TupleTypeElementSyntax(inOut: nil, name: nil, secondName: nil,
159+
colon: nil, type: type, ellipsis: nil,
160+
initializer: nil, trailingComma: trailingComma)
163161
}
164162

163+
@available(*, deprecated, message: "Use initializer on GenericParameterSyntax")
165164
public static func makeGenericParameter(name: TokenSyntax,
166165
trailingComma: TokenSyntax) -> GenericParameterSyntax {
167-
return makeGenericParameter(attributes: nil, name: name, colon: nil,
168-
inheritedType: nil,
169-
trailingComma: trailingComma)
166+
return GenericParameterSyntax(attributes: nil, name: name, colon: nil,
167+
inheritedType: nil,
168+
trailingComma: trailingComma)
170169
}
171170

171+
@available(*, deprecated, message: "Use initializer on SimpleTypeIdentifierSyntax")
172172
public static func makeTypeIdentifier(_ name: String,
173173
leadingTrivia: Trivia = [],
174174
trailingTrivia: Trivia = []) -> TypeSyntax {
175-
let identifier = makeIdentifier(name, leadingTrivia: leadingTrivia,
176-
trailingTrivia: trailingTrivia)
177-
let typeIdentifier = makeSimpleTypeIdentifier(name: identifier,
178-
genericArgumentClause: nil)
175+
let identifier = TokenSyntax.identifier(name, leadingTrivia: leadingTrivia,
176+
trailingTrivia: trailingTrivia)
177+
let typeIdentifier = SimpleTypeIdentifierSyntax(name: identifier,
178+
genericArgumentClause: nil)
179179
return TypeSyntax(typeIdentifier)
180180
}
181181

182+
@available(*, deprecated, message: "Use initializer on SimpleTypeIdentifierSyntax")
182183
public static func makeAnyTypeIdentifier(leadingTrivia: Trivia = [],
183184
trailingTrivia: Trivia = []) -> TypeSyntax {
184185
return makeTypeIdentifier("Any", leadingTrivia: leadingTrivia,
185186
trailingTrivia: trailingTrivia)
186187
}
187188

189+
@available(*, deprecated, message: "Use initializer on SimpleTypeIdentifierSyntax")
188190
public static func makeSelfTypeIdentifier(leadingTrivia: Trivia = [],
189191
trailingTrivia: Trivia = []) -> TypeSyntax {
190192
return makeTypeIdentifier("Self", leadingTrivia: leadingTrivia,
191193
trailingTrivia: trailingTrivia)
192194
}
193195

196+
@available(*, deprecated, message: "Use initializer on SimpleTypeIdentifierSyntax")
194197
public static func makeTypeToken(leadingTrivia: Trivia = [],
195198
trailingTrivia: Trivia = []) -> TokenSyntax {
196-
return makeIdentifier("Type", leadingTrivia: leadingTrivia,
197-
trailingTrivia: trailingTrivia)
199+
return TokenSyntax.identifier("Type", leadingTrivia: leadingTrivia,
200+
trailingTrivia: trailingTrivia)
198201
}
199202

203+
@available(*, deprecated, message: "Use TokenSyntax.protocol")
200204
public static func makeProtocolToken(leadingTrivia: Trivia = [],
201205
trailingTrivia: Trivia = []) -> TokenSyntax {
202-
return makeIdentifier("Protocol", leadingTrivia: leadingTrivia,
203-
trailingTrivia: trailingTrivia)
206+
return TokenSyntax.identifier("Protocol", leadingTrivia: leadingTrivia,
207+
trailingTrivia: trailingTrivia)
204208
}
205209

210+
@available(*, deprecated, message: "Use TokenSyntax.spacedBinaryOperator")
206211
public static func makeBinaryOperator(_ name: String,
207212
leadingTrivia: Trivia = [],
208213
trailingTrivia: Trivia = []) -> TokenSyntax {
209-
return makeToken(.spacedBinaryOperator(name),
210-
presence: .present,
211-
leadingTrivia: leadingTrivia,
212-
trailingTrivia: trailingTrivia)
214+
return TokenSyntax.spacedBinaryOperator(
215+
name,
216+
leadingTrivia: leadingTrivia,
217+
trailingTrivia: trailingTrivia
218+
)
213219
}
214220

221+
@available(*, deprecated, message: "Use initializer on StringLiteralExprSyntax")
215222
public static func makeStringLiteralExpr(_ text: String,
216223
leadingTrivia: Trivia = [],
217224
trailingTrivia: Trivia = []) -> StringLiteralExprSyntax {
218-
let string = makeStringSegment(text)
219-
let segment = makeStringSegment(content: string)
225+
let string = TokenSyntax.stringSegment(text)
226+
let segment = StringSegmentSyntax(content: string)
220227
let segments = makeStringLiteralSegments([Syntax(segment)])
221228
let openQuote = makeStringQuoteToken(leadingTrivia: leadingTrivia)
222229
let closeQuote = makeStringQuoteToken(trailingTrivia: trailingTrivia)
223-
return makeStringLiteralExpr(openDelimiter: nil,
224-
openQuote: openQuote,
225-
segments: segments,
226-
closeQuote: closeQuote,
227-
closeDelimiter: nil)
230+
return StringLiteralExprSyntax(openDelimiter: nil,
231+
openQuote: openQuote,
232+
segments: segments,
233+
closeQuote: closeQuote,
234+
closeDelimiter: nil)
228235
}
229236

237+
@available(*, deprecated, message: "Use initializer on IdentifierExprSyntax")
230238
public static func makeVariableExpr(_ text: String,
231239
leadingTrivia: Trivia = [],
232240
trailingTrivia: Trivia = []) -> IdentifierExprSyntax {
233241
let string = makeIdentifier(text,
234242
leadingTrivia: leadingTrivia, trailingTrivia: trailingTrivia)
235-
return makeIdentifierExpr(identifier: string,
236-
declNameArguments: nil)
243+
return IdentifierExprSyntax(identifier: string,
244+
declNameArguments: nil)
237245
}
238246
}

Sources/SwiftSyntax/SyntaxNodes.swift.gyb.template

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,44 @@ public struct ${node.name}: ${base_type}Protocol, SyntaxHashable {
8080
self._syntaxNode = Syntax(data)
8181
}
8282

83+
% child_params = []
84+
% for child in node.children:
85+
% param_type = child.type_name
86+
% if child.is_optional:
87+
% param_type = param_type + "?"
88+
% child_params.append("%s: %s" % (child.swift_name, param_type))
89+
% child_params = ', '.join(child_params)
90+
public init(${child_params}) {
91+
let layout: [RawSyntax?] = [
92+
% for child in node.children:
93+
% if child.is_optional:
94+
${child.swift_name}?.raw,
95+
% else:
96+
${child.swift_name}.raw,
97+
% end
98+
% end
99+
]
100+
let raw = RawSyntax.createAndCalcLength(kind: SyntaxKind.${node.swift_syntax_kind},
101+
layout: layout, presence: SourcePresence.present)
102+
let data = SyntaxData.forRoot(raw)
103+
self.init(data)
104+
}
105+
106+
public static func blank(presence: SourcePresence = .present) -> ${node.name} {
107+
let raw = RawSyntax.create(kind: .${node.swift_syntax_kind},
108+
layout: [
109+
% for child in node.children:
110+
% if child.is_optional:
111+
nil,
112+
% else:
113+
${make_missing_swift_child(child)},
114+
% end
115+
% end
116+
], length: .zero, presence: presence)
117+
let data = SyntaxData.forRoot(raw)
118+
return ${node.name}(data)
119+
}
120+
83121
public var syntaxNodeType: SyntaxProtocol.Type {
84122
return Swift.type(of: self)
85123
}

Sources/SwiftSyntax/SyntaxOtherNodes.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ public struct UnknownSyntax: SyntaxProtocol, SyntaxHashable {
4141
assert(data.raw.kind == .unknown)
4242
self._syntaxNode = Syntax(data)
4343
}
44+
45+
public init(tokens: [TokenSyntax]) {
46+
let raw = RawSyntax.createAndCalcLength(kind: .unknown,
47+
layout: tokens.map { $0.raw }, presence: .present)
48+
let data = SyntaxData.forRoot(raw)
49+
self.init(data)
50+
}
4451
}
4552

4653
extension UnknownSyntax: CustomReflectable {
@@ -70,6 +77,14 @@ public struct TokenSyntax: SyntaxProtocol, SyntaxHashable {
7077
self._syntaxNode = Syntax(data)
7178
}
7279

80+
public init(_ kind: TokenKind, presence: SourcePresence, leadingTrivia: Trivia = [],
81+
trailingTrivia: Trivia = []) {
82+
let raw = RawSyntax.createAndCalcLength(kind: kind, leadingTrivia: leadingTrivia,
83+
trailingTrivia: trailingTrivia, presence: presence)
84+
let data = SyntaxData.forRoot(raw)
85+
self.init(data)
86+
}
87+
7388
public var syntaxNodeType: SyntaxProtocol.Type {
7489
return Swift.type(of: self)
7590
}

Sources/SwiftSyntax/SyntaxRewriter.swift.gyb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# -*- mode: Swift -*-
44
# Ignore the following admonition it applies to the resulting .swift file only
55
}%
6-
//// Automatically Generated From SyntaxFactory.swift.gyb.
6+
//// Automatically Generated From SyntaxRewriter.swift.gyb.
77
//// Do Not Edit Directly!
88
//===------------ SyntaxRewriter.swift - Syntax Rewriter class ------------===//
99
//

0 commit comments

Comments
 (0)