Skip to content

Commit 85cc54c

Browse files
ahoppenbnbarham
andauthored
Cherry-picks to release/6.0 for sourcekit-lsp update (#7520)
- **Explanation**: Cherry-pick the following to PRs which are companions of swiftlang/sourcekit-lsp#1213 - #7505 - #7492 - **Scope**: CMake build and SourceKit-LSP API - **Risk**: Low, the SourceKit-LSP API is only used by SourceKit-LSP and the CMake build changes will all be caught at build-time - **Testing**: n/a - **Issue**: n/a - **Reviewer**: @DougGregor and @MaxDesiatov on #7505 and #7492 --------- Co-authored-by: Ben Barham <[email protected]>
1 parent eb2d5b3 commit 85cc54c

File tree

5 files changed

+60
-45
lines changed

5 files changed

+60
-45
lines changed

Diff for: BuildSupport/SwiftSyntax/CMakeLists.txt

+13-11
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
include(FetchContent)
22

3-
set(BUILD_SHARED_LIBS OFF)
4-
5-
if(DEFINED SWIFTPM_PATH_TO_SWIFT_SYNTAX_SOURCE)
6-
file(TO_CMAKE_PATH "${SWIFTPM_PATH_TO_SWIFT_SYNTAX_SOURCE}" swift_syntax_path)
7-
FetchContent_Declare(SwiftSyntax
8-
SOURCE_DIR "${swift_syntax_path}")
9-
else()
10-
FetchContent_Declare(SwiftSyntax
11-
GIT_REPOSITORY https://github.com/apple/swift-syntax
12-
GIT_TAG main)
3+
find_package(SwiftSyntax CONFIG GLOBAL)
4+
if(NOT SwiftSyntax_FOUND)
5+
set(SWIFT_SYNTAX_INSTALL_TARGETS YES)
6+
if(DEFINED SWIFTPM_PATH_TO_SWIFT_SYNTAX_SOURCE)
7+
file(TO_CMAKE_PATH "${SWIFTPM_PATH_TO_SWIFT_SYNTAX_SOURCE}" swift_syntax_path)
8+
FetchContent_Declare(SwiftSyntax
9+
SOURCE_DIR "${swift_syntax_path}")
10+
else()
11+
FetchContent_Declare(SwiftSyntax
12+
GIT_REPOSITORY https://github.com/apple/swift-syntax
13+
GIT_TAG main)
14+
endif()
15+
FetchContent_MakeAvailable(SwiftSyntax)
1316
endif()
14-
FetchContent_MakeAvailable(SwiftSyntax)

Diff for: Sources/PackageModelSyntax/CMakeLists.txt

+6-20
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ target_link_libraries(PackageModelSyntax PUBLIC
2424
PackageLoading
2525
PackageModel
2626

27-
SwiftBasicFormat
28-
SwiftDiagnostics
29-
SwiftIDEUtils
30-
SwiftParser
31-
SwiftSyntax
32-
SwiftSyntaxBuilder
27+
SwiftSyntax::SwiftBasicFormat
28+
SwiftSyntax::SwiftDiagnostics
29+
SwiftSyntax::SwiftIDEUtils
30+
SwiftSyntax::SwiftParser
31+
SwiftSyntax::SwiftSyntax
32+
SwiftSyntax::SwiftSyntaxBuilder
3333
)
3434

3535
# NOTE(compnerd) workaround for CMake not setting up include flags yet
@@ -41,17 +41,3 @@ install(TARGETS PackageModelSyntax
4141
LIBRARY DESTINATION lib
4242
RUNTIME DESTINATION bin)
4343
set_property(GLOBAL APPEND PROPERTY SwiftPM_EXPORTS PackageModelSyntax)
44-
45-
set(SWIFT_SYNTAX_MODULES
46-
SwiftBasicFormat
47-
SwiftParser
48-
SwiftParserDiagnostics
49-
SwiftDiagnostics
50-
SwiftSyntax
51-
SwiftSyntaxBuilder
52-
SwiftIDEUtils
53-
)
54-
export(TARGETS ${SWIFT_SYNTAX_MODULES}
55-
NAMESPACE SPMSwiftSyntax::
56-
FILE ${CMAKE_BINARY_DIR}/cmake/modules/SwiftSyntaxConfig.cmake
57-
EXPORT_LINK_INTERFACE_LIBRARIES)

Diff for: Sources/SourceKitLSPAPI/BuildDescription.swift

+33-9
Original file line numberDiff line numberDiff line change
@@ -22,31 +22,45 @@ import class Build.BuildPlan
2222
import class Build.ClangTargetBuildDescription
2323
import class Build.SwiftTargetBuildDescription
2424
import struct PackageGraph.ResolvedTarget
25+
import struct PackageGraph.ModulesGraph
2526

2627
public protocol BuildTarget {
2728
var sources: [URL] { get }
2829

30+
/// Whether the target is part of the root package that the user opened or if it's part of a package dependency.
31+
var isPartOfRootPackage: Bool { get }
32+
2933
func compileArguments(for fileURL: URL) throws -> [String]
30-
}
34+
}
35+
36+
private struct WrappedClangTargetBuildDescription: BuildTarget {
37+
private let description: ClangTargetBuildDescription
38+
let isPartOfRootPackage: Bool
39+
40+
init(description: ClangTargetBuildDescription, isPartOfRootPackage: Bool) {
41+
self.description = description
42+
self.isPartOfRootPackage = isPartOfRootPackage
43+
}
3144

32-
extension ClangTargetBuildDescription: BuildTarget {
3345
public var sources: [URL] {
34-
return (try? compilePaths().map { URL(fileURLWithPath: $0.source.pathString) }) ?? []
46+
return (try? description.compilePaths().map { URL(fileURLWithPath: $0.source.pathString) }) ?? []
3547
}
3648

3749
public func compileArguments(for fileURL: URL) throws -> [String] {
3850
let filePath = try resolveSymlinks(try AbsolutePath(validating: fileURL.path))
39-
let commandLine = try self.emitCommandLine(for: filePath)
51+
let commandLine = try description.emitCommandLine(for: filePath)
4052
// First element on the command line is the compiler itself, not an argument.
4153
return Array(commandLine.dropFirst())
4254
}
4355
}
4456

4557
private struct WrappedSwiftTargetBuildDescription: BuildTarget {
4658
private let description: SwiftTargetBuildDescription
59+
let isPartOfRootPackage: Bool
4760

48-
init(description: SwiftTargetBuildDescription) {
61+
init(description: SwiftTargetBuildDescription, isPartOfRootPackage: Bool) {
4962
self.description = description
63+
self.isPartOfRootPackage = isPartOfRootPackage
5064
}
5165

5266
var sources: [URL] {
@@ -71,17 +85,27 @@ public struct BuildDescription {
7185
}
7286

7387
// FIXME: should not use `ResolvedTarget` in the public interface
74-
public func getBuildTarget(for target: ResolvedTarget) -> BuildTarget? {
88+
public func getBuildTarget(for target: ResolvedTarget, in modulesGraph: ModulesGraph) -> BuildTarget? {
7589
if let description = buildPlan.targetMap[target.id] {
7690
switch description {
7791
case .clang(let description):
78-
return description
92+
return WrappedClangTargetBuildDescription(
93+
description: description,
94+
isPartOfRootPackage: modulesGraph.rootPackages.map(\.id).contains(description.package.id)
95+
)
7996
case .swift(let description):
80-
return WrappedSwiftTargetBuildDescription(description: description)
97+
return WrappedSwiftTargetBuildDescription(
98+
description: description,
99+
isPartOfRootPackage: modulesGraph.rootPackages.map(\.id).contains(description.package.id)
100+
)
81101
}
82102
} else {
83103
if target.type == .plugin, let package = self.buildPlan.graph.package(for: target) {
84-
return PluginTargetBuildDescription(target: target, toolsVersion: package.manifest.toolsVersion)
104+
return PluginTargetBuildDescription(
105+
target: target,
106+
toolsVersion: package.manifest.toolsVersion,
107+
isPartOfRootPackage: modulesGraph.rootPackages.map(\.id).contains(package.id)
108+
)
85109
}
86110
return nil
87111
}

Diff for: Sources/SourceKitLSPAPI/PluginTargetBuildDescription.swift

+3-1
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@ private import class PackageModel.UserToolchain
2121
struct PluginTargetBuildDescription: BuildTarget {
2222
private let target: ResolvedTarget
2323
private let toolsVersion: ToolsVersion
24+
let isPartOfRootPackage: Bool
2425

25-
init(target: ResolvedTarget, toolsVersion: ToolsVersion) {
26+
init(target: ResolvedTarget, toolsVersion: ToolsVersion, isPartOfRootPackage: Bool) {
2627
assert(target.type == .plugin)
2728
self.target = target
2829
self.toolsVersion = toolsVersion
30+
self.isPartOfRootPackage = isPartOfRootPackage
2931
}
3032

3133
var sources: [URL] {

Diff for: Tests/SourceKitLSPAPITests/SourceKitLSPAPITests.swift

+5-4
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,15 @@ class SourceKitLSPAPITests: XCTestCase {
5151
)
5252
let description = BuildDescription(buildPlan: plan)
5353

54-
try description.checkArguments(for: "exe", graph: graph, partialArguments: ["-module-name", "exe", "-emit-dependencies", "-emit-module", "-emit-module-path", "/path/to/build/debug/exe.build/exe.swiftmodule"])
55-
try description.checkArguments(for: "lib", graph: graph, partialArguments: ["-module-name", "lib", "-emit-dependencies", "-emit-module", "-emit-module-path", "/path/to/build/debug/Modules/lib.swiftmodule"])
54+
try description.checkArguments(for: "exe", graph: graph, partialArguments: ["-module-name", "exe", "-emit-dependencies", "-emit-module", "-emit-module-path", "/path/to/build/debug/exe.build/exe.swiftmodule"], isPartOfRootPackage: true)
55+
try description.checkArguments(for: "lib", graph: graph, partialArguments: ["-module-name", "lib", "-emit-dependencies", "-emit-module", "-emit-module-path", "/path/to/build/debug/Modules/lib.swiftmodule"], isPartOfRootPackage: true)
5656
}
5757
}
5858

5959
extension SourceKitLSPAPI.BuildDescription {
60-
@discardableResult func checkArguments(for targetName: String, graph: ModulesGraph, partialArguments: [String]) throws -> Bool {
60+
@discardableResult func checkArguments(for targetName: String, graph: ModulesGraph, partialArguments: [String], isPartOfRootPackage: Bool) throws -> Bool {
6161
let target = try XCTUnwrap(graph.allTargets.first(where: { $0.name == targetName }))
62-
let buildTarget = try XCTUnwrap(self.getBuildTarget(for: target))
62+
let buildTarget = try XCTUnwrap(self.getBuildTarget(for: target, in: graph))
6363

6464
guard let file = buildTarget.sources.first else {
6565
XCTFail("build target \(targetName) contains no files")
@@ -70,6 +70,7 @@ extension SourceKitLSPAPI.BuildDescription {
7070
let result = arguments.contains(partialArguments)
7171

7272
XCTAssertTrue(result, "could not match \(partialArguments) to actual arguments \(arguments)")
73+
XCTAssertEqual(buildTarget.isPartOfRootPackage, isPartOfRootPackage)
7374
return result
7475
}
7576
}

0 commit comments

Comments
 (0)