@@ -47,15 +47,15 @@ func isExprMigrated(_ node: ExprSyntax) -> Bool {
47
47
. editorPlaceholderExpr, . floatLiteralExpr, . forceUnwrapExpr, . functionCallExpr,
48
48
. genericSpecializationExpr, . ifExpr, . infixOperatorExpr, . inOutExpr,
49
49
. integerLiteralExpr, . isExpr, . memberAccessExpr, . nilLiteralExpr, . optionalChainingExpr,
50
- . packElementExpr, . packExpansionExpr, . patternExpr,
50
+ . packElementExpr, . packExpansionExpr, . patternExpr, . postfixIfConfigExpr ,
51
51
. postfixOperatorExpr, . prefixOperatorExpr, . regexLiteralExpr, . sequenceExpr,
52
52
. simpleStringLiteralExpr, . subscriptCallExpr, . stringLiteralExpr, . superExpr,
53
53
. switchExpr, . tryExpr, . tupleExpr, . typeExpr, . unresolvedAsExpr, . unresolvedIsExpr,
54
54
. unresolvedTernaryExpr, . ternaryExpr:
55
55
break
56
56
57
57
// Known unimplemented kinds.
58
- case . keyPathExpr, . macroExpansionExpr, . postfixIfConfigExpr :
58
+ case . keyPathExpr, . macroExpansionExpr:
59
59
return false
60
60
61
61
// Unknown expr kinds.
@@ -147,8 +147,8 @@ extension ASTGenVisitor {
147
147
return self . generate ( packExpansionExpr: node) . asExpr
148
148
case . patternExpr( let node) :
149
149
return self . generate ( patternExpr: node) . asExpr
150
- case . postfixIfConfigExpr:
151
- break
150
+ case . postfixIfConfigExpr( let node ) :
151
+ return self . generate ( postfixIfConfigExpr : node )
152
152
case . postfixOperatorExpr( let node) :
153
153
return self . generate ( postfixOperatorExpr: node) . asExpr
154
154
case . prefixOperatorExpr( let node) :
@@ -187,6 +187,45 @@ extension ASTGenVisitor {
187
187
preconditionFailure ( " isExprMigrated() mismatch " )
188
188
}
189
189
190
+ func generate( expr node: ExprSyntax , postfixIfConfigBaseExpr: BridgedExpr ? = nil ) -> BridgedExpr {
191
+ if let postfixIfConfigBaseExpr {
192
+ // Generating tail part of a postfix #if expression.
193
+ return self . generatePostfixIfConfigExprSuffix ( expr: node, baseExpr: postfixIfConfigBaseExpr)
194
+ } else {
195
+ return self . generate ( expr: node)
196
+ }
197
+ }
198
+
199
+ /// Generate function for interior of postfix #if expressions. The base expression is provided by the caller.
200
+ ///
201
+ /// ```
202
+ /// foo // <- baseExpr
203
+ /// #if FLAG
204
+ /// .bar(arg)?[idx]!++ // <- node
205
+ /// #endif
206
+ /// ```
207
+ func generatePostfixIfConfigExprSuffix( expr node: ExprSyntax , baseExpr: BridgedExpr ) -> BridgedExpr {
208
+ switch node. as ( ExprSyntaxEnum . self) {
209
+ case . memberAccessExpr( let node) :
210
+ return self . generate ( memberAccessExpr: node, postfixIfConfigBaseExpr: baseExpr)
211
+ case . postfixIfConfigExpr( let node) :
212
+ return self . generate ( postfixIfConfigExpr: node, postfixIfConfigBaseExpr: baseExpr)
213
+ case . functionCallExpr( let node) :
214
+ return self . generate ( functionCallExpr: node, postfixIfConfigBaseExpr: baseExpr) . asExpr
215
+ case . subscriptCallExpr( let node) :
216
+ return self . generate ( subscriptCallExpr: node, postfixIfConfigBaseExpr: baseExpr) . asExpr
217
+ case . postfixOperatorExpr( let node) :
218
+ return self . generate ( postfixOperatorExpr: node, postfixIfConfigBaseExpr: baseExpr) . asExpr
219
+ case . optionalChainingExpr( let node) :
220
+ return self . generate ( optionalChainingExpr: node, postfixIfConfigBaseExpr: baseExpr) . asExpr
221
+ case . forceUnwrapExpr( let node) :
222
+ return self . generate ( forceUnwrapExpr: node, postfixIfConfigBaseExpr: baseExpr) . asExpr
223
+ default :
224
+ // FIXME: Diagnose 'invalid expression for a postfix #if expression'
225
+ preconditionFailure ( " expected postfix expression suffix in #if expression clause " )
226
+ }
227
+ }
228
+
190
229
func generate( arrowExpr node: ArrowExprSyntax ) -> BridgedArrowExpr {
191
230
let asyncLoc : BridgedSourceLoc
192
231
let throwsLoc : BridgedSourceLoc
@@ -291,10 +330,10 @@ extension ASTGenVisitor {
291
330
)
292
331
}
293
332
294
- func generate( forceUnwrapExpr node: ForceUnwrapExprSyntax ) -> BridgedForceValueExpr {
333
+ func generate( forceUnwrapExpr node: ForceUnwrapExprSyntax , postfixIfConfigBaseExpr : BridgedExpr ? = nil ) -> BridgedForceValueExpr {
295
334
return . createParsed(
296
335
self . ctx,
297
- subExpr: self . generate ( expr: node. expression) ,
336
+ subExpr: self . generate ( expr: node. expression, postfixIfConfigBaseExpr : postfixIfConfigBaseExpr ) ,
298
337
exclaimLoc: self . generateSourceLoc ( node. exclamationMark)
299
338
)
300
339
}
@@ -364,7 +403,7 @@ extension ASTGenVisitor {
364
403
)
365
404
}
366
405
367
- func generate( functionCallExpr node: FunctionCallExprSyntax ) -> BridgedCallExpr {
406
+ func generate( functionCallExpr node: FunctionCallExprSyntax , postfixIfConfigBaseExpr : BridgedExpr ? = nil ) -> BridgedCallExpr {
368
407
if !node. arguments. isEmpty || node. trailingClosure == nil {
369
408
if node. leftParen == nil {
370
409
self . diagnose (
@@ -378,7 +417,7 @@ extension ASTGenVisitor {
378
417
}
379
418
}
380
419
381
- let callee = generate ( expr: node. calledExpression)
420
+ let callee = self . generate ( expr: node. calledExpression, postfixIfConfigBaseExpr : postfixIfConfigBaseExpr )
382
421
let arguments = generateArgumentList (
383
422
leftParen: node. leftParen,
384
423
labeledExprList: node. arguments,
@@ -496,25 +535,40 @@ extension ASTGenVisitor {
496
535
)
497
536
}
498
537
499
- func generate( memberAccessExpr node: MemberAccessExprSyntax ) -> BridgedExpr {
538
+ func generate( memberAccessExpr node: MemberAccessExprSyntax , postfixIfConfigBaseExpr: BridgedExpr ? = nil ) -> BridgedExpr {
539
+ let baseExpr : BridgedExpr ?
540
+ if let base = node. base {
541
+ baseExpr = self . generate ( expr: base, postfixIfConfigBaseExpr: postfixIfConfigBaseExpr)
542
+ } else if let postfixIfConfigBaseExpr {
543
+ // Dot member syntax right after '#if' line. E.g.
544
+ // foo // <- postfixIfConfigBaseExpr
545
+ // #if FLAG
546
+ // .bar // <- Generating this.
547
+ // .baz
548
+ // #endif
549
+ baseExpr = postfixIfConfigBaseExpr
550
+ } else {
551
+ baseExpr = nil
552
+ }
553
+
500
554
let dotLoc = self . generateSourceLoc ( node. period)
501
555
let nameAndLoc = generateDeclNameRef ( declReferenceExpr: node. declName)
502
556
503
- if let base = node . base {
557
+ if let baseExpr {
504
558
if node. declName. baseName. keywordKind == . `self` {
505
559
// TODO: Diagnose if there's arguments
506
560
assert ( node. declName. argumentNames == nil )
507
561
508
562
return BridgedDotSelfExpr . createParsed (
509
563
self . ctx,
510
- subExpr: self . generate ( expr : base ) ,
564
+ subExpr: baseExpr ,
511
565
dotLoc: dotLoc,
512
566
selfLoc: self . generateSourceLoc ( node. declName)
513
567
) . asExpr
514
568
} else {
515
569
return BridgedUnresolvedDotExpr . createParsed (
516
570
self . ctx,
517
- base: self . generate ( expr : base ) ,
571
+ base: baseExpr ,
518
572
dotLoc: dotLoc,
519
573
name: nameAndLoc. name,
520
574
nameLoc: nameAndLoc. loc
@@ -547,10 +601,10 @@ extension ASTGenVisitor {
547
601
)
548
602
}
549
603
550
- func generate( optionalChainingExpr node: OptionalChainingExprSyntax ) -> BridgedBindOptionalExpr {
604
+ func generate( optionalChainingExpr node: OptionalChainingExprSyntax , postfixIfConfigBaseExpr : BridgedExpr ? = nil ) -> BridgedBindOptionalExpr {
551
605
return . createParsed(
552
606
self . ctx,
553
- subExpr: self . generate ( expr: node. expression) ,
607
+ subExpr: self . generate ( expr: node. expression, postfixIfConfigBaseExpr : postfixIfConfigBaseExpr ) ,
554
608
questionLoc: self . generateSourceLoc ( node. questionMark)
555
609
)
556
610
}
@@ -599,14 +653,46 @@ extension ASTGenVisitor {
599
653
)
600
654
}
601
655
602
- func generate( postfixOperatorExpr node: PostfixOperatorExprSyntax ) -> BridgedPostfixUnaryExpr {
656
+ func generate( postfixIfConfigExpr node: PostfixIfConfigExprSyntax , postfixIfConfigBaseExpr: BridgedExpr ? = nil ) -> BridgedExpr {
657
+ let baseExpr : BridgedExpr
658
+ if let base = node. base {
659
+ baseExpr = self . generate ( expr: base, postfixIfConfigBaseExpr: postfixIfConfigBaseExpr)
660
+ } else if let postfixIfConfigBaseExpr {
661
+ // This is a nested postifx #if expression. E.g.
662
+ //
663
+ // foo // <- postfixIfConfigBaseExpr
664
+ // #if FLAG
665
+ // #if FLAG2 // <- This
666
+ // .bar
667
+ // #endif
668
+ // .baz
669
+ // #endif
670
+ //
671
+ baseExpr = postfixIfConfigBaseExpr
672
+ } else {
673
+ // FIXME: Diagnostics
674
+ preconditionFailure ( " expected PostfixIfConfigExprSyntax.base not nil " )
675
+ }
676
+
677
+ guard let active = self . activeClause ( in: node. config) else {
678
+ return baseExpr
679
+ }
680
+ guard case . postfixExpression( let parsedTail) = active. elements else {
681
+ // FIXME: Diagnostics
682
+ preconditionFailure ( " expected postfixExpression in IfConfigClauseSyntax.Elements " )
683
+ }
684
+ return self . generatePostfixIfConfigExprSuffix ( expr: parsedTail, baseExpr: baseExpr)
685
+ }
686
+
687
+ func generate( postfixOperatorExpr node: PostfixOperatorExprSyntax , postfixIfConfigBaseExpr: BridgedExpr ? = nil ) -> BridgedPostfixUnaryExpr {
688
+ let operand = self . generate ( expr: node. expression, postfixIfConfigBaseExpr: postfixIfConfigBaseExpr)
603
689
return . createParsed(
604
690
self . ctx,
605
691
operator: self . createOperatorRefExpr (
606
692
token: node. operator,
607
693
kind: . postfixOperator
608
694
) . asExpr,
609
- operand: self . generate ( expr : node . expression )
695
+ operand: operand
610
696
)
611
697
}
612
698
@@ -690,8 +776,8 @@ extension ASTGenVisitor {
690
776
) . asExpr
691
777
}
692
778
693
- func generate( subscriptCallExpr node: SubscriptCallExprSyntax ) -> BridgedSubscriptExpr {
694
- let callee = generate ( expr: node. calledExpression)
779
+ func generate( subscriptCallExpr node: SubscriptCallExprSyntax , postfixIfConfigBaseExpr : BridgedExpr ? = nil ) -> BridgedSubscriptExpr {
780
+ let callee = generate ( expr: node. calledExpression, postfixIfConfigBaseExpr : postfixIfConfigBaseExpr )
695
781
let arguments = generateArgumentList (
696
782
leftParen: node. leftSquare,
697
783
labeledExprList: node. arguments,
0 commit comments