Skip to content

Commit a087692

Browse files
committed
Return compiler arguments for invalid package manifests
Currently, when there‘s a syntax error in a package manifest, we don’t get any build settings from it in SourceKit-LSP and thus loose almost all semantic functionality. If we can’t parse the package manifest, fall back to providing build settings by assuming it has the current Swift tools version. Currently, when there‘s a syntax error in a package manifest, we don’t get any build settings from it in SourceKit-LSP and thus loose almost all semantic functionality. If we can’t parse the package manifest, fall back to providing build settings by assuming it has the current Swift tools version. Fixes swiftlang#1704 rdar://136423767
1 parent 247acf6 commit a087692

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,7 @@ package actor SwiftPMBuildSystem: BuiltInBuildSystem {
783783

784784
/// Retrieve settings for a package manifest (Package.swift).
785785
private func settings(forPackageManifest path: AbsolutePath) throws -> TextDocumentSourceKitOptionsResponse? {
786-
let compilerArgs = swiftPMWorkspace.interpreterFlags(for: path.parentDirectory) + [path.pathString]
786+
let compilerArgs = try swiftPMWorkspace.interpreterFlags(for: path) + [path.pathString]
787787
return TextDocumentSourceKitOptionsResponse(compilerArguments: compilerArgs)
788788
}
789789
}

Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,6 +1148,39 @@ final class SwiftPMBuildSystemTests: XCTestCase {
11481148
XCTAssert(compilerArgs.contains(try versionSpecificManifestURL.filePath))
11491149
}
11501150
}
1151+
1152+
func testBuildSettingsForInvalidManifest() async throws {
1153+
try await withTestScratchDir { tempDir in
1154+
try FileManager.default.createFiles(
1155+
root: tempDir,
1156+
files: [
1157+
"pkg/Sources/lib/a.swift": "",
1158+
"pkg/Package.swift": """
1159+
// swift-tools-version: 4.2
1160+
import PackageDescription
1161+
""",
1162+
]
1163+
)
1164+
let packageRoot = try tempDir.appendingPathComponent("pkg").realpath
1165+
let manifestURL = packageRoot.appendingPathComponent("Package.swift")
1166+
let buildSystemManager = await BuildSystemManager(
1167+
buildSystemSpec: BuildSystemSpec(kind: .swiftPM, projectRoot: packageRoot),
1168+
toolchainRegistry: .forTesting,
1169+
options: SourceKitLSPOptions(),
1170+
connectionToClient: DummyBuildSystemManagerConnectionToClient(),
1171+
buildSystemTestHooks: BuildSystemTestHooks()
1172+
)
1173+
await buildSystemManager.waitForUpToDateBuildGraph()
1174+
let settings = await buildSystemManager.buildSettingsInferredFromMainFile(
1175+
for: DocumentURI(manifestURL),
1176+
language: .swift,
1177+
fallbackAfterTimeout: false
1178+
)
1179+
let compilerArgs = try XCTUnwrap(settings?.compilerArguments)
1180+
XCTAssert(compilerArgs.contains("-package-description-version"))
1181+
XCTAssert(compilerArgs.contains(try manifestURL.filePath))
1182+
}
1183+
}
11511184
}
11521185

11531186
private func assertArgumentsDoNotContain(

0 commit comments

Comments
 (0)