Skip to content

Commit a1c17fe

Browse files
committed
[CodeGeneration] Centralize 'import SwiftSyntax' generation
Import all known @_spi.
1 parent 36bd1ac commit a1c17fe

23 files changed

+84
-151
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2025 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import SwiftSyntax
14+
import SwiftSyntaxBuilder
15+
import SyntaxSupport
16+
17+
enum ImportAccessLevel {
18+
case `public`
19+
case `internal`
20+
}
21+
22+
func importSwiftSyntax(accessLevel: ImportAccessLevel = .internal) -> DeclSyntax {
23+
// Import all '@_spi'.
24+
let importingAttrs = AttributeListSyntax {
25+
var seen: Set<String> = []
26+
AttributeSyntax("@_spi(RawSyntax)").with(\.trailingTrivia, .space)
27+
AttributeSyntax("@_spi(ExperimentalLanguageFeatures)").with(\.trailingTrivia, .space)
28+
for node in NON_BASE_SYNTAX_NODES {
29+
if let spi = node.spi, seen.insert(spi.text).inserted {
30+
AttributeSyntax("@_spi(\(spi))").with(\.trailingTrivia, .space)
31+
}
32+
}
33+
}
34+
let visibilityKeyword: TokenSyntax
35+
switch accessLevel {
36+
case .internal:
37+
visibilityKeyword = "internal"
38+
case .public:
39+
visibilityKeyword = "public"
40+
}
41+
42+
return DeclSyntax(
43+
"""
44+
#if compiler(>=6)
45+
\(importingAttrs)\(visibilityKeyword) import SwiftSyntax
46+
#else
47+
\(importingAttrs)import SwiftSyntax
48+
#endif
49+
"""
50+
)
51+
}

CodeGeneration/Sources/generate-swift-syntax/templates/swiftparser/IsLexerClassifiedFile.swift

+1-9
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,7 @@ import SyntaxSupport
1616
import Utils
1717

1818
let isLexerClassifiedFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
19-
DeclSyntax(
20-
"""
21-
#if compiler(>=6)
22-
public import SwiftSyntax
23-
#else
24-
import SwiftSyntax
25-
#endif
26-
"""
27-
)
19+
importSwiftSyntax(accessLevel: .public)
2820

