Skip to content

Commit 705ca55

Browse files
committed
[Parser] Handle deinit and subscript as declaration name references
Treat `deinit` and `subscript` the same way we treat `init` when parsing an expression, treating it as a declaration reference expression. Fixes rdar://121687968.
1 parent 9635de6 commit 705ca55

File tree

4 files changed

+45
-2
lines changed

4 files changed

+45
-2
lines changed

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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ 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(if: .keyword(.`deinit`)) ?? self.consume(if: .keyword(.`subscript`)) {
7070
base = identOrSelf
7171
} else if flags.contains(.operators), let (_, _) = self.at(anyIn: Operator.self) {
7272
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

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)