Skip to content

Commit

Permalink
Merge pull request apple#235 from DougGregor/async-closures
Browse files Browse the repository at this point in the history
[Concurrency] Add support for 'async' on closures.
  • Loading branch information
DougGregor committed Aug 12, 2020
2 parents 27bc2a1 + e2b1c40 commit b6374bb
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 10 deletions.
2 changes: 1 addition & 1 deletion Sources/SwiftSyntax/gyb_generated/Misc.swift
Expand Up @@ -1944,6 +1944,6 @@ extension Syntax {
extension SyntaxParser {
static func verifyNodeDeclarationHash() -> Bool {
return String(cString: swiftparse_syntax_structure_versioning_identifier()!) ==
"9700f84ac29d74406d59a6433d59aebb33227ade"
"71bf2d5d9308cb7092ce3660702fe668381dbbab"
}
}
11 changes: 8 additions & 3 deletions Sources/SwiftSyntax/gyb_generated/SyntaxBuilders.swift
Expand Up @@ -1917,7 +1917,7 @@ extension ClosureParamSyntax {

public struct ClosureSignatureSyntaxBuilder {
private var layout =
Array<RawSyntax?>(repeating: nil, count: 5)
Array<RawSyntax?>(repeating: nil, count: 6)

internal init() {}

Expand All @@ -1931,6 +1931,11 @@ public struct ClosureSignatureSyntaxBuilder {
layout[idx] = node.raw
}

public mutating func useAsyncKeyword(_ node: TokenSyntax) {
let idx = ClosureSignatureSyntax.Cursor.asyncKeyword.rawValue
layout[idx] = node.raw
}

public mutating func useThrowsTok(_ node: TokenSyntax) {
let idx = ClosureSignatureSyntax.Cursor.throwsTok.rawValue
layout[idx] = node.raw
Expand All @@ -1947,8 +1952,8 @@ public struct ClosureSignatureSyntaxBuilder {
}

internal mutating func buildData() -> SyntaxData {
if (layout[4] == nil) {
layout[4] = RawSyntax.missingToken(TokenKind.inKeyword)
if (layout[5] == nil) {
layout[5] = RawSyntax.missingToken(TokenKind.inKeyword)
}

return .forRoot(RawSyntax.createAndCalcLength(kind: .closureSignature,
Expand Down
2 changes: 2 additions & 0 deletions Sources/SwiftSyntax/gyb_generated/SyntaxClassification.swift
Expand Up @@ -67,6 +67,8 @@ extension SyntaxClassification {
switch (parentKind, indexInParent) {
case (.arrowExpr, 0):
return (.keyword, false)
case (.closureSignature, 2):
return (.keyword, false)
case (.expressionSegment, 2):
return (.stringInterpolationAnchor, true)
case (.functionSignature, 1):
Expand Down
4 changes: 3 additions & 1 deletion Sources/SwiftSyntax/gyb_generated/SyntaxFactory.swift
Expand Up @@ -996,10 +996,11 @@ public enum SyntaxFactory {
], length: .zero, presence: .present))
return ClosureParamListSyntax(data)
}
public static func makeClosureSignature(capture: ClosureCaptureSignatureSyntax?, input: Syntax?, throwsTok: TokenSyntax?, output: ReturnClauseSyntax?, inTok: TokenSyntax) -> ClosureSignatureSyntax {
public static func makeClosureSignature(capture: ClosureCaptureSignatureSyntax?, input: Syntax?, asyncKeyword: TokenSyntax?, throwsTok: TokenSyntax?, output: ReturnClauseSyntax?, inTok: TokenSyntax) -> ClosureSignatureSyntax {
let layout: [RawSyntax?] = [
capture?.raw,
input?.raw,
asyncKeyword?.raw,
throwsTok?.raw,
output?.raw,
inTok.raw,
Expand All @@ -1017,6 +1018,7 @@ public enum SyntaxFactory {
nil,
nil,
nil,
nil,
RawSyntax.missingToken(TokenKind.inKeyword),
], length: .zero, presence: .present))
return ClosureSignatureSyntax(data)
Expand Down
42 changes: 37 additions & 5 deletions Sources/SwiftSyntax/gyb_generated/syntax_nodes/SyntaxNodes.swift
Expand Up @@ -1505,6 +1505,7 @@ public struct ClosureSignatureSyntax: SyntaxProtocol, SyntaxHashable {
enum Cursor: Int {
case capture
case input
case asyncKeyword
case throwsTok
case output
case inTok
Expand Down Expand Up @@ -1575,6 +1576,28 @@ public struct ClosureSignatureSyntax: SyntaxProtocol, SyntaxHashable {
return ClosureSignatureSyntax(newData)
}

public var asyncKeyword: TokenSyntax? {
get {
let childData = data.child(at: Cursor.asyncKeyword,
parent: Syntax(self))
if childData == nil { return nil }
return TokenSyntax(childData!)
}
set(value) {
self = withAsyncKeyword(value)
}
}

/// Returns a copy of the receiver with its `asyncKeyword` replaced.
/// - param newChild: The new `asyncKeyword` to replace the node's
/// current `asyncKeyword`, if present.
public func withAsyncKeyword(
_ newChild: TokenSyntax?) -> ClosureSignatureSyntax {
let raw = newChild?.raw
let newData = data.replacingChild(raw, at: Cursor.asyncKeyword)
return ClosureSignatureSyntax(newData)
}

public var throwsTok: TokenSyntax? {
get {
let childData = data.child(at: Cursor.throwsTok,
Expand Down Expand Up @@ -1643,7 +1666,7 @@ public struct ClosureSignatureSyntax: SyntaxProtocol, SyntaxHashable {

public func _validateLayout() {
let rawChildren = Array(RawSyntaxChildren(Syntax(self)))
assert(rawChildren.count == 5)
assert(rawChildren.count == 6)
// Check child #0 child is ClosureCaptureSignatureSyntax or missing
if let raw = rawChildren[0].raw {
let info = rawChildren[0].syntaxInfo
Expand All @@ -1668,21 +1691,29 @@ public struct ClosureSignatureSyntax: SyntaxProtocol, SyntaxHashable {
let syntaxChild = Syntax(syntaxData)
assert(syntaxChild.is(TokenSyntax.self))
}
// Check child #3 child is ReturnClauseSyntax or missing
// Check child #3 child is TokenSyntax or missing
if let raw = rawChildren[3].raw {
let info = rawChildren[3].syntaxInfo
let absoluteRaw = AbsoluteRawSyntax(raw: raw, info: info)
let syntaxData = SyntaxData(absoluteRaw, parent: Syntax(self))
let syntaxChild = Syntax(syntaxData)
assert(syntaxChild.is(ReturnClauseSyntax.self))
assert(syntaxChild.is(TokenSyntax.self))
}
// Check child #4 child is TokenSyntax
assert(rawChildren[4].raw != nil)
// Check child #4 child is ReturnClauseSyntax or missing
if let raw = rawChildren[4].raw {
let info = rawChildren[4].syntaxInfo
let absoluteRaw = AbsoluteRawSyntax(raw: raw, info: info)
let syntaxData = SyntaxData(absoluteRaw, parent: Syntax(self))
let syntaxChild = Syntax(syntaxData)
assert(syntaxChild.is(ReturnClauseSyntax.self))
}
// Check child #5 child is TokenSyntax
assert(rawChildren[5].raw != nil)
if let raw = rawChildren[5].raw {
let info = rawChildren[5].syntaxInfo
let absoluteRaw = AbsoluteRawSyntax(raw: raw, info: info)
let syntaxData = SyntaxData(absoluteRaw, parent: Syntax(self))
let syntaxChild = Syntax(syntaxData)
assert(syntaxChild.is(TokenSyntax.self))
}
}
Expand All @@ -1693,6 +1724,7 @@ extension ClosureSignatureSyntax: CustomReflectable {
return Mirror(self, children: [
"capture": capture.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
"input": input.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
"asyncKeyword": asyncKeyword.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
"throwsTok": throwsTok.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
"output": output.map(Syntax.init)?.asProtocol(SyntaxProtocol.self) as Any,
"inTok": Syntax(inTok).asProtocol(SyntaxProtocol.self),
Expand Down

0 comments on commit b6374bb

Please sign in to comment.