@@ -18,28 +18,28 @@ import SwiftDiagnostics
18
18
// MARK: - TypeDecl
19
19
20
20
extension ASTGenVisitor {
21
- func generate( decl node: DeclSyntax ) -> BridgedDecl {
21
+ func generate( decl node: DeclSyntax ) -> BridgedDecl ? {
22
22
switch node. as ( DeclSyntaxEnum . self) {
23
23
case . accessorDecl:
24
24
fatalError ( " Should be generated as a part of another decl " )
25
25
case . actorDecl( let node) :
26
- return self . generate ( actorDecl: node) . asDecl
26
+ return self . generate ( actorDecl: node) ? . asDecl
27
27
case . associatedTypeDecl( let node) :
28
- return self . generate ( associatedTypeDecl: node) . asDecl
28
+ return self . generate ( associatedTypeDecl: node) ? . asDecl
29
29
case . classDecl( let node) :
30
- return self . generate ( classDecl: node) . asDecl
30
+ return self . generate ( classDecl: node) ? . asDecl
31
31
case . deinitializerDecl( let node) :
32
32
return self . generate ( deinitializerDecl: node) . asDecl
33
33
case . editorPlaceholderDecl:
34
34
break
35
35
case . enumCaseDecl( let node) :
36
36
return self . generate ( enumCaseDecl: node) . asDecl
37
37
case . enumDecl( let node) :
38
- return self . generate ( enumDecl: node) . asDecl
38
+ return self . generate ( enumDecl: node) ? . asDecl
39
39
case . extensionDecl( let node) :
40
40
return self . generate ( extensionDecl: node) . asDecl
41
41
case . functionDecl( let node) :
42
- return self . generate ( functionDecl: node) . asDecl
42
+ return self . generate ( functionDecl: node) ? . asDecl
43
43
case . ifConfigDecl:
44
44
fatalError ( " Should have been handled by the caller " )
45
45
case . importDecl( let node) :
@@ -53,33 +53,46 @@ extension ASTGenVisitor {
53
53
case . missingDecl:
54
54
break
55
55
case . operatorDecl( let node) :
56
- return self . generate ( operatorDecl: node) . asDecl
56
+ return self . generate ( operatorDecl: node) ? . asDecl
57
57
case . poundSourceLocation:
58
58
break
59
59
case . precedenceGroupDecl( let node) :
60
- return self . generate ( precedenceGroupDecl: node) . asDecl
60
+ return self . generate ( precedenceGroupDecl: node) ? . asDecl
61
61
case . protocolDecl( let node) :
62
- return self . generate ( protocolDecl: node) . asDecl
62
+ return self . generate ( protocolDecl: node) ? . asDecl
63
63
case . structDecl( let node) :
64
- return self . generate ( structDecl: node) . asDecl
64
+ return self . generate ( structDecl: node) ? . asDecl
65
65
case . subscriptDecl( let node) :
66
66
return self . generate ( subscriptDecl: node) . asDecl
67
67
case . typeAliasDecl( let node) :
68
- return self . generate ( typeAliasDecl: node) . asDecl
68
+ return self . generate ( typeAliasDecl: node) ? . asDecl
69
69
case . variableDecl( let node) :
70
70
return self . generate ( variableDecl: node) . asDecl
71
71
}
72
72
return self . generateWithLegacy ( node)
73
73
}
74
74
75
- func generate( memberBlockItem node: MemberBlockItemSyntax ) -> BridgedDecl {
75
+ func generate( memberBlockItem node: MemberBlockItemSyntax ) -> BridgedDecl ? {
76
76
// TODO: Set semicolon loc.
77
77
generate ( decl: node. decl)
78
78
}
79
79
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 ? {
81
92
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
+ }
83
96
84
97
let decl = BridgedTypeAliasDecl . createParsed (
85
98
self . ctx,
@@ -96,9 +109,11 @@ extension ASTGenVisitor {
96
109
return decl
97
110
}
98
111
99
- func generate( enumDecl node: EnumDeclSyntax ) -> BridgedNominalTypeDecl {
112
+ func generate( enumDecl node: EnumDeclSyntax ) -> BridgedNominalTypeDecl ? {
100
113
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
+ }
102
117
103
118
let decl = BridgedEnumDecl . createParsed (
104
119
self . ctx,
@@ -123,9 +138,11 @@ extension ASTGenVisitor {
123
138
return decl
124
139
}
125
140
126
- func generate( structDecl node: StructDeclSyntax ) -> BridgedNominalTypeDecl {
141
+ func generate( structDecl node: StructDeclSyntax ) -> BridgedNominalTypeDecl ? {
127
142
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
+ }
129
146
130
147
let decl = BridgedStructDecl . createParsed (
131
148
self . ctx,
@@ -150,9 +167,11 @@ extension ASTGenVisitor {
150
167
return decl
151
168
}
152
169
153
- func generate( classDecl node: ClassDeclSyntax ) -> BridgedNominalTypeDecl {
170
+ func generate( classDecl node: ClassDeclSyntax ) -> BridgedNominalTypeDecl ? {
154
171
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
+ }
156
175
157
176
let decl = BridgedClassDecl . createParsed (
158
177
self . ctx,
@@ -178,9 +197,11 @@ extension ASTGenVisitor {
178
197
return decl
179
198
}
180
199
181
- func generate( actorDecl node: ActorDeclSyntax ) -> BridgedNominalTypeDecl {
200
+ func generate( actorDecl node: ActorDeclSyntax ) -> BridgedNominalTypeDecl ? {
182
201
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
+ }
184
205
185
206
let decl = BridgedClassDecl . createParsed (
186
207
self . ctx,
@@ -206,9 +227,11 @@ extension ASTGenVisitor {
206
227
return decl
207
228
}
208
229
209
- func generate( protocolDecl node: ProtocolDeclSyntax ) -> BridgedNominalTypeDecl {
230
+ func generate( protocolDecl node: ProtocolDeclSyntax ) -> BridgedNominalTypeDecl ? {
210
231
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
+ }
212
235
let primaryAssociatedTypeNames = node. primaryAssociatedTypeClause? . primaryAssociatedTypes. lazy. map {
213
236
self . generateLocatedIdentifier ( $0. name)
214
237
}
@@ -236,9 +259,11 @@ extension ASTGenVisitor {
236
259
return decl
237
260
}
238
261
239
- func generate( associatedTypeDecl node: AssociatedTypeDeclSyntax ) -> BridgedAssociatedTypeDecl {
262
+ func generate( associatedTypeDecl node: AssociatedTypeDeclSyntax ) -> BridgedAssociatedTypeDecl ? {
240
263
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
+ }
242
267
243
268
let decl = BridgedAssociatedTypeDecl . createParsed (
244
269
self . ctx,
@@ -285,8 +310,10 @@ extension ASTGenVisitor {
285
310
// MARK: - EnumCaseDecl
286
311
287
312
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
+ }
290
317
291
318
return . createParsed(
292
319
self . ctx,
@@ -303,8 +330,10 @@ extension ASTGenVisitor {
303
330
let attrs = self . generateDeclAttributes ( node, allowStatic: false )
304
331
305
332
// 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
+ }
308
337
elemDecl. asDecl. setAttrs ( attrs. attributes)
309
338
return elemDecl
310
339
} )
@@ -548,10 +577,11 @@ extension ASTGenVisitor {
548
577
// MARK: - AbstractFunctionDecl
549
578
550
579
extension ASTGenVisitor {
551
- func generate( functionDecl node: FunctionDeclSyntax ) -> BridgedFuncDecl {
580
+ func generate( functionDecl node: FunctionDeclSyntax ) -> BridgedFuncDecl ? {
552
581
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
+ }
555
585
556
586
let decl = BridgedFuncDecl . createParsed (
557
587
self . ctx,
@@ -664,8 +694,10 @@ extension BridgedOperatorFixity {
664
694
}
665
695
666
696
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
+ }
669
701
let ( precedenceGroupName, precedenceGroupLoc) =
670
702
self . generateIdentifierAndSourceLoc ( node. operatorPrecedenceAndTypes? . precedenceGroup)
671
703
@@ -705,9 +737,11 @@ extension BridgedAssociativity {
705
737
}
706
738
707
739
extension ASTGenVisitor {
708
- func generate( precedenceGroupDecl node: PrecedenceGroupDeclSyntax ) -> BridgedPrecedenceGroupDecl {
740
+ func generate( precedenceGroupDecl node: PrecedenceGroupDeclSyntax ) -> BridgedPrecedenceGroupDecl ? {
709
741
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
+ }
711
745
712
746
struct PrecedenceGroupBody {
713
747
var associativity : PrecedenceGroupAssociativitySyntax ? = nil
@@ -852,19 +886,22 @@ extension ASTGenVisitor {
852
886
extension ASTGenVisitor {
853
887
@inline ( __always)
854
888
func generate( memberBlockItemList node: MemberBlockItemListSyntax ) -> [ BridgedDecl ] {
855
- var allBridged : [ BridgedDecl ] = [ ]
889
+ var allMembers : [ BridgedDecl ] = [ ]
856
890
visitIfConfigElements ( node, of: MemberBlockItemSyntax . self) { element in
857
891
if let ifConfigDecl = element. decl. as ( IfConfigDeclSyntax . self) {
858
892
return . ifConfigDecl( ifConfigDecl)
859
893
}
860
894
861
895
return . underlying( element)
862
896
} body: { member in
897
+ guard let member = self . generate ( decl: member. decl) else {
898
+ return
899
+ }
863
900
// TODO: Set semicolon loc.
864
- allBridged . append ( self . generate ( decl : member. decl ) )
901
+ allMembers . append ( member)
865
902
}
866
903
867
- return allBridged
904
+ return allMembers
868
905
}
869
906
870
907
@inline ( __always)
0 commit comments