1212
1313import ASTBridging
1414import SwiftDiagnostics
15+ @_spi ( Compiler) import SwiftParser
1516@_spi ( ExperimentalLanguageFeatures) @_spi ( RawSyntax) import SwiftSyntax
1617
1718/// Check if an `ExprSyntax` can be generated using ASTGen.
@@ -42,20 +43,18 @@ func isExprMigrated(_ node: ExprSyntax) -> Bool {
4243 // Known implemented kinds.
4344 case . asExpr, . arrayExpr, . arrowExpr, . assignmentExpr, . awaitExpr, . binaryOperatorExpr,
4445 . booleanLiteralExpr, . borrowExpr, . closureExpr, . consumeExpr, . copyExpr,
45- . discardAssignmentExpr, . declReferenceExpr, . dictionaryExpr, . floatLiteralExpr ,
46- . functionCallExpr, . ifExpr ,
47- . infixOperatorExpr, . inOutExpr, . integerLiteralExpr, . memberAccessExpr,
46+ . discardAssignmentExpr, . declReferenceExpr, . dictionaryExpr, . doExpr ,
47+ . editorPlaceholderExpr , . floatLiteralExpr , . functionCallExpr, . genericSpecializationExpr ,
48+ . ifExpr , . infixOperatorExpr, . inOutExpr, . integerLiteralExpr, . isExpr , . memberAccessExpr,
4849 . nilLiteralExpr, . packElementExpr, . packExpansionExpr, . patternExpr,
4950 . postfixOperatorExpr, . prefixOperatorExpr, . regexLiteralExpr, . sequenceExpr,
5051 . simpleStringLiteralExpr, . subscriptCallExpr, . stringLiteralExpr, . superExpr,
51- . tryExpr, . tupleExpr, . typeExpr, . unresolvedAsExpr, . unresolvedIsExpr,
52+ . switchExpr , . tryExpr, . tupleExpr, . typeExpr, . unresolvedAsExpr, . unresolvedIsExpr,
5253 . unresolvedTernaryExpr, . ternaryExpr:
5354 break
5455
5556 // Known unimplemented kinds.
56- case . doExpr, . editorPlaceholderExpr, . forceUnwrapExpr, . isExpr, . keyPathExpr, . macroExpansionExpr,
57- . optionalChainingExpr, . postfixIfConfigExpr, . genericSpecializationExpr,
58- . switchExpr:
57+ case . forceUnwrapExpr, . keyPathExpr, . macroExpansionExpr, . optionalChainingExpr, . postfixIfConfigExpr:
5958 return false
6059
6160 // Unknown expr kinds.
@@ -102,15 +101,15 @@ extension ASTGenVisitor {
102101 case . copyExpr( let node) :
103102 return self . generate ( copyExpr: node) . asExpr
104103 case . declReferenceExpr( let node) :
105- return self . generate ( declReferenceExpr: node) . asExpr
104+ return self . generate ( declReferenceExpr: node)
106105 case . dictionaryExpr( let node) :
107106 return self . generate ( dictionaryExpr: node) . asExpr
108107 case . discardAssignmentExpr( let node) :
109108 return self . generate ( discardAssignmentExpr: node) . asExpr
110- case . doExpr:
111- break
109+ case . doExpr( let node ) :
110+ return self . generate ( doExpr : node ) . asExpr
112111 case . editorPlaceholderExpr:
113- break
112+ preconditionFailure ( " EditorPlaceholderExpr is no longer generated by the parser " )
114113 case . floatLiteralExpr( let node) :
115114 return self . generate ( floatLiteralExpr: node) . asExpr
116115 case . forceUnwrapExpr:
@@ -128,7 +127,7 @@ extension ASTGenVisitor {
128127 case . integerLiteralExpr( let node) :
129128 return self . generate ( integerLiteralExpr: node) . asExpr
130129 case . isExpr:
131- break
130+ preconditionFailure ( " IsExprSyntax only appear after operator folding " )
132131 case . keyPathExpr:
133132 break
134133 case . macroExpansionExpr:
@@ -428,20 +427,67 @@ extension ASTGenVisitor {
428427 }
429428 }
430429
431- func generate( declReferenceExpr node: DeclReferenceExprSyntax ) -> BridgedUnresolvedDeclRefExpr {
432- let nameAndLoc = generateDeclNameRef ( declReferenceExpr: node)
430+ func generateEditorPlaceholderExpr( token: TokenSyntax ) -> BridgedEditorPlaceholderExpr {
431+ guard let data = token. rawEditorPlaceHolderData else {
432+ preconditionFailure ( " EditorPlaceholderExprSyntax.placeholder must be a placeholder token " )
433+ }
434+ let ( identifier, loc) = self . generateIdentifierAndSourceLoc ( token)
435+ let placeholderTyR : BridgedTypeRepr ?
436+ let expansionTyR : BridgedTypeRepr ?
437+ func parseType( text: SyntaxText ) -> BridgedTypeRepr {
438+ var parser = Parser ( UnsafeBufferPointer ( start: text. baseAddress, count: text. count) )
439+ let syntax = TypeSyntax . parse ( from: & parser)
440+ return self . generate ( type: syntax)
441+ }
442+ if let typeText = data. typeText {
443+ placeholderTyR = parseType ( text: typeText)
444+ } else {
445+ placeholderTyR = nil
446+ }
447+ if data. typeText == data. typeForExpansionText {
448+ expansionTyR = placeholderTyR
449+ } else {
450+ // `typeForExpansionText` is guaranteed to be non-nil if `typeText` is non-nil,
451+ expansionTyR = parseType ( text: data. typeForExpansionText!)
452+ }
433453 return . createParsed(
454+ self . ctx,
455+ placeholder: identifier,
456+ loc: loc,
457+ placeholderType: placeholderTyR. asNullable,
458+ expansionType: expansionTyR. asNullable
459+ )
460+ }
461+
462+ func generate( declReferenceExpr node: DeclReferenceExprSyntax ) -> BridgedExpr {
463+ if node. baseName. isEditorPlaceholder {
464+ return generateEditorPlaceholderExpr ( token: node. baseName) . asExpr
465+ }
466+ let nameAndLoc = generateDeclNameRef ( declReferenceExpr: node)
467+ return BridgedUnresolvedDeclRefExpr . createParsed (
434468 self . ctx,
435469 name: nameAndLoc. name,
436470 kind: . ordinary,
437471 loc: nameAndLoc. loc
438- )
472+ ) . asExpr
439473 }
440474
441475 func generate( discardAssignmentExpr node: DiscardAssignmentExprSyntax ) -> BridgedDiscardAssignmentExpr {
442476 return . createParsed( self . ctx, loc: self . generateSourceLoc ( node. wildcard) )
443477 }
444478
479+ func generate( doExpr node: DoExprSyntax ) -> BridgedSingleValueStmtExpr {
480+ let stmt = self . generate ( doStmtOrExpr: node)
481+
482+ // Wrap in a SingleValueStmtExpr to embed as an expression.
483+ return . createWithWrappedBranches(
484+ ctx,
485+ stmt: stmt,
486+ declContext: declContext,
487+ mustBeExpr: true
488+ )
489+ }
490+
445491 func generate( memberAccessExpr node: MemberAccessExprSyntax ) -> BridgedExpr {
446492 let dotLoc = self . generateSourceLoc ( node. period)
447493 let nameAndLoc = generateDeclNameRef ( declReferenceExpr: node. declName)
0 commit comments