Skip to content

Commit f406b57

Browse files
committed
Improve performance of sourceFilesAndDirectories
`SourceFilesAndDirectoriesKey` contained all source files in the project and computing its hash value was pretty expensive. The key didn’t really provide any value here because the only way it changes is if the build targets change and if that’s the case, we already clear `cachedSourceFilesAndDirectories`, so we can just avoid the hash value computation.
1 parent f900b4e commit f406b57

File tree

1 file changed

+9
-16
lines changed

1 file changed

+9
-16
lines changed

Sources/BuildSystemIntegration/BuildSystemManager.swift

+9-16
Original file line numberDiff line numberDiff line change
@@ -327,11 +327,9 @@ package actor BuildSystemManager: QueueBasedMessageHandler {
327327

328328
private var cachedTargetSources = RequestCache<BuildTargetSourcesRequest>()
329329

330-
/// The parameters with which `SourceFilesAndDirectories` can be cached in `cachedSourceFilesAndDirectories`.
331-
private struct SourceFilesAndDirectoriesKey: Hashable {
332-
let includeNonBuildableFiles: Bool
333-
let sourcesItems: [SourcesItem]
334-
}
330+
/// `SourceFilesAndDirectories` is a global property that only gets reset when the build targets change and thus
331+
/// has no real key.
332+
private struct SourceFilesAndDirectoriesKey: Hashable {}
335333

336334
private struct SourceFilesAndDirectories {
337335
/// The source files in the workspace, ie. all `SourceItem`s that have `kind == .file`.
@@ -1045,27 +1043,22 @@ package actor BuildSystemManager: QueueBasedMessageHandler {
10451043
///
10461044
/// `includeNonBuildableFiles` determines whether non-buildable files should be included.
10471045
private func sourceFilesAndDirectories(includeNonBuildableFiles: Bool) async throws -> SourceFilesAndDirectories {
1048-
let targets = try await self.buildTargets()
1049-
let sourcesItems = try await self.sourceFiles(in: Set(targets.keys))
1050-
1051-
let key = SourceFilesAndDirectoriesKey(
1052-
includeNonBuildableFiles: includeNonBuildableFiles,
1053-
sourcesItems: sourcesItems
1054-
)
1046+
return try await cachedSourceFilesAndDirectories.get(SourceFilesAndDirectoriesKey(), isolation: self) { key in
1047+
let targets = try await self.buildTargets()
1048+
let sourcesItems = try await self.sourceFiles(in: Set(targets.keys))
10551049

1056-
return try await cachedSourceFilesAndDirectories.get(key, isolation: self) { key in
10571050
var files: [DocumentURI: SourceFileInfo] = [:]
10581051
var directories: [DocumentURI: SourceFileInfo] = [:]
1059-
for sourcesItem in key.sourcesItems {
1052+
for sourcesItem in sourcesItems {
10601053
let target = targets[sourcesItem.target]?.target
10611054
let isPartOfRootProject = !(target?.tags.contains(.dependency) ?? false)
10621055
let mayContainTests = target?.tags.contains(.test) ?? true
1063-
if !key.includeNonBuildableFiles && (target?.tags.contains(.notBuildable) ?? false) {
1056+
if !includeNonBuildableFiles && (target?.tags.contains(.notBuildable) ?? false) {
10641057
continue
10651058
}
10661059

10671060
for sourceItem in sourcesItem.sources {
1068-
if !key.includeNonBuildableFiles && sourceItem.sourceKitData?.isHeader ?? false {
1061+
if !includeNonBuildableFiles && sourceItem.sourceKitData?.isHeader ?? false {
10691062
continue
10701063
}
10711064
let info = SourceFileInfo(

0 commit comments

Comments
 (0)