Skip to content

Commit 58e70e8

Browse files
authored
Merge pull request swiftlang#72103 from rintaro/astgen-stringliteral
[ASTGen] Generate interpolated string literal
2 parents c6e24a7 + e5592c7 commit 58e70e8

File tree

11 files changed

+312
-93
lines changed

11 files changed

+312
-93
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),
@@ -1033,6 +1035,10 @@ BridgedSubscriptDecl_asAbstractStorageDecl(BridgedSubscriptDecl decl);
10331035
// MARK: VarDecl
10341036
//===----------------------------------------------------------------------===//
10351037

1038+
SWIFT_NAME("BridgedVarDecl.createImplicitStringInterpolationVar(_:)")
1039+
BridgedVarDecl BridgedVarDec_createImplicitStringInterpolationVar(
1040+
BridgedDeclContext cDeclContext);
1041+
10361042
SWIFT_NAME("BridgedVarDecl.getSourceLocation(self:)")
10371043
BRIDGED_INLINE BridgedSourceLoc BridgedVarDecl_getSourceLocation(BridgedVarDecl decl);
10381044

@@ -1062,6 +1068,11 @@ struct BridgedCallArgument {
10621068
#endif
10631069
};
10641070

1071+
SWIFT_NAME("BridgedArgumentList.createImplicitUnlabeled(_:exprs:)")
1072+
BridgedArgumentList
1073+
BridgedArgumentList_createImplicitUnlabeled(BridgedASTContext cContext,
1074+
BridgedArrayRef cExprs);
1075+
10651076
SWIFT_NAME("BridgedArgumentList.createParsed(_:lParenLoc:args:rParenLoc:"
10661077
"firstTrailingClosureIndex:)")
10671078
BridgedArgumentList BridgedArgumentList_createParsed(
@@ -1137,6 +1148,12 @@ BridgedCopyExpr BridgedCopyExpr_createParsed(BridgedASTContext cContext,
11371148
BridgedSourceLoc cCopyLoc,
11381149
BridgedExpr cSubExpr);
11391150

1151+
SWIFT_NAME("BridgedDeclRefExpr.create(_:decl:loc:isImplicit:)")
1152+
BridgedDeclRefExpr BridgedDeclRefExpr_create(BridgedASTContext cContext,
1153+
BridgedDecl cDecl,
1154+
BridgedDeclNameLoc cLoc,
1155+
bool IsImplicit);
1156+
11401157
SWIFT_NAME("BridgedDictionaryExpr.createParsed(_:lBracketLoc:elements:"
11411158
"colonLocs:rBracketLoc:)")
11421159
BridgedDictionaryExpr BridgedDictionaryExpr_createParsed(
@@ -1173,6 +1190,13 @@ BridgedIntegerLiteralExpr_createParsed(BridgedASTContext cContext,
11731190
BridgedStringRef cStr,
11741191
BridgedSourceLoc cTokenLoc);
11751192

1193+
SWIFT_NAME("BridgedInterpolatedStringLiteralExpr.createParsed(_:loc:"
1194+
"literalCapacity:interpolationCount:appendingExpr:)")
1195+
BridgedInterpolatedStringLiteralExpr
1196+
BridgedInterpolatedStringLiteralExpr_createParsed(
1197+
BridgedASTContext cContext, BridgedSourceLoc cLoc, size_t literalCapacity,
1198+
size_t interpolationCount, BridgedTapExpr cAppendingExpr);
1199+
11761200
SWIFT_NAME("BridgedIsExpr.createParsed(_:isLoc:type:)")
11771201
BridgedIsExpr BridgedIsExpr_createParsed(BridgedASTContext cContext,
11781202
BridgedSourceLoc cIsLoc,
@@ -1226,6 +1250,10 @@ BridgedStringLiteralExpr_createParsed(BridgedASTContext cContext,
12261250
BridgedStringRef cStr,
12271251
BridgedSourceLoc cTokenLoc);
12281252

1253+
SWIFT_NAME("BridgedTapExpr.create(_:body:)")
1254+
BridgedTapExpr BridgedTapExpr_create(BridgedASTContext cContext,
1255+
BridgedBraceStmt cBody);
1256+
12291257
SWIFT_NAME("BridgedTernaryExpr.createParsed(_:questionLoc:thenExpr:colonLoc:)")
12301258
BridgedTernaryExpr BridgedTernaryExpr_createParsed(
12311259
BridgedASTContext cContext, BridgedSourceLoc cQuestionLoc,

include/swift/AST/Decl.h

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

64986498
clang::PointerAuthQualifier getPointerAuthQualifier() const;
64996499

6500+
static VarDecl *createImplicitStringInterpolationVar(DeclContext *DC);
6501+
65006502
// Implement isa/cast/dyncast/etc.
65016503
static bool classof(const Decl *D) {
65026504
return D->getKind() == DeclKind::Var || D->getKind() == DeclKind::Param;

include/swift/AST/Expr.h

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -902,12 +902,6 @@ class TapExpr : public Expr {
902902
class InterpolatedStringLiteralExpr : public LiteralExpr {
903903
/// Points at the beginning quote.
904904
SourceLoc Loc;
905-
/// Points at the ending quote.
906-
/// Needed for the upcoming \c ASTScope subsystem because lookups can be
907-
/// targeted to inside an \c InterpolatedStringLiteralExpr. It would be nicer
908-
/// to use \c EndLoc for this value, but then \c Lexer::getLocForEndOfToken()
909-
/// would not work for \c stringLiteral->getEndLoc().
910-
SourceLoc TrailingQuoteLoc;
911905
TapExpr *AppendingExpr;
912906

913907
// Set by Sema:
@@ -918,13 +912,11 @@ class InterpolatedStringLiteralExpr : public LiteralExpr {
918912

919913
public:
920914
InterpolatedStringLiteralExpr(SourceLoc Loc,
921-
SourceLoc TrailingQuoteLoc,
922915
unsigned LiteralCapacity,
923916
unsigned InterpolationCount,
924917
TapExpr *AppendingExpr)
925918
: LiteralExpr(ExprKind::InterpolatedStringLiteral, /*Implicit=*/false),
926919
Loc(Loc),
927-
TrailingQuoteLoc(TrailingQuoteLoc),
928920
AppendingExpr(AppendingExpr) {
929921
Bits.InterpolatedStringLiteralExpr.InterpolationCount = InterpolationCount;
930922
Bits.InterpolatedStringLiteralExpr.LiteralCapacity = LiteralCapacity;
@@ -977,11 +969,6 @@ class InterpolatedStringLiteralExpr : public LiteralExpr {
977969
return Loc;
978970
}
979971

980-
/// Could also be computed by relaxing.
981-
SourceLoc getTrailingQuoteLoc() const {
982-
return TrailingQuoteLoc;
983-
}
984-
985972
/// Call the \c callback with information about each segment in turn.
986973
void forEachSegment(ASTContext &Ctx,
987974
llvm::function_ref<void(bool, CallExpr *)> callback);
@@ -5511,9 +5498,6 @@ class EditorPlaceholderExpr : public Expr {
55115498
Identifier getPlaceholder() const { return Placeholder; }
55125499
SourceRange getSourceRange() const { return Loc; }
55135500
TypeRepr *getPlaceholderTypeRepr() const { return PlaceholderTy; }
5514-
SourceLoc getTrailingAngleBracketLoc() const {
5515-
return Loc.getAdvancedLoc(Placeholder.getLength() - 1);
5516-
}
55175501

55185502
/// The TypeRepr to be considered for placeholder expansion.
55195503
TypeRepr *getTypeForExpansion() const { return ExpansionTyR; }

lib/AST/ASTBridging.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1333,6 +1333,12 @@ BridgedTopLevelCodeDecl BridgedTopLevelCodeDecl_createExpr(
13331333
return new (context) TopLevelCodeDecl(declContext, Brace);
13341334
}
13351335

1336+
BridgedVarDecl BridgedVarDec_createImplicitStringInterpolationVar(
1337+
BridgedDeclContext cDeclContext) {
1338+
return VarDecl::createImplicitStringInterpolationVar(
1339+
cDeclContext.unbridged());
1340+
}
1341+
13361342
//===----------------------------------------------------------------------===//
13371343
// MARK: AbstractStorageDecl
13381344
//===----------------------------------------------------------------------===//
@@ -1371,6 +1377,13 @@ bool BridgedNominalTypeDecl_isStructWithUnreferenceableStorage(
13711377
// MARK: Exprs
13721378
//===----------------------------------------------------------------------===//
13731379

1380+
BridgedArgumentList
1381+
BridgedArgumentList_createImplicitUnlabeled(BridgedASTContext cContext,
1382+
BridgedArrayRef cExprs) {
1383+
return ArgumentList::forImplicitUnlabeled(cContext.unbridged(),
1384+
cExprs.unbridged<Expr *>());
1385+
}
1386+
13741387
BridgedArgumentList BridgedArgumentList_createParsed(
13751388
BridgedASTContext cContext, BridgedSourceLoc cLParenLoc,
13761389
BridgedArrayRef cArgs, BridgedSourceLoc cRParenLoc,
@@ -1497,6 +1510,14 @@ BridgedCopyExpr BridgedCopyExpr_createParsed(BridgedASTContext cContext,
14971510
CopyExpr(cCopyLoc.unbridged(), cSubExpr.unbridged());
14981511
}
14991512

1513+
BridgedDeclRefExpr BridgedDeclRefExpr_create(BridgedASTContext cContext,
1514+
BridgedDecl cDecl,
1515+
BridgedDeclNameLoc cLoc,
1516+
bool IsImplicit) {
1517+
return new (cContext.unbridged()) DeclRefExpr(
1518+
cast<ValueDecl>(cDecl.unbridged()), cLoc.unbridged(), IsImplicit);
1519+
}
1520+
15001521
BridgedDictionaryExpr BridgedDictionaryExpr_createParsed(
15011522
BridgedASTContext cContext, BridgedSourceLoc cLBracketLoc,
15021523
BridgedArrayRef cElements, BridgedArrayRef cCommaLocs,
@@ -1548,6 +1569,15 @@ BridgedIntegerLiteralExpr_createParsed(BridgedASTContext cContext,
15481569
return new (context) IntegerLiteralExpr(str, cTokenLoc.unbridged());
15491570
}
15501571

1572+
BridgedInterpolatedStringLiteralExpr
1573+
BridgedInterpolatedStringLiteralExpr_createParsed(
1574+
BridgedASTContext cContext, BridgedSourceLoc cLoc, size_t literalCapacity,
1575+
size_t interpolationCount, BridgedTapExpr cAppendingExpr) {
1576+
return new (cContext.unbridged()) InterpolatedStringLiteralExpr(
1577+
cLoc.unbridged(), literalCapacity, interpolationCount,
1578+
cAppendingExpr.unbridged());
1579+
}
1580+
15511581
BridgedIsExpr BridgedIsExpr_createParsed(BridgedASTContext cContext,
15521582
BridgedSourceLoc cIsLoc,
15531583
BridgedTypeRepr cType) {
@@ -1622,6 +1652,11 @@ BridgedStringLiteralExpr_createParsed(BridgedASTContext cContext,
16221652
return new (context) StringLiteralExpr(str, cTokenLoc.unbridged());
16231653
}
16241654

1655+
BridgedTapExpr BridgedTapExpr_create(BridgedASTContext cContext,
1656+
BridgedBraceStmt cBody) {
1657+
return new (cContext.unbridged()) TapExpr(nullptr, cBody.unbridged());
1658+
}
1659+
16251660
BridgedTernaryExpr BridgedTernaryExpr_createParsed(
16261661
BridgedASTContext cContext, BridgedSourceLoc cQuestionLoc,
16271662
BridgedExpr cThenExpr, BridgedSourceLoc cColonLoc) {

lib/AST/ASTDumper.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2217,11 +2217,6 @@ class PrintExpr : public ExprVisitor<PrintExpr, void, StringRef>,
22172217
void visitInterpolatedStringLiteralExpr(InterpolatedStringLiteralExpr *E, StringRef label) {
22182218
printCommon(E, "interpolated_string_literal_expr", label);
22192219

2220-
// Print the trailing quote location
2221-
if (auto Ty = GetTypeOfExpr(E)) {
2222-
auto &Ctx = Ty->getASTContext();
2223-
printSourceLoc(E->getTrailingQuoteLoc(), &Ctx, "trailing_quote_loc");
2224-
}
22252220
printField(E->getLiteralCapacity(), "literal_capacity", ExprModifierColor);
22262221
printField(E->getInterpolationCount(), "interpolation_count",
22272222
ExprModifierColor);
@@ -3044,12 +3039,6 @@ class PrintExpr : public ExprVisitor<PrintExpr, void, StringRef>,
30443039
void visitEditorPlaceholderExpr(EditorPlaceholderExpr *E, StringRef label) {
30453040
printCommon(E, "editor_placeholder_expr", label);
30463041

3047-
// Print the trailing angle bracket location
3048-
if (auto Ty = GetTypeOfExpr(E)) {
3049-
auto &Ctx = Ty->getASTContext();
3050-
printSourceLoc(E->getTrailingAngleBracketLoc(), &Ctx,
3051-
"trailing_angle_bracket_loc");
3052-
}
30533042
auto *TyR = E->getPlaceholderTypeRepr();
30543043
auto *ExpTyR = E->getTypeForExpansion();
30553044
if (TyR)

lib/AST/Decl.cpp

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

7823+
VarDecl *VarDecl::createImplicitStringInterpolationVar(DeclContext *DC) {
7824+
// Make the variable which will contain our temporary value.
7825+
ASTContext &C = DC->getASTContext();
7826+
auto var =
7827+
new (C) VarDecl(/*IsStatic=*/false, VarDecl::Introducer::Var,
7828+
/*NameLoc=*/SourceLoc(), C.Id_dollarInterpolation, DC);
7829+
var->setImplicit(true);
7830+
var->setUserAccessible(false);
7831+
return var;
7832+
}
7833+
78237834
void ParamDecl::setSpecifier(Specifier specifier) {
78247835
VarDecl::Introducer introducer;
78257836
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)