Skip to content

Commit 1f092d6

Browse files
committed
Update and test ASTGen for module selectors
1 parent b458cf2 commit 1f092d6

File tree

11 files changed

+525
-312
lines changed

11 files changed

+525
-312
lines changed

include/swift/AST/ASTBridging.h

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

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

154-
SWIFT_NAME("BridgedDeclNameRef.createParsed(_:)")
157+
SWIFT_NAME("BridgedDeclNameRef.createParsed(_:moduleSelector:baseName:)")
155158
BridgedDeclNameRef
156-
BridgedDeclNameRef_createParsed(swift::DeclBaseName baseName);
159+
BridgedDeclNameRef_createParsed(BridgedASTContext cContext,
160+
swift::Identifier cModuleSelector,
161+
swift::DeclBaseName cBaseName);
157162

158163
class BridgedDeclNameLoc {
159164
const void *_Nullable LocationInfo;
@@ -2547,9 +2552,10 @@ BridgedOpaqueReturnTypeOfTypeAttr_createParsed(
25472552
// MARK: TypeReprs
25482553
//===----------------------------------------------------------------------===//
25492554

2550-
SWIFT_NAME("BridgedUnqualifiedIdentTypeRepr.createParsed(_:loc:name:)")
2555+
SWIFT_NAME("BridgedUnqualifiedIdentTypeRepr.createParsed(_:name:loc:)")
25512556
BridgedUnqualifiedIdentTypeRepr BridgedUnqualifiedIdentTypeRepr_createParsed(
2552-
BridgedASTContext cContext, swift::SourceLoc loc, swift::Identifier id);
2557+
BridgedASTContext cContext, BridgedDeclNameRef cName,
2558+
BridgedDeclNameLoc cLoc);
25532559

25542560
SWIFT_NAME(
25552561
"BridgedArrayTypeRepr.createParsed(_:base:leftSquareLoc:rightSquareLoc:)")
@@ -2583,8 +2589,8 @@ BridgedCompileTimeLiteralTypeRepr_createParsed(BridgedASTContext cContext,
25832589
SWIFT_NAME("BridgedDeclRefTypeRepr.createParsed(_:base:name:nameLoc:"
25842590
"genericArguments:angleRange:)")
25852591
BridgedDeclRefTypeRepr BridgedDeclRefTypeRepr_createParsed(
2586-
BridgedASTContext cContext, BridgedTypeRepr cBase, swift::Identifier name,
2587-
swift::SourceLoc loc, BridgedArrayRef cGenericArguments,
2592+
BridgedASTContext cContext, BridgedTypeRepr cBase, BridgedDeclNameRef cName,
2593+
BridgedDeclNameLoc cLoc, BridgedArrayRef cGenericArguments,
25882594
swift::SourceRange angleRange);
25892595

25902596
SWIFT_NAME("BridgedDictionaryTypeRepr.createParsed(_:leftSquareLoc:keyType:"
@@ -2609,8 +2615,8 @@ BridgedFunctionTypeRepr BridgedFunctionTypeRepr_createParsed(
26092615
SWIFT_NAME("BridgedUnqualifiedIdentTypeRepr.createParsed(_:name:nameLoc:"
26102616
"genericArgs:leftAngleLoc:rightAngleLoc:)")
26112617
BridgedUnqualifiedIdentTypeRepr BridgedUnqualifiedIdentTypeRepr_createParsed(
2612-
BridgedASTContext cContext, swift::Identifier name,
2613-
swift::SourceLoc nameLoc, BridgedArrayRef genericArgs,
2618+
BridgedASTContext cContext, BridgedDeclNameRef cName,
2619+
BridgedDeclNameLoc cNameLoc, BridgedArrayRef genericArgs,
26142620
swift::SourceLoc lAngleLoc, swift::SourceLoc rAngleLoc);
26152621

26162622
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: 88 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import ASTBridging
1414
import BasicBridging
1515
import SwiftIfConfig
1616
// Needed to use BumpPtrAllocator
17-
@_spi(BumpPtrAllocator) @_spi(RawSyntax) @_spi(Compiler) import SwiftSyntax
17+
@_spi(BumpPtrAllocator) @_spi(ExperimentalLanguageFeatures) @_spi(RawSyntax) @_spi(Compiler) import SwiftSyntax
1818

1919
import struct SwiftDiagnostics.Diagnostic
2020

@@ -205,7 +205,8 @@ extension ASTGenVisitor {
205205
/// source buffer.
206206
@inline(__always)
207207
func generateSourceLoc(_ node: some SyntaxProtocol) -> SourceLoc {
208-
SourceLoc(at: node.positionAfterSkippingLeadingTrivia, in: self.base)
208+
precondition(node.positionAfterSkippingLeadingTrivia.utf8Offset < 0x0000000100000000)
209+
return SourceLoc(at: node.positionAfterSkippingLeadingTrivia, in: self.base)
209210
}
210211

211212
/// Obtains the C++ start location of the node excluding leading trivia in the
@@ -247,6 +248,91 @@ extension ASTGenVisitor {
247248
)
248249
}
249250

251+
/// Obtains the bridged declaration based name and bridged source location from a token.
252+
func generateDeclBaseName(_ token: TokenSyntax) -> (baseName: DeclBaseName, sourceLoc: SourceLoc) {
253+
let baseName: DeclBaseName
254+
switch token.keywordKind {
255+
case .`init`:
256+
baseName = .createConstructor()
257+
case .deinit:
258+
baseName = .createDestructor()
259+
case .subscript:
260+
baseName = .createSubscript()
261+
default:
262+
baseName = .init(self.generateIdentifier(token))
263+
}
264+
let baseNameLoc = self.generateSourceLoc(token)
265+
return (baseName, baseNameLoc)
266+
}
267+
268+
/// Obtains the bridged module name and bridged source location from a module selector.
269+
func generateModuleSelector(_ node: ModuleSelectorSyntax?) -> (moduleName: Identifier, sourceLoc: SourceLoc) {
270+
let moduleName = self.self.generateIdentifierAndSourceLoc(node?.moduleName)
271+
return (moduleName: moduleName.identifier, sourceLoc: moduleName.sourceLoc)
272+
}
273+
274+
func generateDeclNameRef(
275+
moduleSelector: ModuleSelectorSyntax?,
276+
baseName: TokenSyntax,
277+
arguments: (
278+
leftParen: TokenSyntax,
279+
labels: some Collection<TokenSyntax>,
280+
rightParen: TokenSyntax
281+
)? = Optional<(leftParen: TokenSyntax, labels: [TokenSyntax], rightParen: TokenSyntax)>.none
282+
) -> (name: BridgedDeclNameRef, loc: BridgedDeclNameLoc) {
283+
let moduleSelectorLoc = self.generateModuleSelector(moduleSelector)
284+
let baseNameLoc = self.generateDeclBaseName(baseName)
285+
286+
// Create the name itself.
287+
let nameRef: BridgedDeclNameRef
288+
if let arguments {
289+
let bridgedLabels: BridgedArrayRef
290+
if arguments.labels.isEmpty {
291+
bridgedLabels = BridgedArrayRef()
292+
} else {
293+
let labels = arguments.labels.lazy.map {
294+
self.generateIdentifier($0)
295+
}
296+
bridgedLabels = labels.bridgedArray(in: self)
297+
}
298+
nameRef = .createParsed(
299+
self.ctx,
300+
moduleSelector: moduleSelectorLoc.moduleName,
301+
baseName: baseNameLoc.baseName,
302+
argumentLabels: bridgedLabels
303+
)
304+
} else {
305+
nameRef = .createParsed(self.ctx, moduleSelector: moduleSelectorLoc.moduleName, baseName: baseNameLoc.baseName)
306+
}
307+
308+
// Create the location. Complication: if the argument list has no labels, the paren locs aren't provided either.
309+
// FIXME: This is silly but I'm pretty sure it's load-bearing.
310+
let nameLoc: BridgedDeclNameLoc
311+
if let arguments, !arguments.labels.isEmpty {
312+
let labelLocs = arguments.labels.lazy.map {
313+
self.generateSourceLoc($0)
314+
}
315+
let bridgedLabelLocs = labelLocs.bridgedArray(in: self)
316+
317+
nameLoc = .createParsed(
318+
self.ctx,
319+
moduleSelectorLoc: moduleSelectorLoc.sourceLoc,
320+
baseNameLoc: baseNameLoc.sourceLoc,
321+
lParenLoc: self.generateSourceLoc(arguments.leftParen),
322+
argumentLabelLocs: bridgedLabelLocs,
323+
rParenLoc: self.generateSourceLoc(arguments.rightParen)
324+
)
325+
} else {
326+
nameLoc = .createParsed(
327+
self.ctx,
328+
moduleSelectorLoc: moduleSelectorLoc.sourceLoc,
329+
baseNameLoc: baseNameLoc.sourceLoc
330+
)
331+
}
332+
333+
return (name: nameRef, loc: nameLoc)
334+
}
335+
250336
/// Obtains a C++ source range from a pair of token nodes.
251337
@inline(__always)
252338
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
@@ -468,7 +468,8 @@ extension ASTGenVisitor {
468468
let features = args.compactMap(in: self) { arg -> Identifier? in
469469
guard arg.label == nil,
470470
let declNameExpr = arg.expression.as(DeclReferenceExprSyntax.self),
471-
declNameExpr.argumentNames == nil
471+
declNameExpr.argumentNames == nil,
472+
declNameExpr.moduleSelector == nil
472473
else {
473474
// TODO: Diagnose.
474475
return nil
@@ -1045,6 +1046,10 @@ extension ASTGenVisitor {
10451046
return nil
10461047
}
10471048

1049+
if arg.declName.moduleSelector != nil {
1050+
// TODO: Diagnose; module selector is meaningless at this position.
1051+
}
1052+
10481053
let type = self.generate(type: arg.type)
10491054
let member = self.generateDeclNameRef(declReferenceExpr: arg.declName)
10501055

@@ -1122,7 +1127,8 @@ extension ASTGenVisitor {
11221127
let loc = self.generateSourceLoc(descriptorExpr)
11231128
if
11241129
let declRefExpr = descriptorExpr.as(DeclReferenceExprSyntax.self),
1125-
declRefExpr.argumentNames == nil
1130+
declRefExpr.argumentNames == nil,
1131+
declRefExpr.moduleSelector == nil
11261132
{
11271133
return generateLifetimeDescriptor(
11281134
nameToken: declRefExpr.baseName,
@@ -1213,7 +1219,10 @@ extension ASTGenVisitor {
12131219
if node.argumentNames != nil {
12141220
// TODO: Diagnose
12151221
}
1216-
guard node.argumentNames == nil else {
1222+
if node.moduleSelector != nil {
1223+
// TODO: Diagnose
1224+
}
1225+
guard node.argumentNames == nil && node.moduleSelector == nil else {
12171226
return nil
12181227
}
12191228
switch node.baseName.rawText {
@@ -1273,7 +1282,11 @@ extension ASTGenVisitor {
12731282
if let arg = arg.as(DeclReferenceExprSyntax.self) {
12741283
name = self.generateDeclNameRef(declReferenceExpr: arg).name
12751284
} else if arg.is(DiscardAssignmentExprSyntax.self) {
1276-
name = BridgedDeclNameRef.createParsed(.init(self.ctx.getIdentifier("_")))
1285+
name = BridgedDeclNameRef.createParsed(
1286+
self.ctx,
1287+
moduleSelector: nil,
1288+
baseName: .init(self.ctx.getIdentifier("_"))
1289+
)
12771290
} else {
12781291
// TODO: Diagnose
12791292
fatalError("expected name")
@@ -2094,7 +2107,8 @@ extension ASTGenVisitor {
20942107
func generatePropertyName(expr node: ExprSyntax) -> Identifier? {
20952108
guard
20962109
let node = node.as(DeclReferenceExprSyntax.self),
2097-
node.argumentNames == nil
2110+
node.argumentNames == nil,
2111+
node.moduleSelector == nil
20982112
else {
20992113
// TODO: Diagnose.
21002114
return nil
@@ -2185,11 +2199,12 @@ extension ASTGenVisitor {
21852199
// FIXME: Should be normal LabeledExprListSyntax arguments.
21862200
// FIXME: Error handling
21872201
let type: BridgedTypeRepr? = self.generateSingleAttrOption(attribute: node, { token in
2188-
let nameLoc = self.generateIdentifierAndSourceLoc(token)
2202+
// FIXME: Module selector?
2203+
let nameRef = self.generateDeclNameRef(moduleSelector: nil, baseName: token)
21892204
return BridgedUnqualifiedIdentTypeRepr.createParsed(
21902205
self.ctx,
2191-
loc: nameLoc.sourceLoc,
2192-
name: nameLoc.identifier
2206+
name: nameRef.name,
2207+
loc: nameRef.loc
21932208
).asTypeRepr
21942209
})
21952210
guard let type else {
@@ -2359,7 +2374,7 @@ extension ASTGenVisitor {
23592374
_ valueGeneratorFunction: (TokenSyntax) -> R?
23602375
) -> R? {
23612376
return generateConsumingAttrOption(args: &args, label: nil) {
2362-
if let declRefExpr = $0.as(DeclReferenceExprSyntax.self), declRefExpr.argumentNames == nil {
2377+
if let declRefExpr = $0.as(DeclReferenceExprSyntax.self), declRefExpr.argumentNames == nil, declRefExpr.moduleSelector == nil {
23632378
return valueGeneratorFunction(declRefExpr.baseName)
23642379
} else if let discardExpr = $0.as(DiscardAssignmentExprSyntax.self) {
23652380
return valueGeneratorFunction(discardExpr.wildcard)

0 commit comments

Comments
 (0)