Skip to content

Commit 7c8b0d3

Browse files
authored
Merge pull request #2449 from DougGregor/deinit-subscript-decl-ref-expr
[Parser] Handle `deinit` and `subscript` as declaration name references
2 parents 2664baa + 40d916d commit 7c8b0d3

File tree

10 files changed

+101
-6
lines changed

10 files changed

+101
-6
lines changed

CodeGeneration/Sources/SyntaxSupport/ExprNodes.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -932,6 +932,8 @@ public let EXPR_NODES: [Node] = [
932932
.keyword(.self),
933933
.keyword(.Self),
934934
.keyword(.`init`),
935+
.keyword(.`deinit`),
936+
.keyword(.`subscript`),
935937
.token(.dollarIdentifier),
936938
.token(.binaryOperator),
937939
.token(.integerLiteral),

CodeGeneration/Sources/SyntaxSupport/PatternNodes.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,15 @@ public let PATTERN_NODES: [Node] = [
5757
children: [
5858
Child(
5959
name: "identifier",
60-
kind: .token(choices: [.token(.identifier), .keyword(.self), .keyword(.`init`)])
60+
kind: .token(
61+
choices: [
62+
.token(.identifier),
63+
.keyword(.self),
64+
.keyword(.`init`),
65+
.keyword(.`deinit`),
66+
.keyword(.`subscript`),
67+
]
68+
)
6169
)
6270
]
6371
),

Sources/SwiftParser/Expressions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1120,7 +1120,7 @@ extension Parser {
11201120
arena: self.arena
11211121
)
11221122
)
1123-
case (.identifier, let handle)?, (.self, let handle)?, (.`init`, let handle)?:
1123+
case (.identifier, let handle)?, (.self, let handle)?, (.`init`, let handle)?, (.`deinit`, let handle)?, (.`subscript`, let handle)?:
11241124
// If we have "case let x" followed by ".", "(", "[", or a generic
11251125
// argument list, we parse x as a normal name, not a binding, because it
11261126
// is the start of an enum or expr pattern.

