Skip to content

Commit 038597c

Browse files
committed
[ASTGen] Use kind specific SyntaxEnum
1 parent b399173 commit 038597c

File tree

10 files changed

+358
-184
lines changed

10 files changed

+358
-184
lines changed

lib/ASTGen/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ add_pure_swift_host_library(swiftASTGen STATIC
1717
Sources/ASTGen/Literals.swift
1818
Sources/ASTGen/Macros.swift
1919
Sources/ASTGen/ParameterClause.swift
20+
Sources/ASTGen/Patterns.swift
2021
Sources/ASTGen/PluginHost.swift
2122
Sources/ASTGen/SourceFile.swift
2223
Sources/ASTGen/SourceManager.swift

lib/ASTGen/Sources/ASTGen/ASTGen.swift

Lines changed: 36 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import ASTBridging
1414
import BasicBridging
1515
import ParseBridging
1616
// Needed to use BumpPtrAllocator
17-
@_spi(BumpPtrAllocator) import SwiftSyntax
17+
@_spi(BumpPtrAllocator) @_spi(ExperimentalLanguageFeatures) import SwiftSyntax
1818

1919
import struct SwiftDiagnostics.Diagnostic
2020

@@ -132,7 +132,7 @@ struct ASTGenVisitor {
132132

133133
for element in node.statements {
134134
let loc = element.bridgedSourceLoc(in: self)
135-
let swiftASTNodes = generate(element)
135+
let swiftASTNodes = generate(codeBlockItem: element)
136136
switch swiftASTNodes {
137137
case .decl(let d):
138138
out.append(d.raw)
@@ -188,179 +188,67 @@ extension ASTGenVisitor {
188188
}
189189

190190
extension ASTGenVisitor {
191-
func generate(_ node: DeclSyntax) -> BridgedDecl {
192-
return generate(Syntax(node)).castToDecl
193-
}
194-
195-
func generate(_ node: ExprSyntax) -> BridgedExpr {
196-
if !isExprMigrated(node) {
197-
return generateWithLegacy(node)
191+
/// Generate AST from a Syntax node. The node must be a decl, stmt, expr, or
192+
/// type.
193+
func generate(_ node: Syntax) -> ASTNode {
194+
if let decl = node.as(DeclSyntax.self) {
195+
return .decl(self.generate(decl: decl))
198196
}
199-
return generate(Syntax(node)).castToExpr
200-
}
201-
202-
func generate(_ node: PatternSyntax) -> ASTNode {
203-
return generate(Syntax(node))
204-
}
205-
206-
func generate(_ node: StmtSyntax) -> BridgedStmt {
207-
return generate(Syntax(node)).castToStmt
208-
}
209-
210-
func generate(_ node: TypeSyntax) -> BridgedTypeRepr {
211-
if !isTypeMigrated(node) {
212-
return generateWithLegacy(node)
197+
if let stmt = node.as(StmtSyntax.self) {
198+
return .stmt(self.generate(stmt: stmt))
199+
}
200+
if let expr = node.as(ExprSyntax.self) {
201+
return .expr(self.generate(expr: expr))
202+
}
203+
if let type = node.as(TypeSyntax.self) {
204+
return .type(self.generate(type: type))
213205
}
214-
return generate(Syntax(node)).castToType
215-
}
216-
217-
func generate(_ node: some SyntaxChildChoices) -> ASTNode {
218-
return self.generate(Syntax(node))
219-
}
220206

221-
func generate(_ node: Syntax) -> ASTNode {
222-
switch node.as(SyntaxEnum.self) {
223-
case .actorDecl(let node):
224-
return .decl(generate(node).asDecl)
225-
case .arrayElement(let node):
226-
return .expr(generate(node))
227-
case .arrayExpr(let node):
228-
return .expr(generate(node).asExpr)
229-
case .arrayType(let node):
230-
return .type(generate(node))
231-
case .associatedTypeDecl(let node):
232-
return .decl(generate(node).asDecl)
233-
case .attributedType(let node):
234-
return .type(generate(node))
235-
case .booleanLiteralExpr(let node):
236-
return .expr(generate(node).asExpr)
237-
case .classDecl(let node):
238-
return .decl(generate(node).asDecl)
239-
case .closureExpr(let node):
240-
return .expr(generate(node).asExpr)
241-
case .codeBlock(let node):
242-
return .stmt(generate(node).asStmt)
243-
case .codeBlockItem(let node):
244-
return generate(node)
245-
case .compositionType(let node):
246-
return .type(generate(node))
247-
case .conditionElement(let node):
248-
return generate(node)
249-
case .declReferenceExpr(let node):
250-
return .expr(generate(node).asExpr)
251-
case .deinitializerDecl(let node):
252-
return .decl(generate(node).asDecl)
253-
case .dictionaryType(let node):
254-
return .type(generate(node))
255-
case .enumCaseDecl(let node):
256-
return .decl(generate(node).asDecl)
257-
case .enumDecl(let node):
258-
return .decl(generate(node).asDecl)
259-
case .expressionStmt(let node):
260-
return .stmt(generate(node))
261-
case .extensionDecl(let node):
262-
return .decl(generate(node).asDecl)
263-
case .functionCallExpr(let node):
264-
return .expr(generate(node).asExpr)
265-
case .functionDecl(let node):
266-
return .decl(generate(node).asDecl)
267-
case .functionType(let node):
268-
return .type(generate(node))
269-
case .identifierPattern(let node):
270-
return .expr(generate(node).asExpr)
271-
case .identifierType(let node):
272-
return .type(generate(node))
273-
case .ifExpr(let node):
274-
return .expr(generate(node).asExpr)
275-
case .implicitlyUnwrappedOptionalType(let node):
276-
return .type(generate(node))
277-
case .importDecl(let node):
278-
return .decl(generate(node).asDecl)
279-
case .initializerClause(let node):
280-
return .expr(generate(node))
281-
case .initializerDecl(let node):
282-
return .decl(generate(node).asDecl)
283-
case .integerLiteralExpr(let node):
284-
return .expr(generate(node).asExpr)
285-
case .memberAccessExpr(let node):
286-
return .expr(generate(node).asExpr)
287-
case .memberBlockItem(let node):
288-
return .decl(generate(node))
289-
case .memberType(let node):
290-
return .type(generate(node))
291-
case .metatypeType(let node):
292-
return .type(generate(node))
293-
case .namedOpaqueReturnType(let node):
294-
return .type(generate(node))
295-
case .nilLiteralExpr(let node):
296-
return .expr(generate(node).asExpr)
297-
case .operatorDecl(let node):
298-
return .decl(generate(node).asDecl)
299-
case .optionalType(let node):
300-
return .type(generate(node))
301-
case .packExpansionType(let node):
302-
return .type(generate(node))
303-
case .precedenceGroupDecl(let node):
304-
return .decl(generate(node).asDecl)
305-
case .protocolDecl(let node):
306-
return .decl(generate(node).asDecl)
307-
case .returnStmt(let node):
308-
return .stmt(generate(node).asStmt)
309-
case .someOrAnyType(let node):
310-
return .type(generate(node))
311-
case .stringLiteralExpr(let node):
312-
return .expr(generate(node).asExpr)
313-
case .structDecl(let node):
314-
return .decl(generate(node).asDecl)
315-
case .tupleExpr(let node):
316-
return .expr(generate(node).asExpr)
317-
case .tupleType(let node):
318-
return .type(generate(node))
319-
case .typeAliasDecl(let node):
320-
return .decl(generate(node).asDecl)
321-
case .variableDecl(let node):
322-
return .decl(generate(node).asDecl)
323-
324-
// Un-migrated nodes.
325-
case _ where node.is(ExprSyntax.self):
326-
return .expr(self.generateWithLegacy(node.cast(ExprSyntax.self)))
327-
case _ where node.is(StmtSyntax.self):
328-
return .stmt(self.generateWithLegacy(node.cast(StmtSyntax.self)))
329-
case _ where node.is(DeclSyntax.self):
330-
return .decl(self.generateWithLegacy(node.cast(DeclSyntax.self)))
207+
// --- Special cases where `node` doesn't belong to one of the base kinds.
331208

332-
default:
333-
fatalError("case does not correspond to an ASTNode")
209+
// CodeBlockSyntax -> BraceStmt.
210+
if let node = node.as(CodeBlockSyntax.self) {
211+
return .stmt(self.generate(codeBlock: node).asStmt)
212+
}
213+
// CodeBlockItemSyntax -> ASTNode.
214+
if let node = node.as(CodeBlockItemSyntax.self) {
215+
return self.generate(codeBlockItem: node)
334216
}
217+
218+
fatalError("node does not correspond to an ASTNode \(node.kind)")
335219
}
336220
}
337221

338222
// Misc visits.
339223
// TODO: Some of these are called within a single file/method; we may want to move them to the respective files.
340224
extension ASTGenVisitor {
225+
func generate(_ node: some SyntaxChildChoices) -> ASTNode {
226+
return self.generate(Syntax(node))
227+
}
228+
341229
public func generate(_ node: MemberBlockItemSyntax) -> BridgedDecl {
342-
generate(node.decl)
230+
generate(decl: node.decl)
343231
}
344232

345233
public func generate(_ node: InitializerClauseSyntax) -> BridgedExpr {
346-
generate(node.value)
234+
generate(expr: node.value)
347235
}
348236

349237
public func generate(_ node: ConditionElementSyntax) -> ASTNode {
350238
generate(node.condition)
351239
}
352240

353-
public func generate(_ node: CodeBlockItemSyntax) -> ASTNode {
241+
public func generate(codeBlockItem node: CodeBlockItemSyntax) -> ASTNode {
354242
generate(node.item)
355243
}
356244

357245
public func generate(_ node: ArrayElementSyntax) -> BridgedExpr {
358-
generate(node.expression)
246+
generate(expr: node.expression)
359247
}
360248

361249
@inline(__always)
362250
func generate(_ node: CodeBlockItemListSyntax) -> BridgedArrayRef {
363-
node.lazy.map { self.generate($0).bridged }.bridgedArray(in: self)
251+
node.lazy.map { self.generate(codeBlockItem: $0).bridged }.bridgedArray(in: self)
364252
}
365253
}
366254

@@ -373,7 +261,7 @@ extension ASTGenVisitor {
373261
return nil
374262
}
375263

376-
return self.generate(node)
264+
return self.generate(type: node)
377265
}
378266

379267
@inline(__always)
@@ -382,7 +270,7 @@ extension ASTGenVisitor {
382270
return nil
383271
}
384272

385-
return self.generate(node)
273+
return self.generate(expr: node)
386274
}
387275

388276
@inline(__always)

lib/ASTGen/Sources/ASTGen/Decls.swift

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,60 @@ import SwiftDiagnostics
1818
// MARK: - TypeDecl
1919

2020
extension ASTGenVisitor {
21+
func generate(decl node: DeclSyntax) -> BridgedDecl {
22+
switch node.as(DeclSyntaxEnum.self) {
23+
case .accessorDecl:
24+
break
25+
case .actorDecl(let node):
26+
return self.generate(node).asDecl
27+
case .associatedTypeDecl(let node):
28+
return self.generate(node).asDecl
29+
case .classDecl(let node):
30+
return self.generate(node).asDecl
31+
case .deinitializerDecl(let node):
32+
return self.generate(node).asDecl
33+
case .editorPlaceholderDecl:
34+
break
35+
case .enumCaseDecl(let node):
36+
return self.generate(node).asDecl
37+
case .enumDecl(let node):
38+
return self.generate(node).asDecl
39+
case .extensionDecl(let node):
40+
return self.generate(node).asDecl
41+
case .functionDecl(let node):
42+
return self.generate(node).asDecl
43+
case .ifConfigDecl:
44+
break
45+
case .importDecl(let node):
46+
return self.generate(node).asDecl
47+
case .initializerDecl(let node):
48+
return self.generate(node).asDecl
49+
case .macroDecl:
50+
break
51+
case .macroExpansionDecl:
52+
break
53+
case .missingDecl:
54+
break
55+
case .operatorDecl(let node):
56+
return self.generate(node).asDecl
57+
case .poundSourceLocation:
58+
break
59+
case .precedenceGroupDecl(let node):
60+
return self.generate(node).asDecl
61+
case .protocolDecl(let node):
62+
return self.generate(node).asDecl
63+
case .structDecl(let node):
64+
return self.generate(node).asDecl
65+
case .subscriptDecl:
66+
break
67+
case .typeAliasDecl(let node):
68+
return self.generate(node).asDecl
69+
case .variableDecl(let node):
70+
return self.generate(node).asDecl
71+
}
72+
return self.generateWithLegacy(node)
73+
}
74+
2175
public func generate(_ node: TypeAliasDeclSyntax) -> BridgedTypeAliasDecl {
2276
let (name, nameLoc) = node.name.bridgedIdentifierAndSourceLoc(in: self)
2377

@@ -29,7 +83,7 @@ extension ASTGenVisitor {
2983
nameLoc: nameLoc,
3084
genericParamList: self.generate(node.genericParameterClause).asNullable,
3185
equalLoc: node.initializer.equal.bridgedSourceLoc(in: self),
32-
underlyingType: self.generate(node.initializer.value),
86+
underlyingType: self.generate(type: node.initializer.value),
3387
genericWhereClause: self.generate(node.genericWhereClause).asNullable
3488
)
3589
}
@@ -193,7 +247,7 @@ extension ASTGenVisitor {
193247
self.ctx,
194248
declContext: self.declContext,
195249
extensionKeywordLoc: node.extensionKeyword.bridgedSourceLoc(in: self),
196-
extendedType: self.generate(node.extendedType),
250+
extendedType: self.generate(type: node.extendedType),
197251
inheritedTypes: self.generate(node.inheritanceClause?.inheritedTypes),
198252
genericWhereClause: self.generate(node.genericWhereClause).asNullable,
199253
braceRange: BridgedSourceRange(
@@ -241,7 +295,7 @@ extension ASTGenVisitor {
241295

242296
extension ASTGenVisitor {
243297
public func generate(_ node: VariableDeclSyntax) -> BridgedPatternBindingDecl {
244-
let pattern = generate(node.bindings.first!.pattern)
298+
let pattern = generate(pattern: node.bindings.first!.pattern)
245299
let initializer = generate(node.bindings.first!.initializer!)
246300

247301
let isStatic = false // TODO: compute this
@@ -286,7 +340,7 @@ extension ASTGenVisitor {
286340

287341
if let body = node.body {
288342
self.withDeclContext(decl.asDeclContext) {
289-
decl.setParsedBody(self.generate(body))
343+
decl.setParsedBody(self.generate(codeBlock: body))
290344
}
291345
}
292346

@@ -310,7 +364,7 @@ extension ASTGenVisitor {
310364

311365
if let body = node.body {
312366
self.withDeclContext(decl.asDeclContext) {
313-
decl.setParsedBody(self.generate(body))
367+
decl.setParsedBody(self.generate(codeBlock: body))
314368
}
315369
}
316370

@@ -326,7 +380,7 @@ extension ASTGenVisitor {
326380

327381
if let body = node.body {
328382
self.withDeclContext(decl.asDeclContext) {
329-
decl.setParsedBody(self.generate(body))
383+
decl.setParsedBody(self.generate(codeBlock: body))
330384
}
331385
}
332386

@@ -539,7 +593,7 @@ extension ASTGenVisitor {
539593

540594
@inline(__always)
541595
func generate(_ node: InheritedTypeListSyntax) -> BridgedArrayRef {
542-
node.lazy.map { self.generate($0.type) }.bridgedArray(in: self)
596+
node.lazy.map { self.generate(type: $0.type) }.bridgedArray(in: self)
543597
}
544598

545599
@inline(__always)

0 commit comments

Comments
 (0)