Skip to content

Commit bd7bf0b

Browse files
authored
Merge pull request #3154 from DougGregor/static-build-configuration
2 parents 974c292 + e4f73a2 commit bd7bf0b

File tree

27 files changed

+812
-82
lines changed

27 files changed

+812
-82
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ let experimentalFeaturesFile = SourceFileSyntax(leadingTrivia: copyrightHeader)
2020
"""
2121
extension Parser {
2222
@_spi(ExperimentalLanguageFeatures)
23-
public struct ExperimentalFeatures: OptionSet, Sendable {
23+
public struct ExperimentalFeatures: OptionSet, Hashable, Sendable {
2424
public let rawValue: UInt
2525
public init(rawValue: UInt) {
2626
self.rawValue = rawValue

Package.swift

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ let package = Package(
166166

167167
.target(
168168
name: "SwiftIfConfig",
169-
dependencies: ["SwiftSyntax", "SwiftSyntaxBuilder", "SwiftDiagnostics", "SwiftOperators"],
169+
dependencies: ["SwiftSyntax", "SwiftSyntaxBuilder", "SwiftDiagnostics", "SwiftOperators", "SwiftParser"],
170170
exclude: ["CMakeLists.txt"]
171171
),
172172

@@ -275,7 +275,13 @@ let package = Package(
275275

276276
.target(
277277
name: "SwiftSyntaxMacros",
278-
dependencies: ["SwiftDiagnostics", "SwiftParser", "SwiftSyntax", "SwiftSyntaxBuilder"],
278+
dependencies: [
279+
"SwiftDiagnostics",
280+
"SwiftIfConfig",
281+
"SwiftParser",
282+
"SwiftSyntax",
283+
"SwiftSyntaxBuilder",
284+
],
279285
exclude: ["CMakeLists.txt"]
280286
),
281287

@@ -322,6 +328,7 @@ let package = Package(
322328
"_SwiftSyntaxGenericTestSupport",
323329
"SwiftDiagnostics",
324330
"SwiftIDEUtils",
331+
"SwiftIfConfig",
325332
"SwiftParser",
326333
"SwiftSyntaxMacros",
327334
"SwiftSyntaxMacroExpansion",

Sources/SwiftCompilerPluginMessageHandling/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ target_link_swift_syntax_libraries(SwiftCompilerPluginMessageHandling PUBLIC
2525
SwiftSyntax
2626
SwiftBasicFormat
2727
SwiftDiagnostics
28+
SwiftIfConfig
2829
SwiftParser
2930
SwiftSyntaxMacros
3031
SwiftSyntaxMacroExpansion

Sources/SwiftCompilerPluginMessageHandling/CompilerPluginMessageHandler.swift

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ import _SwiftSyntaxCShims
2121
#endif
2222

2323
#if compiler(>=6)
24+
internal import SwiftIfConfig
2425
public import SwiftSyntaxMacros
2526
#else
27+
import SwiftIfConfig
2628
import SwiftSyntaxMacros
2729
#endif
2830

@@ -189,12 +191,25 @@ public class PluginProviderMessageHandler<Provider: PluginProvider>: PluginMessa
189191
let macroRole,
190192
let discriminator,
191193
let expandingSyntax,
192-
let lexicalContext
194+
let lexicalContext,
195+
let staticBuildConfigurationString
193196
):
197+
// Decode the static build configuration.
198+
let staticBuildConfiguration: StaticBuildConfiguration?
199+
if let staticBuildConfigurationString {
200+
var mutableConfigurationString = staticBuildConfigurationString
201+
staticBuildConfiguration = mutableConfigurationString.withUTF8 {
202+
try? JSON.decode(StaticBuildConfiguration.self, from: $0)
203+
}
204+
} else {
205+
staticBuildConfiguration = nil
206+
}
207+
194208
return expandFreestandingMacro(
195209
macro: macro,
196210
macroRole: macroRole,
197211
discriminator: discriminator,
212+
staticBuildConfiguration: staticBuildConfiguration,
198213
expandingSyntax: expandingSyntax,
199214
lexicalContext: lexicalContext
200215
)
@@ -208,12 +223,25 @@ public class PluginProviderMessageHandler<Provider: PluginProvider>: PluginMessa
208223
let parentDeclSyntax,
209224
let extendedTypeSyntax,
210225
let conformanceListSyntax,
211-
let lexicalContext
226+
let lexicalContext,
227+
let staticBuildConfigurationString
212228
):
229+
// Decode the static build configuration.
230+
let staticBuildConfiguration: StaticBuildConfiguration?
231+
if let staticBuildConfigurationString {
232+
var mutableConfigurationString = staticBuildConfigurationString
233+
staticBuildConfiguration = mutableConfigurationString.withUTF8 {
234+
try? JSON.decode(StaticBuildConfiguration.self, from: $0)
235+
}
236+
} else {
237+
staticBuildConfiguration = nil
238+
}
239+
213240
return expandAttachedMacro(
214241
macro: macro,
215242
macroRole: macroRole,
216243
discriminator: discriminator,
244+
staticBuildConfiguration: staticBuildConfiguration,
217245
attributeSyntax: attributeSyntax,
218246
declSyntax: declSyntax,
219247
parentDeclSyntax: parentDeclSyntax,

Sources/SwiftCompilerPluginMessageHandling/Macros.swift

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,18 @@
1313
#if compiler(>=6)
1414
internal import SwiftBasicFormat
1515
internal import SwiftDiagnostics
16+
@_spi(ExperimentalLanguageFeatures) internal import SwiftIfConfig
1617
internal import SwiftOperators
18+
@_spi(ExperimentalLanguageFeatures) internal import SwiftParser
1719
internal import SwiftSyntax
1820
@_spi(MacroExpansion) @_spi(ExperimentalLanguageFeature) internal import SwiftSyntaxMacroExpansion
1921
@_spi(ExperimentalLanguageFeature) internal import SwiftSyntaxMacros
2022
#else
2123
import SwiftBasicFormat
2224
import SwiftDiagnostics
25+
@_spi(ExperimentalLanguageFeatures) import SwiftIfConfig
2326
import SwiftOperators
27+
@_spi(ExperimentalLanguageFeatures) import SwiftParser
2428
import SwiftSyntax
2529
@_spi(MacroExpansion) @_spi(ExperimentalLanguageFeature) import SwiftSyntaxMacroExpansion
2630
@_spi(ExperimentalLanguageFeature) import SwiftSyntaxMacros
@@ -36,6 +40,8 @@ extension PluginProviderMessageHandler {
3640
private static func resolveLexicalContext(
3741
_ lexicalContext: [PluginMessage.Syntax]?,
3842
sourceManager: SourceManager,
43+
swiftVersion: Parser.SwiftVersion?,
44+
experimentalFeatures: Parser.ExperimentalFeatures?,
3945
operatorTable: OperatorTable,
4046
fallbackSyntax: some SyntaxProtocol
4147
) -> [Syntax] {
@@ -45,29 +51,47 @@ extension PluginProviderMessageHandler {
4551
return fallbackSyntax.allMacroLexicalContexts()
4652
}
4753

48-
return lexicalContext.map { sourceManager.add($0, foldingWith: operatorTable) }
54+
return lexicalContext.map {
55+
sourceManager.add(
56+
$0,
57+
swiftVersion: swiftVersion,
58+
experimentalFeatures: experimentalFeatures,
59+
foldingWith: operatorTable
60+
)
61+
}
4962
}
5063

5164
/// Expand `@freestainding(XXX)` macros.
5265
func expandFreestandingMacro(
5366
macro: PluginMessage.MacroReference,
5467
macroRole pluginMacroRole: PluginMessage.MacroRole?,
5568
discriminator: String,
69+
staticBuildConfiguration: StaticBuildConfiguration?,
5670
expandingSyntax: PluginMessage.Syntax,
5771
lexicalContext: [PluginMessage.Syntax]?
5872
) -> PluginToHostMessage {
5973
let sourceManager = SourceManager(syntaxRegistry: syntaxRegistry)
60-
let syntax = sourceManager.add(expandingSyntax, foldingWith: .standardOperators)
74+
let swiftVersion = staticBuildConfiguration?.parserSwiftVersion
75+
let experimentalFeatures = staticBuildConfiguration?.experimentalFeatures
76+
let syntax = sourceManager.add(
77+
expandingSyntax,
78+
swiftVersion: swiftVersion,
79+
experimentalFeatures: experimentalFeatures,
80+
foldingWith: .standardOperators
81+
)
6182

6283
let context = PluginMacroExpansionContext(
6384
sourceManager: sourceManager,
6485
lexicalContext: Self.resolveLexicalContext(
6586
lexicalContext,
6687
sourceManager: sourceManager,
88+
swiftVersion: swiftVersion,
89+
experimentalFeatures: experimentalFeatures,
6790
operatorTable: .standardOperators,
6891
fallbackSyntax: syntax
6992
),
70-
expansionDiscriminator: discriminator
93+
expansionDiscriminator: discriminator,
94+
staticBuildConfiguration: staticBuildConfiguration
7195
)
7296

7397
let expandedSource: String?
@@ -113,6 +137,7 @@ extension PluginProviderMessageHandler {
113137
macro: PluginMessage.MacroReference,
114138
macroRole: PluginMessage.MacroRole,
115139
discriminator: String,
140+
staticBuildConfiguration: StaticBuildConfiguration?,
116141
attributeSyntax: PluginMessage.Syntax,
117142
declSyntax: PluginMessage.Syntax,
118143
parentDeclSyntax: PluginMessage.Syntax?,
@@ -121,17 +146,27 @@ extension PluginProviderMessageHandler {
121146
lexicalContext: [PluginMessage.Syntax]?
122147
) -> PluginToHostMessage {
123148
let sourceManager = SourceManager(syntaxRegistry: syntaxRegistry)
124-
let attributeNode = sourceManager.add(
125-
attributeSyntax,
126-
foldingWith: .standardOperators
127-
).cast(AttributeSyntax.self)
128-
let declarationNode = sourceManager.add(declSyntax)
129-
let parentDeclNode = parentDeclSyntax.map { sourceManager.add($0).cast(DeclSyntax.self) }
149+
let swiftVersion = staticBuildConfiguration?.parserSwiftVersion
150+
let experimentalFeatures = staticBuildConfiguration?.experimentalFeatures
151+
152+
func addToSourceManager(_ syntax: PluginMessage.Syntax) -> Syntax {
153+
sourceManager.add(
154+
syntax,
155+
swiftVersion: swiftVersion,
156+
experimentalFeatures: experimentalFeatures,
157+
foldingWith: .standardOperators
158+
)
159+
}
160+
161+
let attributeNode = addToSourceManager(attributeSyntax)
162+
.cast(AttributeSyntax.self)
163+
let declarationNode = addToSourceManager(declSyntax)
164+
let parentDeclNode = parentDeclSyntax.map { addToSourceManager($0).cast(DeclSyntax.self) }
130165
let extendedType = extendedTypeSyntax.map {
131-
sourceManager.add($0).cast(TypeSyntax.self)
166+
addToSourceManager($0).cast(TypeSyntax.self)
132167
}
133168
let conformanceList = conformanceListSyntax.map {
134-
let placeholderStruct = sourceManager.add($0).cast(StructDeclSyntax.self)
169+
let placeholderStruct = addToSourceManager($0).cast(StructDeclSyntax.self)
135170
return placeholderStruct.inheritanceClause!.inheritedTypes
136171
}
137172

@@ -140,10 +175,13 @@ extension PluginProviderMessageHandler {
140175
lexicalContext: Self.resolveLexicalContext(
141176
lexicalContext,
142177
sourceManager: sourceManager,
178+
swiftVersion: swiftVersion,
179+
experimentalFeatures: experimentalFeatures,
143180
operatorTable: .standardOperators,
144181
fallbackSyntax: declarationNode
145182
),
146-
expansionDiscriminator: discriminator
183+
expansionDiscriminator: discriminator,
184+
staticBuildConfiguration: staticBuildConfiguration
147185
)
148186

149187
// TODO: Make this a 'String?' and remove non-'hasExpandMacroResult' branches.

Sources/SwiftCompilerPluginMessageHandling/PluginMacroExpansionContext.swift

Lines changed: 61 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,16 @@
1212

1313
#if compiler(>=6)
1414
internal import SwiftDiagnostics
15+
internal import SwiftIfConfig
1516
internal import SwiftOperators
16-
internal import SwiftParser
17+
@_spi(ExperimentalLanguageFeatures) internal import SwiftParser
1718
internal import SwiftSyntax
1819
internal import SwiftSyntaxMacros
1920
#else
2021
import SwiftDiagnostics
22+
import SwiftIfConfig
2123
import SwiftOperators
22-
import SwiftParser
24+
@_spi(ExperimentalLanguageFeatures) import SwiftParser
2325
import SwiftSyntax
2426
import SwiftSyntaxMacros
2527
#endif
@@ -29,6 +31,8 @@ class ParsedSyntaxRegistry {
2931
struct Key: Hashable {
3032
let source: String
3133
let kind: PluginMessage.Syntax.Kind
34+
let swiftVersion: Parser.SwiftVersion
35+
let experimentalFeatures: Parser.ExperimentalFeatures
3236
}
3337

3438
private var storage: LRUCache<Key, Syntax>
@@ -37,8 +41,17 @@ class ParsedSyntaxRegistry {
3741
self.storage = LRUCache(capacity: cacheCapacity)
3842
}
3943

40-
private func parse(source: String, kind: PluginMessage.Syntax.Kind) -> Syntax {
41-
var parser = Parser(source)
44+
private func parse(
45+
source: String,
46+
kind: PluginMessage.Syntax.Kind,
47+
swiftVersion: Parser.SwiftVersion,
48+
experimentalFeatures: Parser.ExperimentalFeatures
49+
) -> Syntax {
50+
var parser = Parser(
51+
source,
52+
swiftVersion: swiftVersion,
53+
experimentalFeatures: experimentalFeatures
54+
)
4255
switch kind {
4356
case .declaration:
4457
return Syntax(DeclSyntax.parse(from: &parser))
@@ -55,13 +68,30 @@ class ParsedSyntaxRegistry {
5568
}
5669
}
5770

58-
func get(source: String, kind: PluginMessage.Syntax.Kind) -> Syntax {
59-
let key = Key(source: source, kind: kind)
71+
func get(
72+
source: String,
73+
kind: PluginMessage.Syntax.Kind,
74+
swiftVersion: Parser.SwiftVersion?,
75+
experimentalFeatures: Parser.ExperimentalFeatures?
76+
) -> Syntax {
77+
let swiftVersion = swiftVersion ?? Parser.defaultSwiftVersion
78+
let experimentalFeatures = experimentalFeatures ?? Parser.ExperimentalFeatures()
79+
let key = Key(
80+
source: source,
81+
kind: kind,
82+
swiftVersion: swiftVersion,
83+
experimentalFeatures: experimentalFeatures
84+
)
6085
if let cached = storage[key] {
6186
return cached
6287
}
6388

64-
let node = parse(source: source, kind: kind)
89+
let node = parse(
90+
source: source,
91+
kind: kind,
92+
swiftVersion: swiftVersion,
93+
experimentalFeatures: experimentalFeatures
94+
)
6595
storage[key] = node
6696
return node
6797
}
@@ -124,10 +154,16 @@ class SourceManager {
124154
/// are cached in the source manager to provide `location(of:)` et al.
125155
func add(
126156
_ syntaxInfo: PluginMessage.Syntax,
127-
foldingWith operatorTable: OperatorTable? = nil
157+
swiftVersion: Parser.SwiftVersion?,
158+
experimentalFeatures: Parser.ExperimentalFeatures?,
159+
foldingWith operatorTable: OperatorTable?
128160
) -> Syntax {
129-
130-
var node = syntaxRegistry.get(source: syntaxInfo.source, kind: syntaxInfo.kind)
161+
var node = syntaxRegistry.get(
162+
source: syntaxInfo.source,
163+
kind: syntaxInfo.kind,
164+
swiftVersion: swiftVersion,
165+
experimentalFeatures: experimentalFeatures
166+
)
131167
if let operatorTable {
132168
node = operatorTable.foldAll(node, errorHandler: { _ in /*ignore*/ })
133169
}
@@ -262,6 +298,10 @@ class PluginMacroExpansionContext {
262298
/// to produce unique names.
263299
private var expansionDiscriminator: String
264300

301+
/// The static build configuration, if any, that will be used for the
302+
/// macro-expanded code.
303+
private var staticBuildConfiguration: StaticBuildConfiguration?
304+
265305
/// Counter for each of the uniqued names.
266306
///
267307
/// Used in conjunction with `expansionDiscriminator`.
@@ -271,10 +311,16 @@ class PluginMacroExpansionContext {
271311
/// macro.
272312
internal private(set) var diagnostics: [Diagnostic] = []
273313

274-
init(sourceManager: SourceManager, lexicalContext: [Syntax], expansionDiscriminator: String = "") {
314+
init(
315+
sourceManager: SourceManager,
316+
lexicalContext: [Syntax],
317+
expansionDiscriminator: String = "",
318+
staticBuildConfiguration: StaticBuildConfiguration?
319+
) {
275320
self.sourceManager = sourceManager
276321
self.lexicalContext = lexicalContext
277322
self.expansionDiscriminator = expansionDiscriminator
323+
self.staticBuildConfiguration = staticBuildConfiguration
278324
}
279325
}
280326

@@ -321,4 +367,8 @@ extension PluginMacroExpansionContext: MacroExpansionContext {
321367
}
322368
return AbstractSourceLocation(location)
323369
}
370+
371+
public var buildConfiguration: (any BuildConfiguration)? {
372+
staticBuildConfiguration
373+
}
324374
}

0 commit comments

Comments
 (0)