Skip to content

Commit 66138e8

Browse files
committed
[ASTGen] Generate ForceValueExpr and BindOptionalExpr
1 parent 231e333 commit 66138e8

File tree

4 files changed

+66
-8
lines changed

4 files changed

+66
-8
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,6 +1254,12 @@ BridgedAwaitExpr BridgedAwaitExpr_createParsed(BridgedASTContext cContext,
12541254
BridgedSourceLoc cAwaitLoc,
12551255
BridgedExpr cSubExpr);
12561256

1257+
SWIFT_NAME("BridgedBindOptionalExpr.createParsed(_:subExpr:questionLoc:)")
1258+
BridgedBindOptionalExpr
1259+
BridgedBindOptionalExpr_createParsed(BridgedASTContext cContext,
1260+
BridgedExpr cSubExpr,
1261+
BridgedSourceLoc cQuestionLoc);
1262+
12571263
SWIFT_NAME("BridgedBooleanLiteralExpr.createParsed(_:value:loc:)")
12581264
BridgedBooleanLiteralExpr
12591265
BridgedBooleanLiteralExpr_createParsed(BridgedASTContext cContext, bool value,
@@ -1344,6 +1350,12 @@ BridgedForceTryExpr_createParsed(BridgedASTContext cContext,
13441350
BridgedSourceLoc cTryLoc, BridgedExpr cSubExpr,
13451351
BridgedSourceLoc cExclaimLoc);
13461352

1353+
SWIFT_NAME("BridgedForceValueExpr.createParsed(_:subExpr:exclaimLoc:)")
1354+
BridgedForceValueExpr
1355+
BridgedForceValueExpr_createParsed(BridgedASTContext cContext,
1356+
BridgedExpr cSubExpr,
1357+
BridgedSourceLoc cExclaimLoc);
1358+
13471359
SWIFT_NAME(
13481360
"BridgedForcedCheckedCastExpr.createParsed(_:asLoc:exclaimLoc:type:)")
13491361
BridgedForcedCheckedCastExpr BridgedForcedCheckedCastExpr_createParsed(

lib/AST/Bridging/ExprBridging.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,15 @@ BridgedAwaitExpr BridgedAwaitExpr_createParsed(BridgedASTContext cContext,
9090
AwaitExpr(cAwaitLoc.unbridged(), cSubExpr.unbridged());
9191
}
9292

93+
BridgedBindOptionalExpr
94+
BridgedBindOptionalExpr_createParsed(BridgedASTContext cContext,
95+
BridgedExpr cSubExpr,
96+
BridgedSourceLoc cQuestionLoc) {
97+
ASTContext &context = cContext.unbridged();
98+
return new (context) BindOptionalExpr(cSubExpr.unbridged(),
99+
cQuestionLoc.unbridged(), /*depth=*/0);
100+
}
101+
93102
BridgedBooleanLiteralExpr
94103
BridgedBooleanLiteralExpr_createParsed(BridgedASTContext cContext, bool value,
95104
BridgedSourceLoc cTokenLoc) {
@@ -220,6 +229,15 @@ BridgedForceTryExpr_createParsed(BridgedASTContext cContext,
220229
cTryLoc.unbridged(), cSubExpr.unbridged(), cExclaimLoc.unbridged());
221230
}
222231

232+
BridgedForceValueExpr
233+
BridgedForceValueExpr_createParsed(BridgedASTContext cContext,
234+
BridgedExpr cSubExpr,
235+
BridgedSourceLoc cExclaimLoc) {
236+
ASTContext &context = cContext.unbridged();
237+
return new (context)
238+
ForceValueExpr(cSubExpr.unbridged(), cExclaimLoc.unbridged());
239+
}
240+
223241
BridgedFloatLiteralExpr
224242
BridgedFloatLiteralExpr_createParsed(BridgedASTContext cContext,
225243
BridgedStringRef cStr,

lib/ASTGen/Sources/ASTGen/Exprs.swift

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,17 +44,18 @@ func isExprMigrated(_ node: ExprSyntax) -> Bool {
4444
case .asExpr, .arrayExpr, .arrowExpr, .assignmentExpr, .awaitExpr, .binaryOperatorExpr,
4545
.booleanLiteralExpr, .borrowExpr, .closureExpr, .consumeExpr, .copyExpr,
4646
.discardAssignmentExpr, .declReferenceExpr, .dictionaryExpr, .doExpr,
47-
.editorPlaceholderExpr, .floatLiteralExpr, .functionCallExpr, .genericSpecializationExpr,
48-
.ifExpr, .infixOperatorExpr, .inOutExpr, .integerLiteralExpr, .isExpr, .memberAccessExpr,
49-
.nilLiteralExpr, .packElementExpr, .packExpansionExpr, .patternExpr,
47+
.editorPlaceholderExpr, .floatLiteralExpr, .forceUnwrapExpr, .functionCallExpr,
48+
.genericSpecializationExpr, .ifExpr, .infixOperatorExpr, .inOutExpr,
49+
.integerLiteralExpr, .isExpr, .memberAccessExpr, .nilLiteralExpr, .optionalChainingExpr,
50+
.packElementExpr, .packExpansionExpr, .patternExpr,
5051
.postfixOperatorExpr, .prefixOperatorExpr, .regexLiteralExpr, .sequenceExpr,
5152
.simpleStringLiteralExpr, .subscriptCallExpr, .stringLiteralExpr, .superExpr,
5253
.switchExpr, .tryExpr, .tupleExpr, .typeExpr, .unresolvedAsExpr, .unresolvedIsExpr,
5354
.unresolvedTernaryExpr, .ternaryExpr:
5455
break
5556

5657
// Known unimplemented kinds.
57-
case .forceUnwrapExpr, .keyPathExpr, .macroExpansionExpr, .optionalChainingExpr, .postfixIfConfigExpr:
58+
case .keyPathExpr, .macroExpansionExpr, .postfixIfConfigExpr:
5859
return false
5960

6061
// Unknown expr kinds.
@@ -112,8 +113,8 @@ extension ASTGenVisitor {
112113
preconditionFailure("EditorPlaceholderExpr is no longer generated by the parser")
113114
case .floatLiteralExpr(let node):
114115
return self.generate(floatLiteralExpr: node).asExpr
115-
case .forceUnwrapExpr:
116-
break
116+
case .forceUnwrapExpr(let node):
117+
return self.generate(forceUnwrapExpr: node).asExpr
117118
case .functionCallExpr(let node):
118119
return self.generate(functionCallExpr: node).asExpr
119120
case .genericSpecializationExpr(let node):
@@ -138,8 +139,8 @@ extension ASTGenVisitor {
138139
break
139140
case .nilLiteralExpr(let node):
140141
return self.generate(nilLiteralExpr: node).asExpr
141-
case .optionalChainingExpr:
142-
// Need special care to wrap the entire postfix chain with OptionalEvaluationExpr.
142+
case .optionalChainingExpr(let node):
143+
return self.generate(optionalChainingExpr: node).asExpr
143144
break
144145
case .packElementExpr(let node):
145146
return self.generate(packElementExpr: node).asExpr
@@ -291,6 +292,14 @@ extension ASTGenVisitor {
291292
)
292293
}
293294

295+
func generate(forceUnwrapExpr node: ForceUnwrapExprSyntax) -> BridgedForceValueExpr {
296+
return .createParsed(
297+
self.ctx,
298+
subExpr: self.generate(expr: node.expression),
299+
exclaimLoc: self.generateSourceLoc(node.exclamationMark)
300+
)
301+
}
302+
294303
func generateArgumentList(
295304
leftParen: TokenSyntax?,
296305
labeledExprList: LabeledExprListSyntax,
@@ -539,6 +548,14 @@ extension ASTGenVisitor {
539548
)
540549
}
541550

551+
func generate(optionalChainingExpr node: OptionalChainingExprSyntax) -> BridgedBindOptionalExpr {
552+
return .createParsed(
553+
self.ctx,
554+
subExpr: self.generate(expr: node.expression),
555+
questionLoc: self.generateSourceLoc(node.questionMark)
556+
)
557+
}
558+
542559
func generate(packElementExpr node: PackElementExprSyntax) -> BridgedPackElementExpr {
543560
return .createParsed(
544561
self.ctx,

test/ASTGen/exprs.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ struct TestStruct {
6767
_ = self.method(arg:_:).self
6868
_ = Ty.`Self` == Ty.`self`
6969
}
70+
71+
var optSelf: Self? { self }
7072
}
7173

7274
func testSequence(arg1: Int, arg2: () -> Int, arg3: Any) {
@@ -178,3 +180,12 @@ func testSpecializeExpr() {
178180
_ = Generic<Int>.self
179181
_ = Generic<Int>()
180182
}
183+
184+
func testOptionalChain(value: TestStruct) {
185+
let _: TestStruct? = value.optSelf?.optSelf!
186+
let _: TestStruct = value.optSelf!
187+
let _: TestStruct = value.optSelf.self!
188+
189+
var value: Int? = 1
190+
value? += 1
191+
}

0 commit comments

Comments
 (0)