Skip to content

Commit fc58fc8

Browse files
author
Harlan Haskins
authored
Merge pull request #2275 from apple/harlan/vintage-conformances
Add support for '@retroactive' conformances in SwiftSyntaxParser
2 parents 1f3618d + acdbf3d commit fc58fc8

File tree

6 files changed

+21
-1
lines changed

6 files changed

+21
-1
lines changed

CodeGeneration/Sources/SyntaxSupport/KeywordSpec.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ public enum Keyword: CaseIterable {
240240
case `repeat`
241241
case required
242242
case `rethrows`
243+
case retroactive
243244
case `return`
244245
case reverse
245246
case right
@@ -611,6 +612,8 @@ public enum Keyword: CaseIterable {
611612
return KeywordSpec("required")
612613
case .rethrows:
613614
return KeywordSpec("rethrows", isLexerClassified: true)
615+
case .retroactive:
616+
return KeywordSpec("retroactive")
614617
case .return:
615618
return KeywordSpec("return", isLexerClassified: true)
616619
case .reverse:

Sources/SwiftParser/TokenPrecedence.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ enum TokenPrecedence: Comparable {
248248
.noDerivative,
249249
.noescape,
250250
.Sendable,
251+
.retroactive,
251252
.unchecked:
252253
self = .exprKeyword
253254

Sources/SwiftParser/TokenSpecSet.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,7 @@ enum TypeAttribute: TokenSpecSet {
630630
case escaping
631631
case noDerivative
632632
case noescape
633+
case retroactive
633634
case Sendable
634635
case unchecked
635636

@@ -646,6 +647,7 @@ enum TypeAttribute: TokenSpecSet {
646647
case TokenSpec(.noDerivative): self = .noDerivative
647648
case TokenSpec(.noescape): self = .noescape
648649
case TokenSpec(.Sendable): self = .Sendable
650+
case TokenSpec(.retroactive): self = .retroactive
649651
case TokenSpec(.unchecked): self = .unchecked
650652
default: return nil
651653
}
@@ -663,6 +665,7 @@ enum TypeAttribute: TokenSpecSet {
663665
case .escaping: return .keyword(.escaping)
664666
case .noDerivative: return .keyword(.noDerivative)
665667
case .noescape: return .keyword(.noescape)
668+
case .retroactive: return .keyword(.retroactive)
666669
case .Sendable: return .keyword(.Sendable)
667670
case .unchecked: return .keyword(.unchecked)
668671
}

Sources/SwiftParser/Types.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -924,7 +924,8 @@ extension Parser {
924924

925925
mutating func parseTypeAttribute() -> RawAttributeListSyntax.Element {
926926
switch peek(isAtAnyIn: TypeAttribute.self) {
927-
case ._local, ._noMetadata, .async, .escaping, .noDerivative, .noescape, .Sendable, .unchecked, .autoclosure:
927+
case ._local, ._noMetadata, .async, .escaping, .noDerivative, .noescape,
928+
.retroactive, .Sendable, .unchecked, .autoclosure:
928929
// Known type attribute that doesn't take any arguments
929930
return parseAttributeWithoutArguments()
930931
case .differentiable:

Sources/SwiftSyntax/generated/Keyword.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ public enum Keyword: UInt8, Hashable {
182182
case `repeat`
183183
case required
184184
case `rethrows`
185+
case retroactive
185186
case `return`
186187
case reverse
187188
case right
@@ -620,6 +621,8 @@ public enum Keyword: UInt8, Hashable {
620621
self = .nonisolated
621622
case "nonmutating":
622623
self = .nonmutating
624+
case "retroactive":
625+
self = .retroactive
623626
case "unavailable":
624627
self = .unavailable
625628
default:
@@ -940,6 +943,7 @@ public enum Keyword: UInt8, Hashable {
940943
"repeat",
941944
"required",
942945
"rethrows",
946+
"retroactive",
943947
"return",
944948
"reverse",
945949
"right",

Tests/SwiftParserTest/DeclarationTests.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,14 @@ final class DeclarationTests: ParserTestCase {
705705
)
706706
}
707707

708+
func testParseRetroactiveExtension() {
709+
assertParse(
710+
"""
711+
extension Int: @retroactive Identifiable {}
712+
"""
713+
)
714+
}
715+
708716
func testParseDynamicReplacement() {
709717
assertParse(
710718
"""

0 commit comments

Comments
 (0)