Skip to content

Commit 97eda9a

Browse files
authored
Merge pull request #77608 from rintaro/astgen-decl-optional
[ASTGen] Skip named decls with missing name
2 parents d7d3ca1 + c4955ed commit 97eda9a

File tree

3 files changed

+87
-45
lines changed

3 files changed

+87
-45
lines changed

lib/ASTGen/Sources/ASTGen/ASTGen.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,9 @@ struct ASTGenVisitor {
110110
of: CodeBlockItemSyntax.self,
111111
split: Self.splitCodeBlockItemIfConfig
112112
) { element in
113-
let astNode = generate(codeBlockItem: element)
113+
guard let astNode = generate(codeBlockItem: element) else {
114+
return
115+
}
114116
if !isTopLevel {
115117
out.append(astNode)
116118
return
@@ -463,7 +465,7 @@ public func buildTopLevelASTNodes(
463465
/// Generate an AST node at the given source location. Returns the generated
464466
/// ASTNode and mutate the pointee of `endLocPtr` to the end of the node.
465467
private func _build<Node: SyntaxProtocol, Result>(
466-
generator: (ASTGenVisitor) -> (Node) -> Result,
468+
generator: (ASTGenVisitor) -> (Node) -> Result?,
467469
diagEngine: BridgedDiagnosticEngine,
468470
sourceFilePtr: UnsafeMutableRawPointer,
469471
sourceLoc: BridgedSourceLoc,

lib/ASTGen/Sources/ASTGen/Decls.swift

Lines changed: 77 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -18,28 +18,28 @@ import SwiftDiagnostics
1818
// MARK: - TypeDecl
1919

2020
extension ASTGenVisitor {
21-
func generate(decl node: DeclSyntax) -> BridgedDecl {
21+
func generate(decl node: DeclSyntax) -> BridgedDecl? {
2222
switch node.as(DeclSyntaxEnum.self) {
2323
case .accessorDecl:
2424
fatalError("Should be generated as a part of another decl")
2525
case .actorDecl(let node):
26-
return self.generate(actorDecl: node).asDecl
26+
return self.generate(actorDecl: node)?.asDecl
2727
case .associatedTypeDecl(let node):
28-
return self.generate(associatedTypeDecl: node).asDecl
28+
return self.generate(associatedTypeDecl: node)?.asDecl
2929
case .classDecl(let node):
30-
return self.generate(classDecl: node).asDecl
30+
return self.generate(classDecl: node)?.asDecl
3131
case .deinitializerDecl(let node):
3232
return self.generate(deinitializerDecl: node).asDecl
3333
case .editorPlaceholderDecl:
3434
break
3535
case .enumCaseDecl(let node):
3636
return self.generate(enumCaseDecl: node).asDecl
3737
case .enumDecl(let node):
38-
return self.generate(enumDecl: node).asDecl
38+
return self.generate(enumDecl: node)?.asDecl
3939
case .extensionDecl(let node):
4040
return self.generate(extensionDecl: node).asDecl
4141
case .functionDecl(let node):
42-
return self.generate(functionDecl: node).asDecl
42+
return self.generate(functionDecl: node)?.asDecl
4343
case .ifConfigDecl:
4444
fatalError("Should have been handled by the caller")
4545
case .importDecl(let node):
@@ -53,33 +53,46 @@ extension ASTGenVisitor {
5353
case .missingDecl:
5454
break
5555
case .operatorDecl(let node):
56-
return self.generate(operatorDecl: node).asDecl
56+
return self.generate(operatorDecl: node)?.asDecl
5757
case .poundSourceLocation:
5858
break
5959
case .precedenceGroupDecl(let node):
60-
return self.generate(precedenceGroupDecl: node).asDecl
60+
return self.generate(precedenceGroupDecl: node)?.asDecl
6161
case .protocolDecl(let node):
62-
return self.generate(protocolDecl: node).asDecl
62+
return self.generate(protocolDecl: node)?.asDecl
6363
case .structDecl(let node):
64-
return self.generate(structDecl: node).asDecl
64+
return self.generate(structDecl: node)?.asDecl
6565
case .subscriptDecl(let node):
6666
return self.generate(subscriptDecl: node).asDecl
6767
case .typeAliasDecl(let node):
68-
return self.generate(typeAliasDecl: node).asDecl
68+
return self.generate(typeAliasDecl: node)?.asDecl
6969
case .variableDecl(let node):
7070
return self.generate(variableDecl: node).asDecl
7171
}
7272
return self.generateWithLegacy(node)
7373
}
7474

75-
func generate(memberBlockItem node: MemberBlockItemSyntax) -> BridgedDecl {
75+
func generate(memberBlockItem node: MemberBlockItemSyntax) -> BridgedDecl? {
7676
// TODO: Set semicolon loc.
7777
generate(decl: node.decl)
7878
}
7979

80-
func generate(typeAliasDecl node: TypeAliasDeclSyntax) -> BridgedTypeAliasDecl {
80+
func generateIdentifierDeclNameAndLoc(_ node: TokenSyntax) -> (identifier: BridgedIdentifier, sourceLoc: BridgedSourceLoc)? {
81+
guard node.presence == .present else {
82+
return nil
83+
}
84+
let result = self.generateIdentifierAndSourceLoc(node)
85+
guard result.identifier != nil else {
86+
return nil
87+
}
88+
return result
89+
}
90+
91+
func generate(typeAliasDecl node: TypeAliasDeclSyntax) -> BridgedTypeAliasDecl? {
8192
let attrs = self.generateDeclAttributes(node, allowStatic: false)
82-
let (name, nameLoc) = self.generateIdentifierAndSourceLoc(node.name)
93+
guard let (name, nameLoc) = self.generateIdentifierDeclNameAndLoc(node.name) else {
94+
return nil
95+
}
8396

8497
let decl = BridgedTypeAliasDecl.createParsed(
8598
self.ctx,
@@ -96,9 +109,11 @@ extension ASTGenVisitor {
96109
return decl
97110
}
98111

99-
func generate(enumDecl node: EnumDeclSyntax) -> BridgedNominalTypeDecl {
112+
func generate(enumDecl node: EnumDeclSyntax) -> BridgedNominalTypeDecl? {
100113
let attrs = self.generateDeclAttributes(node, allowStatic: false)
101-
let (name, nameLoc) = self.generateIdentifierAndSourceLoc(node.name)
114+
guard let (name, nameLoc) = self.generateIdentifierDeclNameAndLoc(node.name) else {
115+
return nil
116+
}
102117

103118
let decl = BridgedEnumDecl.createParsed(
104119
self.ctx,
@@ -123,9 +138,11 @@ extension ASTGenVisitor {
123138
return decl
124139
}
125140

126-
func generate(structDecl node: StructDeclSyntax) -> BridgedNominalTypeDecl {
141+
func generate(structDecl node: StructDeclSyntax) -> BridgedNominalTypeDecl? {
127142
let attrs = self.generateDeclAttributes(node, allowStatic: false)
128-
let (name, nameLoc) = self.generateIdentifierAndSourceLoc(node.name)
143+
guard let (name, nameLoc) = self.generateIdentifierDeclNameAndLoc(node.name) else {
144+
return nil
145+
}
129146

130147
let decl = BridgedStructDecl.createParsed(
131148
self.ctx,
@@ -150,9 +167,11 @@ extension ASTGenVisitor {
150167
return decl
151168
}
152169

153-
func generate(classDecl node: ClassDeclSyntax) -> BridgedNominalTypeDecl {
170+
func generate(classDecl node: ClassDeclSyntax) -> BridgedNominalTypeDecl? {
154171
let attrs = self.generateDeclAttributes(node, allowStatic: false)
155-
let (name, nameLoc) = self.generateIdentifierAndSourceLoc(node.name)
172+
guard let (name, nameLoc) = self.generateIdentifierDeclNameAndLoc(node.name) else {
173+
return nil
174+
}
156175

157176
let decl = BridgedClassDecl.createParsed(
158177
self.ctx,
@@ -178,9 +197,11 @@ extension ASTGenVisitor {
178197
return decl
179198
}
180199

181-
func generate(actorDecl node: ActorDeclSyntax) -> BridgedNominalTypeDecl {
200+
func generate(actorDecl node: ActorDeclSyntax) -> BridgedNominalTypeDecl? {
182201
let attrs = self.generateDeclAttributes(node, allowStatic: false)
183-
let (name, nameLoc) = self.generateIdentifierAndSourceLoc(node.name)
202+
guard let (name, nameLoc) = self.generateIdentifierDeclNameAndLoc(node.name) else {
203+
return nil
204+
}
184205

185206
let decl = BridgedClassDecl.createParsed(
186207
self.ctx,
@@ -206,9 +227,11 @@ extension ASTGenVisitor {
206227
return decl
207228
}
208229

209-
func generate(protocolDecl node: ProtocolDeclSyntax) -> BridgedNominalTypeDecl {
230+
func generate(protocolDecl node: ProtocolDeclSyntax) -> BridgedNominalTypeDecl? {
210231
let attrs = self.generateDeclAttributes(node, allowStatic: false)
211-
let (name, nameLoc) = self.generateIdentifierAndSourceLoc(node.name)
232+
guard let (name, nameLoc) = self.generateIdentifierDeclNameAndLoc(node.name) else {
233+
return nil
234+
}
212235
let primaryAssociatedTypeNames = node.primaryAssociatedTypeClause?.primaryAssociatedTypes.lazy.map {
213236
self.generateLocatedIdentifier($0.name)
214237
}
@@ -236,9 +259,11 @@ extension ASTGenVisitor {
236259
return decl
237260
}
238261

239-
func generate(associatedTypeDecl node: AssociatedTypeDeclSyntax) -> BridgedAssociatedTypeDecl {
262+
func generate(associatedTypeDecl node: AssociatedTypeDeclSyntax) -> BridgedAssociatedTypeDecl? {
240263
let attrs = self.generateDeclAttributes(node, allowStatic: false)
241-
let (name, nameLoc) = self.generateIdentifierAndSourceLoc(node.name)
264+
guard let (name, nameLoc) = self.generateIdentifierDeclNameAndLoc(node.name) else {
265+
return nil
266+
}
242267

243268
let decl = BridgedAssociatedTypeDecl.createParsed(
244269
self.ctx,
@@ -285,8 +310,10 @@ extension ASTGenVisitor {
285310
// MARK: - EnumCaseDecl
286311

287312
extension ASTGenVisitor {
288-
func generate(enumCaseElement node: EnumCaseElementSyntax) -> BridgedEnumElementDecl {
289-
let (name, nameLoc) = self.generateIdentifierAndSourceLoc(node.name)
313+
func generate(enumCaseElement node: EnumCaseElementSyntax) -> BridgedEnumElementDecl? {
314+
guard let (name, nameLoc) = self.generateIdentifierDeclNameAndLoc(node.name) else {
315+
return nil
316+
}
290317

291318
return .createParsed(
292319
self.ctx,
@@ -303,8 +330,10 @@ extension ASTGenVisitor {
303330
let attrs = self.generateDeclAttributes(node, allowStatic: false)
304331

305332
// All attributes goes to each element.
306-
let elements = node.elements.lazy.map({ elem -> BridgedEnumElementDecl in
307-
let elemDecl = self.generate(enumCaseElement: elem)
333+
let elements = node.elements.lazy.compactMap({ elem -> BridgedEnumElementDecl? in
334+
guard let elemDecl = self.generate(enumCaseElement: elem) else {
335+
return nil
336+
}
308337
elemDecl.asDecl.setAttrs(attrs.attributes)
309338
return elemDecl
310339
})
@@ -548,10 +577,11 @@ extension ASTGenVisitor {
548577
// MARK: - AbstractFunctionDecl
549578

550579
extension ASTGenVisitor {
551-
func generate(functionDecl node: FunctionDeclSyntax) -> BridgedFuncDecl {
580+
func generate(functionDecl node: FunctionDeclSyntax) -> BridgedFuncDecl? {
552581
let attrs = self.generateDeclAttributes(node, allowStatic: true)
553-
554-
let (name, nameLoc) = self.generateIdentifierAndSourceLoc(node.name)
582+
guard let (name, nameLoc) = self.generateIdentifierDeclNameAndLoc(node.name) else {
583+
return nil
584+
}
555585

556586
let decl = BridgedFuncDecl.createParsed(
557587
self.ctx,
@@ -664,8 +694,10 @@ extension BridgedOperatorFixity {
664694
}
665695

666696
extension ASTGenVisitor {
667-
func generate(operatorDecl node: OperatorDeclSyntax) -> BridgedOperatorDecl {
668-
let (name, nameLoc) = self.generateIdentifierAndSourceLoc(node.name)
697+
func generate(operatorDecl node: OperatorDeclSyntax) -> BridgedOperatorDecl? {
698+
guard let (name, nameLoc) = self.generateIdentifierDeclNameAndLoc(node.name) else {
699+
return nil
700+
}
669701
let (precedenceGroupName, precedenceGroupLoc) =
670702
self.generateIdentifierAndSourceLoc(node.operatorPrecedenceAndTypes?.precedenceGroup)
671703

@@ -705,9 +737,11 @@ extension BridgedAssociativity {
705737
}
706738

707739
extension ASTGenVisitor {
708-
func generate(precedenceGroupDecl node: PrecedenceGroupDeclSyntax) -> BridgedPrecedenceGroupDecl {
740+
func generate(precedenceGroupDecl node: PrecedenceGroupDeclSyntax) -> BridgedPrecedenceGroupDecl? {
709741
let attrs = self.generateDeclAttributes(node, allowStatic: false)
710-
let (name, nameLoc) = self.generateIdentifierAndSourceLoc(node.name)
742+
guard let (name, nameLoc) = self.generateIdentifierDeclNameAndLoc(node.name) else {
743+
return nil
744+
}
711745

712746
struct PrecedenceGroupBody {
713747
var associativity: PrecedenceGroupAssociativitySyntax? = nil
@@ -852,19 +886,22 @@ extension ASTGenVisitor {
852886
extension ASTGenVisitor {
853887
@inline(__always)
854888
func generate(memberBlockItemList node: MemberBlockItemListSyntax) -> [BridgedDecl] {
855-
var allBridged: [BridgedDecl] = []
889+
var allMembers: [BridgedDecl] = []
856890
visitIfConfigElements(node, of: MemberBlockItemSyntax.self) { element in
857891
if let ifConfigDecl = element.decl.as(IfConfigDeclSyntax.self) {
858892
return .ifConfigDecl(ifConfigDecl)
859893
}
860894

861895
return .underlying(element)
862896
} body: { member in
897+
guard let member = self.generate(decl: member.decl) else {
898+
return
899+
}
863900
// TODO: Set semicolon loc.
864-
allBridged.append(self.generate(decl: member.decl))
901+
allMembers.append(member)
865902
}
866903

867-
return allBridged
904+
return allMembers
868905
}
869906

870907
@inline(__always)

lib/ASTGen/Sources/ASTGen/Stmts.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,11 @@ extension ASTGenVisitor {
6767
return self.generateWithLegacy(node)
6868
}
6969

70-
func generate(codeBlockItem node: CodeBlockItemSyntax) -> ASTNode {
70+
func generate(codeBlockItem node: CodeBlockItemSyntax) -> ASTNode? {
7171
// TODO: Set semicolon loc.
7272
switch node.item {
7373
case .decl(let node):
74-
return .decl(self.generate(decl: node))
74+
return self.generate(decl: node).map { .decl($0) }
7575
case .stmt(let node):
7676
return .stmt(self.generate(stmt: node))
7777
case .expr(let node):
@@ -87,7 +87,10 @@ extension ASTGenVisitor {
8787
of: CodeBlockItemSyntax.self,
8888
split: Self.splitCodeBlockItemIfConfig
8989
) { codeBlockItem in
90-
allItems.append(self.generate(codeBlockItem: codeBlockItem).bridged)
90+
guard let item = self.generate(codeBlockItem: codeBlockItem) else {
91+
return
92+
}
93+
allItems.append(item.bridged)
9194
}
9295

9396
return allItems.lazy.bridgedArray(in: self)

0 commit comments

Comments
 (0)