Skip to content

Commit bca394a

Browse files
authored
Simplify target discovery (#131)
1 parent 642157b commit bca394a

File tree

8 files changed

+26
-361
lines changed

8 files changed

+26
-361
lines changed

Sources/SourceKitBazelBSP/RequestHandlers/BuildTargets/BazelTargetDiscoverer.swift

Lines changed: 0 additions & 76 deletions
This file was deleted.

Sources/SourceKitBazelBSP/RequestHandlers/BuildTargets/BazelTargetQuerier.swift

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,11 @@ final class BazelTargetQuerier {
4646
private var aqueryCache = [String: ProcessedAqueryResult]()
4747

4848
private static func queryDepsString(forTargets targets: [String]) -> String {
49-
var query = ""
50-
for target in targets {
51-
if query == "" {
52-
query = "deps(\(target))"
53-
} else {
54-
query += " union deps(\(target))"
55-
}
56-
}
57-
return query
49+
return unionString(forTargets: targets.map { "deps(\($0))" })
50+
}
51+
52+
private static func unionString(forTargets targets: [String]) -> String {
53+
return targets.joined(separator: " union ")
5854
}
5955

6056
init(
@@ -84,30 +80,28 @@ final class BazelTargetQuerier {
8480
throw BazelTargetQuerierError.noTargets
8581
}
8682

87-
var kindsToFilterFor = Set(supportedDependencyRuleTypes.map { $0.rawValue }).sorted()
88-
83+
var dependencyKindsFilter = supportedDependencyRuleTypes.map { $0.rawValue }
8984
// We need to also use the `alias` mnemonic for this query to work properly.
9085
// This is because --output proto doesn't follow the aliases automatically,
9186
// so we need this info to do it ourselves.
92-
kindsToFilterFor.append("alias")
93-
87+
dependencyKindsFilter.append("alias")
9488
// Always fetch source information.
9589
// FIXME: Need to also handle `generated file`
96-
kindsToFilterFor.append("source file")
90+
dependencyKindsFilter.append("source file")
9791

92+
var topLevelKindsFilter = supportedTopLevelRuleTypes.map { $0.rawValue }
9893
// If we're searching for test rules, we need to also include their test bundle rules.
9994
// Otherwise we won't be able to map test dependencies back to their top level parents.
10095
let testBundleRules = supportedTopLevelRuleTypes.compactMap { $0.testBundleRule }
101-
kindsToFilterFor.append(contentsOf: testBundleRules)
96+
topLevelKindsFilter.append(contentsOf: testBundleRules)
10297

10398
// Collect the top-level targets -> collect these targets' dependencies
10499
let providedTargetsQuerySet = "set(\(userProvidedTargets.joined(separator: " ")))"
105-
let dependencyKindsFilter = kindsToFilterFor.joined(separator: "|")
106100
let topLevelTargetsQuery = """
107-
let topLevelTargets = kind("rule", \(providedTargetsQuerySet)) in \
101+
let topLevelTargets = kind("\(topLevelKindsFilter.joined(separator: "|"))", \(providedTargetsQuerySet)) in \
108102
$topLevelTargets \
109103
union \
110-
kind("\(dependencyKindsFilter)", deps($topLevelTargets))
104+
kind("\(dependencyKindsFilter.joined(separator: "|"))", deps($topLevelTargets))
111105
"""
112106

113107
let cacheKey = "QUERY_TARGETS+\(topLevelTargetsQuery)"
@@ -134,7 +128,6 @@ final class BazelTargetQuerier {
134128
let processedCqueryResult = try parser.processCquery(
135129
from: output,
136130
testBundleRules: testBundleRules,
137-
userProvidedTargets: userProvidedTargets,
138131
supportedDependencyRuleTypes: supportedDependencyRuleTypes,
139132
supportedTopLevelRuleTypes: supportedTopLevelRuleTypes,
140133
rootUri: config.rootUri,

Sources/SourceKitBazelBSP/RequestHandlers/BuildTargets/BazelTargetQuerierParser.swift

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ enum BazelTargetQuerierParserError: Error, LocalizedError {
3434
case indexOutOfBounds(Int, Int)
3535
case unexpectedLanguageRule(String, String)
3636
case unexpectedTargetType(Int)
37-
case unsupportedTopLevelTargetType(String, String, [TopLevelRuleType])
3837
case noTopLevelTargets([TopLevelRuleType])
3938
case missingPathExtension(String)
4039
case unexpectedFileExtension(String)
@@ -56,11 +55,6 @@ enum BazelTargetQuerierParserError: Error, LocalizedError {
5655
case .unexpectedLanguageRule(let target, let ruleClass):
5756
return "Could not determine \(target)'s language: Unexpected rule \(ruleClass)"
5857
case .unexpectedTargetType(let type): return "Parsed unexpected target type: \(type)"
59-
case .unsupportedTopLevelTargetType(let target, let type, let supportedTypes):
60-
return """
61-
Unsupported top-level target type: '\(type)' for target: \
62-
'\(target)' supported types: \(supportedTypes.map { $0.rawValue }.joined(separator: ", "))
63-
"""
6458
case .noTopLevelTargets(let rules):
6559
return """
6660
No top-level targets found in the query of kind: \
@@ -77,7 +71,6 @@ protocol BazelTargetQuerierParser: AnyObject {
7771
func processCquery(
7872
from data: Data,
7973
testBundleRules: [String],
80-
userProvidedTargets: [String],
8174
supportedDependencyRuleTypes: [DependencyRuleType],
8275
supportedTopLevelRuleTypes: [TopLevelRuleType],
8376
rootUri: String,
@@ -97,7 +90,6 @@ final class BazelTargetQuerierParserImpl: BazelTargetQuerierParser {
9790
func processCquery(
9891
from data: Data,
9992
testBundleRules: [String],
100-
userProvidedTargets: [String],
10193
supportedDependencyRuleTypes: [DependencyRuleType],
10294
supportedTopLevelRuleTypes: [TopLevelRuleType],
10395
rootUri: String,
@@ -158,22 +150,11 @@ final class BazelTargetQuerierParserImpl: BazelTargetQuerierParser {
158150
let supportedTopLevelRuleTypesSet = Set(supportedTopLevelRuleTypes)
159151
var topLevelTargets: [(BlazeQuery_Target, TopLevelRuleType)] = []
160152
var dependencyTargets: [BlazeQuery_Target] = []
161-
// Convert the user's provided targets to full labels if needed, since this is what
162-
// the cquery result will contain.
163-
let userProvidedTargetsSet = Set(userProvidedTargets.map { $0.toFullLabel() })
164153
for target in allRules {
165154
let kind = target.rule.ruleClass
166-
let name = target.rule.name
167-
if userProvidedTargetsSet.contains(name) {
168-
guard let topLevelRuleType = TopLevelRuleType(rawValue: kind),
169-
supportedTopLevelRuleTypesSet.contains(topLevelRuleType)
170-
else {
171-
throw BazelTargetQuerierParserError.unsupportedTopLevelTargetType(
172-
name,
173-
kind,
174-
supportedTopLevelRuleTypes
175-
)
176-
}
155+
if let topLevelRuleType = TopLevelRuleType(rawValue: kind),
156+
supportedTopLevelRuleTypesSet.contains(topLevelRuleType)
157+
{
177158
topLevelTargets.append((target, topLevelRuleType))
178159
} else {
179160
dependencyTargets.append(target)

Sources/sourcekit-bazel-bsp/Commands/Serve.swift

Lines changed: 5 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -68,51 +68,12 @@ struct Serve: ParsableCommand {
6868
func run() throws {
6969
logger.info("`serve` invoked, initializing BSP server...")
7070

71-
let topLevelRulesToDiscover: [TopLevelRuleType]
72-
if !topLevelRuleToDiscover.isEmpty {
73-
topLevelRulesToDiscover = topLevelRuleToDiscover
74-
} else {
75-
topLevelRulesToDiscover = TopLevelRuleType.allCases
76-
}
77-
let dependencyRulesToDiscover: [DependencyRuleType]
78-
if !dependencyRuleToDiscover.isEmpty {
79-
dependencyRulesToDiscover = dependencyRuleToDiscover
80-
} else {
81-
dependencyRulesToDiscover = DependencyRuleType.allCases
82-
}
71+
let topLevelRulesToDiscover: [TopLevelRuleType] =
72+
topLevelRuleToDiscover.isEmpty ? TopLevelRuleType.allCases : topLevelRuleToDiscover
73+
let dependencyRulesToDiscover: [DependencyRuleType] =
74+
dependencyRuleToDiscover.isEmpty ? DependencyRuleType.allCases : dependencyRuleToDiscover
8375
let indexFlags = indexFlag.map { "--" + $0 }
84-
let targets: [String]
85-
if !target.isEmpty {
86-
var expandedTargets = [String]()
87-
var targetsToExpand = [String]()
88-
for _target in target {
89-
if _target.hasSuffix("...") {
90-
targetsToExpand.append(_target)
91-
} else {
92-
expandedTargets.append(_target)
93-
}
94-
}
95-
if !targetsToExpand.isEmpty {
96-
expandedTargets.append(
97-
contentsOf: try expandWildcardTargets(
98-
bazelWrapper: bazelWrapper,
99-
targets: targetsToExpand,
100-
topLevelRuleToDiscover: topLevelRulesToDiscover,
101-
indexFlags: indexFlags
102-
)
103-
)
104-
}
105-
targets = expandedTargets
106-
} else {
107-
// If the user provided no specific targets, try to discover them
108-
// in the workspace.
109-
targets = try expandWildcardTargets(
110-
bazelWrapper: bazelWrapper,
111-
targets: ["..."],
112-
topLevelRuleToDiscover: topLevelRulesToDiscover,
113-
indexFlags: indexFlags
114-
)
115-
}
76+
let targets = target.isEmpty ? ["//..."] : target
11677

11778
let config = BaseServerConfig(
11879
bazelWrapper: bazelWrapper,
@@ -129,29 +90,4 @@ struct Serve: ParsableCommand {
12990
let server = SourceKitBazelBSPServer(baseConfig: config)
13091
server.run()
13192
}
132-
133-
private func expandWildcardTargets(
134-
bazelWrapper: String,
135-
targets: [String],
136-
topLevelRuleToDiscover: [TopLevelRuleType],
137-
indexFlags: [String]
138-
) throws -> [String] {
139-
let targetsString = targets.joined(separator: ", ")
140-
logger.warning(
141-
"Will expand wildcard targets (\(targetsString, privacy: .public)). This can cause the BSP to perform poorly if we find too many targets. Prefer passing explicit targets via --targets if possible."
142-
)
143-
do {
144-
return try BazelTargetDiscoverer.discoverTargets(
145-
for: topLevelRuleToDiscover,
146-
bazelWrapper: bazelWrapper,
147-
locations: targets,
148-
additionalFlags: indexFlags,
149-
)
150-
} catch {
151-
logger.error(
152-
"Failed to initialize server: Could not expand wildcard targets (\(targetsString, privacy: .public)). Please check your Bazel configuration or try specifying targets explicitly with `--target` instead. Failure: \(error, privacy: .public)"
153-
)
154-
throw error
155-
}
156-
}
15793
}

0 commit comments

Comments
 (0)