Skip to content

Commit 6f72d14

Browse files
committed
Update and test ASTGen for module selectors
1 parent 0e936a4 commit 6f72d14

File tree

10 files changed

+508
-311
lines changed

10 files changed

+508
-311
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -148,14 +148,19 @@ class BridgedDeclNameRef {
148148
BRIDGED_INLINE swift::DeclNameRef unbridged() const;
149149
};
150150

151-
SWIFT_NAME("BridgedDeclNameRef.createParsed(_:baseName:argumentLabels:)")
152-
BridgedDeclNameRef BridgedDeclNameRef_createParsed(BridgedASTContext cContext,
153-
swift::DeclBaseName baseName,
154-
BridgedArrayRef cLabels);
151+
SWIFT_NAME("BridgedDeclNameRef.createParsed(_:moduleSelector:baseName:"
152+
"argumentLabels:)")
153+
BridgedDeclNameRef
154+
BridgedDeclNameRef_createParsed(BridgedASTContext cContext,
155+
swift::Identifier cModuleSelector,
156+
swift::DeclBaseName cBaseName,
157+
BridgedArrayRef cLabels);
155158

156-
SWIFT_NAME("BridgedDeclNameRef.createParsed(_:)")
159+
SWIFT_NAME("BridgedDeclNameRef.createParsed(_:moduleSelector:baseName:)")
157160
BridgedDeclNameRef
158-
BridgedDeclNameRef_createParsed(swift::DeclBaseName baseName);
161+
BridgedDeclNameRef_createParsed(BridgedASTContext cContext,
162+
swift::Identifier cModuleSelector,
163+
swift::DeclBaseName cBaseName);
159164

