Skip to content

Commit a1ec246

Browse files
committed
Add support for SE-0460 @specialized
Add support to parse the non-underscored version of the @specialized attribute. rdar://150033316
1 parent 18628b2 commit a1ec246

24 files changed

+291
-2
lines changed

CodeGeneration/Sources/SyntaxSupport/AttributeNodes.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ public let ATTRIBUTE_NODES: [Node] = [
7474
// Special arguments for keyword decl name e.g. 'subscript(_:)', and availability arguments.
7575
kind: .node(kind: .specializeAttributeArgumentList)
7676
),
77+
Child(
78+
name: "specializedArguments",
79+
// Special arguments for keyword decl name e.g. 'subscript(_:)', and availability arguments.
80+
kind: .node(kind: .specializedAttributeArgumentList)
81+
),
7782
Child(
7883
name: "objCName",
7984
// Special arguments for Objective-C names. e.g. 'methodNameWithArg1:Arg2:'
@@ -717,6 +722,16 @@ public let ATTRIBUTE_NODES: [Node] = [
717722
]
718723
),
719724

725+
Node(
726+
kind: .specializedAttributeArgumentList,
727+
base: .syntaxCollection,
728+
nameForDiagnostics: "argument to '@specialized",
729+
documentation: "A collection of arguments for the `@specialized` attribute",
730+
elementChoices: [
731+
.genericWhereClause
732+
]
733+
),
734+
720735
Node(
721736
kind: .specializeTargetFunctionArgument,
722737
base: .syntax,

CodeGeneration/Sources/SyntaxSupport/KeywordSpec.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ public enum Keyword: CaseIterable {
104104
case _PackageDescription
105105
case _read
106106
case _RefCountedObject
107+
case specialized
107108
case _specialize
108109
case _spi_available
109110
case _Trivial
@@ -340,6 +341,8 @@ public enum Keyword: CaseIterable {
340341
return KeywordSpec("_read")
341342
case ._RefCountedObject:
342343
return KeywordSpec("_RefCountedObject")
344+
case .specialized:
345+
return KeywordSpec("specialized")
343346
case ._specialize:
344347
return KeywordSpec("_specialize")
345348
case ._spi_available:

CodeGeneration/Sources/SyntaxSupport/SyntaxNodeKind.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ public enum SyntaxNodeKind: String, CaseIterable, IdentifierConvertible, TypeCon
259259
case simpleStringLiteralSegmentList
260260
case someOrAnyType
261261
case sourceFile
262+
case specializedAttributeArgumentList
262263
case specializeAttributeArgumentList
263264
case specializeAvailabilityArgument
264265
case specializeTargetFunctionArgument
@@ -454,6 +455,7 @@ public enum SyntaxNodeKind: String, CaseIterable, IdentifierConvertible, TypeCon
454455
case .someOrAnyType: return "constrainedSugarType"
455456
case .simpleTypeSpecifier: return "typeSpecifier"
456457
case .specializeAttributeArgumentList: return "specializeAttributeSpecList"
458+
case .specializedAttributeArgumentList: return "specializedAttributeSpecList"
457459
case .specializeAvailabilityArgument: return "availabilityEntry"
458460
case .specializeTargetFunctionArgument: return "targetFunctionEntry"
459461
case .stringLiteralSegmentList: return "stringLiteralSegments"

Sources/SwiftParser/Attributes.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ extension Parser {
4141
case _effects
4242
case _implements
4343
case _originallyDefinedIn
44+
case specialized
4445
case _specialize
4546
case _spi_available
4647
case `rethrows`
@@ -63,6 +64,7 @@ extension Parser {
6364
case TokenSpec(._effects): self = ._effects
6465
case TokenSpec(._implements): self = ._implements
6566
case TokenSpec(._originallyDefinedIn): self = ._originallyDefinedIn
67+
case TokenSpec(.specialized): self = .specialized
6668
case TokenSpec(._specialize): self = ._specialize
6769
case TokenSpec(._spi_available): self = ._spi_available
6870
case TokenSpec(.`rethrows`): self = .rethrows
@@ -89,6 +91,7 @@ extension Parser {
8991
case ._effects: return .keyword(._effects)
9092
case ._implements: return .keyword(._implements)
9193
case ._originallyDefinedIn: return .keyword(._originallyDefinedIn)
94+
case .specialized: return .keyword(.specialized)
9295
case ._specialize: return .keyword(._specialize)
9396
case ._spi_available: return .keyword(._spi_available)
9497
case .`rethrows`: return .keyword(.rethrows)
@@ -254,6 +257,10 @@ extension Parser {
254257
return parseAttribute(argumentMode: .optional) { parser in
255258
return (nil, .objCName(parser.parseObjectiveCSelector()))
256259
}
260+
case .specialized:
261+
return parseAttribute(argumentMode: .required) { parser in
262+
return (nil, .specializedArguments(parser.parseSpecializedAttributeArgumentList()))
263+
}
257264
case ._specialize:
258265
return parseAttribute(argumentMode: .required) { parser in
259266
return (nil, .specializeArguments(parser.parseSpecializeAttributeArgumentList()))
@@ -645,6 +652,17 @@ extension Parser {
645652
}
646653

647654
extension Parser {
655+
mutating func parseSpecializedAttributeArgumentList() -> RawSpecializedAttributeArgumentListSyntax {
656+
var elements = [RawGenericWhereClauseSyntax]()
657+
658+
// Parse the where clause.
659+
if self.at(.keyword(.where)) {
660+
let whereClause = self.parseGenericWhereClause()
661+
elements.append(whereClause)
662+
}
663+
return RawSpecializedAttributeArgumentListSyntax(elements: elements, arena: self.arena)
664+
}
665+
648666
mutating func parseSpecializeAttributeArgumentList() -> RawSpecializeAttributeArgumentListSyntax {
649667
var elements = [RawSpecializeAttributeArgumentListSyntax.Element]()
650668
// Parse optional "exported" and "kind" labeled parameters.

Sources/SwiftParser/TokenPrecedence.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ enum TokenPrecedence: Comparable {
267267
._effects,
268268
._implements,
269269
._originallyDefinedIn,
270+
.specialized,
270271
._specialize,
271272
._spi_available,
272273
.abi,

Sources/SwiftParserDiagnostics/generated/SyntaxKindNameForDiagnostics.swift

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SwiftSyntax/Documentation.docc/generated/SwiftSyntax.md

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SwiftSyntax/generated/Keyword.swift

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SwiftSyntax/generated/RenamedNodesCompatibility.swift

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SwiftSyntax/generated/SyntaxAnyVisitor.swift

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SwiftSyntax/generated/SyntaxBaseNodes.swift

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SwiftSyntax/generated/SyntaxCollections.swift

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SwiftSyntax/generated/SyntaxEnum.swift

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SwiftSyntax/generated/SyntaxKind.swift

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SwiftSyntax/generated/SyntaxRewriter.swift

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SwiftSyntax/generated/SyntaxVisitor.swift

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)