Sources/SwiftParser/Names.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ extension Parser {
6666
mutating func parseDeclReferenceExpr(_ flags: DeclNameOptions = []) -> RawDeclReferenceExprSyntax {
6767
// Consume the base name.
6868
let base: RawTokenSyntax
69-
if let identOrSelf = self.consume(if: .identifier, .keyword(.self), .keyword(.Self)) ?? self.consume(if: .keyword(.`init`)) {
69+
if let identOrSelf = self.consume(if: .identifier, .keyword(.self), .keyword(.Self)) ?? self.consume(if: .keyword(.`init`)) ?? self.consume(
70+
if: .keyword(.`deinit`)
71+
) ?? self.consume(if: .keyword(.`subscript`)) {
7072
base = identOrSelf
7173
} else if flags.contains(.operators), let (_, _) = self.at(anyIn: Operator.self) {
7274
base = self.consumeAnyToken(remapping: .binaryOperator)

Sources/SwiftParser/TokenSpecSet.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,7 @@ enum PrimaryExpressionStart: TokenSpecSet {
869869
case `Any`
870870
case atSign // For recovery
871871
case `Self`
872+
case `deinit`
872873
case dollarIdentifier
873874
case `false`
874875
case floatLiteral
@@ -886,6 +887,7 @@ enum PrimaryExpressionStart: TokenSpecSet {
886887
case regexSlash
887888
case extendedRegexDelimiter
888889
case `self`
890+
case `subscript`
889891
case `super`
890892
case `true`
891893
case wildcard
@@ -899,6 +901,7 @@ enum PrimaryExpressionStart: TokenSpecSet {
899901
case TokenSpec(.Any): self = .Any
900902
case TokenSpec(.atSign): self = .atSign
901903
case TokenSpec(.Self): self = .Self
904+
case TokenSpec(.deinit): self = .`deinit`
902905
case TokenSpec(.dollarIdentifier): self = .dollarIdentifier
903906
case TokenSpec(.false): self = .false
904907
case TokenSpec(.floatLiteral): self = .floatLiteral
@@ -916,6 +919,7 @@ enum PrimaryExpressionStart: TokenSpecSet {
916919
case TokenSpec(.regexSlash): self = .regexSlash
917920
case TokenSpec(.regexPoundDelimiter): self = .extendedRegexDelimiter
918921
case TokenSpec(.self): self = .self
922+
case TokenSpec(.subscript): self = .`subscript`
919923
case TokenSpec(.super): self = .super
920924
case TokenSpec(.true): self = .true
921925
case TokenSpec(.wildcard): self = .wildcard
@@ -932,6 +936,7 @@ enum PrimaryExpressionStart: TokenSpecSet {
932936
case .Any: return .keyword(.Any)
933937
case .atSign: return .atSign
934938
case .Self: return .keyword(.Self)
939+
case .`deinit`: return .keyword(.`deinit`)
935940
case .dollarIdentifier: return .dollarIdentifier
936941
case .false: return .keyword(.false)
937942
case .floatLiteral: return .floatLiteral
@@ -949,6 +954,7 @@ enum PrimaryExpressionStart: TokenSpecSet {
949954
case .regexSlash: return .regexSlash
950955
case .extendedRegexDelimiter: return .regexPoundDelimiter
951956
case .self: return .keyword(.self)
957+
case .`subscript`: return .keyword(.subscript)
952958
case .super: return .keyword(.super)
953959
case .true: return .keyword(.true)
954960
case .wildcard: return .wildcard

Sources/SwiftParser/generated/Parser+TokenSpecSet.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -991,6 +991,8 @@ extension DeclReferenceExprSyntax {
991991
case `self`
992992
case `Self`
993993
case `init`
994+
case `deinit`
995+
case `subscript`
994996
case dollarIdentifier
995997
case binaryOperator
996998
case integerLiteral
@@ -1005,6 +1007,10 @@ extension DeclReferenceExprSyntax {
10051007
self = .Self
10061008
case TokenSpec(.`init`):
10071009
self = .`init`
1010+
case TokenSpec(.deinit):
1011+
self = .deinit
1012+
case TokenSpec(.subscript):
1013+
self = .subscript
10081014
case TokenSpec(.dollarIdentifier):
10091015
self = .dollarIdentifier
10101016
case TokenSpec(.binaryOperator):
@@ -1026,6 +1032,10 @@ extension DeclReferenceExprSyntax {
10261032
return .keyword(.Self)
10271033
case .`init`:
10281034
return .keyword(.`init`)
1035+
case .deinit:
1036+
return .keyword(.deinit)
1037+
case .subscript:
1038+
return .keyword(.subscript)
10291039
case .dollarIdentifier:
10301040
return .dollarIdentifier
10311041
case .binaryOperator:
@@ -1049,6 +1059,10 @@ extension DeclReferenceExprSyntax {
10491059
return .keyword(.Self)
10501060
case .`init`:
10511061
return .keyword(.`init`)
1062+
case .deinit:
1063+
return .keyword(.deinit)
1064+
case .subscript:
1065+
return .keyword(.subscript)
10521066
case .dollarIdentifier:
10531067
return .dollarIdentifier("")
10541068
case .binaryOperator:
@@ -1504,6 +1518,8 @@ extension IdentifierPatternSyntax {
15041518
case identifier
15051519
case `self`
15061520
case `init`
1521+
case `deinit`
1522+
case `subscript`
15071523

15081524
init?(lexeme: Lexer.Lexeme, experimentalFeatures: Parser.ExperimentalFeatures) {
15091525
switch PrepareForKeywordMatch(lexeme) {
@@ -1513,6 +1529,10 @@ extension IdentifierPatternSyntax {
15131529
self = .self
15141530
case TokenSpec(.`init`):
15151531
self = .`init`
1532+
case TokenSpec(.deinit):
1533+
self = .deinit
1534+
case TokenSpec(.subscript):
1535+
self = .subscript
15161536
default:
15171537
return nil
15181538
}
@@ -1526,6 +1546,10 @@ extension IdentifierPatternSyntax {
15261546
return .keyword(.self)
15271547
case .`init`:
15281548
return .keyword(.`init`)
1549+
case .deinit:
1550+
return .keyword(.deinit)
1551+
case .subscript:
1552+
return .keyword(.subscript)
15291553
}
15301554
}
15311555

@@ -1541,6 +1565,10 @@ extension IdentifierPatternSyntax {
15411565
return .keyword(.self)
15421566
case .`init`:
15431567
return .keyword(.`init`)
1568+
case .deinit:
1569+
return .keyword(.deinit)
1570+
case .subscript:
1571+
return .keyword(.subscript)
15441572
}
15451573
}
15461574
}

Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,8 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
842842
.keyword("self"),
843843
.keyword("Self"),
844844
.keyword("init"),
845+
.keyword("deinit"),
846+
.keyword("subscript"),
845847
.tokenKind(.dollarIdentifier),
846848
.tokenKind(.binaryOperator),
847849
.tokenKind(.integerLiteral)
@@ -1418,7 +1420,13 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
14181420
case .identifierPattern:
14191421
assert(layout.count == 3)
14201422
assertNoError(kind, 0, verify(layout[0], as: RawUnexpectedNodesSyntax?.self))
1421-
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax.self, tokenChoices: [.tokenKind(.identifier), .keyword("self"), .keyword("init")]))
1423+
assertNoError(kind, 1, verify(layout[1], as: RawTokenSyntax.self, tokenChoices: [
1424+
.tokenKind(.identifier),
1425+
.keyword("self"),
1426+
.keyword("init"),
1427+
.keyword("deinit"),
1428+
.keyword("subscript")
1429+
]))
14221430
assertNoError(kind, 2, verify(layout[2], as: RawUnexpectedNodesSyntax?.self))
14231431
case .identifierType:
14241432
assert(layout.count == 5)

Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodesD.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ public struct DeclNameArgumentsSyntax: SyntaxProtocol, SyntaxHashable, _LeafSynt
624624

625625
/// ### Children
626626
///
627-
/// - `baseName`: (`<identifier>` | `self` | `Self` | `init` | `<dollarIdentifier>` | `<binaryOperator>` | `<integerLiteral>`)
627+
/// - `baseName`: (`<identifier>` | `self` | `Self` | `init` | `deinit` | `subscript` | `<dollarIdentifier>` | `<binaryOperator>` | `<integerLiteral>`)
628628
/// - `argumentNames`: ``DeclNameArgumentsSyntax``?
629629
///
630630
/// ### Contained in
@@ -701,6 +701,8 @@ public struct DeclReferenceExprSyntax: ExprSyntaxProtocol, SyntaxHashable, _Leaf
701701
/// - `self`
702702
/// - `Self`
703703
/// - `init`
704+
/// - `deinit`
705+
/// - `subscript`
704706
/// - `<dollarIdentifier>`
705707
/// - `<binaryOperator>`
706708
/// - `<integerLiteral>`

Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodesGHI.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1534,7 +1534,7 @@ public struct GuardStmtSyntax: StmtSyntaxProtocol, SyntaxHashable, _LeafStmtSynt
15341534
///
15351535
/// ### Children
15361536
///
1537-
/// - `identifier`: (`<identifier>` | `self` | `init`)
1537+
/// - `identifier`: (`<identifier>` | `self` | `init` | `deinit` | `subscript`)
15381538
public struct IdentifierPatternSyntax: PatternSyntaxProtocol, SyntaxHashable, _LeafPatternSyntaxNodeProtocol {
15391539
public let _syntaxNode: Syntax
15401540

@@ -1587,6 +1587,8 @@ public struct IdentifierPatternSyntax: PatternSyntaxProtocol, SyntaxHashable, _L
15871587
/// - `<identifier>`
15881588
/// - `self`
15891589
/// - `init`
1590+
/// - `deinit`
1591+
/// - `subscript`
15901592
public var identifier: TokenSyntax {
15911593
get {
15921594
return Syntax(self).child(at: 1)!.cast(TokenSyntax.self)

Tests/SwiftParserTest/AttributeTests.swift

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,43 @@ final class AttributeTests: ParserTestCase {
689689
)
690690
}
691691

692+
func testAttachedNames() {
693+
assertParse(
694+
"""
695+
@attached(member, names: named(deinit))
696+
macro m()
697+
"""
698+
)
699+
700+
assertParse(
701+
"""
702+
@attached(member, names: named(init))
703+
macro m()
704+
"""
705+
)
706+
707+
assertParse(
708+
"""
709+
@attached(member, names: named(init(a:b:)))
710+
macro m()
711+
"""
712+
)
713+
714+
assertParse(
715+
"""
716+
@attached(member, names: named(subscript))
717+
macro m()
718+
"""
719+
)
720+
721+
assertParse(
722+
"""
723+
@attached(member, names: named(subscript(a:b:)))
724+
macro m()
725+
"""
726+
)
727+
}
728+
692729
func testAttachedExtensionAttribute() {
693730
assertParse(
694731
"""

0 commit comments

Comments
 (0)