From bb4d508fbea298df869defda4fe829314d7a1bea Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Thu, 9 Jan 2025 00:26:32 -0800 Subject: [PATCH 1/3] Allow custom derivate registration for _modify accessors --- Sources/SwiftParser/Attributes.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/SwiftParser/Attributes.swift b/Sources/SwiftParser/Attributes.swift index b042dc6a78b..58f5e1d7b83 100644 --- a/Sources/SwiftParser/Attributes.swift +++ b/Sources/SwiftParser/Attributes.swift @@ -650,7 +650,7 @@ extension Parser { let unexpectedBeforeAccessor: RawUnexpectedNodesSyntax? let accessor: RawTokenSyntax? if period != nil { - (unexpectedBeforeAccessor, accessor) = self.expect(.keyword(.get), .keyword(.set), default: .keyword(.get)) + (unexpectedBeforeAccessor, accessor) = self.expect(.keyword(.get), .keyword(.set), .keyword(._modify), default: .keyword(.get)) } else { (unexpectedBeforeAccessor, accessor) = (nil, nil) } From 0e1b52a78fc6579e7e83998c629050efb36e4650 Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Thu, 9 Jan 2025 10:00:17 -0800 Subject: [PATCH 2/3] Address review comments --- CodeGeneration/Sources/SyntaxSupport/AttributeNodes.swift | 2 +- Sources/SwiftParser/Attributes.swift | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CodeGeneration/Sources/SyntaxSupport/AttributeNodes.swift b/CodeGeneration/Sources/SyntaxSupport/AttributeNodes.swift index ca49a20150c..a92cb990b9e 100644 --- a/CodeGeneration/Sources/SyntaxSupport/AttributeNodes.swift +++ b/CodeGeneration/Sources/SyntaxSupport/AttributeNodes.swift @@ -385,7 +385,7 @@ public let ATTRIBUTE_NODES: [Node] = [ ), Child( name: "accessorSpecifier", - kind: .token(choices: [.keyword(.get), .keyword(.set)]), + kind: .token(choices: [.keyword(.get), .keyword(.set), .keyword(._modify)]), documentation: "The accessor name.", isOptional: true ), diff --git a/Sources/SwiftParser/Attributes.swift b/Sources/SwiftParser/Attributes.swift index 58f5e1d7b83..65ea4646ff4 100644 --- a/Sources/SwiftParser/Attributes.swift +++ b/Sources/SwiftParser/Attributes.swift @@ -650,7 +650,12 @@ extension Parser { let unexpectedBeforeAccessor: RawUnexpectedNodesSyntax? let accessor: RawTokenSyntax? if period != nil { - (unexpectedBeforeAccessor, accessor) = self.expect(.keyword(.get), .keyword(.set), .keyword(._modify), default: .keyword(.get)) + (unexpectedBeforeAccessor, accessor) = self.expect( + .keyword(.get), + .keyword(.set), + .keyword(._modify), + default: .keyword(.get) + ) } else { (unexpectedBeforeAccessor, accessor) = (nil, nil) } From f25e5fba1f9354e35fbc63bc84021146adf17d0a Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Thu, 9 Jan 2025 14:13:05 -0800 Subject: [PATCH 3/3] Add generated files --- Sources/SwiftParser/generated/Parser+TokenSpecSet.swift | 9 +++++++++ .../SwiftSyntax/generated/raw/RawSyntaxValidation.swift | 2 +- .../SwiftSyntax/generated/syntaxNodes/SyntaxNodesD.swift | 3 ++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Sources/SwiftParser/generated/Parser+TokenSpecSet.swift b/Sources/SwiftParser/generated/Parser+TokenSpecSet.swift index 0b4ac402f2e..a36fe84b9df 100644 --- a/Sources/SwiftParser/generated/Parser+TokenSpecSet.swift +++ b/Sources/SwiftParser/generated/Parser+TokenSpecSet.swift @@ -1374,6 +1374,7 @@ extension DerivativeAttributeArgumentsSyntax { public enum AccessorSpecifierOptions: TokenSpecSet { case get case set + case _modify init?(lexeme: Lexer.Lexeme, experimentalFeatures: Parser.ExperimentalFeatures) { switch PrepareForKeywordMatch(lexeme) { @@ -1381,6 +1382,8 @@ extension DerivativeAttributeArgumentsSyntax { self = .get case TokenSpec(.set): self = .set + case TokenSpec(._modify): + self = ._modify default: return nil } @@ -1392,6 +1395,8 @@ extension DerivativeAttributeArgumentsSyntax { self = .get case TokenSpec(.set): self = .set + case TokenSpec(._modify): + self = ._modify default: return nil } @@ -1403,6 +1408,8 @@ extension DerivativeAttributeArgumentsSyntax { return .keyword(.get) case .set: return .keyword(.set) + case ._modify: + return .keyword(._modify) } } @@ -1416,6 +1423,8 @@ extension DerivativeAttributeArgumentsSyntax { return .keyword(.get) case .set: return .keyword(.set) + case ._modify: + return .keyword(._modify) } } } diff --git a/Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift b/Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift index 3a04edbea02..5350e0f27cb 100644 --- a/Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift +++ b/Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift @@ -950,7 +950,7 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) { assertNoError(kind, 6, verify(layout[6], as: RawUnexpectedNodesSyntax?.self)) assertNoError(kind, 7, verify(layout[7], as: RawTokenSyntax?.self, tokenChoices: [.tokenKind(.period)])) assertNoError(kind, 8, verify(layout[8], as: RawUnexpectedNodesSyntax?.self)) - assertNoError(kind, 9, verify(layout[9], as: RawTokenSyntax?.self, tokenChoices: [.keyword("get"), .keyword("set")])) + assertNoError(kind, 9, verify(layout[9], as: RawTokenSyntax?.self, tokenChoices: [.keyword("get"), .keyword("set"), .keyword("_modify")])) assertNoError(kind, 10, verify(layout[10], as: RawUnexpectedNodesSyntax?.self)) assertNoError(kind, 11, verify(layout[11], as: RawTokenSyntax?.self, tokenChoices: [.tokenKind(.comma)])) assertNoError(kind, 12, verify(layout[12], as: RawUnexpectedNodesSyntax?.self)) diff --git a/Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodesD.swift b/Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodesD.swift index 4977ad6958a..ce581322301 100644 --- a/Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodesD.swift +++ b/Sources/SwiftSyntax/generated/syntaxNodes/SyntaxNodesD.swift @@ -1239,7 +1239,7 @@ public struct DeinitializerEffectSpecifiersSyntax: SyntaxProtocol, SyntaxHashabl /// - `colon`: `:` /// - `originalDeclName`: ``ExprSyntax`` /// - `period`: `.`? -/// - `accessorSpecifier`: (`get` | `set`)? +/// - `accessorSpecifier`: (`get` | `set` | `_modify`)? /// - `comma`: `,`? /// - `arguments`: ``DifferentiabilityWithRespectToArgumentSyntax``? /// @@ -1439,6 +1439,7 @@ public struct DerivativeAttributeArgumentsSyntax: SyntaxProtocol, SyntaxHashable /// For syntax trees generated by the parser, this is guaranteed to be one of the following kinds: /// - `get` /// - `set` + /// - `_modify` public var accessorSpecifier: TokenSyntax? { get { return Syntax(self).child(at: 9)?.cast(TokenSyntax.self)