Skip to content

Commit c7e8f58

Browse files
authored
Merge pull request #79438 from rintaro/astgen-static-var
[ASTGen] Correctly store static spelling and location to PBD
2 parents b1411b3 + b7b28b6 commit c7e8f58

File tree

4 files changed

+59
-19
lines changed

4 files changed

+59
-19
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,13 +1286,20 @@ BridgedAccessorDecl BridgedAccessorDecl_createParsed(
12861286
BridgedNullableParameterList cParamList, BridgedSourceLoc cAsyncLoc,
12871287
BridgedSourceLoc cThrowsLoc, BridgedNullableTypeRepr cThrownType);
12881288

1289-
SWIFT_NAME(
1290-
"BridgedPatternBindingDecl.createParsed(_:declContext:bindingKeywordLoc:"
1291-
"entries:attributes:isStatic:isLet:)")
1289+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedVarDeclIntroducer {
1290+
BridgedVarDeclIntroducerLet = 0,
1291+
BridgedVarDeclIntroducerVar = 1,
1292+
BridgedVarDeclIntroducerInOut = 2,
1293+
BridgedVarDeclIntroducerBorrowing = 3,
1294+
};
1295+
1296+
SWIFT_NAME("BridgedPatternBindingDecl.createParsed(_:declContext:attributes:"
1297+
"staticLoc:staticSpelling:introducerLoc:introducer:entries:)")
12921298
BridgedPatternBindingDecl BridgedPatternBindingDecl_createParsed(
12931299
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
1294-
BridgedSourceLoc cBindingKeywordLoc, BridgedArrayRef cBindingEntries, BridgedDeclAttributes cAttrs,
1295-
bool isStatic, bool isLet);
1300+
BridgedDeclAttributes cAttrs, BridgedSourceLoc cStaticLoc,
1301+
BridgedStaticSpelling cStaticSpelling, BridgedSourceLoc cIntroducerLoc,
1302+
BridgedVarDeclIntroducer cIntorducer, BridgedArrayRef cBindingEntries);
12961303

12971304
SWIFT_NAME("BridgedParamDecl.createParsed(_:declContext:specifierLoc:argName:"
12981305
"argNameLoc:paramName:paramNameLoc:type:defaultValue:)")

lib/AST/Bridging/DeclBridging.cpp

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,33 @@ BridgedAccessorDecl BridgedAccessorDecl_createParsed(
141141
cThrownType.unbridged(), cDeclContext.unbridged());
142142
}
143143

