Skip to content

Commit 0084a8a

Browse files
committed
[ASTGen] Implement unary expressions
AwaitExpr, BorrowExpr, ConsumeExpr, CopyExpr, TryExpr, ForceTryExpr, and OptionalTryExpr.
1 parent 471cba2 commit 0084a8a

File tree

4 files changed

+180
-22
lines changed

4 files changed

+180
-22
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,16 @@ SWIFT_NAME("BridgedAssignExpr.createParsed(_:equalsLoc:)")
656656
BridgedAssignExpr BridgedAssignExpr_createParsed(BridgedASTContext cContext,
657657
BridgedSourceLoc cEqualsLoc);
658658

659+
SWIFT_NAME("BridgedAwaitExpr.createParsed(_:awaitLoc:subExpr:)")
660+
BridgedAwaitExpr BridgedAwaitExpr_createParsed(BridgedASTContext cContext,
661+
BridgedSourceLoc cAwaitLoc,
662+
BridgedExpr cSubExpr);
663+
664+
SWIFT_NAME("BridgedBorrowExpr.createParsed(_:borrowLoc:subExpr:)")
665+
BridgedBorrowExpr BridgedBorrowExpr_createParsed(BridgedASTContext cContext,
666+
BridgedSourceLoc cBorrowLoc,
667+
BridgedExpr cSubExpr);
668+
659669
SWIFT_NAME("BridgedCallExpr.createParsed(_:fn:args:)")
660670
BridgedCallExpr BridgedCallExpr_createParsed(BridgedASTContext cContext,
661671
BridgedExpr fn,
@@ -680,6 +690,16 @@ BridgedConditionalCheckedCastExpr_createParsed(BridgedASTContext cContext,
680690
BridgedSourceLoc cQuestionLoc,
681691
BridgedTypeRepr cType);
682692

693+
SWIFT_NAME("BridgedConsumeExpr.createParsed(_:consumeLoc:subExpr:)")
694+
BridgedConsumeExpr BridgedConsumeExpr_createParsed(BridgedASTContext cContext,
695+
BridgedSourceLoc cConsumeLoc,
696+
BridgedExpr cSubExpr);
697+
698+
SWIFT_NAME("BridgedCopyExpr.createParsed(_:copyLoc:subExpr:)")
699+
BridgedCopyExpr BridgedCopyExpr_createParsed(BridgedASTContext cContext,
700+
BridgedSourceLoc cCopyLoc,
701+
BridgedExpr cSubExpr);
702+
683703
SWIFT_NAME("BridgedDiscardAssignmentExpr.createParsed(_:loc:)")
684704
BridgedDiscardAssignmentExpr
685705
BridgedDiscardAssignmentExpr_createParsed(BridgedASTContext cContext,
@@ -698,6 +718,12 @@ BridgedDotSelfExpr BridgedDotSelfExpr_createParsed(BridgedASTContext cContext,
698718
BridgedSourceLoc cDotLoc,
699719
BridgedSourceLoc cSelfLoc);
700720

721+
SWIFT_NAME("BridgedForceTryExpr.createParsed(_:tryLoc:subExpr:exclaimLoc:)")
722+
BridgedForceTryExpr
723+
BridgedForceTryExpr_createParsed(BridgedASTContext cContext,
724+
BridgedSourceLoc cTryLoc, BridgedExpr cSubExpr,
725+
BridgedSourceLoc cExclaimLoc);
726+
701727
SWIFT_NAME(
702728
"BridgedForcedCheckedCastExpr.createParsed(_:asLoc:exclaimLoc:type:)")
703729
BridgedForcedCheckedCastExpr BridgedForcedCheckedCastExpr_createParsed(
@@ -709,6 +735,11 @@ BridgedIsExpr BridgedIsExpr_createParsed(BridgedASTContext cContext,
709735
BridgedSourceLoc cIsLoc,
710736
BridgedTypeRepr cType);
711737

738+
SWIFT_NAME("BridgedOptionalTryExpr.createParsed(_:tryLoc:subExpr:questionLoc:)")
739+
BridgedOptionalTryExpr BridgedOptionalTryExpr_createParsed(
740+
BridgedASTContext cContext, BridgedSourceLoc cTryLoc, BridgedExpr cSubExpr,
741+
BridgedSourceLoc cQuestionLoc);
742+
712743
SWIFT_NAME("BridgedSingleValueStmtExpr.createWithWrappedBranches(_:stmt:"
713744
"declContext:mustBeExpr:)")
714745
BridgedSingleValueStmtExpr BridgedSingleValueStmtExpr_createWithWrappedBranches(
@@ -730,6 +761,11 @@ BridgedTernaryExpr BridgedTernaryExpr_createParsed(
730761
BridgedASTContext cContext, BridgedSourceLoc cQuestionLoc,
731762
BridgedExpr cThenExpr, BridgedSourceLoc cColonLoc);
732763

764+
SWIFT_NAME("BridgedTryExpr.createParsed(_:tryLoc:subExpr:)")
765+
BridgedTryExpr BridgedTryExpr_createParsed(BridgedASTContext cContext,
766+
BridgedSourceLoc cTryLoc,
767+
BridgedExpr cSubExpr);
768+
733769
SWIFT_NAME("BridgedTupleExpr.createParsed(_:leftParenLoc:exprs:labels:"
734770
"labelLocs:rightParenLoc:)")
735771
BridgedTupleExpr BridgedTupleExpr_createParsed(

lib/AST/ASTBridging.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,20 @@ BridgedAssignExpr BridgedAssignExpr_createParsed(BridgedASTContext cContext,
869869
return new (cContext.unbridged()) AssignExpr(cEqualsLoc.unbridged());
870870
}
871871

872+
BridgedAwaitExpr BridgedAwaitExpr_createParsed(BridgedASTContext cContext,
873+
BridgedSourceLoc cAwaitLoc,
874+
BridgedExpr cSubExpr) {
875+
return new (cContext.unbridged())
876+
AwaitExpr(cAwaitLoc.unbridged(), cSubExpr.unbridged());
877+
}
878+
879+
BridgedBorrowExpr BridgedBorrowExpr_createParsed(BridgedASTContext cContext,
880+
BridgedSourceLoc cBorrowLoc,
881+
BridgedExpr cSubExpr) {
882+
return new (cContext.unbridged())
883+
BorrowExpr(cBorrowLoc.unbridged(), cSubExpr.unbridged());
884+
}
885+
872886
BridgedClosureExpr
873887
BridgedClosureExpr_createParsed(BridgedASTContext cContext,
874888
BridgedDeclContext cDeclContext,
@@ -910,6 +924,20 @@ BridgedConditionalCheckedCastExpr_createParsed(BridgedASTContext cContext,
910924
cType.unbridged());
911925
}
912926

927+
BridgedConsumeExpr BridgedConsumeExpr_createParsed(BridgedASTContext cContext,
928+
BridgedSourceLoc cConsumeLoc,
929+
BridgedExpr cSubExpr) {
930+
return new (cContext.unbridged())
931+
ConsumeExpr(cConsumeLoc.unbridged(), cSubExpr.unbridged());
932+
}
933+
934+
BridgedCopyExpr BridgedCopyExpr_createParsed(BridgedASTContext cContext,
935+
BridgedSourceLoc cCopyLoc,
936+
BridgedExpr cSubExpr) {
937+
return new (cContext.unbridged())
938+
CopyExpr(cCopyLoc.unbridged(), cSubExpr.unbridged());
939+
}
940+
913941
BridgedDiscardAssignmentExpr
914942
BridgedDiscardAssignmentExpr_createParsed(BridgedASTContext cContext,
915943
BridgedSourceLoc cLoc) {
@@ -927,6 +955,14 @@ BridgedDictionaryExpr BridgedDictionaryExpr_createParsed(
927955
cRBracketLoc.unbridged());
928956
}
929957

958+
BridgedForceTryExpr
959+
BridgedForceTryExpr_createParsed(BridgedASTContext cContext,
960+
BridgedSourceLoc cTryLoc, BridgedExpr cSubExpr,
961+
BridgedSourceLoc cExclaimLoc) {
962+
return new (cContext.unbridged()) ForceTryExpr(
963+
cTryLoc.unbridged(), cSubExpr.unbridged(), cExclaimLoc.unbridged());
964+
}
965+
930966
BridgedForcedCheckedCastExpr BridgedForcedCheckedCastExpr_createParsed(
931967
BridgedASTContext cContext, BridgedSourceLoc cAsLoc,
932968
BridgedSourceLoc cExclaimLoc, BridgedTypeRepr cType) {
@@ -951,11 +987,25 @@ BridgedIsExpr BridgedIsExpr_createParsed(BridgedASTContext cContext,
951987
cType.unbridged());
952988
}
953989

990+
BridgedOptionalTryExpr BridgedOptionalTryExpr_createParsed(
991+
BridgedASTContext cContext, BridgedSourceLoc cTryLoc, BridgedExpr cSubExpr,
992+
BridgedSourceLoc cQuestionLoc) {
993+
return new (cContext.unbridged()) OptionalTryExpr(
994+
cTryLoc.unbridged(), cSubExpr.unbridged(), cQuestionLoc.unbridged());
995+
}
996+
954997
BridgedSequenceExpr BridgedSequenceExpr_createParsed(BridgedASTContext cContext,
955998
BridgedArrayRef exprs) {
956999
return SequenceExpr::create(cContext.unbridged(), exprs.unbridged<Expr *>());
9571000
}
9581001

1002+
BridgedTryExpr BridgedTryExpr_createParsed(BridgedASTContext cContext,
1003+
BridgedSourceLoc cTryLoc,
1004+
BridgedExpr cSubExpr) {
1005+
return new (cContext.unbridged())
1006+
TryExpr(cTryLoc.unbridged(), cSubExpr.unbridged());
1007+
}
1008+
9591009
BridgedTupleExpr BridgedTupleExpr_createParsed(BridgedASTContext cContext,
9601010
BridgedSourceLoc cLParen,
9611011
BridgedArrayRef subs,

lib/ASTGen/Sources/ASTGen/Exprs.swift

Lines changed: 82 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ func isExprMigrated(_ node: ExprSyntax) -> Bool {
4040
while true {
4141
switch current.kind {
4242
case // Known implemented kinds.
43-
.arrayExpr, .arrowExpr, .assignmentExpr, .binaryOperatorExpr,
44-
.booleanLiteralExpr, .closureExpr, .discardAssignmentExpr,
45-
.declReferenceExpr, .dictionaryExpr, .functionCallExpr, .ifExpr,
46-
.integerLiteralExpr, .memberAccessExpr, .nilLiteralExpr,
47-
.postfixOperatorExpr, .prefixOperatorExpr, .sequenceExpr,
48-
.stringLiteralExpr, .tupleExpr, .typeExpr, .unresolvedAsExpr,
49-
.unresolvedIsExpr, .unresolvedTernaryExpr:
43+
.arrayExpr, .arrowExpr, .assignmentExpr, .awaitExpr, .binaryOperatorExpr,
44+
.booleanLiteralExpr, .borrowExpr, .closureExpr, .consumeExpr, .copyExpr,
45+
.discardAssignmentExpr, .declReferenceExpr, .dictionaryExpr,
46+
.functionCallExpr, .ifExpr, .integerLiteralExpr, .memberAccessExpr,
47+
.nilLiteralExpr, .postfixOperatorExpr, .prefixOperatorExpr,
48+
.sequenceExpr, .stringLiteralExpr, .tryExpr, .tupleExpr, .typeExpr,
49+
.unresolvedAsExpr, .unresolvedIsExpr, .unresolvedTernaryExpr:
5050

5151
// `generate(stringLiteralExpr:)` doesn't support interpolations.
5252
if let str = current.as(StringLiteralExprSyntax.self) {
@@ -58,13 +58,13 @@ func isExprMigrated(_ node: ExprSyntax) -> Bool {
5858

5959
break
6060
case // Known unimplemented kinds.
61-
.asExpr, .awaitExpr, .borrowExpr, .canImportExpr, .canImportVersionInfo,
61+
.asExpr, .canImportExpr, .canImportVersionInfo,
6262
.doExpr, .editorPlaceholderExpr, .floatLiteralExpr, .forceUnwrapExpr,
6363
.inOutExpr, .infixOperatorExpr, .isExpr, .keyPathExpr,
64-
.macroExpansionExpr, .consumeExpr, .copyExpr, .optionalChainingExpr,
64+
.macroExpansionExpr, .optionalChainingExpr,
6565
.packElementExpr, .packExpansionExpr, .postfixIfConfigExpr,
6666
.regexLiteralExpr, .genericSpecializationExpr, .simpleStringLiteralExpr,
67-
.subscriptCallExpr, .superExpr, .switchExpr, .ternaryExpr, .tryExpr,
67+
.subscriptCallExpr, .superExpr, .switchExpr, .ternaryExpr,
6868
.patternExpr:
6969
return false
7070
case // Unknown expr kinds.
@@ -96,24 +96,24 @@ extension ASTGenVisitor {
9696
break
9797
case .assignmentExpr:
9898
preconditionFailure("should be handled in generate(sequenceExpr:)")
99-
case .awaitExpr:
100-
break
99+
case .awaitExpr(let node):
100+
return self.generate(awaitExpr: node).asExpr
101101
case .binaryOperatorExpr:
102102
preconditionFailure("should be handled in generate(sequenceExpr:)")
103103
case .booleanLiteralExpr(let node):
104104
return self.generate(booleanLiteralExpr: node).asExpr
105-
case .borrowExpr:
106-
break
105+
case .borrowExpr(let node):
106+
return self.generate(borrowExpr: node).asExpr
107107
case .canImportExpr:
108108
break
109109
case .canImportVersionInfo:
110110
break
111111
case .closureExpr(let node):
112112
return self.generate(closureExpr: node).asExpr
113-
case .consumeExpr:
114-
break
115-
case .copyExpr:
116-
break
113+
case .consumeExpr(let node):
114+
return self.generate(consumeExpr: node).asExpr
115+
case .copyExpr(let node):
116+
return self.generate(copyExpr: node).asExpr
117117
case .declReferenceExpr(let node):
118118
return self.generate(declReferenceExpr: node).asExpr
119119
case .dictionaryExpr(let node):
@@ -183,8 +183,8 @@ extension ASTGenVisitor {
183183
break
184184
case .ternaryExpr:
185185
break
186-
case .tryExpr:
187-
break
186+
case .tryExpr(let node):
187+
return self.generate(tryExpr: node)
188188
case .tupleExpr(let node):
189189
return self.generate(tupleExpr: node).asExpr
190190
case .typeExpr(let node):
@@ -235,6 +235,22 @@ extension ASTGenVisitor {
235235
return .createParsed(self.ctx, equalsLoc: self.generateSourceLoc(node.equal))
236236
}
237237

238+
func generate(awaitExpr node: AwaitExprSyntax) -> BridgedAwaitExpr {
239+
return .createParsed(
240+
self.ctx,
241+
awaitLoc: self.generateSourceLoc(node.awaitKeyword),
242+
subExpr: self.generate(expr: node.expression)
243+
)
244+
}
245+
246+
func generate(borrowExpr node: BorrowExprSyntax) -> BridgedBorrowExpr {
247+
return .createParsed(
248+
self.ctx,
249+
borrowLoc: self.generateSourceLoc(node.borrowKeyword),
250+
subExpr: self.generate(expr: node.expression)
251+
)
252+
}
253+
238254
func generate(binaryOperatorExpr node: BinaryOperatorExprSyntax) -> BridgedUnresolvedDeclRefExpr {
239255
return createOperatorRefExpr(token: node.operator, kind: .binaryOperator)
240256
}
@@ -251,6 +267,22 @@ extension ASTGenVisitor {
251267
return .createParsed(self.ctx, declContext: self.declContext, body: body)
252268
}
253269

270+
func generate(consumeExpr node: ConsumeExprSyntax) -> BridgedConsumeExpr {
271+
return .createParsed(
272+
self.ctx,
273+
consumeLoc: self.generateSourceLoc(node.consumeKeyword),
274+
subExpr: self.generate(expr: node.expression)
275+
)
276+
}
277+
278+
func generate(copyExpr node: CopyExprSyntax) -> BridgedCopyExpr {
279+
return .createParsed(
280+
self.ctx,
281+
copyLoc: self.generateSourceLoc(node.copyKeyword),
282+
subExpr: self.generate(expr: node.expression)
283+
)
284+
}
285+
254286
func generate(functionCallExpr node: FunctionCallExprSyntax) -> BridgedCallExpr {
255287
if !node.arguments.isEmpty || node.trailingClosure == nil {
256288
if node.leftParen == nil {
@@ -471,6 +503,36 @@ extension ASTGenVisitor {
471503
).asExpr
472504
}
473505

506+
func generate(tryExpr node: TryExprSyntax) -> BridgedExpr {
507+
let tryLoc = self.generateSourceLoc(node.tryKeyword)
508+
let subExpr = self.generate(expr: node.expression)
509+
510+
switch node.questionOrExclamationMark {
511+
case nil:
512+
return BridgedTryExpr.createParsed(
513+
self.ctx,
514+
tryLoc: tryLoc,
515+
subExpr: subExpr
516+
).asExpr
517+
case let exclaim? where exclaim.rawTokenKind == .exclamationMark:
518+
return BridgedForceTryExpr.createParsed(
519+
self.ctx,
520+
tryLoc: tryLoc,
521+
subExpr: subExpr,
522+
exclaimLoc: self.generateSourceLoc(exclaim)
523+
).asExpr
524+
case let question? where question.rawTokenKind == .postfixQuestionMark:
525+
return BridgedOptionalTryExpr.createParsed(
526+
self.ctx,
527+
tryLoc: tryLoc,
528+
subExpr: subExpr,
529+
questionLoc: self.generateSourceLoc(question)
530+
).asExpr
531+
default:
532+
preconditionFailure("TryExprSyntax.questionOrExclamationMark must be .exclamationMark or .postfixQuestionMark")
533+
}
534+
}
535+
474536
func generate(tupleExpr node: TupleExprSyntax) -> BridgedTupleExpr {
475537
return self.generate(labeledExprList: node.elements, leftParen: node.leftParen, rightParen: node.rightParen)
476538
}

test/ASTGen/verify-parse.swift

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
// RUN: %empty-directory(%t)
3-
// RUN: %target-swift-frontend %s -dump-parse -disable-availability-checking -enable-experimental-feature ParserASTGen > %t/astgen.ast
4-
// RUN: %target-swift-frontend %s -dump-parse -disable-availability-checking > %t/cpp-parser.ast
3+
// RUN: %target-swift-frontend %s -dump-parse -disable-availability-checking -enable-experimental-move-only -enable-experimental-feature ParserASTGen > %t/astgen.ast
4+
// RUN: %target-swift-frontend %s -dump-parse -disable-availability-checking -enable-experimental-move-only > %t/cpp-parser.ast
55
// RUN: %diff -u %t/astgen.ast %t/cpp-parser.ast
66

77
// RUN: %target-run-simple-swift(-Xfrontend -disable-availability-checking -enable-experimental-feature SwiftParser -enable-experimental-feature ParserASTGen)
@@ -244,3 +244,13 @@ func testSequence(arg1: Int, arg2: () -> Int, arg3: Any) {
244244
_ = [@Sendable () -> Int]().count + [any Collection]().count
245245
_ = arg3 is Double || !(arg3 is Int, 0).0
246246
}
247+
248+
func asyncFunc(_ arg: String) async throws -> Int {
249+
return 1
250+
}
251+
func testUnaryExprs() async throws {
252+
let str = String()
253+
let foo = try await asyncFunc(_borrow str)
254+
let bar = copy foo
255+
let baz = consume foo
256+
}

0 commit comments

Comments
 (0)