Skip to content

Commit e5592c7

Browse files
committed
[ASTGen] Generate interpolated string literal
1 parent cbae07e commit e5592c7

File tree

8 files changed

+310
-27
lines changed

8 files changed

+310
-27
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,12 @@ BridgedDeclNameRef
126126
BridgedDeclNameRef_createParsed(BridgedDeclBaseName cBaseName);
127127

128128
class BridgedDeclNameLoc {
129-
const void *_Nonnull LocationInfo;
129+
const void *_Nullable LocationInfo;
130130
size_t NumArgumentLabels;
131131

132132
public:
133+
BridgedDeclNameLoc() : LocationInfo(nullptr), NumArgumentLabels(0) {}
134+
133135
#ifdef USED_IN_CPP_SOURCE
134136
BridgedDeclNameLoc(swift::DeclNameLoc loc)
135137
: LocationInfo(loc.LocationInfo),
@@ -1025,6 +1027,10 @@ BridgedSubscriptDecl_asAbstractStorageDecl(BridgedSubscriptDecl decl);
10251027
// MARK: VarDecl
10261028
//===----------------------------------------------------------------------===//
10271029

1030+
SWIFT_NAME("BridgedVarDecl.createImplicitStringInterpolationVar(_:)")
1031+
BridgedVarDecl BridgedVarDec_createImplicitStringInterpolationVar(
1032+
BridgedDeclContext cDeclContext);
1033+
10281034
SWIFT_NAME("BridgedVarDecl.getSourceLocation(self:)")
10291035
BRIDGED_INLINE BridgedSourceLoc BridgedVarDecl_getSourceLocation(BridgedVarDecl decl);
10301036

@@ -1054,6 +1060,11 @@ struct BridgedCallArgument {
10541060
#endif
10551061
};
10561062

1063+
SWIFT_NAME("BridgedArgumentList.createImplicitUnlabeled(_:exprs:)")
1064+
BridgedArgumentList
1065+
BridgedArgumentList_createImplicitUnlabeled(BridgedASTContext cContext,
1066+
BridgedArrayRef cExprs);
1067+
10571068
SWIFT_NAME("BridgedArgumentList.createParsed(_:lParenLoc:args:rParenLoc:"
10581069
"firstTrailingClosureIndex:)")
10591070
BridgedArgumentList BridgedArgumentList_createParsed(
@@ -1129,6 +1140,12 @@ BridgedCopyExpr BridgedCopyExpr_createParsed(BridgedASTContext cContext,
11291140
BridgedSourceLoc cCopyLoc,
11301141
BridgedExpr cSubExpr);
11311142

1143+
SWIFT_NAME("BridgedDeclRefExpr.create(_:decl:loc:isImplicit:)")
1144+
BridgedDeclRefExpr BridgedDeclRefExpr_create(BridgedASTContext cContext,
1145+
BridgedDecl cDecl,
1146+
BridgedDeclNameLoc cLoc,
1147+
bool IsImplicit);
1148+
11321149
SWIFT_NAME("BridgedDictionaryExpr.createParsed(_:lBracketLoc:elements:"
11331150
"colonLocs:rBracketLoc:)")
11341151
BridgedDictionaryExpr BridgedDictionaryExpr_createParsed(
@@ -1165,6 +1182,13 @@ BridgedIntegerLiteralExpr_createParsed(BridgedASTContext cContext,
11651182
BridgedStringRef cStr,
11661183
BridgedSourceLoc cTokenLoc);
11671184

1185+
SWIFT_NAME("BridgedInterpolatedStringLiteralExpr.createParsed(_:loc:"
1186+
"literalCapacity:interpolationCount:appendingExpr:)")
1187+
BridgedInterpolatedStringLiteralExpr
1188+
BridgedInterpolatedStringLiteralExpr_createParsed(
1189+
BridgedASTContext cContext, BridgedSourceLoc cLoc, size_t literalCapacity,
1190+
size_t interpolationCount, BridgedTapExpr cAppendingExpr);
1191+
11681192
SWIFT_NAME("BridgedIsExpr.createParsed(_:isLoc:type:)")
11691193
BridgedIsExpr BridgedIsExpr_createParsed(BridgedASTContext cContext,
11701194
BridgedSourceLoc cIsLoc,
@@ -1218,6 +1242,10 @@ BridgedStringLiteralExpr_createParsed(BridgedASTContext cContext,
12181242
BridgedStringRef cStr,
12191243
BridgedSourceLoc cTokenLoc);
12201244

1245+
SWIFT_NAME("BridgedTapExpr.create(_:body:)")
1246+
BridgedTapExpr BridgedTapExpr_create(BridgedASTContext cContext,
1247+
BridgedBraceStmt cBody);
1248+
12211249
SWIFT_NAME("BridgedTernaryExpr.createParsed(_:questionLoc:thenExpr:colonLoc:)")
12221250
BridgedTernaryExpr BridgedTernaryExpr_createParsed(
12231251
BridgedASTContext cContext, BridgedSourceLoc cQuestionLoc,

include/swift/AST/Decl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6465,6 +6465,8 @@ class VarDecl : public AbstractStorageDecl {
64656465

64666466
clang::PointerAuthQualifier getPointerAuthQualifier() const;
64676467

6468+
static VarDecl *createImplicitStringInterpolationVar(DeclContext *DC);
6469+
64686470
// Implement isa/cast/dyncast/etc.
64696471
static bool classof(const Decl *D) {
64706472
return D->getKind() == DeclKind::Var || D->getKind() == DeclKind::Param;

lib/AST/ASTBridging.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,6 +1321,12 @@ BridgedTopLevelCodeDecl BridgedTopLevelCodeDecl_createExpr(
13211321
return new (context) TopLevelCodeDecl(declContext, Brace);
13221322
}
13231323

1324+
BridgedVarDecl BridgedVarDec_createImplicitStringInterpolationVar(
1325+
BridgedDeclContext cDeclContext) {
1326+
return VarDecl::createImplicitStringInterpolationVar(
1327+
cDeclContext.unbridged());
1328+
}
1329+
13241330
//===----------------------------------------------------------------------===//
13251331
// MARK: AbstractStorageDecl
13261332
//===----------------------------------------------------------------------===//
@@ -1359,6 +1365,13 @@ bool BridgedNominalTypeDecl_isStructWithUnreferenceableStorage(
13591365
// MARK: Exprs
13601366
//===----------------------------------------------------------------------===//
13611367

1368+
BridgedArgumentList
1369+
BridgedArgumentList_createImplicitUnlabeled(BridgedASTContext cContext,
1370+
BridgedArrayRef cExprs) {
1371+
return ArgumentList::forImplicitUnlabeled(cContext.unbridged(),
1372+
cExprs.unbridged<Expr *>());
1373+
}
1374+
13621375
BridgedArgumentList BridgedArgumentList_createParsed(
13631376
BridgedASTContext cContext, BridgedSourceLoc cLParenLoc,
13641377
BridgedArrayRef cArgs, BridgedSourceLoc cRParenLoc,
@@ -1485,6 +1498,14 @@ BridgedCopyExpr BridgedCopyExpr_createParsed(BridgedASTContext cContext,
14851498
CopyExpr(cCopyLoc.unbridged(), cSubExpr.unbridged());
14861499
}
14871500

1501+
BridgedDeclRefExpr BridgedDeclRefExpr_create(BridgedASTContext cContext,
1502+
BridgedDecl cDecl,
1503+
BridgedDeclNameLoc cLoc,
1504+
bool IsImplicit) {
1505+
return new (cContext.unbridged()) DeclRefExpr(
1506+
cast<ValueDecl>(cDecl.unbridged()), cLoc.unbridged(), IsImplicit);
1507+
}
1508+
14881509
BridgedDictionaryExpr BridgedDictionaryExpr_createParsed(
14891510
BridgedASTContext cContext, BridgedSourceLoc cLBracketLoc,
14901511
BridgedArrayRef cElements, BridgedArrayRef cCommaLocs,
@@ -1536,6 +1557,15 @@ BridgedIntegerLiteralExpr_createParsed(BridgedASTContext cContext,
15361557
return new (context) IntegerLiteralExpr(str, cTokenLoc.unbridged());
15371558
}
15381559

1560+
BridgedInterpolatedStringLiteralExpr
1561+
BridgedInterpolatedStringLiteralExpr_createParsed(
1562+
BridgedASTContext cContext, BridgedSourceLoc cLoc, size_t literalCapacity,
1563+
size_t interpolationCount, BridgedTapExpr cAppendingExpr) {
1564+
return new (cContext.unbridged()) InterpolatedStringLiteralExpr(
1565+
cLoc.unbridged(), literalCapacity, interpolationCount,
1566+
cAppendingExpr.unbridged());
1567+
}
1568+
15391569
BridgedIsExpr BridgedIsExpr_createParsed(BridgedASTContext cContext,
15401570
BridgedSourceLoc cIsLoc,
15411571
BridgedTypeRepr cType) {
@@ -1610,6 +1640,11 @@ BridgedStringLiteralExpr_createParsed(BridgedASTContext cContext,
16101640
return new (context) StringLiteralExpr(str, cTokenLoc.unbridged());
16111641
}
16121642

1643+
BridgedTapExpr BridgedTapExpr_create(BridgedASTContext cContext,
1644+
BridgedBraceStmt cBody) {
1645+
return new (cContext.unbridged()) TapExpr(nullptr, cBody.unbridged());
1646+
}
1647+
16131648
BridgedTernaryExpr BridgedTernaryExpr_createParsed(
16141649
BridgedASTContext cContext, BridgedSourceLoc cQuestionLoc,
16151650
BridgedExpr cThenExpr, BridgedSourceLoc cColonLoc) {

lib/AST/Decl.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7903,6 +7903,17 @@ bool VarDecl::isOrdinaryStoredProperty() const {
79037903
return hasStorage() && !hasObservers();
79047904
}
79057905

7906+
VarDecl *VarDecl::createImplicitStringInterpolationVar(DeclContext *DC) {
7907+
// Make the variable which will contain our temporary value.
7908+
ASTContext &C = DC->getASTContext();
7909+
auto var =
7910+
new (C) VarDecl(/*IsStatic=*/false, VarDecl::Introducer::Var,
7911+
/*NameLoc=*/SourceLoc(), C.Id_dollarInterpolation, DC);
7912+
var->setImplicit(true);
7913+
var->setUserAccessible(false);
7914+
return var;
7915+
}
7916+
79067917
void ParamDecl::setSpecifier(Specifier specifier) {
79077918
VarDecl::Introducer introducer;
79087919
switch (specifier) {

lib/ASTGen/Sources/ASTGen/Exprs.swift

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,6 @@ func isExprMigrated(_ node: ExprSyntax) -> Bool {
4848
.postfixOperatorExpr, .prefixOperatorExpr, .sequenceExpr,
4949
.stringLiteralExpr, .tryExpr, .tupleExpr, .typeExpr, .unresolvedAsExpr,
5050
.unresolvedIsExpr, .unresolvedTernaryExpr:
51-
52-
// `generate(stringLiteralExpr:)` doesn't support interpolations.
53-
if let str = current.as(StringLiteralExprSyntax.self) {
54-
if str.segments.count != 1 {
55-
return false
56-
}
57-
assert(str.segments.first!.is(StringSegmentSyntax.self))
58-
}
59-
6051
break
6152

6253
// Known unimplemented kinds.
@@ -176,7 +167,7 @@ extension ASTGenVisitor {
176167
case .simpleStringLiteralExpr:
177168
break
178169
case .stringLiteralExpr(let node):
179-
return self.generate(stringLiteralExpr: node).asExpr
170+
return self.generate(stringLiteralExpr: node)
180171
case .subscriptCallExpr:
181172
break
182173
case .superExpr:

0 commit comments

Comments
 (0)