Skip to content

Commit 1032559

Browse files
authored
Merge pull request swiftlang#232 from DougGregor/concurrency-await
[Concurrency] Add syntax for the await expression.
2 parents 141631f + b66abac commit 1032559

12 files changed

+258
-3
lines changed

Sources/SwiftSyntax/gyb_generated/Misc.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,12 @@ extension SyntaxNode {
111111
return TryExprSyntax(asSyntaxData)
112112
}
113113

114+
public var isAwaitExpr: Bool { return raw.kind == .awaitExpr }
115+
public var asAwaitExpr: AwaitExprSyntax? {
116+
guard isAwaitExpr else { return nil }
117+
return AwaitExprSyntax(asSyntaxData)
118+
}
119+
114120
public var isDeclNameArgument: Bool { return raw.kind == .declNameArgument }
115121
public var asDeclNameArgument: DeclNameArgumentSyntax? {
116122
guard isDeclNameArgument else { return nil }
@@ -1489,6 +1495,8 @@ extension Syntax {
14891495
return node
14901496
case .tryExpr(let node):
14911497
return node
1498+
case .awaitExpr(let node):
1499+
return node
14921500
case .declNameArgument(let node):
14931501
return node
14941502
case .declNameArgumentList(let node):
@@ -1936,6 +1944,6 @@ extension Syntax {
19361944
extension SyntaxParser {
19371945
static func verifyNodeDeclarationHash() -> Bool {
19381946
return String(cString: swiftparse_syntax_structure_versioning_identifier()!) ==
1939-
"3a049b2faed8cf5c7c125ffe4354a6e8b5d9620f"
1947+
"fd719aaf2e0dab2620af2d4d123d123b3d0de28d"
19401948
}
19411949
}

Sources/SwiftSyntax/gyb_generated/SyntaxAnyVisitor.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,13 @@ open class SyntaxAnyVisitor: SyntaxVisitor {
169169
override open func visitPost(_ node: TryExprSyntax) {
170170
visitAnyPost(node._syntaxNode)
171171
}
172+
override open func visit(_ node: AwaitExprSyntax) -> SyntaxVisitorContinueKind {
173+
return visitAny(node._syntaxNode)
174+
}
175+
176+
override open func visitPost(_ node: AwaitExprSyntax) {
177+
visitAnyPost(node._syntaxNode)
178+
}
172179
override open func visit(_ node: DeclNameArgumentSyntax) -> SyntaxVisitorContinueKind {
173180
return visitAny(node._syntaxNode)
174181
}

Sources/SwiftSyntax/gyb_generated/SyntaxBaseNodes.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ public struct ExprSyntax: ExprSyntaxProtocol, SyntaxHashable {
164164
/// `nil` if the conversion is not possible.
165165
public init?(_ syntax: Syntax) {
166166
switch syntax.raw.kind {
167-
case .unknownExpr, .inOutExpr, .poundColumnExpr, .tryExpr, .identifierExpr, .superRefExpr, .nilLiteralExpr, .discardAssignmentExpr, .assignmentExpr, .sequenceExpr, .poundLineExpr, .poundFileExpr, .poundFileIDExpr, .poundFilePathExpr, .poundFunctionExpr, .poundDsohandleExpr, .symbolicReferenceExpr, .prefixOperatorExpr, .binaryOperatorExpr, .arrowExpr, .floatLiteralExpr, .tupleExpr, .arrayExpr, .dictionaryExpr, .integerLiteralExpr, .booleanLiteralExpr, .ternaryExpr, .memberAccessExpr, .isExpr, .asExpr, .typeExpr, .closureExpr, .unresolvedPatternExpr, .functionCallExpr, .subscriptExpr, .optionalChainingExpr, .forcedValueExpr, .postfixUnaryExpr, .specializeExpr, .stringLiteralExpr, .keyPathExpr, .keyPathBaseExpr, .objcKeyPathExpr, .objcSelectorExpr, .editorPlaceholderExpr, .objectLiteralExpr:
167+
case .unknownExpr, .inOutExpr, .poundColumnExpr, .tryExpr, .awaitExpr, .identifierExpr, .superRefExpr, .nilLiteralExpr, .discardAssignmentExpr, .assignmentExpr, .sequenceExpr, .poundLineExpr, .poundFileExpr, .poundFileIDExpr, .poundFilePathExpr, .poundFunctionExpr, .poundDsohandleExpr, .symbolicReferenceExpr, .prefixOperatorExpr, .binaryOperatorExpr, .arrowExpr, .floatLiteralExpr, .tupleExpr, .arrayExpr, .dictionaryExpr, .integerLiteralExpr, .booleanLiteralExpr, .ternaryExpr, .memberAccessExpr, .isExpr, .asExpr, .typeExpr, .closureExpr, .unresolvedPatternExpr, .functionCallExpr, .subscriptExpr, .optionalChainingExpr, .forcedValueExpr, .postfixUnaryExpr, .specializeExpr, .stringLiteralExpr, .keyPathExpr, .keyPathBaseExpr, .objcKeyPathExpr, .objcSelectorExpr, .editorPlaceholderExpr, .objectLiteralExpr:
168168
self._syntaxNode = syntax
169169
default:
170170
return nil
@@ -178,7 +178,7 @@ public struct ExprSyntax: ExprSyntaxProtocol, SyntaxHashable {
178178
// Assert that the kind of the given data matches in debug builds.
179179
#if DEBUG
180180
switch data.raw.kind {
181-
case .unknownExpr, .inOutExpr, .poundColumnExpr, .tryExpr, .identifierExpr, .superRefExpr, .nilLiteralExpr, .discardAssignmentExpr, .assignmentExpr, .sequenceExpr, .poundLineExpr, .poundFileExpr, .poundFileIDExpr, .poundFilePathExpr, .poundFunctionExpr, .poundDsohandleExpr, .symbolicReferenceExpr, .prefixOperatorExpr, .binaryOperatorExpr, .arrowExpr, .floatLiteralExpr, .tupleExpr, .arrayExpr, .dictionaryExpr, .integerLiteralExpr, .booleanLiteralExpr, .ternaryExpr, .memberAccessExpr, .isExpr, .asExpr, .typeExpr, .closureExpr, .unresolvedPatternExpr, .functionCallExpr, .subscriptExpr, .optionalChainingExpr, .forcedValueExpr, .postfixUnaryExpr, .specializeExpr, .stringLiteralExpr, .keyPathExpr, .keyPathBaseExpr, .objcKeyPathExpr, .objcSelectorExpr, .editorPlaceholderExpr, .objectLiteralExpr:
181+
case .unknownExpr, .inOutExpr, .poundColumnExpr, .tryExpr, .awaitExpr, .identifierExpr, .superRefExpr, .nilLiteralExpr, .discardAssignmentExpr, .assignmentExpr, .sequenceExpr, .poundLineExpr, .poundFileExpr, .poundFileIDExpr, .poundFilePathExpr, .poundFunctionExpr, .poundDsohandleExpr, .symbolicReferenceExpr, .prefixOperatorExpr, .binaryOperatorExpr, .arrowExpr, .floatLiteralExpr, .tupleExpr, .arrayExpr, .dictionaryExpr, .integerLiteralExpr, .booleanLiteralExpr, .ternaryExpr, .memberAccessExpr, .isExpr, .asExpr, .typeExpr, .closureExpr, .unresolvedPatternExpr, .functionCallExpr, .subscriptExpr, .optionalChainingExpr, .forcedValueExpr, .postfixUnaryExpr, .specializeExpr, .stringLiteralExpr, .keyPathExpr, .keyPathBaseExpr, .objcKeyPathExpr, .objcSelectorExpr, .editorPlaceholderExpr, .objectLiteralExpr:
182182
break
183183
default:
184184
fatalError("Unable to create ExprSyntax from \(data.raw.kind)")

Sources/SwiftSyntax/gyb_generated/SyntaxBuilders.swift

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,52 @@ extension TryExprSyntax {
256256
}
257257
}
258258

259+
public struct AwaitExprSyntaxBuilder {
260+
private var layout =
261+
Array<RawSyntax?>(repeating: nil, count: 2)
262+
263+
internal init() {}
264+
265+
public mutating func useAwaitKeyword(_ node: TokenSyntax) {
266+
let idx = AwaitExprSyntax.Cursor.awaitKeyword.rawValue
267+
layout[idx] = node.raw
268+
}
269+
270+
public mutating func useExpression(_ node: ExprSyntax) {
271+
let idx = AwaitExprSyntax.Cursor.expression.rawValue
272+
layout[idx] = node.raw
273+
}
274+
275+
internal mutating func buildData() -> SyntaxData {
276+
if (layout[0] == nil) {
277+
layout[0] = RawSyntax.missingToken(TokenKind.awaitKeyword)
278+
}
279+
if (layout[1] == nil) {
280+
layout[1] = RawSyntax.missing(SyntaxKind.expr)
281+
}
282+
283+
return .forRoot(RawSyntax.createAndCalcLength(kind: .awaitExpr,
284+
layout: layout, presence: .present))
285+
}
286+
}
287+
288+
extension AwaitExprSyntax {
289+
/// Creates a `AwaitExprSyntax` using the provided build function.
290+
/// - Parameter:
291+
/// - build: A closure that wil be invoked in order to initialize
292+
/// the fields of the syntax node.
293+
/// This closure is passed a `AwaitExprSyntaxBuilder` which you can use to
294+
/// incrementally build the structure of the node.
295+
/// - Returns: A `AwaitExprSyntax` with all the fields populated in the builder
296+
/// closure.
297+
public init(_ build: (inout AwaitExprSyntaxBuilder) -> Void) {
298+
var builder = AwaitExprSyntaxBuilder()
299+
build(&builder)
300+
let data = builder.buildData()
301+
self.init(data)
302+
}
303+
}
304+
259305
public struct DeclNameArgumentSyntaxBuilder {
260306
private var layout =
261307
Array<RawSyntax?>(repeating: nil, count: 2)

Sources/SwiftSyntax/gyb_generated/SyntaxClassification.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,8 @@ extension RawTokenKind {
212212
return .keyword
213213
case .throwsKeyword:
214214
return .keyword
215+
case .awaitKeyword:
216+
return .keyword
215217
case .__file__Keyword:
216218
return .keyword
217219
case .__line__Keyword:

Sources/SwiftSyntax/gyb_generated/SyntaxEnum.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public enum SyntaxEnum {
3636
case dictionaryElementList(DictionaryElementListSyntax)
3737
case stringLiteralSegments(StringLiteralSegmentsSyntax)
3838
case tryExpr(TryExprSyntax)
39+
case awaitExpr(AwaitExprSyntax)
3940
case declNameArgument(DeclNameArgumentSyntax)
4041
case declNameArgumentList(DeclNameArgumentListSyntax)
4142
case declNameArguments(DeclNameArgumentsSyntax)
@@ -306,6 +307,8 @@ public extension Syntax {
306307
return .stringLiteralSegments(StringLiteralSegmentsSyntax(self)!)
307308
case .tryExpr:
308309
return .tryExpr(TryExprSyntax(self)!)
310+
case .awaitExpr:
311+
return .awaitExpr(AwaitExprSyntax(self)!)
309312
case .declNameArgument:
310313
return .declNameArgument(DeclNameArgumentSyntax(self)!)
311314
case .declNameArgumentList:

Sources/SwiftSyntax/gyb_generated/SyntaxFactory.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,25 @@ public enum SyntaxFactory {
250250
], length: .zero, presence: .present))
251251
return TryExprSyntax(data)
252252
}
253+
public static func makeAwaitExpr(awaitKeyword: TokenSyntax, expression: ExprSyntax) -> AwaitExprSyntax {
254+
let layout: [RawSyntax?] = [
255+
awaitKeyword.raw,
256+
expression.raw,
257+
]
258+
let raw = RawSyntax.createAndCalcLength(kind: SyntaxKind.awaitExpr,
259+
layout: layout, presence: SourcePresence.present)
260+
let data = SyntaxData.forRoot(raw)
261+
return AwaitExprSyntax(data)
262+
}
263+
264+
public static func makeBlankAwaitExpr() -> AwaitExprSyntax {
265+
let data = SyntaxData.forRoot(RawSyntax.create(kind: .awaitExpr,
266+
layout: [
267+
RawSyntax.missingToken(TokenKind.awaitKeyword),
268+
RawSyntax.missing(SyntaxKind.expr),
269+
], length: .zero, presence: .present))
270+
return AwaitExprSyntax(data)
271+
}
253272
public static func makeDeclNameArgument(name: TokenSyntax, colon: TokenSyntax) -> DeclNameArgumentSyntax {
254273
let layout: [RawSyntax?] = [
255274
name.raw,
@@ -5045,6 +5064,12 @@ public enum SyntaxFactory {
50455064
leadingTrivia: leadingTrivia,
50465065
trailingTrivia: trailingTrivia)
50475066
}
5067+
public static func makeAwaitKeyword(leadingTrivia: Trivia = [],
5068+
trailingTrivia: Trivia = []) -> TokenSyntax {
5069+
return makeToken(.awaitKeyword, presence: .present,
5070+
leadingTrivia: leadingTrivia,
5071+
trailingTrivia: trailingTrivia)
5072+
}
50485073
public static func make__FILE__Keyword(leadingTrivia: Trivia = [],
50495074
trailingTrivia: Trivia = []) -> TokenSyntax {
50505075
return makeToken(.__file__Keyword, presence: .present,

Sources/SwiftSyntax/gyb_generated/SyntaxKind.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ internal enum SyntaxKind: CSyntaxKind {
3636
case dictionaryElementList = 167
3737
case stringLiteralSegments = 168
3838
case tryExpr = 27
39+
case awaitExpr = 249
3940
case declNameArgument = 94
4041
case declNameArgumentList = 169
4142
case declNameArguments = 95

Sources/SwiftSyntax/gyb_generated/SyntaxRewriter.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,13 @@ open class SyntaxRewriter {
128128
return ExprSyntax(visitChildren(node))
129129
}
130130

131+
/// Visit a `AwaitExprSyntax`.
132+
/// - Parameter node: the node that is being visited
133+
/// - Returns: the rewritten node
134+
open func visit(_ node: AwaitExprSyntax) -> ExprSyntax {
135+
return ExprSyntax(visitChildren(node))
136+
}
137+
131138
/// Visit a `DeclNameArgumentSyntax`.
132139
/// - Parameter node: the node that is being visited
133140
/// - Returns: the rewritten node
@@ -1909,6 +1916,16 @@ open class SyntaxRewriter {
19091916
return Syntax(visit(node))
19101917
}
19111918

1919+
/// Implementation detail of visit(_:). Do not call directly.
1920+
private func visitImplAwaitExprSyntax(_ data: SyntaxData) -> Syntax {
1921+
let node = AwaitExprSyntax(data)
1922+
// Accessing _syntaxNode directly is faster than calling Syntax(node)
1923+
visitPre(node._syntaxNode)
1924+
defer { visitPost(node._syntaxNode) }
1925+
if let newNode = visitAny(node._syntaxNode) { return newNode }
1926+
return Syntax(visit(node))
1927+
}
1928+
19121929
/// Implementation detail of visit(_:). Do not call directly.
19131930
private func visitImplDeclNameArgumentSyntax(_ data: SyntaxData) -> Syntax {
19141931
let node = DeclNameArgumentSyntax(data)
@@ -4201,6 +4218,8 @@ open class SyntaxRewriter {
42014218
return visitImplStringLiteralSegmentsSyntax
42024219
case .tryExpr:
42034220
return visitImplTryExprSyntax
4221+
case .awaitExpr:
4222+
return visitImplAwaitExprSyntax
42044223
case .declNameArgument:
42054224
return visitImplDeclNameArgumentSyntax
42064225
case .declNameArgumentList:
@@ -4696,6 +4715,8 @@ open class SyntaxRewriter {
46964715
return visitImplStringLiteralSegmentsSyntax(data)
46974716
case .tryExpr:
46984717
return visitImplTryExprSyntax(data)
4718+
case .awaitExpr:
4719+
return visitImplAwaitExprSyntax(data)
46994720
case .declNameArgument:
47004721
return visitImplDeclNameArgumentSyntax(data)
47014722
case .declNameArgumentList:

Sources/SwiftSyntax/gyb_generated/SyntaxVisitor.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,16 @@ open class SyntaxVisitor {
182182
/// The function called after visiting `TryExprSyntax` and its descendents.
183183
/// - node: the node we just finished visiting.
184184
open func visitPost(_ node: TryExprSyntax) {}
185+
/// Visiting `AwaitExprSyntax` specifically.
186+
/// - Parameter node: the node we are visiting.
187+
/// - Returns: how should we continue visiting.
188+
open func visit(_ node: AwaitExprSyntax) -> SyntaxVisitorContinueKind {
189+
return .visitChildren
190+
}
191+
192+
/// The function called after visiting `AwaitExprSyntax` and its descendents.
193+
/// - node: the node we just finished visiting.
194+
open func visitPost(_ node: AwaitExprSyntax) {}
185195
/// Visiting `DeclNameArgumentSyntax` specifically.
186196
/// - Parameter node: the node we are visiting.
187197
/// - Returns: how should we continue visiting.
@@ -2625,6 +2635,17 @@ open class SyntaxVisitor {
26252635
visitPost(node)
26262636
}
26272637

2638+
/// Implementation detail of doVisit(_:_:). Do not call directly.
2639+
private func visitImplAwaitExprSyntax(_ data: SyntaxData) {
2640+
let node = AwaitExprSyntax(data)
2641+
let needsChildren = (visit(node) == .visitChildren)
2642+
// Avoid calling into visitChildren if possible.
2643+
if needsChildren && node.raw.numberOfChildren > 0 {
2644+
visitChildren(node)
2645+
}
2646+
visitPost(node)
2647+
}
2648+
26282649
/// Implementation detail of doVisit(_:_:). Do not call directly.
26292650
private func visitImplDeclNameArgumentSyntax(_ data: SyntaxData) {
26302651
let node = DeclNameArgumentSyntax(data)
@@ -5105,6 +5126,8 @@ open class SyntaxVisitor {
51055126
visitImplStringLiteralSegmentsSyntax(data)
51065127
case .tryExpr:
51075128
visitImplTryExprSyntax(data)
5129+
case .awaitExpr:
5130+
visitImplAwaitExprSyntax(data)
51085131
case .declNameArgument:
51095132
visitImplDeclNameArgumentSyntax(data)
51105133
case .declNameArgumentList:

Sources/SwiftSyntax/gyb_generated/TokenKind.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public enum TokenKind {
6868
case trueKeyword
6969
case tryKeyword
7070
case throwsKeyword
71+
case awaitKeyword
7172
case __file__Keyword
7273
case __line__Keyword
7374
case __column__Keyword
@@ -195,6 +196,7 @@ public enum TokenKind {
195196
case .trueKeyword: return "true"
196197
case .tryKeyword: return "try"
197198
case .throwsKeyword: return "throws"
199+
case .awaitKeyword: return "__await"
198200
case .__file__Keyword: return "__FILE__"
199201
case .__line__Keyword: return "__LINE__"
200202
case .__column__Keyword: return "__COLUMN__"
@@ -323,6 +325,7 @@ public enum TokenKind {
323325
case .trueKeyword: return true
324326
case .tryKeyword: return true
325327
case .throwsKeyword: return true
328+
case .awaitKeyword: return true
326329
case .__file__Keyword: return true
327330
case .__line__Keyword: return true
328331
case .__column__Keyword: return true
@@ -451,6 +454,7 @@ public enum TokenKind {
451454
case .trueKeyword: return "kw_true"
452455
case .tryKeyword: return "kw_try"
453456
case .throwsKeyword: return "kw_throws"
457+
case .awaitKeyword: return "kw___await"
454458
case .__file__Keyword: return "kw___FILE__"
455459
case .__line__Keyword: return "kw___LINE__"
456460
case .__column__Keyword: return "kw___COLUMN__"
@@ -579,6 +583,7 @@ public enum TokenKind {
579583
case .trueKeyword: return SourceLength(utf8Length: 4)
580584
case .tryKeyword: return SourceLength(utf8Length: 3)
581585
case .throwsKeyword: return SourceLength(utf8Length: 6)
586+
case .awaitKeyword: return SourceLength(utf8Length: 7)
582587
case .__file__Keyword: return SourceLength(utf8Length: 8)
583588
case .__line__Keyword: return SourceLength(utf8Length: 8)
584589
case .__column__Keyword: return SourceLength(utf8Length: 10)
@@ -709,6 +714,7 @@ extension TokenKind: Equatable {
709714
case (.trueKeyword, .trueKeyword): return true
710715
case (.tryKeyword, .tryKeyword): return true
711716
case (.throwsKeyword, .throwsKeyword): return true
717+
case (.awaitKeyword, .awaitKeyword): return true
712718
case (.__file__Keyword, .__file__Keyword): return true
713719
case (.__line__Keyword, .__line__Keyword): return true
714720
case (.__column__Keyword, .__column__Keyword): return true
@@ -907,6 +913,8 @@ extension TokenKind {
907913
return .tryKeyword
908914
case 53:
909915
return .throwsKeyword
916+
case 123:
917+
return .awaitKeyword
910918
case 54:
911919
return .__file__Keyword
912920
case 55:
@@ -1167,6 +1175,8 @@ extension TokenKind {
11671175
return false
11681176
case 53:
11691177
return false
1178+
case 123:
1179+
return false
11701180
case 54:
11711181
return false
11721182
case 55:
@@ -1367,6 +1377,7 @@ internal enum RawTokenKind: CTokenKind {
13671377
case trueKeyword = 51
13681378
case tryKeyword = 52
13691379
case throwsKeyword = 53
1380+
case awaitKeyword = 123
13701381
case __file__Keyword = 54
13711382
case __line__Keyword = 55
13721383
case __column__Keyword = 56
@@ -1608,6 +1619,9 @@ extension TokenKind {
16081619
case .throwsKeyword:
16091620
let length = 6
16101621
return body(.init(kind: .throwsKeyword, length: length))
1622+
case .awaitKeyword:
1623+
let length = 7
1624+
return body(.init(kind: .awaitKeyword, length: length))
16111625
case .__file__Keyword:
16121626
let length = 8
16131627
return body(.init(kind: .__file__Keyword, length: length))

0 commit comments

Comments
 (0)