Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -146,10 +146,12 @@ final class BazelTargetQuerierParserImpl: BazelTargetQuerierParser {
// Now, separate the parsed content between top-level and non-top-level targets.
// We don't need to handle the case where a top-level target is missing entirely
// because Bazel itself will fail when this is the case.
let userProvidedTargetsSet = Set(userProvidedTargets)
let supportedTopLevelRuleTypesSet = Set(supportedTopLevelRuleTypes)
var topLevelTargets: [(BlazeQuery_Target, TopLevelRuleType)] = []
var dependencyTargets: [BlazeQuery_Target] = []
// Convert the user's provided targets to full labels if needed, since this is what
// the cquery result will contain.
let userProvidedTargetsSet = Set(userProvidedTargets.map { $0.toFullLabel() })
for target in allRules {
let kind = target.rule.ruleClass
let name = target.rule.name
Expand Down Expand Up @@ -611,4 +613,18 @@ extension String {

return (packageName: packageName, targetName: targetName)
}

// Converts a Bazel label to its "full" equivalent, if needed.
// e.g: "//foo/bar" -> "//foo/bar:bar"
fileprivate func toFullLabel() -> String {
let paths = components(separatedBy: "/")
let lastComponent = paths.last
if lastComponent?.contains(":") == true {
return self
} else if let lastComponent = lastComponent {
return "\(self):\(lastComponent)"
} else {
return self
}
}
}
21 changes: 1 addition & 20 deletions Sources/SourceKitBazelBSP/Server/BaseServerConfig.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,29 +41,10 @@ package struct BaseServerConfig: Equatable {
topLevelRulesToDiscover: [TopLevelRuleType] = TopLevelRuleType.allCases,
) {
self.bazelWrapper = bazelWrapper
self.targets = targets
self.indexFlags = indexFlags
self.filesToWatch = filesToWatch
self.compileTopLevel = compileTopLevel
self.topLevelRulesToDiscover = topLevelRulesToDiscover

// We need to post-process the target list provided by the user
// because the queries will always return the "full" label.
// e.g: "//foo/bar" -> "//foo/bar:bar"
// We need to also de-dupe them if the user passed wildcards in Serve.swift.
self.targets = Set(targets.map { $0.toFullLabel() }).sorted()
}
}

extension String {
func toFullLabel() -> String {
let paths = components(separatedBy: "/")
let lastComponent = paths.last
if lastComponent?.contains(":") == true {
return self
} else if let lastComponent = lastComponent {
return "\(self):\(lastComponent)"
} else {
return self
}
}
}
10 changes: 5 additions & 5 deletions Tests/SourceKitBazelBSPTests/BazelTargetQuerierTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ struct BazelTargetQuerierTests {
let config = Self.makeInitializedConfig()

let expectedCommand =
"bazelisk --output_base=/path/to/output/base cquery \'let topLevelTargets = kind(\"rule\", set(//HelloWorld:HelloWorld)) in $topLevelTargets union kind(\"source file|swift_library|alias\", deps($topLevelTargets))\' --noinclude_aspects --notool_deps --noimplicit_deps --output proto --config=test"
"bazelisk --output_base=/path/to/output/base cquery \'let topLevelTargets = kind(\"rule\", set(//HelloWorld)) in $topLevelTargets union kind(\"source file|swift_library|alias\", deps($topLevelTargets))\' --noinclude_aspects --notool_deps --noimplicit_deps --output proto --config=test"
runnerMock.setResponse(for: expectedCommand, cwd: Self.mockRootUri, response: exampleCqueryOutput)

_ = try querier.cqueryTargets(
Expand All @@ -112,7 +112,7 @@ struct BazelTargetQuerierTests {
let config = Self.makeInitializedConfig(targets: ["//HelloWorld", "//Tests"])

let expectedCommand =
"bazelisk --output_base=/path/to/output/base cquery \'let topLevelTargets = kind(\"rule\", set(//HelloWorld:HelloWorld //Tests:Tests)) in $topLevelTargets union kind(\"objc_library|swift_library|alias\", deps($topLevelTargets))\' --noinclude_aspects --notool_deps --noimplicit_deps --output proto --config=test"
"bazelisk --output_base=/path/to/output/base cquery \'let topLevelTargets = kind(\"rule\", set(//HelloWorld //Tests)) in $topLevelTargets union kind(\"objc_library|swift_library|alias\", deps($topLevelTargets))\' --noinclude_aspects --notool_deps --noimplicit_deps --output proto --config=test"
runnerMock.setResponse(for: expectedCommand, cwd: Self.mockRootUri, response: exampleCqueryOutput)

_ = try querier.cqueryTargets(
Expand All @@ -136,13 +136,13 @@ struct BazelTargetQuerierTests {

runnerMock.setResponse(
for:
"bazel --output_base=/path/to/output/base cquery \'let topLevelTargets = kind(\"rule\", set(//HelloWorld:HelloWorld)) in $topLevelTargets union kind(\"swift_library|alias\", deps($topLevelTargets))\' --noinclude_aspects --notool_deps --noimplicit_deps --output proto",
"bazel --output_base=/path/to/output/base cquery \'let topLevelTargets = kind(\"rule\", set(//HelloWorld)) in $topLevelTargets union kind(\"swift_library|alias\", deps($topLevelTargets))\' --noinclude_aspects --notool_deps --noimplicit_deps --output proto",
cwd: Self.mockRootUri,
response: exampleCqueryOutput
)
runnerMock.setResponse(
for:
"bazel --output_base=/path/to/output/base cquery \'let topLevelTargets = kind(\"rule\", set(//HelloWorld:HelloWorld)) in $topLevelTargets union kind(\"objc_library|alias\", deps($topLevelTargets))\' --noinclude_aspects --notool_deps --noimplicit_deps --output proto",
"bazel --output_base=/path/to/output/base cquery \'let topLevelTargets = kind(\"rule\", set(//HelloWorld)) in $topLevelTargets union kind(\"objc_library|alias\", deps($topLevelTargets))\' --noinclude_aspects --notool_deps --noimplicit_deps --output proto",
cwd: Self.mockRootUri,
response: exampleCqueryOutput
)
Expand Down Expand Up @@ -178,7 +178,7 @@ struct BazelTargetQuerierTests {
let config = Self.makeInitializedConfig()

let expectedCommand =
"bazelisk --output_base=/path/to/output/base cquery \'let topLevelTargets = kind(\"rule\", set(//HelloWorld:HelloWorld)) in $topLevelTargets union kind(\"source file|swift_library|alias|_watchos_internal_unit_test_bundle\", deps($topLevelTargets))\' --noinclude_aspects --notool_deps --noimplicit_deps --output proto --config=test"
"bazelisk --output_base=/path/to/output/base cquery \'let topLevelTargets = kind(\"rule\", set(//HelloWorld)) in $topLevelTargets union kind(\"source file|swift_library|alias|_watchos_internal_unit_test_bundle\", deps($topLevelTargets))\' --noinclude_aspects --notool_deps --noimplicit_deps --output proto --config=test"
runnerMock.setResponse(for: expectedCommand, cwd: Self.mockRootUri, response: exampleCqueryOutput)

_ = try querier.cqueryTargets(
Expand Down