Skip to content

Commit 9d89b32

Browse files
committed
[NFC] Add module selector syntax nodes/children
Changes the syntax tree to represent module selectors: • A `ModuleSelectorSyntax` node represents a module selector abstractly. • The following nodes now have an optional `moduleSelector` child: • `DeclReferenceExprSyntax` • `IdentifierTypeSyntax` • `MacroExpansionExprSyntax` • `MemberTypeSyntax` • BasicFormat knows the preferred format for module selectors. Other components, particularly the parser, were also updated to continue building, though without any changes in behavior. Parser implementation will come in a future commit.
1 parent 1831ab3 commit 9d89b32

34 files changed

+911
-238
lines changed

CodeGeneration/Sources/SyntaxSupport/CommonNodes.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,24 @@ public let COMMON_NODES: [Node] = [
330330
]
331331
),
332332

333+
Node(
334+
kind: .moduleSelector,
335+
base: .syntax,
336+
nameForDiagnostics: "module selector",
337+
children: [
338+
Child(
339+
name: "moduleName",
340+
kind: .token(choices: [.token(.identifier)]),
341+
nameForDiagnostics: "module name"
342+
),
343+
Child(
344+
name: "colonColon",
345+
kind: .token(choices: [.token(.colonColon)]),
346+
nameForDiagnostics: "'::' operator"
347+
),
348+
]
349+
),
350+
333351
Node(
334352
kind: .pattern,
335353
base: .syntax,

CodeGeneration/Sources/SyntaxSupport/ExprNodes.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,6 +1002,12 @@ public let EXPR_NODES: [Node] = [
10021002
base: .expr,
10031003
nameForDiagnostics: nil,
10041004
children: [
1005+
Child(
1006+
name: "moduleSelector",
1007+
kind: .node(kind: .moduleSelector),
1008+
experimentalFeature: .moduleSelector,
1009+
isOptional: true
1010+
),
10051011
Child(
10061012
name: "baseName",
10071013
kind: .token(choices: [
@@ -1358,6 +1364,12 @@ public let EXPR_NODES: [Node] = [
13581364
kind: .token(choices: [.token(.pound)]),
13591365
documentation: "The `#` sign."
13601366
),
1367+
Child(
1368+
name: "moduleSelector",
1369+
kind: .node(kind: .moduleSelector),
1370+
experimentalFeature: .moduleSelector,
1371+
isOptional: true
1372+
),
13611373
Child(
13621374
name: "macroName",
13631375
kind: .token(choices: [.token(.identifier)])

CodeGeneration/Sources/SyntaxSupport/SyntaxNodeKind.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ public enum SyntaxNodeKind: String, CaseIterable, IdentifierConvertible, TypeCon
206206
case missingPattern
207207
case missingStmt
208208
case missingType
209+
case moduleSelector
209210
case multipleTrailingClosureElement
210211
case multipleTrailingClosureElementList
211212
case namedOpaqueReturnType

CodeGeneration/Sources/SyntaxSupport/TypeNodes.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,13 @@ public let TYPE_NODES: [Node] = [
355355
name: "period",
356356
kind: .token(choices: [.token(.period)])
357357
),
358+
Child(
359+
name: "moduleSelector",
360+
kind: .node(kind: .moduleSelector),
361+
experimentalFeature: .moduleSelector,
362+
nameForDiagnostics: "module selector",
363+
isOptional: true
364+
),
358365
Child(
359366
name: "name",
360367
kind: .token(choices: [.token(.identifier), .keyword(.self)]),
@@ -501,6 +508,13 @@ public let TYPE_NODES: [Node] = [
501508
base: .type,
502509
nameForDiagnostics: "type",
503510
children: [
511+
Child(
512+
name: "moduleSelector",
513+
kind: .node(kind: .moduleSelector),
514+
experimentalFeature: .moduleSelector,
515+
nameForDiagnostics: "module selector",
516+
isOptional: true
517+
),
504518
Child(
505519
name: "name",
506520
kind: .token(choices: [

Sources/SwiftBasicFormat/BasicFormat.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,10 +308,12 @@ open class BasicFormat: SyntaxRewriter {
308308
case (.atSign, _),
309309
(.backslash, _),
310310
(.backtick, _),
311+
(.colonColon, .identifier),
311312
(.dollarIdentifier, .period), // a.b
312313
(.endOfFile, _),
313314
(.exclamationMark, .period), // myOptionalBar!.foo()
314315
(.regexPoundDelimiter, .regexSlash), // opening extended regex delimiter should never be separate by a space
316+
(.identifier, .colonColon),
315317
(.identifier, .leftAngle), // MyType<Int>
316318
(.identifier, .leftSquare), // myArray[1]
317319
(.identifier, .period), // a.b

Sources/SwiftParser/Attributes.swift

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,12 @@ extension Parser {
297297
unexpectedBeforeAtSign,
298298
atSign: atSign,
299299
unexpectedBeforeAttributeName,
300-
attributeName: RawIdentifierTypeSyntax(name: attributeName, genericArgumentClause: nil, arena: self.arena),
300+
attributeName: RawIdentifierTypeSyntax(
301+
moduleSelector: nil,
302+
name: attributeName,
303+
genericArgumentClause: nil,
304+
arena: self.arena
305+
),
301306
leftParen: nil,
302307
arguments: nil,
303308
rightParen: nil,
@@ -322,7 +327,9 @@ extension Parser {
322327

323328
extension RawLabeledExprSyntax {
324329
fileprivate init(
325-
_ unexpectedBeforeIdentifier: RawUnexpectedNodesSyntax? = nil,
330+
_ unexpectedBeforeModuleSelector: RawUnexpectedNodesSyntax? = nil,
331+
moduleSelector: RawModuleSelectorSyntax?,
332+
_ unexpectedBetweenModuleSelectorAndIdentifier: RawUnexpectedNodesSyntax? = nil,
326333
identifier: RawTokenSyntax,
327334
_ unexpectedBetweenIdentifierAndTrailingComma: RawUnexpectedNodesSyntax? = nil,
328335
trailingComma: RawTokenSyntax? = nil,
@@ -332,7 +339,9 @@ extension RawLabeledExprSyntax {
332339
label: nil,
333340
colon: nil,
334341
expression: RawDeclReferenceExprSyntax(
335-
unexpectedBeforeIdentifier,
342+
unexpectedBeforeModuleSelector,
343+
moduleSelector: moduleSelector,
344+
unexpectedBetweenModuleSelectorAndIdentifier,
336345
baseName: identifier,
337346
argumentNames: nil,
338347
arena: arena
@@ -354,6 +363,7 @@ extension Parser {
354363
let roleTrailingComma = self.consume(if: .comma)
355364

356365
let roleElement = RawLabeledExprSyntax(
366+
moduleSelector: nil,
357367
unexpectedBeforeRole,
358368
identifier: role,
359369
trailingComma: roleTrailingComma,
@@ -383,7 +393,12 @@ extension Parser {
383393
unexpectedBeforeAtSign,
384394
atSign: atSign,
385395
unexpectedBeforeDifferentiable,
386-
attributeName: RawIdentifierTypeSyntax(name: differentiable, genericArgumentClause: nil, arena: self.arena),
396+
attributeName: RawIdentifierTypeSyntax(
397+
moduleSelector: nil,
398+
name: differentiable,
399+
genericArgumentClause: nil,
400+
arena: self.arena
401+
),
387402
unexpectedBeforeLeftParen,
388403
leftParen: leftParen,
389404
arguments: .differentiableArguments(argument),
@@ -524,8 +539,13 @@ extension Parser {
524539
return RawAttributeSyntax(
525540
unexpectedBeforeAtSign,
526541
atSign: atSign,
527-
unexpectedBeforeDerivative,
528-
attributeName: RawIdentifierTypeSyntax(name: derivative, genericArgumentClause: nil, arena: self.arena),
542+
attributeName: RawIdentifierTypeSyntax(
543+
moduleSelector: nil,
544+
unexpectedBeforeDerivative,
545+
name: derivative,
546+
genericArgumentClause: nil,
547+
arena: self.arena
548+
),
529549
unexpectedBeforeLeftParen,
530550
leftParen: leftParen,
531551
arguments: .derivativeRegistrationArguments(argument),
@@ -547,7 +567,12 @@ extension Parser {
547567
unexpectedBeforeAtSign,
548568
atSign: atSign,
549569
unexpectedBeforeTranspose,
550-
attributeName: RawIdentifierTypeSyntax(name: transpose, genericArgumentClause: nil, arena: self.arena),
570+
attributeName: RawIdentifierTypeSyntax(
571+
moduleSelector: nil,
572+
name: transpose,
573+
genericArgumentClause: nil,
574+
arena: self.arena
575+
),
551576
unexpectedBeforeLeftParen,
552577
leftParen: leftParen,
553578
arguments: .derivativeRegistrationArguments(argument),
@@ -777,6 +802,7 @@ extension Parser {
777802
let (unexpectedBeforeIsolationKind, isolationKind) =
778803
self.expectIdentifier(allowKeywordsAsIdentifier: true)
779804
let isolationKindElement = RawLabeledExprSyntax(
805+
moduleSelector: nil,
780806
unexpectedBeforeIsolationKind,
781807
identifier: isolationKind,
782808
arena: self.arena
@@ -907,6 +933,7 @@ extension Parser {
907933
let declName: RawDeclReferenceExprSyntax
908934
if label.isMissing && colon.isMissing && self.atStartOfLine {
909935
declName = RawDeclReferenceExprSyntax(
936+
moduleSelector: nil,
910937
baseName: RawTokenSyntax(missing: .identifier, arena: self.arena),
911938
argumentNames: nil,
912939
arena: self.arena

Sources/SwiftParser/Declarations.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,7 @@ extension Parser {
533533
unexpectedBeforeInherited = RawUnexpectedNodesSyntax([classKeyword], arena: self.arena)
534534
inherited = RawTypeSyntax(
535535
RawIdentifierTypeSyntax(
536+
moduleSelector: nil,
536537
name: missingToken(.identifier, text: "AnyObject"),
537538
genericArgumentClause: nil,
538539
arena: self.arena

Sources/SwiftParser/Expressions.swift

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,7 @@ extension Parser {
652652
if skipMemberName {
653653
let missingIdentifier = missingToken(.identifier)
654654
let declName = RawDeclReferenceExprSyntax(
655+
moduleSelector: nil,
655656
baseName: missingIdentifier,
656657
argumentNames: nil,
657658
arena: self.arena
@@ -664,6 +665,7 @@ extension Parser {
664665
if let indexOrSelf = self.consume(if: .integerLiteral, .keyword(.self)) {
665666
// Handle "x.42" - a tuple index.
666667
declName = RawDeclReferenceExprSyntax(
668+
moduleSelector: nil,
667669
baseName: indexOrSelf,
668670
argumentNames: nil,
669671
arena: self.arena
@@ -1276,6 +1278,7 @@ extension Parser {
12761278
let poundAvailable = self.parsePoundAvailableConditionElement()
12771279
return RawExprSyntax(
12781280
RawDeclReferenceExprSyntax(
1281+
moduleSelector: nil,
12791282
RawUnexpectedNodesSyntax([poundAvailable], arena: self.arena),
12801283
baseName: missingToken(.identifier),
12811284
argumentNames: nil,
@@ -1429,6 +1432,7 @@ extension Parser {
14291432
return RawMacroExpansionExprSyntax(
14301433
unexpectedBeforePound,
14311434
pound: pound,
1435+
moduleSelector: nil,
14321436
unexpectedBeforeMacroName,
14331437
macroName: macroName,
14341438
genericArgumentClause: generics,
@@ -1743,6 +1747,7 @@ extension Parser {
17431747
mutating func parseAnonymousClosureArgument() -> RawDeclReferenceExprSyntax {
17441748
let (unexpectedBeforeBaseName, baseName) = self.expect(.dollarIdentifier)
17451749
return RawDeclReferenceExprSyntax(
1750+
moduleSelector: nil,
17461751
unexpectedBeforeBaseName,
17471752
baseName: baseName,
17481753
argumentNames: nil,
@@ -2396,7 +2401,12 @@ extension Parser {
23962401
unknownAttr = RawAttributeSyntax(
23972402
atSign: at,
23982403
unexpectedBeforeIdent,
2399-
attributeName: RawIdentifierTypeSyntax(name: ident, genericArgumentClause: nil, arena: self.arena),
2404+
attributeName: RawIdentifierTypeSyntax(
2405+
moduleSelector: nil,
2406+
name: ident,
2407+
genericArgumentClause: nil,
2408+
arena: self.arena
2409+
),
24002410
leftParen: nil,
24012411
arguments: nil,
24022412
rightParen: nil,

Sources/SwiftParser/Names.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ extension Parser {
8989
// Parse an argument list, if the flags allow it and it's present.
9090
let args = self.parseArgLabelList(flags)
9191
return RawDeclReferenceExprSyntax(
92+
moduleSelector: nil,
9293
baseName: base,
9394
argumentNames: args,
9495
arena: self.arena
@@ -201,6 +202,7 @@ extension Parser {
201202

202203
var result = RawTypeSyntax(
203204
RawIdentifierTypeSyntax(
205+
moduleSelector: nil,
204206
unexpectedBeforeName,
205207
name: name,
206208
genericArgumentClause: generics,
@@ -238,6 +240,7 @@ extension Parser {
238240
RawMemberTypeSyntax(
239241
baseType: result,
240242
period: keepGoing!,
243+
moduleSelector: nil,
241244
unexpectedBeforeName,
242245
name: name,
243246
genericArgumentClause: generics,

Sources/SwiftParser/Parameters.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ extension Parser {
131131
// Synthesize the secondName parameter as a type node.
132132
type = RawTypeSyntax(
133133
RawIdentifierTypeSyntax(
134+
moduleSelector: nil,
134135
name: secondName,
135136
genericArgumentClause: nil,
136137
arena: self.arena

Sources/SwiftParser/Types.swift

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ extension Parser {
270270
baseType: base,
271271
unexpectedPeriod,
272272
period: period,
273+
moduleSelector: nil,
273274
name: missingIdentifier,
274275
genericArgumentClause: nil,
275276
arena: self.arena
@@ -307,6 +308,7 @@ extension Parser {
307308
baseType: base,
308309
unexpectedPeriod,
309310
period: period,
311+
moduleSelector: nil,
310312
name: name,
311313
genericArgumentClause: generics,
312314
arena: self.arena
@@ -376,6 +378,7 @@ extension Parser {
376378

377379
return RawTypeSyntax(
378380
RawIdentifierTypeSyntax(
381+
moduleSelector: nil,
379382
unexpectedBeforeName,
380383
name: name,
381384
genericArgumentClause: generics,
@@ -388,6 +391,7 @@ extension Parser {
388391
mutating func parseAnyType() -> RawIdentifierTypeSyntax {
389392
let (unexpectedBeforeName, name) = self.expect(.keyword(.Any))
390393
return RawIdentifierTypeSyntax(
394+
moduleSelector: nil,
391395
unexpectedBeforeName,
392396
name: name,
393397
genericArgumentClause: nil,
@@ -399,6 +403,7 @@ extension Parser {
399403
mutating func parsePlaceholderType() -> RawIdentifierTypeSyntax {
400404
let (unexpectedBeforeName, name) = self.expect(.wildcard)
401405
return RawIdentifierTypeSyntax(
406+
moduleSelector: nil,
402407
unexpectedBeforeName,
403408
name: name,
404409
genericArgumentClause: nil,
@@ -529,7 +534,12 @@ extension Parser {
529534
secondName: nil,
530535
RawUnexpectedNodesSyntax(combining: misplacedSpecifiers, unexpectedBeforeColon, arena: self.arena),
531536
colon: nil,
532-
type: RawIdentifierTypeSyntax(name: first, genericArgumentClause: nil, arena: self.arena),
537+
type: RawIdentifierTypeSyntax(
538+
moduleSelector: nil,
539+
name: first,
540+
genericArgumentClause: nil,
541+
arena: self.arena
542+
),
533543
ellipsis: nil,
534544
trailingComma: self.missingToken(.comma),
535545
arena: self.arena

0 commit comments

Comments
 (0)