From 4d90f40f7219100cbcf46916f581178012acaa7a Mon Sep 17 00:00:00 2001 From: Alex Hoppen Date: Fri, 21 Jun 2024 07:19:57 -0700 Subject: [PATCH] Watch for changes to `Package.resolved` We need to watch for changes to `Package.resolved` so that we can update the dependency checkouts in `.index-build` when the user runs `swift package update`. --- .../SwiftPMBuildSystem.swift | 2 +- .../RepeatUntilExpectedResult.swift | 38 ++++++ .../SwiftPMDependencyProject.swift | 11 +- Sources/SourceKitLSP/SourceKitLSPServer.swift | 1 + .../BackgroundIndexingTests.swift | 126 +++++++++++++++++- .../SourceKitLSPTests/BuildSystemTests.swift | 9 +- .../MainFilesProviderTests.swift | 12 +- 7 files changed, 179 insertions(+), 20 deletions(-) create mode 100644 Sources/SKTestSupport/RepeatUntilExpectedResult.swift diff --git a/Sources/SKSwiftPMWorkspace/SwiftPMBuildSystem.swift b/Sources/SKSwiftPMWorkspace/SwiftPMBuildSystem.swift index 1267add64..53cbc7e83 100644 --- a/Sources/SKSwiftPMWorkspace/SwiftPMBuildSystem.swift +++ b/Sources/SKSwiftPMWorkspace/SwiftPMBuildSystem.swift @@ -691,7 +691,7 @@ extension SwiftPMBuildSystem: SKCore.BuildSystem { packageGraph: self.modulesGraph ) case .changed: - return fileURL.lastPathComponent == "Package.swift" + return fileURL.lastPathComponent == "Package.swift" || fileURL.lastPathComponent == "Package.resolved" default: // Unknown file change type return false } diff --git a/Sources/SKTestSupport/RepeatUntilExpectedResult.swift b/Sources/SKTestSupport/RepeatUntilExpectedResult.swift new file mode 100644 index 000000000..1f2c52045 --- /dev/null +++ b/Sources/SKTestSupport/RepeatUntilExpectedResult.swift @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +import LSPTestSupport +import XCTest + +/// Runs the body repeatedly once per second until it returns `true`, giving up after `timeout`. +/// +/// This is useful to test some request that requires global state to be updated but will eventually converge on the +/// correct result. +/// +/// If `bodyHasOneSecondDelay` is true, it is assume that the body already has a one-second delay between iterations. +public func repeatUntilExpectedResult( + _ body: () async throws -> Bool, + bodyHasOneSecondDelay: Bool = false, + timeout: TimeInterval = defaultTimeout, + file: StaticString = #filePath, + line: UInt = #line +) async throws { + for _ in 0..