Skip to content

Commit 76b4854

Browse files
committed
[ASTGen] Implement PackElement and PackExpansion expressions
1 parent 21aeb90 commit 76b4854

File tree

4 files changed

+60
-11
lines changed

4 files changed

+60
-11
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -740,6 +740,18 @@ BridgedOptionalTryExpr BridgedOptionalTryExpr_createParsed(
740740
BridgedASTContext cContext, BridgedSourceLoc cTryLoc, BridgedExpr cSubExpr,
741741
BridgedSourceLoc cQuestionLoc);
742742

743+
SWIFT_NAME("BridgedPackElementExpr.createParsed(_:eachLoc:packRefExpr:)")
744+
BridgedPackElementExpr
745+
BridgedPackElementExpr_createParsed(BridgedASTContext cContext,
746+
BridgedSourceLoc cEachLoc,
747+
BridgedExpr cPackRefExpr);
748+
749+
SWIFT_NAME("BridgedPackExpansionExpr.createParsed(_:repeatLoc:patternExpr:)")
750+
BridgedPackExpansionExpr
751+
BridgedPackExpansionExpr_createParsed(BridgedASTContext cContext,
752+
BridgedSourceLoc cRepeatLoc,
753+
BridgedExpr cPatternExpr);
754+
743755
SWIFT_NAME("BridgedSingleValueStmtExpr.createWithWrappedBranches(_:stmt:"
744756
"declContext:mustBeExpr:)")
745757
BridgedSingleValueStmtExpr BridgedSingleValueStmtExpr_createWithWrappedBranches(

lib/AST/ASTBridging.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,23 @@ BridgedOptionalTryExpr BridgedOptionalTryExpr_createParsed(
994994
cTryLoc.unbridged(), cSubExpr.unbridged(), cQuestionLoc.unbridged());
995995
}
996996

997+
BridgedPackElementExpr
998+
BridgedPackElementExpr_createParsed(BridgedASTContext cContext,
999+
BridgedSourceLoc cEachLoc,
1000+
BridgedExpr cPackRefExpr) {
1001+
return PackElementExpr::create(cContext.unbridged(), cEachLoc.unbridged(),
1002+
cPackRefExpr.unbridged());
1003+
}
1004+
1005+
BridgedPackExpansionExpr
1006+
BridgedPackExpansionExpr_createParsed(BridgedASTContext cContext,
1007+
BridgedSourceLoc cRepeatLoc,
1008+
BridgedExpr cPatternExpr) {
1009+
return PackExpansionExpr::create(cContext.unbridged(), cRepeatLoc.unbridged(),
1010+
cPatternExpr.unbridged(),
1011+
/*genericEnv=*/nullptr);
1012+
}
1013+
9971014
BridgedSequenceExpr BridgedSequenceExpr_createParsed(BridgedASTContext cContext,
9981015
BridgedArrayRef exprs) {
9991016
return SequenceExpr::create(cContext.unbridged(), exprs.unbridged<Expr *>());

lib/ASTGen/Sources/ASTGen/Exprs.swift

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,10 @@ func isExprMigrated(_ node: ExprSyntax) -> Bool {
4444
.booleanLiteralExpr, .borrowExpr, .closureExpr, .consumeExpr, .copyExpr,
4545
.discardAssignmentExpr, .declReferenceExpr, .dictionaryExpr,
4646
.functionCallExpr, .ifExpr, .integerLiteralExpr, .memberAccessExpr,
47-
.nilLiteralExpr, .postfixOperatorExpr, .prefixOperatorExpr,
48-
.sequenceExpr, .stringLiteralExpr, .tryExpr, .tupleExpr, .typeExpr,
49-
.unresolvedAsExpr, .unresolvedIsExpr, .unresolvedTernaryExpr:
47+
.nilLiteralExpr, .packElementExpr, .packExpansionExpr,
48+
.postfixOperatorExpr, .prefixOperatorExpr, .sequenceExpr,
49+
.stringLiteralExpr, .tryExpr, .tupleExpr, .typeExpr, .unresolvedAsExpr,
50+
.unresolvedIsExpr, .unresolvedTernaryExpr:
5051

5152
// `generate(stringLiteralExpr:)` doesn't support interpolations.
5253
if let str = current.as(StringLiteralExprSyntax.self) {
@@ -62,10 +63,9 @@ func isExprMigrated(_ node: ExprSyntax) -> Bool {
6263
.doExpr, .editorPlaceholderExpr, .floatLiteralExpr, .forceUnwrapExpr,
6364
.inOutExpr, .infixOperatorExpr, .isExpr, .keyPathExpr,
6465
.macroExpansionExpr, .optionalChainingExpr,
65-
.packElementExpr, .packExpansionExpr, .postfixIfConfigExpr,
66-
.regexLiteralExpr, .genericSpecializationExpr, .simpleStringLiteralExpr,
67-
.subscriptCallExpr, .superExpr, .switchExpr, .ternaryExpr,
68-
.patternExpr:
66+
.postfixIfConfigExpr, .regexLiteralExpr, .genericSpecializationExpr,
67+
.simpleStringLiteralExpr, .subscriptCallExpr, .superExpr, .switchExpr,
68+
.ternaryExpr, .patternExpr:
6969
return false
7070
case // Unknown expr kinds.
7171
_ where current.is(ExprSyntax.self):
@@ -155,10 +155,10 @@ extension ASTGenVisitor {
155155
case .optionalChainingExpr:
156156
// Need special care to wrap the entire postfix chain with OptionalEvaluationExpr.
157157
break
158-
case .packElementExpr:
159-
break
160-
case .packExpansionExpr:
161-
break
158+
case .packElementExpr(let node):
159+
return self.generate(packElementExpr: node).asExpr
160+
case .packExpansionExpr(let node):
161+
return self.generate(packExpansionExpr: node).asExpr
162162
case .patternExpr:
163163
break
164164
case .postfixIfConfigExpr:
@@ -413,6 +413,22 @@ extension ASTGenVisitor {
413413
}
414414
}
415415

416+
func generate(packElementExpr node: PackElementExprSyntax) -> BridgedPackElementExpr {
417+
return .createParsed(
418+
self.ctx,
419+
eachLoc: self.generateSourceLoc(node.eachKeyword),
420+
packRefExpr: self.generate(expr: node.pack)
421+
)
422+
}
423+
424+
func generate(packExpansionExpr node: PackExpansionExprSyntax) -> BridgedPackExpansionExpr {
425+
return .createParsed(
426+
self.ctx,
427+
repeatLoc: self.generateSourceLoc(node.repeatKeyword),
428+
patternExpr: self.generate(expr: node.repetitionPattern)
429+
)
430+
}
431+
416432
func generate(ifExpr node: IfExprSyntax) -> BridgedSingleValueStmtExpr {
417433
let stmt = makeIfStmt(node).asStmt
418434

test/ASTGen/verify-parse.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,3 +248,7 @@ func testUnaryExprs() async throws {
248248
let bar = copy foo
249249
let baz = consume foo
250250
}
251+
252+
func testRepeatEach<each T>(_ t: repeat each T) -> (repeat each T) {
253+
return (repeat each t)
254+
}

0 commit comments

Comments
 (0)