@@ -50,6 +50,11 @@ public actor BuildSystemManager {
50
50
/// Build system delegate that will receive notifications about setting changes, etc.
51
51
var delegate : BuildSystemDelegate ?
52
52
53
+ /// The list of toolchains that are available.
54
+ ///
55
+ /// Used to determine which toolchain to use for a given document.
56
+ private let toolchainRegistry : ToolchainRegistry
57
+
53
58
/// The root of the project that this build system manages. For example, for SwiftPM packages, this is the folder
54
59
/// containing Package.swift. For compilation databases it is the root folder based on which the compilation database
55
60
/// was found.
@@ -65,13 +70,15 @@ public actor BuildSystemManager {
65
70
buildSystem: BuildSystem ? ,
66
71
fallbackBuildSystem: FallbackBuildSystem ? ,
67
72
mainFilesProvider: MainFilesProvider ? ,
73
+ toolchainRegistry: ToolchainRegistry ,
68
74
fallbackSettingsTimeout: DispatchTimeInterval = . seconds( 3 )
69
75
) async {
70
76
let buildSystemHasDelegate = await buildSystem? . delegate != nil
71
77
precondition ( !buildSystemHasDelegate)
72
78
self . buildSystem = buildSystem
73
79
self . fallbackBuildSystem = fallbackBuildSystem
74
80
self . mainFilesProvider = mainFilesProvider
81
+ self . toolchainRegistry = toolchainRegistry
75
82
self . fallbackSettingsTimeout = fallbackSettingsTimeout
76
83
await self . buildSystem? . setDelegate ( self )
77
84
}
@@ -87,11 +94,34 @@ extension BuildSystemManager {
87
94
self . delegate = delegate
88
95
}
89
96
97
+ /// Returns the toolchain that should be used to process the given document.
98
+ public func toolchain( for uri: DocumentURI , _ language: Language ) async -> Toolchain ? {
99
+ // To support multiple toolchains within a single workspace, we need to ask the build system which toolchain to use
100
+ // for this document.
101
+ return await toolchainRegistry. defaultToolchain ( for: language)
102
+ }
103
+
90
104
/// - Note: Needed so we can set the delegate from a different isolation context.
91
105
public func setMainFilesProvider( _ mainFilesProvider: MainFilesProvider ? ) {
92
106
self . mainFilesProvider = mainFilesProvider
93
107
}
94
108
109
+ /// Returns the language that a document should be interpreted in for background tasks where the editor doesn't
110
+ /// specify the document's language.
111
+ public func defaultLanguage( for document: DocumentURI ) async -> Language ? {
112
+ if let defaultLanguage = await buildSystem? . defaultLanguage ( for: document) {
113
+ return defaultLanguage
114
+ }
115
+ switch document. fileURL? . pathExtension {
116
+ case " c " : return . c
117
+ case " cpp " , " cc " , " cxx " : return . cpp
118
+ case " m " : return . objective_c
119
+ case " mm " , " h " : return . objective_cpp
120
+ case " swift " : return . swift
121
+ default : return nil
122
+ }
123
+ }
124
+
95
125
private func buildSettings(
96
126
for document: DocumentURI ,
97
127
language: Language
@@ -177,8 +207,17 @@ extension BuildSystemManager {
177
207
)
178
208
}
179
209
210
+ public func sourceFiles( ) async -> [ SourceFileInfo ] {
211
+ return await buildSystem? . sourceFiles ( ) ?? [ ]
212
+ }
213
+
180
214
public func testFiles( ) async -> [ DocumentURI ] {
181
- return await buildSystem? . testFiles ( ) ?? [ ]
215
+ return await sourceFiles ( ) . compactMap { ( info: SourceFileInfo ) -> DocumentURI ? in
216
+ guard info. mayContainTests else {
217
+ return nil
218
+ }
219
+ return info. uri
220
+ }
182
221
}
183
222
}
184
223
0 commit comments