@@ -14,7 +14,7 @@ import ASTBridging
1414import BasicBridging
1515import ParseBridging
1616// Needed to use BumpPtrAllocator
17- @_spi ( BumpPtrAllocator) import SwiftSyntax
17+ @_spi ( BumpPtrAllocator) @ _spi ( ExperimentalLanguageFeatures ) import SwiftSyntax
1818
1919import 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
190190extension 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.
340224extension 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)
0 commit comments