Skip to content

Commit 77c2ae4

Browse files
authored
Merge pull request #251 from benlangmuir/bsm-fixes
BuildSystemManager fileBuildSettingsChanged fixes for dropped notifications
2 parents c6f08fd + 8a6340e commit 77c2ae4

File tree

3 files changed

+58
-2
lines changed

3 files changed

+58
-2
lines changed

Sources/SKCore/BuildSystemManager.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -181,14 +181,14 @@ extension BuildSystemManager: BuildSystemDelegate {
181181
public func fileBuildSettingsChanged(_ changedFiles: Set<DocumentURI>) {
182182
queue.async {
183183
// Empty -> assume all files have been changed.
184-
let filesToCheck = changedFiles.isEmpty ? Set(self.watchedFiles.keys) : changedFiles
184+
let filesToCheck = changedFiles.isEmpty ? Set(self.mainFileSettings.keys) : changedFiles
185185
var changedWatchedFiles = Set<DocumentURI>()
186186

187187
for mainFile in filesToCheck {
188188
let watches = self.watchedFiles.filter { $1.mainFile == mainFile }
189189
guard !watches.isEmpty else {
190190
// We got a notification after the file was unregistered. Ignore.
191-
return
191+
continue
192192
}
193193

194194
// FIXME: we need to stop threading the langauge everywhere, or we need the build system

Tests/SKCoreTests/BuildSystemManagerTests.swift

+55
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,61 @@ final class BuildSystemManagerTests: XCTestCase {
286286
bsm.fileBuildSettingsChanged(Set([cpp]))
287287

288288
wait(for: [changed1, changed2], timeout: 10, enforceOrder: false)
289+
290+
bs.map[cpp] = FileBuildSettings(compilerArguments: ["Third C++ Main File"], language: .cpp)
291+
let changed3 = expectation(description: "third settings h1 via cpp")
292+
let changed4 = expectation(description: "third settings h2 via cpp")
293+
del.expected = [
294+
(h1, bs.map[cpp]!, changed3, #file, #line),
295+
(h2, bs.map[cpp]!, changed4, #file, #line),
296+
]
297+
bsm.fileBuildSettingsChanged(Set([])) // Empty => all
298+
wait(for: [changed3, changed4], timeout: 10, enforceOrder: false)
299+
}
300+
301+
func testSettingsChangedAfterUnregister() {
302+
let a = DocumentURI(string: "bsm:a.swift")
303+
let b = DocumentURI(string: "bsm:b.swift")
304+
let c = DocumentURI(string: "bsm:c.swift")
305+
let mainFiles = ManualMainFilesProvider()
306+
mainFiles.mainFiles = [a: Set([a]), b: Set([b]), c: Set([c])]
307+
let bs = ManualBuildSystem()
308+
let bsm = BuildSystemManager(buildSystem: bs, mainFilesProvider: mainFiles)
309+
let del = BSMDelegate(bsm)
310+
311+
bs.map[a] = FileBuildSettings(compilerArguments: ["a"], language: .swift)
312+
bs.map[b] = FileBuildSettings(compilerArguments: ["b"], language: .swift)
313+
bs.map[c] = FileBuildSettings(compilerArguments: ["c"], language: .swift)
314+
315+
let initialA = expectation(description: "initial settings a")
316+
let initialB = expectation(description: "initial settings b")
317+
let initialC = expectation(description: "initial settings c")
318+
del.expected = [
319+
(a, bs.map[a]!, initialA, #file, #line),
320+
(b, bs.map[b]!, initialB, #file, #line),
321+
(c, bs.map[c]!, initialC, #file, #line),
322+
]
323+
bsm.registerForChangeNotifications(for: a, language: .swift)
324+
bsm.registerForChangeNotifications(for: b, language: .swift)
325+
bsm.registerForChangeNotifications(for: c, language: .swift)
326+
wait(for: [initialA, initialB, initialC], timeout: 10, enforceOrder: false)
327+
328+
bs.map[a] = FileBuildSettings(compilerArguments: ["new-a"], language: .swift)
329+
bs.map[b] = FileBuildSettings(compilerArguments: ["new-b"], language: .swift)
330+
bs.map[c] = FileBuildSettings(compilerArguments: ["new-c"], language: .swift)
331+
332+
let changedB = expectation(description: "changed settings b")
333+
del.expected = [
334+
(b, bs.map[b]!, changedB, #file, #line),
335+
]
336+
337+
bsm.unregisterForChangeNotifications(for: a)
338+
bsm.unregisterForChangeNotifications(for: c)
339+
// At this point only b is registered, but that can race with notifications,
340+
// so ensure nothing bad happens and we still get the notification for b.
341+
bsm.fileBuildSettingsChanged([a, b, c])
342+
343+
wait(for: [changedB], timeout: 10, enforceOrder: false)
289344
}
290345
}
291346

Tests/SKCoreTests/XCTestManifests.swift

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ extension BuildSystemManagerTests {
2222
// to regenerate.
2323
static let __allTests__BuildSystemManagerTests = [
2424
("testMainFiles", testMainFiles),
25+
("testSettingsChangedAfterUnregister", testSettingsChangedAfterUnregister),
2526
("testSettingsHeaderChangeMainFile", testSettingsHeaderChangeMainFile),
2627
("testSettingsMainFile", testSettingsMainFile),
2728
("testSettingsMainFileInitialIntersect", testSettingsMainFileInitialIntersect),

0 commit comments

Comments
 (0)