160165
class BridgedDeclNameLoc {
161166
const void *_Nullable LocationInfo;
@@ -2499,9 +2504,10 @@ BridgedOpaqueReturnTypeOfTypeAttr_createParsed(
24992504
// MARK: TypeReprs
25002505
//===----------------------------------------------------------------------===//
25012506

2502-
SWIFT_NAME("BridgedUnqualifiedIdentTypeRepr.createParsed(_:loc:name:)")
2507+
SWIFT_NAME("BridgedUnqualifiedIdentTypeRepr.createParsed(_:name:loc:)")
25032508
BridgedUnqualifiedIdentTypeRepr BridgedUnqualifiedIdentTypeRepr_createParsed(
2504-
BridgedASTContext cContext, swift::SourceLoc loc, swift::Identifier id);
2509+
BridgedASTContext cContext, BridgedDeclNameRef cName,
2510+
BridgedDeclNameLoc cLoc);
25052511

25062512
SWIFT_NAME(
25072513
"BridgedArrayTypeRepr.createParsed(_:base:leftSquareLoc:rightSquareLoc:)")
@@ -2535,8 +2541,8 @@ BridgedCompileTimeLiteralTypeRepr_createParsed(BridgedASTContext cContext,
25352541
SWIFT_NAME("BridgedDeclRefTypeRepr.createParsed(_:base:name:nameLoc:"
25362542
"genericArguments:angleRange:)")
25372543
BridgedDeclRefTypeRepr BridgedDeclRefTypeRepr_createParsed(
2538-
BridgedASTContext cContext, BridgedTypeRepr cBase, swift::Identifier name,
2539-
swift::SourceLoc loc, BridgedArrayRef cGenericArguments,
2544+
BridgedASTContext cContext, BridgedTypeRepr cBase, BridgedDeclNameRef cName,
2545+
BridgedDeclNameLoc cLoc, BridgedArrayRef cGenericArguments,
25402546
swift::SourceRange angleRange);
25412547

25422548
SWIFT_NAME("BridgedDictionaryTypeRepr.createParsed(_:leftSquareLoc:keyType:"
@@ -2561,8 +2567,8 @@ BridgedFunctionTypeRepr BridgedFunctionTypeRepr_createParsed(
25612567
SWIFT_NAME("BridgedUnqualifiedIdentTypeRepr.createParsed(_:name:nameLoc:"
25622568
"genericArgs:leftAngleLoc:rightAngleLoc:)")
25632569
BridgedUnqualifiedIdentTypeRepr BridgedUnqualifiedIdentTypeRepr_createParsed(
2564-
BridgedASTContext cContext, swift::Identifier name,
2565-
swift::SourceLoc nameLoc, BridgedArrayRef genericArgs,
2570+
BridgedASTContext cContext, BridgedDeclNameRef cName,
2571+
BridgedDeclNameLoc cNameLoc, BridgedArrayRef genericArgs,
25662572
swift::SourceLoc lAngleLoc, swift::SourceLoc rAngleLoc);
25672573

25682574
SWIFT_NAME("BridgedOptionalTypeRepr.createParsed(_:base:questionLoc:)")

lib/AST/Bridging/DeclBridging.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,22 @@ using namespace swift;
3232
// MARK: DeclName
3333
//===----------------------------------------------------------------------===//
3434

35-
BridgedDeclNameRef BridgedDeclNameRef_createParsed(BridgedASTContext cContext,
36-
DeclBaseName baseName,
37-
BridgedArrayRef cLabels) {
35+
BridgedDeclNameRef
36+
BridgedDeclNameRef_createParsed(BridgedASTContext cContext,
37+
swift::Identifier moduleSelector,
38+
DeclBaseName baseName,
39+
BridgedArrayRef cLabels) {
3840
ASTContext &context = cContext.unbridged();
3941
auto labels = cLabels.unbridged<swift::Identifier>();
4042

41-
return DeclNameRef(DeclName(context, baseName, labels));
43+
return DeclNameRef(context, moduleSelector, baseName, labels);
4244
}
4345

44-
BridgedDeclNameRef BridgedDeclNameRef_createParsed(DeclBaseName baseName) {
45-
return DeclNameRef(baseName);
46+
BridgedDeclNameRef
47+
BridgedDeclNameRef_createParsed(BridgedASTContext cContext,
48+
swift::Identifier moduleSelector,
49+
DeclBaseName baseName) {
50+
return DeclNameRef(cContext.unbridged(), moduleSelector, baseName);
4651
}
4752

4853
BridgedDeclNameLoc BridgedDeclNameLoc_createParsed(BridgedASTContext cContext,

lib/AST/Bridging/TypeReprBridging.cpp

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,24 @@ using namespace swift;
3333
#define ABSTRACT_TYPEREPR(Id, Parent) TYPEREPR(Id, Parent)
3434
#include "swift/AST/TypeReprNodes.def"
3535

36-
BridgedUnqualifiedIdentTypeRepr
37-
BridgedUnqualifiedIdentTypeRepr_createParsed(BridgedASTContext cContext,
38-
SourceLoc loc, Identifier id) {
36+
BridgedUnqualifiedIdentTypeRepr BridgedUnqualifiedIdentTypeRepr_createParsed(
37+
BridgedASTContext cContext,
38+
BridgedDeclNameRef cName,
39+
BridgedDeclNameLoc cLoc) {
3940
return UnqualifiedIdentTypeRepr::create(cContext.unbridged(),
40-
DeclNameLoc(loc), DeclNameRef(id));
41+
cLoc.unbridged(),
42+
cName.unbridged());
4143
}
4244

4345
BridgedUnqualifiedIdentTypeRepr BridgedUnqualifiedIdentTypeRepr_createParsed(
44-
BridgedASTContext cContext, Identifier name, SourceLoc nameLoc,
45-
BridgedArrayRef genericArgs, SourceLoc lAngleLoc, SourceLoc rAngleLoc) {
46+
BridgedASTContext cContext,
47+
BridgedDeclNameRef cName,
48+
BridgedDeclNameLoc cNameLoc,
49+
BridgedArrayRef genericArgs,
50+
SourceLoc lAngleLoc, SourceLoc rAngleLoc) {
4651
ASTContext &context = cContext.unbridged();
47-
auto Loc = DeclNameLoc(nameLoc);
48-
auto Name = DeclNameRef(name);
49-
return UnqualifiedIdentTypeRepr::create(context, Loc, Name,
52+
return UnqualifiedIdentTypeRepr::create(context, cNameLoc.unbridged(),
53+
cName.unbridged(),
5054
genericArgs.unbridged<TypeRepr *>(),
5155
SourceRange{lAngleLoc, rAngleLoc});
5256
}
@@ -223,16 +227,17 @@ BridgedTupleTypeRepr_createParsed(BridgedASTContext cContext,
223227
}
224228

225229
BridgedDeclRefTypeRepr BridgedDeclRefTypeRepr_createParsed(
226-
BridgedASTContext cContext, BridgedTypeRepr cBase, Identifier name,
227-
SourceLoc loc, BridgedArrayRef cGenericArguments, SourceRange angleRange) {
230+
BridgedASTContext cContext, BridgedTypeRepr cBase, BridgedDeclNameRef cName,
231+
BridgedDeclNameLoc cLoc, BridgedArrayRef cGenericArguments,
232+
SourceRange angleRange) {
228233
ASTContext &context = cContext.unbridged();
229234
auto genericArguments = cGenericArguments.unbridged<TypeRepr *>();
230235

231236
assert(angleRange.isValid() || genericArguments.empty());
232237

233-
return DeclRefTypeRepr::create(context, cBase.unbridged(), DeclNameLoc(loc),
234-
DeclNameRef(name), genericArguments,
235-
angleRange);
238+
return DeclRefTypeRepr::create(
239+
context, cBase.unbridged(), cLoc.unbridged(),
240+
cName.unbridged(), genericArguments, angleRange);
236241
}
237242

238243
BridgedCompositionTypeRepr

lib/ASTGen/Sources/ASTGen/ASTGen.swift

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,87 @@ extension ASTGenVisitor {
247247
)
248248
}
249249

250+
/// Obtains the bridged declaration based name and bridged source location from a token.
251+
func generateDeclBaseName(_ token: TokenSyntax) -> (baseName: DeclBaseName, sourceLoc: SourceLoc) {
252+
let baseName: DeclBaseName
253+
switch token.keywordKind {
254+
case .`init`:
255+
baseName = .createConstructor()
256+
case .deinit:
257+
baseName = .createDestructor()
258+
case .subscript:
259+
baseName = .createSubscript()
260+
default:
261+
baseName = .init(self.generateIdentifier(token))
262+
}
263+
let baseNameLoc = self.generateSourceLoc(token)
264+
return (baseName, baseNameLoc)
265+
}
266+
267+
/// Obtains the bridged module name and bridged source location from a module selector.
268+
func generateModuleSelector(_ node: ModuleSelectorSyntax?) -> (moduleName: Identifier, sourceLoc: SourceLoc) {
269+
let moduleName = self.self.generateIdentifierAndSourceLoc(node?.moduleName)
270+
return (moduleName: moduleName.identifier, sourceLoc: moduleName.sourceLoc)
271+
}
272+
273+
func generateDeclNameRef(
274+
moduleSelector: ModuleSelectorSyntax?,
275+
baseName: TokenSyntax,
276+
arguments: DeclNameArgumentsSyntax? = nil
277+
) -> (name: BridgedDeclNameRef, loc: BridgedDeclNameLoc) {
278+
let moduleSelectorLoc = self.generateModuleSelector(moduleSelector)
279+
let baseNameLoc = self.generateDeclBaseName(baseName)
280+
281+
// Create the name itself.
282+
let nameRef: BridgedDeclNameRef
283+
if let arguments {
284+
let bridgedLabels: BridgedArrayRef
285+
if arguments.arguments.isEmpty {
286+
bridgedLabels = BridgedArrayRef()
287+
} else {
288+
let labels = arguments.arguments.lazy.map {
289+
self.generateIdentifier($0.name)
290+
}
291+
bridgedLabels = labels.bridgedArray(in: self)
292+
}
293+
nameRef = .createParsed(
294+
self.ctx,
295+
moduleSelector: moduleSelectorLoc.moduleName,
296+
baseName: baseNameLoc.baseName,
297+
argumentLabels: bridgedLabels
298+
)
299+
} else {
300+
nameRef = .createParsed(self.ctx, moduleSelector: moduleSelectorLoc.moduleName, baseName: baseNameLoc.baseName)
301+
}
302+
303+
// Create the location. Complication: if the argument list has no labels, the paren locs aren't provided either.
304+
// FIXME: This is silly but I'm pretty sure it's load-bearing.
305+
let nameLoc: BridgedDeclNameLoc
306+
if let arguments, !arguments.arguments.isEmpty {
307+
let labelLocs = arguments.arguments.lazy.map {
308+
self.generateSourceLoc($0.name)
309+
}
310+
let bridgedLabelLocs = labelLocs.bridgedArray(in: self)
311+
312+
nameLoc = .createParsed(
313+
self.ctx,
314+
moduleSelectorLoc: moduleSelectorLoc.sourceLoc,
315+
baseNameLoc: baseNameLoc.sourceLoc,
316+
lParenLoc: self.generateSourceLoc(arguments.leftParen),
317+
argumentLabelLocs: bridgedLabelLocs,
318+
rParenLoc: self.generateSourceLoc(arguments.rightParen)
319+
)
320+
} else {
321+
nameLoc = .createParsed(
322+
self.ctx,
323+
moduleSelectorLoc: moduleSelectorLoc.sourceLoc,
324+
baseNameLoc: baseNameLoc.sourceLoc
325+
)
326+
}
327+
328+
return (name: nameRef, loc: nameLoc)
329+
}
330+
250331
/// Obtains a C++ source range from a pair of token nodes.
251332
@inline(__always)
252333
func generateSourceRange(start: TokenSyntax, end: TokenSyntax) -> SourceRange {

lib/ASTGen/Sources/ASTGen/DeclAttrs.swift

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ extension ASTGenVisitor {
118118
let attrKind: swift.DeclAttrKind?
119119
do {
120120
let bridgedOptional = BridgedOptionalDeclAttrKind(from: attrName.bridged)
121-
attrKind = if bridgedOptional.hasValue {
121+
attrKind = if identTy.moduleSelector == nil && bridgedOptional.hasValue {
122122
bridgedOptional.value
123123
} else {
124124
nil
@@ -471,7 +471,8 @@ extension ASTGenVisitor {
471471
let features = args.compactMap(in: self) { arg -> Identifier? in
472472
guard arg.label == nil,
473473
let declNameExpr = arg.expression.as(DeclReferenceExprSyntax.self),
474-
declNameExpr.argumentNames == nil
474+
declNameExpr.argumentNames == nil,
475+
declNameExpr.moduleSelector == nil
475476
else {
476477
// TODO: Diagnose.
477478
return nil
@@ -1048,6 +1049,10 @@ extension ASTGenVisitor {
10481049
return nil
10491050
}
10501051

1052+
if arg.declName.moduleSelector != nil {
1053+
// TODO: Diagnose; module selector is meaningless at this position.
1054+
}
1055+
10511056
let type = self.generate(type: arg.type)
10521057
let member = self.generateDeclNameRef(declReferenceExpr: arg.declName)
10531058

@@ -1127,7 +1132,8 @@ extension ASTGenVisitor {
11271132
let loc = self.generateSourceLoc(descriptorExpr)
11281133
if
11291134
let declRefExpr = descriptorExpr.as(DeclReferenceExprSyntax.self),
1130-
declRefExpr.argumentNames == nil
1135+
declRefExpr.argumentNames == nil,
1136+
declRefExpr.moduleSelector == nil
11311137
{
11321138
return generateLifetimeDescriptor(
11331139
nameToken: declRefExpr.baseName,
@@ -1218,7 +1224,10 @@ extension ASTGenVisitor {
12181224
if node.argumentNames != nil {
12191225
// TODO: Diagnose
12201226
}
1221-
guard node.argumentNames == nil else {
1227+
if node.moduleSelector != nil {
1228+
// TODO: Diagnose
1229+
}
1230+
guard node.argumentNames == nil && node.moduleSelector == nil else {
12221231
return nil
12231232
}
12241233
switch node.baseName.rawText {
@@ -1278,7 +1287,11 @@ extension ASTGenVisitor {
12781287
if let arg = arg.as(DeclReferenceExprSyntax.self) {
12791288
name = self.generateDeclNameRef(declReferenceExpr: arg).name
12801289
} else if arg.is(DiscardAssignmentExprSyntax.self) {
1281-
name = BridgedDeclNameRef.createParsed(.init(self.ctx.getIdentifier("_")))
1290+
name = BridgedDeclNameRef.createParsed(
1291+
self.ctx,
1292+
moduleSelector: nil,
1293+
baseName: .init(self.ctx.getIdentifier("_"))
1294+
)
12821295
} else {
12831296
// TODO: Diagnose
12841297
fatalError("expected name")
@@ -2099,7 +2112,8 @@ extension ASTGenVisitor {
20992112
func generatePropertyName(expr node: ExprSyntax) -> Identifier? {
21002113
guard
21012114
let node = node.as(DeclReferenceExprSyntax.self),
2102-
node.argumentNames == nil
2115+
node.argumentNames == nil,
2116+
node.moduleSelector == nil
21032117
else {
21042118
// TODO: Diagnose.
21052119
return nil
@@ -2190,11 +2204,12 @@ extension ASTGenVisitor {
21902204
// FIXME: Should be normal LabeledExprListSyntax arguments.
21912205
// FIXME: Error handling
21922206
let type: BridgedTypeRepr? = self.generateSingleAttrOption(attribute: node, { token in
2193-
let nameLoc = self.generateIdentifierAndSourceLoc(token)
2207+
// FIXME: Module selector?
2208+
let nameRef = self.generateDeclNameRef(moduleSelector: nil, baseName: token)
21942209
return BridgedUnqualifiedIdentTypeRepr.createParsed(
21952210
self.ctx,
2196-
loc: nameLoc.sourceLoc,
2197-
name: nameLoc.identifier
2211+
name: nameRef.name,
2212+
loc: nameRef.loc
21982213
).asTypeRepr
21992214
})
22002215
guard let type else {
@@ -2364,7 +2379,7 @@ extension ASTGenVisitor {
23642379
_ valueGeneratorFunction: (TokenSyntax) -> R?
23652380
) -> R? {
23662381
return generateConsumingAttrOption(args: &args, label: nil) {
2367-
if let declRefExpr = $0.as(DeclReferenceExprSyntax.self), declRefExpr.argumentNames == nil {
2382+
if let declRefExpr = $0.as(DeclReferenceExprSyntax.self), declRefExpr.argumentNames == nil, declRefExpr.moduleSelector == nil {
23682383
return valueGeneratorFunction(declRefExpr.baseName)
23692384
} else if let discardExpr = $0.as(DiscardAssignmentExprSyntax.self) {
23702385
return valueGeneratorFunction(discardExpr.wildcard)

0 commit comments

Comments
 (0)