2921
try! ExtensionDeclSyntax(
3022
"""

CodeGeneration/Sources/generate-swift-syntax/templates/swiftparser/LayoutNodesParsableFile.swift

+1-19
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,7 @@ import SyntaxSupport
1616
import Utils
1717

1818
let layoutNodesParsableFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
19-
var importingAttrs = AttributeListSyntax {
20-
var seen: Set<String> = []
21-
AttributeSyntax("@_spi(RawSyntax)").with(\.trailingTrivia, .space)
22-
AttributeSyntax("@_spi(ExperimentalLanguageFeatures)").with(\.trailingTrivia, .space)
23-
for node in NON_BASE_SYNTAX_NODES {
24-
if let spi = node.spi, seen.insert(spi.text).inserted {
25-
AttributeSyntax("@_spi(\(spi))").with(\.trailingTrivia, .space)
26-
}
27-
}
28-
}
29-
DeclSyntax(
30-
"""
31-
#if compiler(>=6)
32-
\(importingAttrs) public import SwiftSyntax
33-
#else
34-
\(importingAttrs) import SwiftSyntax
35-
#endif
36-
"""
37-
)
19+
importSwiftSyntax(accessLevel: .public)
3820

3921
DeclSyntax(
4022
"""

CodeGeneration/Sources/generate-swift-syntax/templates/swiftparser/ParserTokenSpecSetFile.swift

+1-9
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,7 @@ func tokenCaseMatch(
2727
}
2828

2929
let parserTokenSpecSetFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
30-
DeclSyntax(
31-
"""
32-
#if compiler(>=6)
33-
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) public import SwiftSyntax
34-
#else
35-
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) import SwiftSyntax
36-
#endif
37-
"""
38-
)
30+
importSwiftSyntax(accessLevel: .public)
3931

4032
for layoutNode in SYNTAX_NODES.compactMap(\.layoutNode) {
4133
for child in layoutNode.children {

CodeGeneration/Sources/generate-swift-syntax/templates/swiftparser/TokenSpecStaticMembersFile.swift

+1-9
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,7 @@ import SyntaxSupport
1616
import Utils
1717

1818
let tokenSpecStaticMembersFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
19-
DeclSyntax(
20-
"""
21-
#if compiler(>=6)
22-
@_spi(RawSyntax) internal import SwiftSyntax
23-
#else
24-
@_spi(RawSyntax) import SwiftSyntax
25-
#endif
26-
"""
27-
)
19+
importSwiftSyntax()
2820

2921
try! ExtensionDeclSyntax("extension TokenSpec") {
3022
for tokenSpec in Token.allCases.map(\.spec) where tokenSpec.kind != .keyword {

CodeGeneration/Sources/generate-swift-syntax/templates/swiftparserdiagnostics/ChildNameForDiagnosticsFile.swift

+1-9
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,7 @@ import SyntaxSupport
1616
import Utils
1717

1818
let childNameForDiagnosticFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
19-
DeclSyntax(
20-
"""
21-
#if compiler(>=6)
22-
@_spi(ExperimentalLanguageFeatures) internal import SwiftSyntax
23-
#else
24-
@_spi(ExperimentalLanguageFeatures) import SwiftSyntax
25-
#endif
26-
"""
27-
)
19+
importSwiftSyntax(accessLevel: .internal)
2820

2921
try! FunctionDeclSyntax(
3022
"private func childNameForDiagnostics(_ keyPath: AnyKeyPath) -> String?"

CodeGeneration/Sources/generate-swift-syntax/templates/swiftparserdiagnostics/SyntaxKindNameForDiagnosticsFile.swift

+1-18
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,7 @@ import SyntaxSupport
1616
import Utils
1717

1818
let syntaxKindNameForDiagnosticFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
19-
var importingAttrs = AttributeListSyntax {
20-
var seen: Set<String> = []
21-
AttributeSyntax("@_spi(ExperimentalLanguageFeatures)").with(\.trailingTrivia, .space)
22-
for node in NON_BASE_SYNTAX_NODES {
23-
if let spi = node.spi, seen.insert(spi.text).inserted {
24-
AttributeSyntax("@_spi(\(spi))").with(\.trailingTrivia, .space)
25-
}
26-
}
27-
}
28-
DeclSyntax(
29-
"""
30-
#if compiler(>=6)
31-
\(importingAttrs) internal import SwiftSyntax
32-
#else
33-
\(importingAttrs) import SwiftSyntax
34-
#endif
35-
"""
36-
)
19+
importSwiftSyntax()
3720

3821
try! ExtensionDeclSyntax("extension SyntaxKind") {
3922
try VariableDeclSyntax("var nameForDiagnostics: String?") {

CodeGeneration/Sources/generate-swift-syntax/templates/swiftparserdiagnostics/TokenNameForDiagnosticsFile.swift

+1-9
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,7 @@ import SyntaxSupport
1616
import Utils
1717

1818
let tokenNameForDiagnosticFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
19-
DeclSyntax(
20-
"""
21-
#if compiler(>=6)
22-
@_spi(RawSyntax) internal import SwiftSyntax
23-
#else
24-
@_spi(RawSyntax) import SwiftSyntax
25-
#endif
26-
"""
27-
)
19+
importSwiftSyntax()
2820

2921
try! ExtensionDeclSyntax("extension TokenKind") {
3022
try! VariableDeclSyntax("var nameForDiagnostics: String") {

CodeGeneration/Sources/generate-swift-syntax/templates/swiftsyntaxbuilder/BuildableNodesFile.swift

+1-9
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,7 @@ import SyntaxSupport
1616
import Utils
1717

1818
let buildableNodesFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
19-
DeclSyntax(
20-
"""
21-
#if compiler(>=6)
22-
@_spi(ExperimentalLanguageFeatures) public import SwiftSyntax
23-
#else
24-
@_spi(ExperimentalLanguageFeatures) import SwiftSyntax
25-
#endif
26-
"""
27-
)
19+
importSwiftSyntax(accessLevel: .public)
2820

2921
for node in SYNTAX_NODES.compactMap(\.layoutNode) {
3022
let type = node.type

CodeGeneration/Sources/generate-swift-syntax/templates/swiftsyntaxbuilder/RenamedChildrenBuilderCompatibilityFile.swift

+1-9
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,7 @@ import SyntaxSupport
1616
import Utils
1717

1818
let renamedChildrenBuilderCompatibilityFile = try! SourceFileSyntax(leadingTrivia: copyrightHeader) {
19-
DeclSyntax(
20-
"""
21-
#if compiler(>=6)
22-
public import SwiftSyntax
23-
#else
24-
import SwiftSyntax
25-
#endif
26-
"""
27-
)
19+
importSwiftSyntax(accessLevel: .public)
2820

2921
for layoutNode in SYNTAX_NODES.compactMap(\.layoutNode).filter({ !$0.childHistory.isEmpty }) {
3022
let deprecatedMembers = SYNTAX_COMPATIBILITY_LAYER.deprecatedMembers(for: layoutNode)

CodeGeneration/Sources/generate-swift-syntax/templates/swiftsyntaxbuilder/ResultBuildersFile.swift

+1-9
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,7 @@ import SyntaxSupport
1616
import Utils
1717

1818
let resultBuildersFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
19-
DeclSyntax(
20-
"""
21-
#if compiler(>=6)
22-
@_spi(ExperimentalLanguageFeatures) public import SwiftSyntax
23-
#else
24-
@_spi(ExperimentalLanguageFeatures) import SwiftSyntax
25-
#endif
26-
"""
27-
)
19+
importSwiftSyntax(accessLevel: .public)
2820

2921
for node in SYNTAX_NODES.compactMap(\.collectionNode) {
3022
let type = SyntaxBuildableType(kind: .node(kind: node.kind))

CodeGeneration/Sources/generate-swift-syntax/templates/swiftsyntaxbuilder/SyntaxExpressibleByStringInterpolationConformancesFile.swift

+1-20
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,7 @@ import SyntaxSupport
1616
import Utils
1717

1818
let syntaxExpressibleByStringInterpolationConformancesFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
19-
20-
var importingAttrs = AttributeListSyntax {
21-
var seen: Set<String> = []
22-
AttributeSyntax("@_spi(ExperimentalLanguageFeatures)").with(\.trailingTrivia, .space)
23-
for node in NON_BASE_SYNTAX_NODES {
24-
if let spi = node.spi, seen.insert(spi.text).inserted {
25-
AttributeSyntax("@_spi(\(spi))").with(\.trailingTrivia, .space)
26-
}
27-
}
28-
}
29-
30-
DeclSyntax(
31-
"""
32-
#if compiler(>=6)
33-
\(importingAttrs) internal import SwiftSyntax
34-
#else
35-
\(importingAttrs) import SwiftSyntax
36-
#endif
37-
"""
38-
)
19+
importSwiftSyntax()
3920

4021
let typesExpressibleByStringInterpolation =
4122
SYNTAX_NODES

Sources/SwiftParser/generated/IsLexerClassified.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
#if compiler(>=6)
16-
public import SwiftSyntax
16+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) public import SwiftSyntax
1717
#else
18-
import SwiftSyntax
18+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) import SwiftSyntax
1919
#endif
2020

2121
extension Keyword {

Sources/SwiftParser/generated/LayoutNodes+Parsable.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
#if compiler(>=6)
16-
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) public import SwiftSyntax
16+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) public import SwiftSyntax
1717
#else
18-
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) import SwiftSyntax
18+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) import SwiftSyntax
1919
#endif
2020

2121
public protocol SyntaxParseable: SyntaxProtocol {

Sources/SwiftParser/generated/Parser+TokenSpecSet.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
#if compiler(>=6)
16-
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) public import SwiftSyntax
16+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) public import SwiftSyntax
1717
#else
18-
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) import SwiftSyntax
18+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) import SwiftSyntax
1919
#endif
2020

2121
extension AccessorDeclSyntax {

Sources/SwiftParser/generated/TokenSpecStaticMembers.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
#if compiler(>=6)
16-
@_spi(RawSyntax) internal import SwiftSyntax
16+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) internal import SwiftSyntax
1717
#else
18-
@_spi(RawSyntax) import SwiftSyntax
18+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) import SwiftSyntax
1919
#endif
2020

2121
extension TokenSpec {

Sources/SwiftParserDiagnostics/generated/ChildNameForDiagnostics.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
#if compiler(>=6)
16-
@_spi(ExperimentalLanguageFeatures) internal import SwiftSyntax
16+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) internal import SwiftSyntax
1717
#else
18-
@_spi(ExperimentalLanguageFeatures) import SwiftSyntax
18+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) import SwiftSyntax
1919
#endif
2020

2121
private func childNameForDiagnostics(_ keyPath: AnyKeyPath) -> String? {

Sources/SwiftParserDiagnostics/generated/SyntaxKindNameForDiagnostics.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
#if compiler(>=6)
16-
@_spi(ExperimentalLanguageFeatures) @_spi(Compiler) internal import SwiftSyntax
16+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) internal import SwiftSyntax
1717
#else
18-
@_spi(ExperimentalLanguageFeatures) @_spi(Compiler) import SwiftSyntax
18+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) import SwiftSyntax
1919
#endif
2020

2121
extension SyntaxKind {

Sources/SwiftParserDiagnostics/generated/TokenNameForDiagnostics.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
#if compiler(>=6)
16-
@_spi(RawSyntax) internal import SwiftSyntax
16+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) internal import SwiftSyntax
1717
#else
18-
@_spi(RawSyntax) import SwiftSyntax
18+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) import SwiftSyntax
1919
#endif
2020

2121
extension TokenKind {

Sources/SwiftSyntaxBuilder/generated/BuildableNodes.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
#if compiler(>=6)
16-
@_spi(ExperimentalLanguageFeatures) public import SwiftSyntax
16+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) public import SwiftSyntax
1717
#else
18-
@_spi(ExperimentalLanguageFeatures) import SwiftSyntax
18+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) import SwiftSyntax
1919
#endif
2020

2121
extension AccessorDeclSyntax {

Sources/SwiftSyntaxBuilder/generated/RenamedChildrenBuilderCompatibility.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
#if compiler(>=6)
16-
public import SwiftSyntax
16+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) public import SwiftSyntax
1717
#else
18-
import SwiftSyntax
18+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) import SwiftSyntax
1919
#endif
2020

2121
extension AccessorDeclSyntax {

Sources/SwiftSyntaxBuilder/generated/ResultBuilders.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
#if compiler(>=6)
16-
@_spi(ExperimentalLanguageFeatures) public import SwiftSyntax
16+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) public import SwiftSyntax
1717
#else
18-
@_spi(ExperimentalLanguageFeatures) import SwiftSyntax
18+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) @_spi(Compiler) import SwiftSyntax
1919
#endif
2020

2121
// MARK: - AccessorDeclListBuilder

0 commit comments

Comments
 (0)