@@ -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.
@@ -141,15 +141,14 @@ extension ASTGenVisitor {
141
141
return self . generate ( nilLiteralExpr: node) . asExpr
142
142
case . optionalChainingExpr( let node) :
143
143
return self . generate ( optionalChainingExpr: node) . asExpr
144
- break
145
144
case . packElementExpr( let node) :
146
145
return self . generate ( packElementExpr: node) . asExpr
147
146
case . packExpansionExpr( let node) :
148
147
return self . generate ( packExpansionExpr: node) . asExpr
149
148
case . patternExpr( let node) :
150
149
return self . generate ( patternExpr: node) . asExpr
151
- case . postfixIfConfigExpr:
152
- break
150
+ case . postfixIfConfigExpr( let node ) :
151
+ return self . generate ( postfixIfConfigExpr : node )
153
152
case . postfixOperatorExpr( let node) :
154
153
return self . generate ( postfixOperatorExpr: node) . asExpr
155
154
case . prefixOperatorExpr( let node) :
@@ -188,6 +187,45 @@ extension ASTGenVisitor {
188
187
preconditionFailure ( " isExprMigrated() mismatch " )
189
188
}
190
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
+
191
229
func generate( arrowExpr node: ArrowExprSyntax ) -> BridgedArrowExpr {
192
230
let asyncLoc : BridgedSourceLoc
193
231
let throwsLoc : BridgedSourceLoc
@@ -292,10 +330,10 @@ extension ASTGenVisitor {
292
330
)
293
331
}
294
332
295
- func generate( forceUnwrapExpr node: ForceUnwrapExprSyntax ) -> BridgedForceValueExpr {
333
+ func generate( forceUnwrapExpr node: ForceUnwrapExprSyntax , postfixIfConfigBaseExpr : BridgedExpr ? = nil ) -> BridgedForceValueExpr {
296
334
return . createParsed(
297
335
self . ctx,
298
- subExpr: self . generate ( expr: node. expression) ,
336
+ subExpr: self . generate ( expr: node. expression, postfixIfConfigBaseExpr : postfixIfConfigBaseExpr ) ,
299
337
exclaimLoc: self . generateSourceLoc ( node. exclamationMark)
300
338
)
301
339
}
@@ -365,7 +403,7 @@ extension ASTGenVisitor {
365
403
)
366
404
}
367
405
368
- func generate( functionCallExpr node: FunctionCallExprSyntax ) -> BridgedCallExpr {
406
+ func generate( functionCallExpr node: FunctionCallExprSyntax , postfixIfConfigBaseExpr : BridgedExpr ? = nil ) -> BridgedCallExpr {
369
407
if !node. arguments. isEmpty || node. trailingClosure == nil {
370
408
if node. leftParen == nil {
371
409
self . diagnose (
@@ -379,7 +417,7 @@ extension ASTGenVisitor {
379
417
}
380
418
}
381
419
382
- let callee = generate ( expr: node. calledExpression)
420
+ let callee = self . generate ( expr: node. calledExpression, postfixIfConfigBaseExpr : postfixIfConfigBaseExpr )
383
421
let arguments = generateArgumentList (
384
422
leftParen: node. leftParen,
385
423
labeledExprList: node. arguments,
@@ -497,25 +535,40 @@ extension ASTGenVisitor {
497
535
)
498
536
}
499
537
500
- 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
+
501
554
let dotLoc = self . generateSourceLoc ( node. period)
502
555
let nameAndLoc = generateDeclNameRef ( declReferenceExpr: node. declName)
503
556
504
- if let base = node . base {
557
+ if let baseExpr {
505
558
if node. declName. baseName. keywordKind == . `self` {
506
559
// TODO: Diagnose if there's arguments
507
560
assert ( node. declName. argumentNames == nil )
508
561
509
562
return BridgedDotSelfExpr . createParsed (
510
563
self . ctx,
511
- subExpr: self . generate ( expr : base ) ,
564
+ subExpr: baseExpr ,
512
565
dotLoc: dotLoc,
513
566
selfLoc: self . generateSourceLoc ( node. declName)
514
567
) . asExpr
515
568
} else {
516
569
return BridgedUnresolvedDotExpr . createParsed (
517
570
self . ctx,
518
- base: self . generate ( expr : base ) ,
571
+ base: baseExpr ,
519
572
dotLoc: dotLoc,
520
573
name: nameAndLoc. name,
521
574
nameLoc: nameAndLoc. loc
@@ -548,10 +601,10 @@ extension ASTGenVisitor {
548
601
)
549
602
}
550
603
551
- func generate( optionalChainingExpr node: OptionalChainingExprSyntax ) -> BridgedBindOptionalExpr {
604
+ func generate( optionalChainingExpr node: OptionalChainingExprSyntax , postfixIfConfigBaseExpr : BridgedExpr ? = nil ) -> BridgedBindOptionalExpr {
552
605
return . createParsed(
553
606
self . ctx,
554
- subExpr: self . generate ( expr: node. expression) ,
607
+ subExpr: self . generate ( expr: node. expression, postfixIfConfigBaseExpr : postfixIfConfigBaseExpr ) ,
555
608
questionLoc: self . generateSourceLoc ( node. questionMark)
556
609
)
557
610
}
@@ -600,14 +653,46 @@ extension ASTGenVisitor {
600
653
)
601
654
}
602
655
603
- 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)
604
689
return . createParsed(
605
690
self . ctx,
606
691
operator: self . createOperatorRefExpr (
607
692
token: node. operator,
608
693
kind: . postfixOperator
609
694
) . asExpr,
610
- operand: self . generate ( expr : node . expression )
695
+ operand: operand
611
696
)
612
697
}
613
698
@@ -691,8 +776,8 @@ extension ASTGenVisitor {
691
776
) . asExpr
692
777
}
693
778
694
- func generate( subscriptCallExpr node: SubscriptCallExprSyntax ) -> BridgedSubscriptExpr {
695
- 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 )
696
781
let arguments = generateArgumentList (
697
782
leftParen: node. leftSquare,
698
783
labeledExprList: node. arguments,
0 commit comments