12
12
13
13
import ASTBridging
14
14
import SwiftDiagnostics
15
+ @_spi ( Compiler) import SwiftParser
15
16
@_spi ( ExperimentalLanguageFeatures) @_spi ( RawSyntax) import SwiftSyntax
16
17
17
18
/// Check if an `ExprSyntax` can be generated using ASTGen.
@@ -42,20 +43,18 @@ func isExprMigrated(_ node: ExprSyntax) -> Bool {
42
43
// Known implemented kinds.
43
44
case . asExpr, . arrayExpr, . arrowExpr, . assignmentExpr, . awaitExpr, . binaryOperatorExpr,
44
45
. 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,
48
49
. nilLiteralExpr, . packElementExpr, . packExpansionExpr, . patternExpr,
49
50
. postfixOperatorExpr, . prefixOperatorExpr, . regexLiteralExpr, . sequenceExpr,
50
51
. simpleStringLiteralExpr, . subscriptCallExpr, . stringLiteralExpr, . superExpr,
51
- . tryExpr, . tupleExpr, . typeExpr, . unresolvedAsExpr, . unresolvedIsExpr,
52
+ . switchExpr , . tryExpr, . tupleExpr, . typeExpr, . unresolvedAsExpr, . unresolvedIsExpr,
52
53
. unresolvedTernaryExpr, . ternaryExpr:
53
54
break
54
55
55
56
// Known unimplemented kinds.
56
- case . doExpr, . editorPlaceholderExpr, . forceUnwrapExpr, . isExpr, . keyPathExpr, . macroExpansionExpr,
57
- . optionalChainingExpr, . postfixIfConfigExpr, . genericSpecializationExpr,
58
- . switchExpr:
57
+ case . forceUnwrapExpr, . keyPathExpr, . macroExpansionExpr, . optionalChainingExpr, . postfixIfConfigExpr:
59
58
return false
60
59
61
60
// Unknown expr kinds.
@@ -102,15 +101,15 @@ extension ASTGenVisitor {
102
101
case . copyExpr( let node) :
103
102
return self . generate ( copyExpr: node) . asExpr
104
103
case . declReferenceExpr( let node) :
105
- return self . generate ( declReferenceExpr: node) . asExpr
104
+ return self . generate ( declReferenceExpr: node)
106
105
case . dictionaryExpr( let node) :
107
106
return self . generate ( dictionaryExpr: node) . asExpr
108
107
case . discardAssignmentExpr( let node) :
109
108
return self . generate ( discardAssignmentExpr: node) . asExpr
110
- case . doExpr:
111
- break
109
+ case . doExpr( let node ) :
110
+ return self . generate ( doExpr : node ) . asExpr
112
111
case . editorPlaceholderExpr:
113
- break
112
+ preconditionFailure ( " EditorPlaceholderExpr is no longer generated by the parser " )
114
113
case . floatLiteralExpr( let node) :
115
114
return self . generate ( floatLiteralExpr: node) . asExpr
116
115
case . forceUnwrapExpr:
@@ -128,7 +127,7 @@ extension ASTGenVisitor {
128
127
case . integerLiteralExpr( let node) :
129
128
return self . generate ( integerLiteralExpr: node) . asExpr
130
129
case . isExpr:
131
- break
130
+ preconditionFailure ( " IsExprSyntax only appear after operator folding " )
132
131
case . keyPathExpr:
133
132
break
134
133
case . macroExpansionExpr:
@@ -428,20 +427,67 @@ extension ASTGenVisitor {
428
427
}
429
428
}
430
429
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
+ }
433
453
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 (
434
468
self . ctx,
435
469
name: nameAndLoc. name,
436
470
kind: . ordinary,
437
471
loc: nameAndLoc. loc
438
- )
472
+ ) . asExpr
439
473
}
440
474
441
475
func generate( discardAssignmentExpr node: DiscardAssignmentExprSyntax ) -> BridgedDiscardAssignmentExpr {
442
476
return . createParsed( self . ctx, loc: self . generateSourceLoc ( node. wildcard) )
443
477
}
444
478
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
+
445
491
func generate( memberAccessExpr node: MemberAccessExprSyntax ) -> BridgedExpr {
446
492
let dotLoc = self . generateSourceLoc ( node. period)
447
493
let nameAndLoc = generateDeclNameRef ( declReferenceExpr: node. declName)
0 commit comments