Skip to content

Commit 300efb4

Browse files
committed
Support attributes on closures
1 parent 1603369 commit 300efb4

File tree

7 files changed

+107
-17
lines changed

7 files changed

+107
-17
lines changed

Sources/SwiftSyntax/gyb_generated/Misc.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1960,6 +1960,6 @@ extension Syntax {
19601960
extension SyntaxParser {
19611961
static func verifyNodeDeclarationHash() -> Bool {
19621962
return String(cString: swiftparse_syntax_structure_versioning_identifier()!) ==
1963-
"4f85168b3860f575ce60ac0d223fc89da37014df"
1963+
"a66df9d44b9128aee3da17e9b0d2aed27ce7ec61"
19641964
}
19651965
}

Sources/SwiftSyntax/gyb_generated/SyntaxBuilders.swift

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1917,10 +1917,21 @@ extension ClosureParamSyntax {
19171917

19181918
public struct ClosureSignatureSyntaxBuilder {
19191919
private var layout =
1920-
Array<RawSyntax?>(repeating: nil, count: 6)
1920+
Array<RawSyntax?>(repeating: nil, count: 7)
19211921

19221922
internal init() {}
19231923

1924+
public mutating func addAttribute(_ elt: Syntax) {
1925+
let idx = ClosureSignatureSyntax.Cursor.attributes.rawValue
1926+
if let list = layout[idx] {
1927+
layout[idx] = list.appending(elt.raw)
1928+
} else {
1929+
layout[idx] = RawSyntax.create(kind: SyntaxKind.attributeList,
1930+
layout: [elt.raw], length: elt.raw.totalLength,
1931+
presence: SourcePresence.present)
1932+
}
1933+
}
1934+
19241935
public mutating func useCapture(_ node: ClosureCaptureSignatureSyntax) {
19251936
let idx = ClosureSignatureSyntax.Cursor.capture.rawValue
19261937
layout[idx] = node.raw
@@ -1952,8 +1963,8 @@ public struct ClosureSignatureSyntaxBuilder {
19521963
}
19531964

19541965
internal mutating func buildData() -> SyntaxData {
1955-
if (layout[5] == nil) {
1956-
layout[5] = RawSyntax.missingToken(TokenKind.inKeyword)
1966+
if (layout[6] == nil) {
1967+
layout[6] = RawSyntax.missingToken(TokenKind.inKeyword)
19571968
}
19581969

19591970
return .forRoot(RawSyntax.createAndCalcLength(kind: .closureSignature,

Sources/SwiftSyntax/gyb_generated/SyntaxClassification.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ extension SyntaxClassification {
6969
return (.keyword, false)
7070
case (.arrowExpr, 0):
7171
return (.keyword, false)
72-
case (.closureSignature, 2):
72+
case (.closureSignature, 3):
7373
return (.keyword, false)
7474
case (.expressionSegment, 2):
7575
return (.stringInterpolationAnchor, true)

Sources/SwiftSyntax/gyb_generated/SyntaxFactory.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -996,8 +996,9 @@ public enum SyntaxFactory {
996996
], length: .zero, presence: .present))
997997
return ClosureParamListSyntax(data)
998998
}
999-
public static func makeClosureSignature(capture: ClosureCaptureSignatureSyntax?, input: Syntax?, asyncKeyword: TokenSyntax?, throwsTok: TokenSyntax?, output: ReturnClauseSyntax?, inTok: TokenSyntax) -> ClosureSignatureSyntax {
999+
public static func makeClosureSignature(attributes: AttributeListSyntax?, capture: ClosureCaptureSignatureSyntax?, input: Syntax?, asyncKeyword: TokenSyntax?, throwsTok: TokenSyntax?, output: ReturnClauseSyntax?, inTok: TokenSyntax) -> ClosureSignatureSyntax {
10001000
let layout: [RawSyntax?] = [
1001+
attributes?.raw,
10011002
capture?.raw,
10021003
input?.raw,
10031004
asyncKeyword?.raw,
@@ -1019,6 +1020,7 @@ public enum SyntaxFactory {
10191020
nil,
10201021
nil,
10211022
nil,
1023+
nil,
10221024
RawSyntax.missingToken(TokenKind.inKeyword),
10231025
], length: .zero, presence: .present))
10241026
return ClosureSignatureSyntax(data)

Sources/SwiftSyntax/gyb_generated/syntax_nodes/SyntaxNodes.swift

Lines changed: 62 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1503,6 +1503,7 @@ extension ClosureParamSyntax: CustomReflectable {
15031503

15041504
public struct ClosureSignatureSyntax: SyntaxProtocol, SyntaxHashable {
15051505
enum Cursor: Int {
1506+
case attributes
15061507
case capture
15071508
case input
15081509
case asyncKeyword
@@ -1532,6 +1533,47 @@ public struct ClosureSignatureSyntax: SyntaxProtocol, SyntaxHashable {
15321533
return Swift.type(of: self)
15331534
}
15341535

1536+
public var attributes: AttributeListSyntax? {
1537+
get {
1538+
let childData = data.child(at: Cursor.attributes,
1539+
parent: Syntax(self))
1540+
if childData == nil { return nil }
1541+
return AttributeListSyntax(childData!)
1542+
}
1543+
set(value) {
1544+
self = withAttributes(value)
1545+
}
1546+
}
1547+
1548+
/// Adds the provided `Attribute` to the node's `attributes`
1549+
/// collection.
1550+
/// - param element: The new `Attribute` to add to the node's
1551+
/// `attributes` collection.
1552+
/// - returns: A copy of the receiver with the provided `Attribute`
1553+
/// appended to its `attributes` collection.
1554+
public func addAttribute(_ element: Syntax) -> ClosureSignatureSyntax {
1555+
var collection: RawSyntax
1556+
if let col = raw[Cursor.attributes] {
1557+
collection = col.appending(element.raw)
1558+
} else {
1559+
collection = RawSyntax.create(kind: SyntaxKind.attributeList,
1560+
layout: [element.raw], length: element.raw.totalLength, presence: .present)
1561+
}
1562+
let newData = data.replacingChild(collection,
1563+
at: Cursor.attributes)
1564+
return ClosureSignatureSyntax(newData)
1565+
}
1566+
1567+
/// Returns a copy of the receiver with its `attributes` replaced.
1568+
/// - param newChild: The new `attributes` to replace the node's
1569+
/// current `attributes`, if present.
1570+
public func withAttributes(
1571+
_ newChild: AttributeListSyntax?) -> ClosureSignatureSyntax {
1572+
let raw = newChild?.raw
1573+
let newData = data.replacingChild(raw, at: Cursor.attributes)
1574+
return ClosureSignatureSyntax(newData)
1575+
}
1576+
15351577
public var capture: ClosureCaptureSignatureSyntax? {
15361578
get {
15371579
let childData = data.child(at: Cursor.capture,
@@ -1666,30 +1708,30 @@ public struct ClosureSignatureSyntax: SyntaxProtocol, SyntaxHashable {
16661708

16671709
public func _validateLayout() {
16681710
let rawChildren = Array(RawSyntaxChildren(Syntax(self)))
1669-
assert(rawChildren.count == 6)
1670-
// Check child #0 child is ClosureCaptureSignatureSyntax or missing
1711+
assert(rawChildren.count == 7)
1712+
// Check child #0 child is AttributeListSyntax or missing
16711713
if let raw = rawChildren[0].raw {
16721714
let info = rawChildren[0].syntaxInfo
16731715
let absoluteRaw = AbsoluteRawSyntax(raw: raw, info: info)
16741716
let syntaxData = SyntaxData(absoluteRaw, parent: Syntax(self))
16751717
let syntaxChild = Syntax(syntaxData)
1676-
assert(syntaxChild.is(ClosureCaptureSignatureSyntax.self))
1718+
assert(syntaxChild.is(AttributeListSyntax.self))
16771719
}
1678-
// Check child #1 child is Syntax or missing
1720+
// Check child #1 child is ClosureCaptureSignatureSyntax or missing
16791721
if let raw = rawChildren[1].raw {
16801722
let info = rawChildren[1].syntaxInfo
16811723
let absoluteRaw = AbsoluteRawSyntax(raw: raw, info: info)
16821724
let syntaxData = SyntaxData(absoluteRaw, parent: Syntax(self))
16831725
let syntaxChild = Syntax(syntaxData)
1684-
assert(syntaxChild.is(Syntax.self))
1726+
assert(syntaxChild.is(ClosureCaptureSignatureSyntax.self))
16851727
}
1686-
// Check child #2 child is TokenSyntax or missing
1728+
// Check child #2 child is Syntax or missing
16871729
if let raw = rawChildren[2].raw {
16881730
let info = rawChildren[2].syntaxInfo
16891731
let absoluteRaw = AbsoluteRawSyntax(raw: raw, info: info)
16901732
let syntaxData = SyntaxData(absoluteRaw, parent: Syntax(self))
16911733
let syntaxChild = Syntax(syntaxData)
1692-
assert(syntaxChild.is(TokenSyntax.self))
1734+
assert(syntaxChild.is(Syntax.self))
16931735
}
16941736
// Check child #3 child is TokenSyntax or missing
16951737
if let raw = rawChildren[3].raw {
@@ -1699,21 +1741,29 @@ public struct ClosureSignatureSyntax: SyntaxProtocol, SyntaxHashable {
16991741
let syntaxChild = Syntax(syntaxData)
17001742
assert(syntaxChild.is(TokenSyntax.self))
17011743
}
1702-
// Check child #4 child is ReturnClauseSyntax or missing
1744+
// Check child #4 child is TokenSyntax or missing
17031745
if let raw = rawChildren[4].raw {
17041746
let info = rawChildren[4].syntaxInfo
17051747
let absoluteRaw = AbsoluteRawSyntax(raw: raw, info: info)
17061748
let syntaxData = SyntaxData(absoluteRaw, parent: Syntax(self))
17071749
let syntaxChild = Syntax(syntaxData)
1708-
assert(syntaxChild.is(ReturnClauseSyntax.self))
1750+
assert(syntaxChild.is(TokenSyntax.self))
17091751
}
1710-
// Check child #5 child is TokenSyntax
1711-
assert(rawChildren[5].raw != nil)
1752+
// Check child #5 child is ReturnClauseSyntax or missing
17121753
if let raw = rawChildren[5].raw {
17131754
let info = rawChildren[5].syntaxInfo
17141755
let absoluteRaw = AbsoluteRawSyntax(raw: raw, info: info)
17151756
let syntaxData = SyntaxData(absoluteRaw, parent: Syntax(self))
17161757
let syntaxChild = Syntax(syntaxData)
1758+
assert(syntaxChild.is(ReturnClauseSyntax.self))
1759+
}
1760+
// Check child #6 child is TokenSyntax
1761+
assert(rawChildren[6].raw != nil)
1762+
if let raw = rawChildren[6].raw {
1763+
let info = rawChildren[6].syntaxInfo
1764+
let absoluteRaw = AbsoluteRawSyntax(raw: raw, info: info)
1765+
let syntaxData = SyntaxData(absoluteRaw, parent: Syntax(self))
1766+
let syntaxChild = Syntax(syntaxData)
17171767
assert(syntaxChild.is(TokenSyntax.self))
17181768
}
17191769
}
@@ -1722,6 +1772,7 @@ public struct ClosureSignatureSyntax: SyntaxProtocol, SyntaxHashable {
17221772
extension ClosureSignatureSyntax: CustomReflectable {
17231773
public var customMirror: Mirror {
17241774
return Mirror(self, children: [
1775+
"attributes": attributes.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
17251776
"capture": capture.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
17261777
"input": input.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
17271778
"asyncKeyword": asyncKeyword.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,

Sources/SwiftSyntaxBuilder/gyb_generated/Buildables.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1879,6 +1879,7 @@ public struct ClosureParamList: SyntaxBuildable {
18791879
}
18801880

18811881
public struct ClosureSignature: SyntaxBuildable {
1882+
let attributes: AttributeList?
18821883
let capture: ClosureCaptureSignature?
18831884
let input: SyntaxBuildable?
18841885
let asyncKeyword: TokenSyntax?
@@ -1887,13 +1888,15 @@ public struct ClosureSignature: SyntaxBuildable {
18871888
let inTok: TokenSyntax
18881889

18891890
public init(
1891+
attributes: AttributeList? = nil,
18901892
capture: ClosureCaptureSignature? = nil,
18911893
input: SyntaxBuildable? = nil,
18921894
asyncKeyword: TokenSyntax? = nil,
18931895
throwsTok: TokenSyntax? = nil,
18941896
output: ReturnClause? = nil,
18951897
inTok: TokenSyntax
18961898
) {
1899+
self.attributes = attributes
18971900
self.capture = capture
18981901
self.input = input
18991902
self.asyncKeyword = asyncKeyword
@@ -1904,6 +1907,7 @@ public struct ClosureSignature: SyntaxBuildable {
19041907

19051908
func buildClosureSignature(format: Format, leadingTrivia: Trivia? = nil) -> ClosureSignatureSyntax {
19061909
let closureSignature = SyntaxFactory.makeClosureSignature(
1910+
attributes: attributes?.buildAttributeList(format: format),
19071911
capture: capture?.buildClosureCaptureSignature(format: format),
19081912
input: input?.buildSyntax(format: format),
19091913
asyncKeyword: asyncKeyword,

Sources/SwiftSyntaxBuilder/gyb_generated/BuildablesConvenienceInitializers.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,28 @@ extension ClosureCaptureSignature {
112112
}
113113
}
114114

115+
extension ClosureSignature {
116+
public init(
117+
@AttributeListBuilder attributesBuilder: () -> AttributeList? = { nil },
118+
capture: ClosureCaptureSignature? = nil,
119+
input: SyntaxBuildable? = nil,
120+
asyncKeyword: String?,
121+
throwsTok: TokenSyntax? = nil,
122+
output: ReturnClause? = nil,
123+
inTok: TokenSyntax = Tokens.`in`
124+
) {
125+
self.init(
126+
attributes: attributesBuilder(),
127+
capture: capture,
128+
input: input,
129+
asyncKeyword: asyncKeyword.map({ SyntaxFactory.makeIdentifier($0) }),
130+
throwsTok: throwsTok,
131+
output: output,
132+
inTok: inTok
133+
)
134+
}
135+
}
136+
115137
extension ClosureExpr {
116138
public init(
117139
leftBrace: TokenSyntax = Tokens.`leftBrace`,

0 commit comments

Comments
 (0)