Skip to content

Commit 339e71d

Browse files
authored
Merge pull request #499 from DougGregor/syntax-decl-cleanup
[Syntax] Clean up syntax grammar for declaration nodes
2 parents d7909be + 69ca962 commit 339e71d

File tree

19 files changed

+1182
-389
lines changed

19 files changed

+1182
-389
lines changed

Examples/CodeGenerationUsingSwiftSyntaxBuilder.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import SwiftSyntaxBuilder
1313
let source = SourceFile {
1414
ImportDecl(path: "Foundation")
1515
ImportDecl(path: "UIKit")
16-
ClassDecl(classOrActorKeyword: .class, identifier: "SomeViewController", membersBuilder: {
16+
ClassDecl(classKeyword: .class, identifier: "SomeViewController", membersBuilder: {
1717
VariableDecl(.let, name: "tableView", type: "UITableView")
1818
})
1919
}

Sources/SwiftSyntax/gyb_generated/Misc.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,12 @@ extension SyntaxNode {
577577
return PoundSourceLocationArgsSyntax(asSyntaxData)
578578
}
579579

580+
public var isDeclModifierDetail: Bool { return raw.kind == .declModifierDetail }
581+
public var asDeclModifierDetail: DeclModifierDetailSyntax? {
582+
guard isDeclModifierDetail else { return nil }
583+
return DeclModifierDetailSyntax(asSyntaxData)
584+
}
585+
580586
public var isDeclModifier: Bool { return raw.kind == .declModifier }
581587
public var asDeclModifier: DeclModifierSyntax? {
582588
guard isDeclModifier else { return nil }
@@ -607,6 +613,12 @@ extension SyntaxNode {
607613
return ClassDeclSyntax(asSyntaxData)
608614
}
609615

616+
public var isActorDecl: Bool { return raw.kind == .actorDecl }
617+
public var asActorDecl: ActorDeclSyntax? {
618+
guard isActorDecl else { return nil }
619+
return ActorDeclSyntax(asSyntaxData)
620+
}
621+
610622
public var isStructDecl: Bool { return raw.kind == .structDecl }
611623
public var asStructDecl: StructDeclSyntax? {
612624
guard isStructDecl else { return nil }
@@ -1715,6 +1727,8 @@ extension Syntax {
17151727
return node
17161728
case .poundSourceLocationArgs(let node):
17171729
return node
1730+
case .declModifierDetail(let node):
1731+
return node
17181732
case .declModifier(let node):
17191733
return node
17201734
case .inheritedType(let node):
@@ -1725,6 +1739,8 @@ extension Syntax {
17251739
return node
17261740
case .classDecl(let node):
17271741
return node
1742+
case .actorDecl(let node):
1743+
return node
17281744
case .structDecl(let node):
17291745
return node
17301746
case .protocolDecl(let node):

Sources/SwiftSyntax/gyb_generated/SyntaxAnyVisitor.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,13 @@ open class SyntaxAnyVisitor: SyntaxVisitor {
715715
override open func visitPost(_ node: PoundSourceLocationArgsSyntax) {
716716
visitAnyPost(node._syntaxNode)
717717
}
718+
override open func visit(_ node: DeclModifierDetailSyntax) -> SyntaxVisitorContinueKind {
719+
return visitAny(node._syntaxNode)
720+
}
721+
722+
override open func visitPost(_ node: DeclModifierDetailSyntax) {
723+
visitAnyPost(node._syntaxNode)
724+
}
718725
override open func visit(_ node: DeclModifierSyntax) -> SyntaxVisitorContinueKind {
719726
return visitAny(node._syntaxNode)
720727
}
@@ -750,6 +757,13 @@ open class SyntaxAnyVisitor: SyntaxVisitor {
750757
override open func visitPost(_ node: ClassDeclSyntax) {
751758
visitAnyPost(node._syntaxNode)
752759
}
760+
override open func visit(_ node: ActorDeclSyntax) -> SyntaxVisitorContinueKind {
761+
return visitAny(node._syntaxNode)
762+
}
763+
764+
override open func visitPost(_ node: ActorDeclSyntax) {
765+
visitAnyPost(node._syntaxNode)
766+
}
753767
override open func visit(_ node: StructDeclSyntax) -> SyntaxVisitorContinueKind {
754768
return visitAny(node._syntaxNode)
755769
}

Sources/SwiftSyntax/gyb_generated/SyntaxBaseNodes.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public struct DeclSyntax: DeclSyntaxProtocol, SyntaxHashable {
5656
/// `nil` if the conversion is not possible.
5757
public init?(_ syntax: Syntax) {
5858
switch syntax.raw.kind {
59-
case .unknownDecl, .typealiasDecl, .associatedtypeDecl, .ifConfigDecl, .poundErrorDecl, .poundWarningDecl, .poundSourceLocation, .classDecl, .structDecl, .protocolDecl, .extensionDecl, .functionDecl, .initializerDecl, .deinitializerDecl, .subscriptDecl, .importDecl, .accessorDecl, .variableDecl, .enumCaseDecl, .enumDecl, .operatorDecl, .precedenceGroupDecl:
59+
case .unknownDecl, .typealiasDecl, .associatedtypeDecl, .ifConfigDecl, .poundErrorDecl, .poundWarningDecl, .poundSourceLocation, .classDecl, .actorDecl, .structDecl, .protocolDecl, .extensionDecl, .functionDecl, .initializerDecl, .deinitializerDecl, .subscriptDecl, .importDecl, .accessorDecl, .variableDecl, .enumCaseDecl, .enumDecl, .operatorDecl, .precedenceGroupDecl:
6060
self._syntaxNode = syntax
6161
default:
6262
return nil
@@ -70,7 +70,7 @@ public struct DeclSyntax: DeclSyntaxProtocol, SyntaxHashable {
7070
// Assert that the kind of the given data matches in debug builds.
7171
#if DEBUG
7272
switch data.raw.kind {
73-
case .unknownDecl, .typealiasDecl, .associatedtypeDecl, .ifConfigDecl, .poundErrorDecl, .poundWarningDecl, .poundSourceLocation, .classDecl, .structDecl, .protocolDecl, .extensionDecl, .functionDecl, .initializerDecl, .deinitializerDecl, .subscriptDecl, .importDecl, .accessorDecl, .variableDecl, .enumCaseDecl, .enumDecl, .operatorDecl, .precedenceGroupDecl:
73+
case .unknownDecl, .typealiasDecl, .associatedtypeDecl, .ifConfigDecl, .poundErrorDecl, .poundWarningDecl, .poundSourceLocation, .classDecl, .actorDecl, .structDecl, .protocolDecl, .extensionDecl, .functionDecl, .initializerDecl, .deinitializerDecl, .subscriptDecl, .importDecl, .accessorDecl, .variableDecl, .enumCaseDecl, .enumDecl, .operatorDecl, .precedenceGroupDecl:
7474
break
7575
default:
7676
fatalError("Unable to create DeclSyntax from \(data.raw.kind)")

Sources/SwiftSyntax/gyb_generated/SyntaxBuilders.swift

Lines changed: 156 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3238,6 +3238,9 @@ public struct TypealiasDeclSyntaxBuilder {
32383238
if (layout[3] == nil) {
32393239
layout[3] = RawSyntax.missingToken(TokenKind.identifier(""))
32403240
}
3241+
if (layout[5] == nil) {
3242+
layout[5] = RawSyntax.missing(SyntaxKind.typeInitializerClause)
3243+
}
32413244

32423245
return .forRoot(RawSyntax.createAndCalcLength(kind: .typealiasDecl,
32433246
layout: layout, presence: .present))
@@ -3875,29 +3878,73 @@ extension PoundSourceLocationArgsSyntax {
38753878
}
38763879
}
38773880

3878-
public struct DeclModifierSyntaxBuilder {
3881+
public struct DeclModifierDetailSyntaxBuilder {
38793882
private var layout =
3880-
Array<RawSyntax?>(repeating: nil, count: 4)
3883+
Array<RawSyntax?>(repeating: nil, count: 3)
38813884

38823885
internal init() {}
38833886

3884-
public mutating func useName(_ node: TokenSyntax) {
3885-
let idx = DeclModifierSyntax.Cursor.name.rawValue
3887+
public mutating func useLeftParen(_ node: TokenSyntax) {
3888+
let idx = DeclModifierDetailSyntax.Cursor.leftParen.rawValue
3889+
layout[idx] = node.raw
3890+
}
3891+
3892+
public mutating func useDetail(_ node: TokenSyntax) {
3893+
let idx = DeclModifierDetailSyntax.Cursor.detail.rawValue
38863894
layout[idx] = node.raw
38873895
}
38883896

3889-
public mutating func useDetailLeftParen(_ node: TokenSyntax) {
3890-
let idx = DeclModifierSyntax.Cursor.detailLeftParen.rawValue
3897+
public mutating func useRightParen(_ node: TokenSyntax) {
3898+
let idx = DeclModifierDetailSyntax.Cursor.rightParen.rawValue
38913899
layout[idx] = node.raw
38923900
}
38933901

3894-
public mutating func useDetail(_ node: TokenSyntax) {
3895-
let idx = DeclModifierSyntax.Cursor.detail.rawValue
3902+
internal mutating func buildData() -> SyntaxData {
3903+
if (layout[0] == nil) {
3904+
layout[0] = RawSyntax.missingToken(TokenKind.leftParen)
3905+
}
3906+
if (layout[1] == nil) {
3907+
layout[1] = RawSyntax.missingToken(TokenKind.identifier(""))
3908+
}
3909+
if (layout[2] == nil) {
3910+
layout[2] = RawSyntax.missingToken(TokenKind.rightParen)
3911+
}
3912+
3913+
return .forRoot(RawSyntax.createAndCalcLength(kind: .declModifierDetail,
3914+
layout: layout, presence: .present))
3915+
}
3916+
}
3917+
3918+
extension DeclModifierDetailSyntax {
3919+
/// Creates a `DeclModifierDetailSyntax` using the provided build function.
3920+
/// - Parameter:
3921+
/// - build: A closure that will be invoked in order to initialize
3922+
/// the fields of the syntax node.
3923+
/// This closure is passed a `DeclModifierDetailSyntaxBuilder` which you can use to
3924+
/// incrementally build the structure of the node.
3925+
/// - Returns: A `DeclModifierDetailSyntax` with all the fields populated in the builder
3926+
/// closure.
3927+
public init(_ build: (inout DeclModifierDetailSyntaxBuilder) -> Void) {
3928+
var builder = DeclModifierDetailSyntaxBuilder()
3929+
build(&builder)
3930+
let data = builder.buildData()
3931+
self.init(data)
3932+
}
3933+
}
3934+
3935+
public struct DeclModifierSyntaxBuilder {
3936+
private var layout =
3937+
Array<RawSyntax?>(repeating: nil, count: 2)
3938+
3939+
internal init() {}
3940+
3941+
public mutating func useName(_ node: TokenSyntax) {
3942+
let idx = DeclModifierSyntax.Cursor.name.rawValue
38963943
layout[idx] = node.raw
38973944
}
38983945

3899-
public mutating func useDetailRightParen(_ node: TokenSyntax) {
3900-
let idx = DeclModifierSyntax.Cursor.detailRightParen.rawValue
3946+
public mutating func useDetail(_ node: DeclModifierDetailSyntax) {
3947+
let idx = DeclModifierSyntax.Cursor.detail.rawValue
39013948
layout[idx] = node.raw
39023949
}
39033950

@@ -4051,8 +4098,8 @@ public struct ClassDeclSyntaxBuilder {
40514098
}
40524099
}
40534100

4054-
public mutating func useClassOrActorKeyword(_ node: TokenSyntax) {
4055-
let idx = ClassDeclSyntax.Cursor.classOrActorKeyword.rawValue
4101+
public mutating func useClassKeyword(_ node: TokenSyntax) {
4102+
let idx = ClassDeclSyntax.Cursor.classKeyword.rawValue
40564103
layout[idx] = node.raw
40574104
}
40584105

@@ -4114,6 +4161,97 @@ extension ClassDeclSyntax {
41144161
}
41154162
}
41164163

4164+
public struct ActorDeclSyntaxBuilder {
4165+
private var layout =
4166+
Array<RawSyntax?>(repeating: nil, count: 8)
4167+
4168+
internal init() {}
4169+
4170+
public mutating func addAttribute(_ elt: Syntax) {
4171+
let idx = ActorDeclSyntax.Cursor.attributes.rawValue
4172+
if let list = layout[idx] {
4173+
layout[idx] = list.appending(elt.raw)
4174+
} else {
4175+
layout[idx] = RawSyntax.create(kind: SyntaxKind.attributeList,
4176+
layout: [elt.raw], length: elt.raw.totalLength,
4177+
presence: SourcePresence.present)
4178+
}
4179+
}
4180+
4181+
public mutating func addModifier(_ elt: DeclModifierSyntax) {
4182+
let idx = ActorDeclSyntax.Cursor.modifiers.rawValue
4183+
if let list = layout[idx] {
4184+
layout[idx] = list.appending(elt.raw)
4185+
} else {
4186+
layout[idx] = RawSyntax.create(kind: SyntaxKind.modifierList,
4187+
layout: [elt.raw], length: elt.raw.totalLength,
4188+
presence: SourcePresence.present)
4189+
}
4190+
}
4191+
4192+
public mutating func useActorKeyword(_ node: TokenSyntax) {
4193+
let idx = ActorDeclSyntax.Cursor.actorKeyword.rawValue
4194+
layout[idx] = node.raw
4195+
}
4196+
4197+
public mutating func useIdentifier(_ node: TokenSyntax) {
4198+
let idx = ActorDeclSyntax.Cursor.identifier.rawValue
4199+
layout[idx] = node.raw
4200+
}
4201+
4202+
public mutating func useGenericParameterClause(_ node: GenericParameterClauseSyntax) {
4203+
let idx = ActorDeclSyntax.Cursor.genericParameterClause.rawValue
4204+
layout[idx] = node.raw
4205+
}
4206+
4207+
public mutating func useInheritanceClause(_ node: TypeInheritanceClauseSyntax) {
4208+
let idx = ActorDeclSyntax.Cursor.inheritanceClause.rawValue
4209+
layout[idx] = node.raw
4210+
}
4211+
4212+
public mutating func useGenericWhereClause(_ node: GenericWhereClauseSyntax) {
4213+
let idx = ActorDeclSyntax.Cursor.genericWhereClause.rawValue
4214+
layout[idx] = node.raw
4215+
}
4216+
4217+
public mutating func useMembers(_ node: MemberDeclBlockSyntax) {
4218+
let idx = ActorDeclSyntax.Cursor.members.rawValue
4219+
layout[idx] = node.raw
4220+
}
4221+
4222+
internal mutating func buildData() -> SyntaxData {
4223+
if (layout[2] == nil) {
4224+
layout[2] = RawSyntax.missingToken(TokenKind.contextualKeyword(""))
4225+
}
4226+
if (layout[3] == nil) {
4227+
layout[3] = RawSyntax.missingToken(TokenKind.identifier(""))
4228+
}
4229+
if (layout[7] == nil) {
4230+
layout[7] = RawSyntax.missing(SyntaxKind.memberDeclBlock)
4231+
}
4232+
4233+
return .forRoot(RawSyntax.createAndCalcLength(kind: .actorDecl,
4234+
layout: layout, presence: .present))
4235+
}
4236+
}
4237+
4238+
extension ActorDeclSyntax {
4239+
/// Creates a `ActorDeclSyntax` using the provided build function.
4240+
/// - Parameter:
4241+
/// - build: A closure that will be invoked in order to initialize
4242+
/// the fields of the syntax node.
4243+
/// This closure is passed a `ActorDeclSyntaxBuilder` which you can use to
4244+
/// incrementally build the structure of the node.
4245+
/// - Returns: A `ActorDeclSyntax` with all the fields populated in the builder
4246+
/// closure.
4247+
public init(_ build: (inout ActorDeclSyntaxBuilder) -> Void) {
4248+
var builder = ActorDeclSyntaxBuilder()
4249+
build(&builder)
4250+
let data = builder.buildData()
4251+
self.init(data)
4252+
}
4253+
}
4254+
41174255
public struct StructDeclSyntaxBuilder {
41184256
private var layout =
41194257
Array<RawSyntax?>(repeating: nil, count: 8)
@@ -4752,7 +4890,7 @@ extension FunctionDeclSyntax {
47524890

47534891
public struct InitializerDeclSyntaxBuilder {
47544892
private var layout =
4755-
Array<RawSyntax?>(repeating: nil, count: 9)
4893+
Array<RawSyntax?>(repeating: nil, count: 8)
47564894

47574895
internal init() {}
47584896

@@ -4793,13 +4931,8 @@ public struct InitializerDeclSyntaxBuilder {
47934931
layout[idx] = node.raw
47944932
}
47954933

4796-
public mutating func useParameters(_ node: ParameterClauseSyntax) {
4797-
let idx = InitializerDeclSyntax.Cursor.parameters.rawValue
4798-
layout[idx] = node.raw
4799-
}
4800-
4801-
public mutating func useThrowsOrRethrowsKeyword(_ node: TokenSyntax) {
4802-
let idx = InitializerDeclSyntax.Cursor.throwsOrRethrowsKeyword.rawValue
4934+
public mutating func useSignature(_ node: FunctionSignatureSyntax) {
4935+
let idx = InitializerDeclSyntax.Cursor.signature.rawValue
48034936
layout[idx] = node.raw
48044937
}
48054938

@@ -4818,7 +4951,7 @@ public struct InitializerDeclSyntaxBuilder {
48184951
layout[2] = RawSyntax.missingToken(TokenKind.initKeyword)
48194952
}
48204953
if (layout[5] == nil) {
4821-
layout[5] = RawSyntax.missing(SyntaxKind.parameterClause)
4954+
layout[5] = RawSyntax.missing(SyntaxKind.functionSignature)
48224955
}
48234956

48244957
return .forRoot(RawSyntax.createAndCalcLength(kind: .initializerDecl,
@@ -4885,9 +5018,6 @@ public struct DeinitializerDeclSyntaxBuilder {
48855018
if (layout[2] == nil) {
48865019
layout[2] = RawSyntax.missingToken(TokenKind.deinitKeyword)
48875020
}
4888-
if (layout[3] == nil) {
4889-
layout[3] = RawSyntax.missing(SyntaxKind.codeBlock)
4890-
}
48915021

48925022
return .forRoot(RawSyntax.createAndCalcLength(kind: .deinitializerDecl,
48935023
layout: layout, presence: .present))
@@ -5004,7 +5134,7 @@ extension SubscriptDeclSyntax {
50045134

50055135
public struct AccessLevelModifierSyntaxBuilder {
50065136
private var layout =
5007-
Array<RawSyntax?>(repeating: nil, count: 4)
5137+
Array<RawSyntax?>(repeating: nil, count: 2)
50085138

50095139
internal init() {}
50105140

@@ -5013,21 +5143,11 @@ public struct AccessLevelModifierSyntaxBuilder {
50135143
layout[idx] = node.raw
50145144
}
50155145

5016-
public mutating func useLeftParen(_ node: TokenSyntax) {
5017-
let idx = AccessLevelModifierSyntax.Cursor.leftParen.rawValue
5018-
layout[idx] = node.raw
5019-
}
5020-
5021-
public mutating func useModifier(_ node: TokenSyntax) {
5146+
public mutating func useModifier(_ node: DeclModifierDetailSyntax) {
50225147
let idx = AccessLevelModifierSyntax.Cursor.modifier.rawValue
50235148
layout[idx] = node.raw
50245149
}
50255150

5026-
public mutating func useRightParen(_ node: TokenSyntax) {
5027-
let idx = AccessLevelModifierSyntax.Cursor.rightParen.rawValue
5028-
layout[idx] = node.raw
5029-
}
5030-
50315151
internal mutating func buildData() -> SyntaxData {
50325152
if (layout[0] == nil) {
50335153
layout[0] = RawSyntax.missingToken(TokenKind.identifier(""))

0 commit comments

Comments
 (0)