Skip to content

Commit 4aeae6c

Browse files
committed
Formalize Labeled Syntax
This represents labeled statements as an explicit kind of statement and removes the Labeled trait. Any kind of statement is allowed to be labeled in the tree, but we specifically diagnose the syntax elements that aren't allowed to have labels. This homogenizes the way clients deal with statement labels and also makes parser recovery quite a bit easier in the case where we have a label but no actual statement following it.
1 parent 2380374 commit 4aeae6c

File tree

19 files changed

+784
-1407
lines changed

19 files changed

+784
-1407
lines changed

Sources/SwiftSyntax/gyb_generated/Misc.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,6 +1045,12 @@ extension SyntaxNode {
10451045
return BackDeployVersionArgumentSyntax(asSyntaxData)
10461046
}
10471047

1048+
public var isLabeledStmt: Bool { return raw.kind == .labeledStmt }
1049+
public var asLabeledStmt: LabeledStmtSyntax? {
1050+
guard isLabeledStmt else { return nil }
1051+
return LabeledStmtSyntax(asSyntaxData)
1052+
}
1053+
10481054
public var isContinueStmt: Bool { return raw.kind == .continueStmt }
10491055
public var asContinueStmt: ContinueStmtSyntax? {
10501056
guard isContinueStmt else { return nil }
@@ -1921,6 +1927,8 @@ extension Syntax {
19211927
return node
19221928
case .backDeployVersionArgument(let node):
19231929
return node
1930+
case .labeledStmt(let node):
1931+
return node
19241932
case .continueStmt(let node):
19251933
return node
19261934
case .whileStmt(let node):

Sources/SwiftSyntax/gyb_generated/SyntaxAnyVisitor.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,6 +1258,13 @@ open class SyntaxAnyVisitor: SyntaxVisitor {
12581258
override open func visitPost(_ node: BackDeployVersionArgumentSyntax) {
12591259
visitAnyPost(node._syntaxNode)
12601260
}
1261+
override open func visit(_ node: LabeledStmtSyntax) -> SyntaxVisitorContinueKind {
1262+
return visitAny(node._syntaxNode)
1263+
}
1264+
1265+
override open func visitPost(_ node: LabeledStmtSyntax) {
1266+
visitAnyPost(node._syntaxNode)
1267+
}
12611268
override open func visit(_ node: ContinueStmtSyntax) -> SyntaxVisitorContinueKind {
12621269
return visitAny(node._syntaxNode)
12631270
}

Sources/SwiftSyntax/gyb_generated/SyntaxBaseNodes.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ public struct StmtSyntax: StmtSyntaxProtocol, SyntaxHashable {
272272
/// `nil` if the conversion is not possible.
273273
public init?(_ syntax: Syntax) {
274274
switch syntax.raw.kind {
275-
case .unknownStmt, .missingStmt, .continueStmt, .whileStmt, .deferStmt, .expressionStmt, .repeatWhileStmt, .guardStmt, .forInStmt, .switchStmt, .doStmt, .returnStmt, .yieldStmt, .fallthroughStmt, .breakStmt, .declarationStmt, .throwStmt, .ifStmt, .poundAssertStmt:
275+
case .unknownStmt, .missingStmt, .labeledStmt, .continueStmt, .whileStmt, .deferStmt, .expressionStmt, .repeatWhileStmt, .guardStmt, .forInStmt, .switchStmt, .doStmt, .returnStmt, .yieldStmt, .fallthroughStmt, .breakStmt, .declarationStmt, .throwStmt, .ifStmt, .poundAssertStmt:
276276
self._syntaxNode = syntax
277277
default:
278278
return nil
@@ -286,7 +286,7 @@ public struct StmtSyntax: StmtSyntaxProtocol, SyntaxHashable {
286286
// Assert that the kind of the given data matches in debug builds.
287287
#if DEBUG
288288
switch data.raw.kind {
289-
case .unknownStmt, .missingStmt, .continueStmt, .whileStmt, .deferStmt, .expressionStmt, .repeatWhileStmt, .guardStmt, .forInStmt, .switchStmt, .doStmt, .returnStmt, .yieldStmt, .fallthroughStmt, .breakStmt, .declarationStmt, .throwStmt, .ifStmt, .poundAssertStmt:
289+
case .unknownStmt, .missingStmt, .labeledStmt, .continueStmt, .whileStmt, .deferStmt, .expressionStmt, .repeatWhileStmt, .guardStmt, .forInStmt, .switchStmt, .doStmt, .returnStmt, .yieldStmt, .fallthroughStmt, .breakStmt, .declarationStmt, .throwStmt, .ifStmt, .poundAssertStmt:
290290
break
291291
default:
292292
fatalError("Unable to create StmtSyntax from \(data.raw.kind)")

Sources/SwiftSyntax/gyb_generated/SyntaxBuilders.swift

Lines changed: 102 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -7275,6 +7275,60 @@ extension BackDeployVersionArgumentSyntax {
72757275
}
72767276
}
72777277

7278+
public struct LabeledStmtSyntaxBuilder {
7279+
private var layout =
7280+
Array<RawSyntax?>(repeating: nil, count: 6)
7281+
7282+
internal init() {}
7283+
7284+
public mutating func useLabelName(_ node: TokenSyntax) {
7285+
let idx = LabeledStmtSyntax.Cursor.labelName.rawValue
7286+
layout[idx] = node.raw
7287+
}
7288+
7289+
public mutating func useLabelColon(_ node: TokenSyntax) {
7290+
let idx = LabeledStmtSyntax.Cursor.labelColon.rawValue
7291+
layout[idx] = node.raw
7292+
}
7293+
7294+
public mutating func useBody(_ node: StmtSyntax) {
7295+
let idx = LabeledStmtSyntax.Cursor.body.rawValue
7296+
layout[idx] = node.raw
7297+
}
7298+
7299+
internal mutating func buildData() -> SyntaxData {
7300+
if (layout[1] == nil) {
7301+
layout[1] = RawSyntax.missingToken(TokenKind.identifier(""))
7302+
}
7303+
if (layout[3] == nil) {
7304+
layout[3] = RawSyntax.missingToken(TokenKind.colon)
7305+
}
7306+
if (layout[5] == nil) {
7307+
layout[5] = RawSyntax.missing(SyntaxKind.missingStmt)
7308+
}
7309+
7310+
return .forRoot(RawSyntax.createAndCalcLength(kind: .labeledStmt,
7311+
layout: layout, presence: .present))
7312+
}
7313+
}
7314+
7315+
extension LabeledStmtSyntax {
7316+
/// Creates a `LabeledStmtSyntax` using the provided build function.
7317+
/// - Parameter:
7318+
/// - build: A closure that will be invoked in order to initialize
7319+
/// the fields of the syntax node.
7320+
/// This closure is passed a `LabeledStmtSyntaxBuilder` which you can use to
7321+
/// incrementally build the structure of the node.
7322+
/// - Returns: A `LabeledStmtSyntax` with all the fields populated in the builder
7323+
/// closure.
7324+
public init(_ build: (inout LabeledStmtSyntaxBuilder) -> Void) {
7325+
var builder = LabeledStmtSyntaxBuilder()
7326+
build(&builder)
7327+
let data = builder.buildData()
7328+
self.init(data)
7329+
}
7330+
}
7331+
72787332
public struct ContinueStmtSyntaxBuilder {
72797333
private var layout =
72807334
Array<RawSyntax?>(repeating: nil, count: 4)
@@ -7320,20 +7374,10 @@ extension ContinueStmtSyntax {
73207374

73217375
public struct WhileStmtSyntaxBuilder {
73227376
private var layout =
7323-
Array<RawSyntax?>(repeating: nil, count: 10)
7377+
Array<RawSyntax?>(repeating: nil, count: 6)
73247378

73257379
internal init() {}
73267380

7327-
public mutating func useLabelName(_ node: TokenSyntax) {
7328-
let idx = WhileStmtSyntax.Cursor.labelName.rawValue
7329-
layout[idx] = node.raw
7330-
}
7331-
7332-
public mutating func useLabelColon(_ node: TokenSyntax) {
7333-
let idx = WhileStmtSyntax.Cursor.labelColon.rawValue
7334-
layout[idx] = node.raw
7335-
}
7336-
73377381
public mutating func useWhileKeyword(_ node: TokenSyntax) {
73387382
let idx = WhileStmtSyntax.Cursor.whileKeyword.rawValue
73397383
layout[idx] = node.raw
@@ -7356,14 +7400,14 @@ public struct WhileStmtSyntaxBuilder {
73567400
}
73577401

73587402
internal mutating func buildData() -> SyntaxData {
7359-
if (layout[5] == nil) {
7360-
layout[5] = RawSyntax.missingToken(TokenKind.whileKeyword)
7403+
if (layout[1] == nil) {
7404+
layout[1] = RawSyntax.missingToken(TokenKind.whileKeyword)
73617405
}
7362-
if (layout[7] == nil) {
7363-
layout[7] = RawSyntax.missing(SyntaxKind.conditionElementList)
7406+
if (layout[3] == nil) {
7407+
layout[3] = RawSyntax.missing(SyntaxKind.conditionElementList)
73647408
}
7365-
if (layout[9] == nil) {
7366-
layout[9] = RawSyntax.missing(SyntaxKind.codeBlock)
7409+
if (layout[5] == nil) {
7410+
layout[5] = RawSyntax.missing(SyntaxKind.codeBlock)
73677411
}
73687412

73697413
return .forRoot(RawSyntax.createAndCalcLength(kind: .whileStmt,
@@ -7474,20 +7518,10 @@ extension ExpressionStmtSyntax {
74747518

74757519
public struct RepeatWhileStmtSyntaxBuilder {
74767520
private var layout =
7477-
Array<RawSyntax?>(repeating: nil, count: 12)
7521+
Array<RawSyntax?>(repeating: nil, count: 8)
74787522

74797523
internal init() {}
74807524

7481-
public mutating func useLabelName(_ node: TokenSyntax) {
7482-
let idx = RepeatWhileStmtSyntax.Cursor.labelName.rawValue
7483-
layout[idx] = node.raw
7484-
}
7485-
7486-
public mutating func useLabelColon(_ node: TokenSyntax) {
7487-
let idx = RepeatWhileStmtSyntax.Cursor.labelColon.rawValue
7488-
layout[idx] = node.raw
7489-
}
7490-
74917525
public mutating func useRepeatKeyword(_ node: TokenSyntax) {
74927526
let idx = RepeatWhileStmtSyntax.Cursor.repeatKeyword.rawValue
74937527
layout[idx] = node.raw
@@ -7509,17 +7543,17 @@ public struct RepeatWhileStmtSyntaxBuilder {
75097543
}
75107544

75117545
internal mutating func buildData() -> SyntaxData {
7512-
if (layout[5] == nil) {
7513-
layout[5] = RawSyntax.missingToken(TokenKind.repeatKeyword)
7546+
if (layout[1] == nil) {
7547+
layout[1] = RawSyntax.missingToken(TokenKind.repeatKeyword)
75147548
}
7515-
if (layout[7] == nil) {
7516-
layout[7] = RawSyntax.missing(SyntaxKind.codeBlock)
7549+
if (layout[3] == nil) {
7550+
layout[3] = RawSyntax.missing(SyntaxKind.codeBlock)
75177551
}
7518-
if (layout[9] == nil) {
7519-
layout[9] = RawSyntax.missingToken(TokenKind.whileKeyword)
7552+
if (layout[5] == nil) {
7553+
layout[5] = RawSyntax.missingToken(TokenKind.whileKeyword)
75207554
}
7521-
if (layout[11] == nil) {
7522-
layout[11] = RawSyntax.missing(SyntaxKind.missingExpr)
7555+
if (layout[7] == nil) {
7556+
layout[7] = RawSyntax.missing(SyntaxKind.missingExpr)
75237557
}
75247558

75257559
return .forRoot(RawSyntax.createAndCalcLength(kind: .repeatWhileStmt,
@@ -7660,20 +7694,10 @@ extension WhereClauseSyntax {
76607694

76617695
public struct ForInStmtSyntaxBuilder {
76627696
private var layout =
7663-
Array<RawSyntax?>(repeating: nil, count: 24)
7697+
Array<RawSyntax?>(repeating: nil, count: 20)
76647698

76657699
internal init() {}
76667700

7667-
public mutating func useLabelName(_ node: TokenSyntax) {
7668-
let idx = ForInStmtSyntax.Cursor.labelName.rawValue
7669-
layout[idx] = node.raw
7670-
}
7671-
7672-
public mutating func useLabelColon(_ node: TokenSyntax) {
7673-
let idx = ForInStmtSyntax.Cursor.labelColon.rawValue
7674-
layout[idx] = node.raw
7675-
}
7676-
76777701
public mutating func useForKeyword(_ node: TokenSyntax) {
76787702
let idx = ForInStmtSyntax.Cursor.forKeyword.rawValue
76797703
layout[idx] = node.raw
@@ -7725,20 +7749,20 @@ public struct ForInStmtSyntaxBuilder {
77257749
}
77267750

77277751
internal mutating func buildData() -> SyntaxData {
7728-
if (layout[5] == nil) {
7729-
layout[5] = RawSyntax.missingToken(TokenKind.forKeyword)
7752+
if (layout[1] == nil) {
7753+
layout[1] = RawSyntax.missingToken(TokenKind.forKeyword)
7754+
}
7755+
if (layout[9] == nil) {
7756+
layout[9] = RawSyntax.missing(SyntaxKind.missingPattern)
77307757
}
77317758
if (layout[13] == nil) {
7732-
layout[13] = RawSyntax.missing(SyntaxKind.missingPattern)
7759+
layout[13] = RawSyntax.missingToken(TokenKind.inKeyword)
77337760
}
7734-
if (layout[17] == nil) {
7735-
layout[17] = RawSyntax.missingToken(TokenKind.inKeyword)
7761+
if (layout[15] == nil) {
7762+
layout[15] = RawSyntax.missing(SyntaxKind.missingExpr)
77367763
}
77377764
if (layout[19] == nil) {
7738-
layout[19] = RawSyntax.missing(SyntaxKind.missingExpr)
7739-
}
7740-
if (layout[23] == nil) {
7741-
layout[23] = RawSyntax.missing(SyntaxKind.codeBlock)
7765+
layout[19] = RawSyntax.missing(SyntaxKind.codeBlock)
77427766
}
77437767

77447768
return .forRoot(RawSyntax.createAndCalcLength(kind: .forInStmt,
@@ -7765,20 +7789,10 @@ extension ForInStmtSyntax {
77657789

77667790
public struct SwitchStmtSyntaxBuilder {
77677791
private var layout =
7768-
Array<RawSyntax?>(repeating: nil, count: 14)
7792+
Array<RawSyntax?>(repeating: nil, count: 10)
77697793

77707794
internal init() {}
77717795

7772-
public mutating func useLabelName(_ node: TokenSyntax) {
7773-
let idx = SwitchStmtSyntax.Cursor.labelName.rawValue
7774-
layout[idx] = node.raw
7775-
}
7776-
7777-
public mutating func useLabelColon(_ node: TokenSyntax) {
7778-
let idx = SwitchStmtSyntax.Cursor.labelColon.rawValue
7779-
layout[idx] = node.raw
7780-
}
7781-
77827796
public mutating func useSwitchKeyword(_ node: TokenSyntax) {
77837797
let idx = SwitchStmtSyntax.Cursor.switchKeyword.rawValue
77847798
layout[idx] = node.raw
@@ -7811,20 +7825,20 @@ public struct SwitchStmtSyntaxBuilder {
78117825
}
78127826

78137827
internal mutating func buildData() -> SyntaxData {
7828+
if (layout[1] == nil) {
7829+
layout[1] = RawSyntax.missingToken(TokenKind.switchKeyword)
7830+
}
7831+
if (layout[3] == nil) {
7832+
layout[3] = RawSyntax.missing(SyntaxKind.missingExpr)
7833+
}
78147834
if (layout[5] == nil) {
7815-
layout[5] = RawSyntax.missingToken(TokenKind.switchKeyword)
7835+
layout[5] = RawSyntax.missingToken(TokenKind.leftBrace)
78167836
}
78177837
if (layout[7] == nil) {
7818-
layout[7] = RawSyntax.missing(SyntaxKind.missingExpr)
7838+
layout[7] = RawSyntax.missing(SyntaxKind.switchCaseList)
78197839
}
78207840
if (layout[9] == nil) {
7821-
layout[9] = RawSyntax.missingToken(TokenKind.leftBrace)
7822-
}
7823-
if (layout[11] == nil) {
7824-
layout[11] = RawSyntax.missing(SyntaxKind.switchCaseList)
7825-
}
7826-
if (layout[13] == nil) {
7827-
layout[13] = RawSyntax.missingToken(TokenKind.rightBrace)
7841+
layout[9] = RawSyntax.missingToken(TokenKind.rightBrace)
78287842
}
78297843

78307844
return .forRoot(RawSyntax.createAndCalcLength(kind: .switchStmt,
@@ -7851,20 +7865,10 @@ extension SwitchStmtSyntax {
78517865

78527866
public struct DoStmtSyntaxBuilder {
78537867
private var layout =
7854-
Array<RawSyntax?>(repeating: nil, count: 10)
7868+
Array<RawSyntax?>(repeating: nil, count: 6)
78557869

78567870
internal init() {}
78577871

7858-
public mutating func useLabelName(_ node: TokenSyntax) {
7859-
let idx = DoStmtSyntax.Cursor.labelName.rawValue
7860-
layout[idx] = node.raw
7861-
}
7862-
7863-
public mutating func useLabelColon(_ node: TokenSyntax) {
7864-
let idx = DoStmtSyntax.Cursor.labelColon.rawValue
7865-
layout[idx] = node.raw
7866-
}
7867-
78687872
public mutating func useDoKeyword(_ node: TokenSyntax) {
78697873
let idx = DoStmtSyntax.Cursor.doKeyword.rawValue
78707874
layout[idx] = node.raw
@@ -7887,11 +7891,11 @@ public struct DoStmtSyntaxBuilder {
78877891
}
78887892

78897893
internal mutating func buildData() -> SyntaxData {
7890-
if (layout[5] == nil) {
7891-
layout[5] = RawSyntax.missingToken(TokenKind.doKeyword)
7894+
if (layout[1] == nil) {
7895+
layout[1] = RawSyntax.missingToken(TokenKind.doKeyword)
78927896
}
7893-
if (layout[7] == nil) {
7894-
layout[7] = RawSyntax.missing(SyntaxKind.codeBlock)
7897+
if (layout[3] == nil) {
7898+
layout[3] = RawSyntax.missing(SyntaxKind.codeBlock)
78957899
}
78967900

78977901
return .forRoot(RawSyntax.createAndCalcLength(kind: .doStmt,
@@ -8531,20 +8535,10 @@ extension ThrowStmtSyntax {
85318535

85328536
public struct IfStmtSyntaxBuilder {
85338537
private var layout =
8534-
Array<RawSyntax?>(repeating: nil, count: 14)
8538+
Array<RawSyntax?>(repeating: nil, count: 10)
85358539

85368540
internal init() {}
85378541

8538-
public mutating func useLabelName(_ node: TokenSyntax) {
8539-
let idx = IfStmtSyntax.Cursor.labelName.rawValue
8540-
layout[idx] = node.raw
8541-
}
8542-
8543-
public mutating func useLabelColon(_ node: TokenSyntax) {
8544-
let idx = IfStmtSyntax.Cursor.labelColon.rawValue
8545-
layout[idx] = node.raw
8546-
}
8547-
85488542
public mutating func useIfKeyword(_ node: TokenSyntax) {
85498543
let idx = IfStmtSyntax.Cursor.ifKeyword.rawValue
85508544
layout[idx] = node.raw
@@ -8577,14 +8571,14 @@ public struct IfStmtSyntaxBuilder {
85778571
}
85788572

85798573
internal mutating func buildData() -> SyntaxData {
8580-
if (layout[5] == nil) {
8581-
layout[5] = RawSyntax.missingToken(TokenKind.ifKeyword)
8574+
if (layout[1] == nil) {
8575+
layout[1] = RawSyntax.missingToken(TokenKind.ifKeyword)
85828576
}
8583-
if (layout[7] == nil) {
8584-
layout[7] = RawSyntax.missing(SyntaxKind.conditionElementList)
8577+
if (layout[3] == nil) {
8578+
layout[3] = RawSyntax.missing(SyntaxKind.conditionElementList)
85858579
}
8586-
if (layout[9] == nil) {
8587-
layout[9] = RawSyntax.missing(SyntaxKind.codeBlock)
8580+
if (layout[5] == nil) {
8581+
layout[5] = RawSyntax.missing(SyntaxKind.codeBlock)
85888582
}
85898583

85908584
return .forRoot(RawSyntax.createAndCalcLength(kind: .ifStmt,

Sources/SwiftSyntax/gyb_generated/SyntaxClassification.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ extension SyntaxClassification {
7979
return (.keyword, false)
8080
case (.attribute, 3):
8181
return (.attribute, false)
82-
case (.forInStmt, 9):
82+
case (.forInStmt, 5):
8383
return (.keyword, false)
8484
case (.simpleTypeIdentifier, 1):
8585
return (.typeIdentifier, false)

0 commit comments

Comments
 (0)