Skip to content

Commit 0e72c53

Browse files
committed
[SwiftIfConfig] Adopt updated APIs to for build configuration handling
Switch to the new `canImport` API that includes TokenSyntax nodes for each import path, so we can provide better source locations. We no longer need to stuff a random source location into `CompilerBuildConfiguration`. Make use of `ConfiguredRegions.isActive(_:)` directly instead of going through the older entrypoint. When parser validation is enabled, we currently can end up with duplicated diagnostics from canImport. This is going to require some requestification to address.
1 parent c241e78 commit 0e72c53

File tree

5 files changed

+25
-19
lines changed

5 files changed

+25
-19
lines changed

lib/ASTGen/Sources/ASTGen/ASTGen+CompilerBuildConfiguration.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ extension ASTGenVisitor {
2525
/// produced due to the evaluation.
2626
func activeClause(in node: IfConfigDeclSyntax) -> IfConfigClauseSyntax? {
2727
// Determine the active clause.
28-
var buildConfiguration = self.buildConfiguration
29-
buildConfiguration.conditionLoc = generateSourceLoc(node)
3028
let (activeClause, diagnostics) = node.activeClause(in: buildConfiguration)
3129
diagnoseAll(diagnostics)
3230

lib/ASTGen/Sources/ASTGen/ASTGen.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ struct ASTGenVisitor {
9898
self.legacyParse = legacyParser
9999
self.buildConfiguration = CompilerBuildConfiguration(
100100
ctx: ctx,
101-
conditionLoc: BridgedSourceLoc(at: AbsolutePosition(utf8Offset: 0), in: sourceBuffer)
101+
sourceBuffer: sourceBuffer
102102
)
103103
}
104104

lib/ASTGen/Sources/ASTGen/CompilerBuildConfiguration.swift

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ import SwiftSyntax
2020
/// queries.
2121
struct CompilerBuildConfiguration: BuildConfiguration {
2222
let ctx: BridgedASTContext
23-
var conditionLoc: BridgedSourceLoc
23+
let sourceBuffer: UnsafeBufferPointer<UInt8>
2424

25-
init(ctx: BridgedASTContext, conditionLoc: BridgedSourceLoc) {
25+
init(ctx: BridgedASTContext, sourceBuffer: UnsafeBufferPointer<UInt8>) {
2626
self.ctx = ctx
27-
self.conditionLoc = conditionLoc
27+
self.sourceBuffer = sourceBuffer
2828
}
2929

3030
func isCustomConditionSet(name: String) throws -> Bool {
@@ -48,8 +48,11 @@ struct CompilerBuildConfiguration: BuildConfiguration {
4848
}
4949
}
5050

51-
func canImport(importPath: [String], version: CanImportVersion) throws -> Bool {
52-
var importPathStr = importPath.joined(separator: ".")
51+
func canImport(
52+
importPath: [(TokenSyntax, String)],
53+
version: CanImportVersion
54+
) throws -> Bool {
55+
var importPathStr = importPath.map { $0.1 }.joined(separator: ".")
5356

5457
var versionComponents: [Int]
5558
let cVersionKind: BridgedCanImportVersion
@@ -71,7 +74,10 @@ struct CompilerBuildConfiguration: BuildConfiguration {
7174
versionComponents.withUnsafeBufferPointer { versionComponentsBuf in
7275
ctx.canImport(
7376
importPath: bridgedImportPathStr,
74-
location: conditionLoc,
77+
location: BridgedSourceLoc(
78+
at: importPath.first!.0.position,
79+
in: sourceBuffer
80+
),
7581
versionKind: cVersionKind,
7682
versionComponents: versionComponentsBuf.baseAddress,
7783
numVersionComponents: versionComponentsBuf.count
@@ -165,7 +171,7 @@ public func configuredRegions(
165171
let sourceFilePtr = sourceFilePtr.bindMemory(to: ExportedSourceFile.self, capacity: 1)
166172
let configuration = CompilerBuildConfiguration(
167173
ctx: astContext,
168-
conditionLoc: sourceFilePtr.pointee.sourceLoc(at: AbsolutePosition(utf8Offset: 0))
174+
sourceBuffer: sourceFilePtr.pointee.buffer
169175
)
170176
let regions = sourceFilePtr.pointee.syntax.configuredRegions(in: configuration)
171177

lib/ASTGen/Sources/ASTGen/SourceFile.swift

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -158,23 +158,19 @@ public func emitParserDiagnostics(
158158
) { sourceFile in
159159
var anyDiags = false
160160

161-
let diags = ParseDiagnosticsGenerator.diagnostics(
162-
for: sourceFile.pointee.syntax
163-
)
161+
let sourceFileSyntax = sourceFile.pointee.syntax
162+
let diags = ParseDiagnosticsGenerator.diagnostics(for: sourceFileSyntax)
164163

165164
let diagnosticEngine = BridgedDiagnosticEngine(raw: diagEnginePtr)
166165
let buildConfiguration = CompilerBuildConfiguration(
167166
ctx: ctx,
168-
conditionLoc:
169-
BridgedSourceLoc(
170-
at: AbsolutePosition(utf8Offset: 0),
171-
in: sourceFile.pointee.buffer
172-
)
167+
sourceBuffer: sourceFile.pointee.buffer
173168
)
174169

170+
let configuredRegions = sourceFileSyntax.configuredRegions(in: buildConfiguration)
175171
for diag in diags {
176172
// If the diagnostic is in an unparsed #if region, don't emit it.
177-
if diag.node.isActive(in: buildConfiguration).state == .unparsed {
173+
if configuredRegions.isActive(diag.node) == .unparsed {
178174
continue
179175
}
180176

test/Parse/ConditionalCompilation/can_import_version_missing_user_module_version.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,17 @@ import NoUserModuleVersion
1414
func testCanImportNoUserModuleVersion() {
1515

1616
#if canImport(NoUserModuleVersion, _version: 113.331) // expected-warning {{cannot find user version number for Swift module 'NoUserModuleVersion'; version number ignored}}
17+
// NOTE: Duplicate warning because the canImport request happens twice when parser
18+
// validation is enabled.
19+
// expected-warning@-3 *{{cannot find user version number for Swift module 'NoUserModuleVersion'; version number ignored}}
1720
let a = 1 // expected-warning {{initialization of immutable value 'a' was never used; consider replacing with assignment to '_' or removing it}}
1821
#endif
1922

2023
#if canImport(NoUserModuleVersion, _version: 2) // expected-warning {{cannot find user version number for Swift module 'NoUserModuleVersion'; version number ignored}}
2124
let b = 1 // expected-warning {{initialization of immutable value 'b' was never used; consider replacing with assignment to '_' or removing it}}
25+
// NOTE: Duplicate warning because the canImport request happens twice when parser
26+
// validation is enabled.
27+
// expected-warning@-4 *{{cannot find user version number for Swift module 'NoUserModuleVersion'; version number ignored}}
2228
#endif
2329

2430
}

0 commit comments

Comments
 (0)