@@ -1098,6 +1098,18 @@ extension ASTGenVisitor {
1098
1098
var elements : [ BridgedExpr ] = [ ]
1099
1099
elements. reserveCapacity ( node. elements. count)
1100
1100
1101
+ // If the left-most sequence expr is a 'try', hoist it up to turn
1102
+ // '(try x) + y' into 'try (x + y)'. This is necessary to do in the
1103
+ // ASTGen because 'try' nodes are represented in the ASTScope tree
1104
+ // to look up catch nodes. The scope tree must be syntactic because
1105
+ // it's constructed before sequence folding happens during preCheckExpr.
1106
+ // Otherwise, catch node lookup would find the incorrect catch node for
1107
+ // 'try x + y' at the source location for 'y'.
1108
+ //
1109
+ // 'try' has restrictions for where it can appear within a sequence
1110
+ // expr. This is still diagnosed in TypeChecker::foldSequence.
1111
+ let firstTryExprSyntax = node. elements. first? . as ( TryExprSyntax . self)
1112
+
1101
1113
var iter = node. elements. makeIterator ( )
1102
1114
while let node = iter. next ( ) {
1103
1115
switch node. as ( ExprSyntaxEnum . self) {
@@ -1124,15 +1136,24 @@ extension ASTGenVisitor {
1124
1136
case . unresolvedTernaryExpr( let node) :
1125
1137
elements. append ( self . generate ( unresolvedTernaryExpr: node) . asExpr)
1126
1138
default :
1127
- // Operand.
1128
- elements. append ( self . generate ( expr: node) )
1139
+ if let firstTryExprSyntax, node. id == firstTryExprSyntax. id {
1140
+ elements. append ( self . generate ( expr: firstTryExprSyntax. expression) )
1141
+ } else {
1142
+ elements. append ( self . generate ( expr: node) )
1143
+ }
1129
1144
}
1130
1145
}
1131
1146
1132
- return BridgedSequenceExpr . createParsed (
1147
+ let seqExpr = BridgedSequenceExpr . createParsed (
1133
1148
self . ctx,
1134
1149
exprs: elements. lazy. bridgedArray ( in: self )
1135
1150
) . asExpr
1151
+
1152
+ if let firstTryExprSyntax {
1153
+ return self . generate ( tryExpr: firstTryExprSyntax, overridingSubExpr: seqExpr)
1154
+ } else {
1155
+ return seqExpr
1156
+ }
1136
1157
}
1137
1158
1138
1159
func generate( subscriptCallExpr node: SubscriptCallExprSyntax , postfixIfConfigBaseExpr: BridgedExpr ? = nil ) -> BridgedSubscriptExpr {
@@ -1164,9 +1185,9 @@ extension ASTGenVisitor {
1164
1185
)
1165
1186
}
1166
1187
1167
- func generate( tryExpr node: TryExprSyntax ) -> BridgedExpr {
1188
+ func generate( tryExpr node: TryExprSyntax , overridingSubExpr : BridgedExpr ? = nil ) -> BridgedExpr {
1168
1189
let tryLoc = self . generateSourceLoc ( node. tryKeyword)
1169
- let subExpr = self . generate ( expr: node. expression)
1190
+ let subExpr = overridingSubExpr ?? self . generate ( expr: node. expression)
1170
1191
1171
1192
switch node. questionOrExclamationMark {
1172
1193
case nil :
0 commit comments