Skip to content

Commit 37d8b06

Browse files
committed
[astgen] Support labeled tuples.
1 parent 738b89e commit 37d8b06

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

include/swift/AST/CASTBridging.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ void *ReturnStmt_create(void *ctx, void *loc, void *_Nullable expr);
110110
void *SwiftSequenceExpr_create(void *ctx, BridgedArrayRef exprs);
111111

112112
void *SwiftTupleExpr_create(void *ctx, void *lparen, BridgedArrayRef subs,
113+
BridgedArrayRef names,
114+
BridgedArrayRef nameLocs,
113115
void *rparen);
114116

115117
void *SwiftFunctionCallExpr_create(void *ctx, void *fn, void *args);

lib/AST/CASTBridging.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,14 @@ void *SwiftSequenceExpr_create(void *ctx, BridgedArrayRef exprs) {
8787
}
8888

8989
void *SwiftTupleExpr_create(void *ctx, void *lparen, BridgedArrayRef subs,
90+
BridgedArrayRef names,
91+
BridgedArrayRef nameLocs,
9092
void *rparen) {
93+
auto &Context = *static_cast<ASTContext *>(ctx);
9194
return TupleExpr::create(
92-
*static_cast<ASTContext *>(ctx), getSourceLocFromPointer(lparen),
93-
getArrayRef<Expr *>(subs), {}, {}, getSourceLocFromPointer(rparen),
95+
Context, getSourceLocFromPointer(lparen),
96+
getArrayRef<Expr *>(subs), getArrayRef<Identifier>(names),
97+
getArrayRef<SourceLoc>(nameLocs), getSourceLocFromPointer(rparen),
9498
/*Implicit*/ false);
9599
}
96100

lib/ASTGen/Sources/ASTGen/Exprs.swift

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ extension ASTGenVisitor {
2424
}
2525

2626
let args = visit(node.argumentList).rawValue
27-
// TODO: hack
2827
let callee = visit(node.calledExpression).rawValue
2928

3029
return .expr(SwiftFunctionCallExpr_create(self.ctx, callee, args))
@@ -65,13 +64,28 @@ extension ASTGenVisitor {
6564

6665
public func visit(_ node: TupleExprElementListSyntax) -> ASTNode {
6766
let elements = node.map { self.visit($0).rawValue }
67+
let labels = node.enumerated().map { (idx, e) in
68+
var name = e.label?.text ?? "\(idx)"
69+
return name.withUTF8 { buf in
70+
SwiftASTContext_getIdentifier(ctx, buf.baseAddress, buf.count)
71+
}
72+
}
73+
let labelLocs = node.map {
74+
let pos = $0.label?.position ?? $0.position
75+
return base.advanced(by: pos.utf8Offset).raw
76+
}
6877

6978
let lParenLoc = self.base.advanced(by: node.position.utf8Offset).raw
7079
let rParenLoc = self.base.advanced(by: node.endPosition.utf8Offset).raw
7180

7281
return .expr(
7382
elements.withBridgedArrayRef { elementsRef in
74-
SwiftTupleExpr_create(self.ctx, lParenLoc, elementsRef, rParenLoc)
83+
labels.withBridgedArrayRef { labelsRef in
84+
labelLocs.withBridgedArrayRef { labelLocRef in
85+
SwiftTupleExpr_create(self.ctx, lParenLoc, elementsRef, labelsRef,
86+
labelLocRef, rParenLoc)
87+
}
88+
}
7589
})
7690
}
7791
}

0 commit comments

Comments
 (0)