Skip to content

Commit 296e24d

Browse files
authored
Update DeclGroupSyntax to refine DeclSyntaxProtocol (#2366)
Updates the swift-syntax code generator to support traits refining a syntax base type. Uses this new code generator feature to change DeclGroupSyntax to refine DeclSyntaxProtocol.
1 parent 0d3f3e3 commit 296e24d

File tree

3 files changed

+15
-3
lines changed

3 files changed

+15
-3
lines changed

CodeGeneration/Sources/SyntaxSupport/Traits.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,19 @@ import SwiftSyntax
1414

1515
public class Trait {
1616
public let traitName: String
17+
/// The kind of syntax the trait refines.
18+
///
19+
/// Base kind _must_ be a base syntax node, e.g. `.decl`, `.expr` , or
20+
/// others. See ``SyntaxNodeKind/isBase`` for more details.
21+
public let baseKind: SyntaxNodeKind?
1722
public let protocolName: TokenSyntax
1823
public let documentation: SwiftSyntax.Trivia
1924
public let children: [Child]
2025

21-
init(traitName: String, documentation: String? = nil, children: [Child]) {
26+
init(traitName: String, baseKind: SyntaxNodeKind? = nil, documentation: String? = nil, children: [Child]) {
27+
precondition(baseKind?.isBase != false, "`baseKind` must be a base syntax node kind")
2228
self.traitName = traitName
29+
self.baseKind = baseKind
2330
self.protocolName = .identifier("\(traitName)Syntax")
2431
self.documentation = SwiftSyntax.Trivia.docCommentTrivia(from: documentation)
2532
self.children = children
@@ -36,6 +43,7 @@ public let TRAITS: [Trait] = [
3643
),
3744
Trait(
3845
traitName: "DeclGroup",
46+
baseKind: .decl,
3947
children: [
4048
Child(name: "attributes", kind: .node(kind: .attributeList)),
4149
Child(name: "modifiers", kind: .node(kind: .declModifierList)),

CodeGeneration/Sources/generate-swift-syntax/templates/swiftsyntax/SyntaxTraitsFile.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ let syntaxTraitsFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
2222
// MARK: - \(trait.protocolName)
2323
2424
\(trait.documentation)
25-
public protocol \(trait.protocolName): SyntaxProtocol
25+
public protocol \(trait.protocolName): SyntaxProtocol\(raw:
26+
trait.baseKind != nil
27+
? ", \(trait.baseKind!.protocolType)"
28+
: ""
29+
)
2630
"""
2731
) {
2832
for child in trait.children {

Sources/SwiftSyntax/generated/SyntaxTraits.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public extension SyntaxProtocol {
6363
// MARK: - DeclGroupSyntax
6464

6565

66-
public protocol DeclGroupSyntax: SyntaxProtocol {
66+
public protocol DeclGroupSyntax: SyntaxProtocol, DeclSyntaxProtocol {
6767
var attributes: AttributeListSyntax {
6868
get
6969
set

0 commit comments

Comments
 (0)