Skip to content

Commit 471cba2

Browse files
committed
[ASTGen] Implement dictionary literal expression generation
1 parent 8b026f2 commit 471cba2

File tree

5 files changed

+88
-21
lines changed

5 files changed

+88
-21
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -661,12 +661,6 @@ BridgedCallExpr BridgedCallExpr_createParsed(BridgedASTContext cContext,
661661
BridgedExpr fn,
662662
BridgedTupleExpr args);
663663

664-
SWIFT_NAME("BridgedDotSelfExpr.createParsed(_:subExpr:dotLoc:selfLoc:)")
665-
BridgedDotSelfExpr BridgedDotSelfExpr_createParsed(BridgedASTContext cContext,
666-
BridgedExpr cSubExpr,
667-
BridgedSourceLoc cDotLoc,
668-
BridgedSourceLoc cSelfLoc);
669-
670664
SWIFT_NAME("BridgedClosureExpr.createParsed(_:declContext:body:)")
671665
BridgedClosureExpr
672666
BridgedClosureExpr_createParsed(BridgedASTContext cContext,
@@ -691,6 +685,19 @@ BridgedDiscardAssignmentExpr
691685
BridgedDiscardAssignmentExpr_createParsed(BridgedASTContext cContext,
692686
BridgedSourceLoc cLoc);
693687

688+
SWIFT_NAME("BridgedDictionaryExpr.createParsed(_:lBracketLoc:elements:"
689+
"colonLocs:rBracketLoc:)")
690+
BridgedDictionaryExpr BridgedDictionaryExpr_createParsed(
691+
BridgedASTContext cContext, BridgedSourceLoc cLBracketLoc,
692+
BridgedArrayRef cElements, BridgedArrayRef cCommaLocs,
693+
BridgedSourceLoc cRBracketLoc);
694+
695+
SWIFT_NAME("BridgedDotSelfExpr.createParsed(_:subExpr:dotLoc:selfLoc:)")
696+
BridgedDotSelfExpr BridgedDotSelfExpr_createParsed(BridgedASTContext cContext,
697+
BridgedExpr cSubExpr,
698+
BridgedSourceLoc cDotLoc,
699+
BridgedSourceLoc cSelfLoc);
700+
694701
SWIFT_NAME(
695702
"BridgedForcedCheckedCastExpr.createParsed(_:asLoc:exclaimLoc:type:)")
696703
BridgedForcedCheckedCastExpr BridgedForcedCheckedCastExpr_createParsed(
@@ -729,6 +736,10 @@ BridgedTupleExpr BridgedTupleExpr_createParsed(
729736
BridgedASTContext cContext, BridgedSourceLoc cLParen, BridgedArrayRef subs,
730737
BridgedArrayRef names, BridgedArrayRef cNameLocs, BridgedSourceLoc cRParen);
731738

739+
SWIFT_NAME("BridgedTupleExpr.createParsedDictionaryElement(_:key:value:)")
740+
BridgedTupleExpr BridgedTupleExpr_createParsedDictionaryElement(
741+
BridgedASTContext cContext, BridgedExpr cKeyExpr, BridgedExpr cValueExpr);
742+
732743
SWIFT_NAME("BridgedIntegerLiteralExpr.createParsed(_:value:loc:)")
733744
BridgedIntegerLiteralExpr
734745
BridgedIntegerLiteralExpr_createParsed(BridgedASTContext cContext,

lib/AST/ASTBridging.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -917,6 +917,16 @@ BridgedDiscardAssignmentExpr_createParsed(BridgedASTContext cContext,
917917
DiscardAssignmentExpr(cLoc.unbridged(), /*Implicit=*/false);
918918
}
919919

920+
BridgedDictionaryExpr BridgedDictionaryExpr_createParsed(
921+
BridgedASTContext cContext, BridgedSourceLoc cLBracketLoc,
922+
BridgedArrayRef cElements, BridgedArrayRef cCommaLocs,
923+
BridgedSourceLoc cRBracketLoc) {
924+
return DictionaryExpr::create(cContext.unbridged(), cLBracketLoc.unbridged(),
925+
cElements.unbridged<Expr *>(),
926+
cCommaLocs.unbridged<SourceLoc>(),
927+
cRBracketLoc.unbridged());
928+
}
929+
920930
BridgedForcedCheckedCastExpr BridgedForcedCheckedCastExpr_createParsed(
921931
BridgedASTContext cContext, BridgedSourceLoc cAsLoc,
922932
BridgedSourceLoc cExclaimLoc, BridgedTypeRepr cType) {
@@ -959,6 +969,12 @@ BridgedTupleExpr BridgedTupleExpr_createParsed(BridgedASTContext cContext,
959969
cRParen.unbridged(), /*Implicit*/ false);
960970
}
961971

972+
BridgedTupleExpr BridgedTupleExpr_createParsedDictionaryElement(
973+
BridgedASTContext cContext, BridgedExpr cKeyExpr, BridgedExpr cValueExpr) {
974+
return TupleExpr::createImplicit(
975+
cContext.unbridged(), {cKeyExpr.unbridged(), cValueExpr.unbridged()}, {});
976+
}
977+
962978
BridgedCallExpr BridgedCallExpr_createParsed(BridgedASTContext cContext,
963979
BridgedExpr fn,
964980
BridgedTupleExpr args) {

lib/ASTGen/Sources/ASTGen/Exprs.swift

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,11 @@ func isExprMigrated(_ node: ExprSyntax) -> Bool {
4242
case // Known implemented kinds.
4343
.arrayExpr, .arrowExpr, .assignmentExpr, .binaryOperatorExpr,
4444
.booleanLiteralExpr, .closureExpr, .discardAssignmentExpr,
45-
.declReferenceExpr, .functionCallExpr, .ifExpr, .integerLiteralExpr,
46-
.memberAccessExpr, .nilLiteralExpr, .postfixOperatorExpr,
47-
.prefixOperatorExpr, .sequenceExpr, .stringLiteralExpr, .tupleExpr,
48-
.typeExpr, .unresolvedAsExpr, .unresolvedIsExpr, .unresolvedTernaryExpr:
45+
.declReferenceExpr, .dictionaryExpr, .functionCallExpr, .ifExpr,
46+
.integerLiteralExpr, .memberAccessExpr, .nilLiteralExpr,
47+
.postfixOperatorExpr, .prefixOperatorExpr, .sequenceExpr,
48+
.stringLiteralExpr, .tupleExpr, .typeExpr, .unresolvedAsExpr,
49+
.unresolvedIsExpr, .unresolvedTernaryExpr:
4950

5051
// `generate(stringLiteralExpr:)` doesn't support interpolations.
5152
if let str = current.as(StringLiteralExprSyntax.self) {
@@ -57,15 +58,14 @@ func isExprMigrated(_ node: ExprSyntax) -> Bool {
5758

5859
break
5960
case // Known unimplemented kinds.
60-
.asExpr, .awaitExpr,
61-
.borrowExpr, .canImportExpr, .canImportVersionInfo, .dictionaryExpr,
62-
.doExpr, .editorPlaceholderExpr,
63-
.floatLiteralExpr, .forceUnwrapExpr, .inOutExpr, .infixOperatorExpr,
64-
.isExpr, .keyPathExpr, .macroExpansionExpr, .consumeExpr, .copyExpr,
65-
.optionalChainingExpr, .packElementExpr, .packExpansionExpr,
66-
.postfixIfConfigExpr, .regexLiteralExpr, .genericSpecializationExpr,
67-
.simpleStringLiteralExpr, .subscriptCallExpr, .superExpr, .switchExpr,
68-
.ternaryExpr, .tryExpr, .patternExpr:
61+
.asExpr, .awaitExpr, .borrowExpr, .canImportExpr, .canImportVersionInfo,
62+
.doExpr, .editorPlaceholderExpr, .floatLiteralExpr, .forceUnwrapExpr,
63+
.inOutExpr, .infixOperatorExpr, .isExpr, .keyPathExpr,
64+
.macroExpansionExpr, .consumeExpr, .copyExpr, .optionalChainingExpr,
65+
.packElementExpr, .packExpansionExpr, .postfixIfConfigExpr,
66+
.regexLiteralExpr, .genericSpecializationExpr, .simpleStringLiteralExpr,
67+
.subscriptCallExpr, .superExpr, .switchExpr, .ternaryExpr, .tryExpr,
68+
.patternExpr:
6969
return false
7070
case // Unknown expr kinds.
7171
_ where current.is(ExprSyntax.self):
@@ -116,8 +116,8 @@ extension ASTGenVisitor {
116116
break
117117
case .declReferenceExpr(let node):
118118
return self.generate(declReferenceExpr: node).asExpr
119-
case .dictionaryExpr:
120-
break
119+
case .dictionaryExpr(let node):
120+
return self.generate(dictionaryExpr: node).asExpr
121121
case .discardAssignmentExpr(let node):
122122
return self.generate(discardAssignmentExpr: node).asExpr
123123
case .doExpr:

lib/ASTGen/Sources/ASTGen/Literals.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,41 @@ extension ASTGenVisitor {
6363
)
6464
}
6565

66+
private func generate(dictionaryElement node: DictionaryElementSyntax) -> BridgedTupleExpr {
67+
return BridgedTupleExpr.createParsedDictionaryElement(
68+
self.ctx,
69+
key: self.generate(expr: node.key),
70+
value: self.generate(expr: node.value)
71+
)
72+
}
73+
74+
public func generate(dictionaryExpr node: DictionaryExprSyntax) -> BridgedDictionaryExpr {
75+
let lBracketLoc = self.generateSourceLoc(node.leftSquare)
76+
let rBracketLoc = self.generateSourceLoc(node.rightSquare)
77+
let elements: BridgedArrayRef
78+
let colonLocs: BridgedArrayRef
79+
80+
switch node.content {
81+
case .colon(_):
82+
elements = BridgedArrayRef()
83+
colonLocs = BridgedArrayRef()
84+
case .elements(let elementNodes):
85+
elements = elementNodes.lazy
86+
.map({ self.generate(dictionaryElement: $0).asExpr })
87+
.bridgedArray(in: self)
88+
colonLocs = elementNodes.lazy
89+
.map({ self.generateSourceLoc($0.colon) })
90+
.bridgedArray(in: self)
91+
}
92+
return .createParsed(
93+
self.ctx,
94+
lBracketLoc: lBracketLoc,
95+
elements: elements,
96+
colonLocs: colonLocs,
97+
rBracketLoc: rBracketLoc
98+
)
99+
}
100+
66101
func generate(nilLiteralExpr node: NilLiteralExprSyntax) -> BridgedNilLiteralExpr {
67102
.createParsed(
68103
self.ctx,

test/ASTGen/verify-parse.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,15 @@ Int {
4040

4141
let arlit = [0]
4242
let tuple = (0, 1)
43+
let diclit = [0: 1, 2: 3]
4344

4445
return fn(x)
4546
}
4647

48+
func testEmptyDictionary() -> [Int: Int] {
49+
return [:]
50+
}
51+
4752
func test2(e b: Bool) {
4853
if b
4954
{

0 commit comments

Comments
 (0)