144+
static VarDecl::Introducer unbridged(BridgedVarDeclIntroducer introducer) {
145+
switch (introducer) {
146+
case BridgedVarDeclIntroducerLet:
147+
return swift::VarDecl::Introducer::Let;
148+
case BridgedVarDeclIntroducerVar:
149+
return swift::VarDecl::Introducer::Var;
150+
case BridgedVarDeclIntroducerInOut:
151+
return swift::VarDecl::Introducer::InOut;
152+
case BridgedVarDeclIntroducerBorrowing:
153+
return swift::VarDecl::Introducer::Borrowing;
154+
}
155+
llvm_unreachable("unhandled enum value");
156+
}
157+
144158
BridgedPatternBindingDecl BridgedPatternBindingDecl_createParsed(
145159
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
146-
BridgedSourceLoc cBindingKeywordLoc, BridgedArrayRef cBindingEntries, BridgedDeclAttributes cAttrs, bool isStatic, bool isLet) {
160+
BridgedDeclAttributes cAttrs, BridgedSourceLoc cStaticLoc,
161+
BridgedStaticSpelling cStaticSpelling, BridgedSourceLoc cIntroducerLoc,
162+
BridgedVarDeclIntroducer cIntroducer, BridgedArrayRef cBindingEntries) {
163+
147164
ASTContext &context = cContext.unbridged();
148165
DeclContext *declContext = cDeclContext.unbridged();
149166

150-
auto introducer = isLet ? VarDecl::Introducer::Let : VarDecl::Introducer::Var;
167+
auto introducer = unbridged(cIntroducer);
168+
auto introducerLoc = cIntroducerLoc.unbridged();
169+
auto staticSpelling = unbridged(cStaticSpelling);
170+
auto staticLoc = cStaticLoc.unbridged();
151171

152172
SmallVector<PatternBindingEntry, 4> entries;
153173
for (auto &entry : cBindingEntries.unbridged<BridgedPatternBindingEntry>()) {
@@ -156,7 +176,7 @@ BridgedPatternBindingDecl BridgedPatternBindingDecl_createParsed(
156176
// Configure all vars.
157177
pattern->forEachVariable([&](VarDecl *VD) {
158178
VD->attachParsedAttrs(cAttrs.unbridged());
159-
VD->setStatic(isStatic);
179+
VD->setStatic(staticLoc.isValid());
160180
VD->setIntroducer(introducer);
161181
VD->setTopLevelGlobal(isa<TopLevelCodeDecl>(declContext));
162182
});
@@ -165,12 +185,8 @@ BridgedPatternBindingDecl BridgedPatternBindingDecl_createParsed(
165185
entry.init.unbridged(), entry.initContext.unbridged());
166186
}
167187

168-
return PatternBindingDecl::create(
169-
context,
170-
/*StaticLoc=*/SourceLoc(),
171-
// FIXME: 'class' spelling kind.
172-
isStatic ? StaticSpellingKind::KeywordStatic : StaticSpellingKind::None,
173-
cBindingKeywordLoc.unbridged(), entries, declContext);
188+
return PatternBindingDecl::create(context, staticLoc, staticSpelling,
189+
introducerLoc, entries, declContext);
174190
}
175191

176192
BridgedParamDecl BridgedParamDecl_createParsed(

lib/ASTGen/Sources/ASTGen/Decls.swift

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,18 @@ extension ASTGenVisitor {
574574

575575
func generate(variableDecl node: VariableDeclSyntax) -> BridgedDecl {
576576
let attrs = self.generateDeclAttributes(node, allowStatic: true)
577-
let isLet = node.bindingSpecifier.keywordKind == .let
577+
let introducer: BridgedVarDeclIntroducer
578+
switch node.bindingSpecifier.rawText {
579+
case "let":
580+
introducer = .let
581+
case "var":
582+
introducer = .var
583+
case "inout":
584+
introducer = .inOut
585+
default:
586+
// TODO: Diagnostics
587+
fatalError("invalid pattern binding introducer")
588+
}
578589
let topLevelDecl: BridgedTopLevelCodeDecl?
579590
if self.declContext.isModuleScopeContext, self.declContext.parentSourceFile.isScriptMode {
580591
topLevelDecl = BridgedTopLevelCodeDecl.create(self.ctx, declContext: self.declContext)
@@ -585,11 +596,12 @@ extension ASTGenVisitor {
585596
let decl = BridgedPatternBindingDecl.createParsed(
586597
self.ctx,
587598
declContext: topLevelDecl?.asDeclContext ?? self.declContext,
588-
bindingKeywordLoc: self.generateSourceLoc(node.bindingSpecifier),
589-
entries: self.generateBindingEntries(for: node, attrs: attrs, topLevelDecl: topLevelDecl),
590599
attributes: attrs.attributes,
591-
isStatic: attrs.staticLoc.isValid,
592-
isLet: isLet
600+
staticLoc: attrs.staticLoc,
601+
staticSpelling: attrs.staticSpelling,
602+
introducerLoc: self.generateSourceLoc(node.bindingSpecifier),
603+
introducer: introducer,
604+
entries: self.generateBindingEntries(for: node, attrs: attrs, topLevelDecl: topLevelDecl)
593605
)
594606
if let topLevelDecl {
595607
let range = self.generateImplicitBraceRange(node)

test/ASTGen/decls.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,3 +301,8 @@ func testMagicIdentifier(file: String = #file, line: Int = #line) {
301301
let _: String = file
302302
let _: Int = line
303303
}
304+
305+
class StaticTest {
306+
class var classVar: Int { 42 }
307+
static let staticVar = 42
308+
}

0 commit comments

Comments
 (0)