From 558d7fc66460be144cc0c9d74fb840cb86e36360 Mon Sep 17 00:00:00 2001 From: Alex Hoppen Date: Tue, 19 Nov 2019 12:49:39 -0800 Subject: [PATCH] Change backing storage of DocumentURI to URL URL can in fact store URIs, it just doesn't have a very nice API to interact with them. As long as we only operate on absoluteString, we should be fine though. So instead of implementing the logic for detecting file URLs ourselves, we can just use a URL as storage for DocumentURI. --- .../LanguageServerProtocol/DocumentURI.swift | 56 +++++++++---------- .../WorkspaceFolder.swift | 9 +-- Sources/SKCore/BuildServerBuildSystem.swift | 2 +- .../CompilationDatabaseBuildSystem.swift | 2 +- .../SKSwiftPMWorkspace/SwiftPMWorkspace.swift | 2 +- Sources/SKTestSupport/Extensions.swift | 4 +- .../SKSwiftPMTestWorkspace.swift | 4 +- .../SKTestSupport/SKTibsTestWorkspace.swift | 10 ++-- Sources/SourceKit/SourceKitServer.swift | 10 ++-- Sources/SourceKit/Workspace.swift | 2 +- .../clangd/ClangLanguageServer.swift | 2 +- Sources/SourceKit/sourcekitd/CursorInfo.swift | 2 +- .../sourcekitd/SwiftLanguageServer.swift | 9 ++- .../CodingTests.swift | 2 +- .../BuildServerBuildSystemTests.swift | 10 ++-- .../CompilationDatabaseTests.swift | 3 +- .../SwiftPMWorkspaceTests.swift | 3 +- Tests/SourceKitTests/BuildSystemTests.swift | 32 +++++------ Tests/SourceKitTests/DocumentColorTests.swift | 4 +- .../SourceKitTests/DocumentSymbolTests.swift | 2 +- .../SourceKitTests/ExecuteCommandTests.swift | 4 +- Tests/SourceKitTests/FoldingRangeTests.swift | 2 +- Tests/SourceKitTests/LocalClangTests.swift | 4 +- Tests/SourceKitTests/LocalSwiftTests.swift | 18 +++--- Tests/SourceKitTests/SourceKitTests.swift | 2 +- .../SourceKitTests/SwiftCompletionTests.swift | 2 +- 26 files changed, 100 insertions(+), 102 deletions(-) diff --git a/Sources/LanguageServerProtocol/DocumentURI.swift b/Sources/LanguageServerProtocol/DocumentURI.swift index b52e3f4c..3d38a6d7 100644 --- a/Sources/LanguageServerProtocol/DocumentURI.swift +++ b/Sources/LanguageServerProtocol/DocumentURI.swift @@ -12,9 +12,17 @@ import Foundation -public enum DocumentURI: Codable, Hashable { - case url(URL) - case other(String) +public struct DocumentURI: Codable, Hashable { + /// The URL that store the URIs value + private let storage: URL + + public var fileURL: URL? { + if storage.isFileURL { + return storage + } else { + return nil + } + } /// Returns a filepath if the URI is a URL. If the URI is not a URL, returns /// the full URI as a fallback. @@ -22,39 +30,30 @@ public enum DocumentURI: Codable, Hashable { /// expects a file path but is able to handle arbitrary strings as well in a /// fallback mode that drops semantic functionality. public var pseudoPath: String { - switch self { - case .url(let url): - return url.path - case .other(let string): - return string + if storage.isFileURL { + return storage.path + } else { + return storage.absoluteString } } /// Returns the URI as a string. public var stringValue: String { - switch self { - case .url(let url): - return url.absoluteString - case .other(let string): - return string - } + return storage.absoluteString } /// Construct a DocumentURI from the given URI string, automatically parsing /// it either as a URL or an opaque URI. public init(string: String) { - if string.starts(with: "file:"), let url = URL(string: string) { - // URL with a 'file:' protocol. Parse using URL(string:) - self = .url(url) - } else if string.starts(with: "/") { - // Absolute path. Technically this not part of the LSP specification - // but we want to support it anyway. - // Parse it using URL(fileURLWithPath:) - self = .url(URL(fileURLWithPath: string)) - } else { - // Can't parse URI as URL. Use it as an opaque value. - self = .other(string) + guard let url = URL(string: string) else { + fatalError("Failed to construct DocumentURI from '\(string)'") } + self.init(url) + } + + public init(_ url: URL) { + self.storage = url + assert(self.storage.scheme != nil, "Received invalid URI without a scheme '\(self.storage.absoluteString)'") } public init(from decoder: Decoder) throws { @@ -62,11 +61,6 @@ public enum DocumentURI: Codable, Hashable { } public func encode(to encoder: Encoder) throws { - switch self { - case .url(let url): - try url.absoluteString.encode(to: encoder) - case .other(let string): - try string.encode(to: encoder) - } + try storage.absoluteString.encode(to: encoder) } } diff --git a/Sources/LanguageServerProtocol/WorkspaceFolder.swift b/Sources/LanguageServerProtocol/WorkspaceFolder.swift index 0852e55d..9276930a 100644 --- a/Sources/LanguageServerProtocol/WorkspaceFolder.swift +++ b/Sources/LanguageServerProtocol/WorkspaceFolder.swift @@ -22,13 +22,8 @@ public struct WorkspaceFolder: ResponseType, Hashable, Codable { public init(uri: DocumentURI, name: String? = nil) { self.uri = uri - switch uri { - case .url(let url): - self.name = name ?? url.lastPathComponent - case .other(_): - self.name = name ?? "unknown_workspace" - } - + self.name = name ?? uri.fileURL?.lastPathComponent ?? "unknown_workspace" + if self.name.isEmpty { self.name = "unknown_workspace" } diff --git a/Sources/SKCore/BuildServerBuildSystem.swift b/Sources/SKCore/BuildServerBuildSystem.swift index 307bfeb6..22d5d3a2 100644 --- a/Sources/SKCore/BuildServerBuildSystem.swift +++ b/Sources/SKCore/BuildServerBuildSystem.swift @@ -170,7 +170,7 @@ extension BuildServerBuildSystem: BuildSystem { } public func settings(for uri: DocumentURI, _ language: Language) -> FileBuildSettings? { - guard case .url(let url) = uri else { + guard let url = uri.fileURL else { // We can't determine build settings for non-file URIs. return nil } diff --git a/Sources/SKCore/CompilationDatabaseBuildSystem.swift b/Sources/SKCore/CompilationDatabaseBuildSystem.swift index eae75e49..690fcfb5 100644 --- a/Sources/SKCore/CompilationDatabaseBuildSystem.swift +++ b/Sources/SKCore/CompilationDatabaseBuildSystem.swift @@ -45,7 +45,7 @@ extension CompilationDatabaseBuildSystem: BuildSystem { public var indexDatabasePath: AbsolutePath? { return nil } public func settings(for uri: DocumentURI, _ language: Language) -> FileBuildSettings? { - guard case .url(let url) = uri else { + guard let url = uri.fileURL else { // We can't determine build settings for non-file URIs. return nil } diff --git a/Sources/SKSwiftPMWorkspace/SwiftPMWorkspace.swift b/Sources/SKSwiftPMWorkspace/SwiftPMWorkspace.swift index 54d560c6..7c43f9b1 100644 --- a/Sources/SKSwiftPMWorkspace/SwiftPMWorkspace.swift +++ b/Sources/SKSwiftPMWorkspace/SwiftPMWorkspace.swift @@ -199,7 +199,7 @@ extension SwiftPMWorkspace: BuildSystem { for uri: DocumentURI, _ language: Language) -> FileBuildSettings? { - guard case .url(let url) = uri else { + guard let url = uri.fileURL else { // We can't determine build settings for non-file URIs. return nil } diff --git a/Sources/SKTestSupport/Extensions.swift b/Sources/SKTestSupport/Extensions.swift index 9c6bff78..bfa811d6 100644 --- a/Sources/SKTestSupport/Extensions.swift +++ b/Sources/SKTestSupport/Extensions.swift @@ -15,12 +15,12 @@ import TSCBasic public extension TextDocumentIdentifier { init(_ url: URL) { - self.init(.url(url)) + self.init(DocumentURI(url)) } } public extension AbsolutePath { var asURI: DocumentURI { - return .url(asURL) + return DocumentURI(asURL) } } diff --git a/Sources/SKTestSupport/SKSwiftPMTestWorkspace.swift b/Sources/SKTestSupport/SKSwiftPMTestWorkspace.swift index 91f1e495..948b1551 100644 --- a/Sources/SKTestSupport/SKSwiftPMTestWorkspace.swift +++ b/Sources/SKTestSupport/SKSwiftPMTestWorkspace.swift @@ -85,7 +85,7 @@ public final class SKSwiftPMTestWorkspace { listenToUnitEvents: false) testServer.server!.workspace = Workspace( - rootUri: .url(sources.rootDirectory), + rootUri: DocumentURI(sources.rootDirectory), clientCapabilities: ClientCapabilities(), buildSettings: swiftpm, index: index, @@ -121,7 +121,7 @@ extension SKSwiftPMTestWorkspace { extension SKSwiftPMTestWorkspace { public func openDocument(_ url: URL, language: Language) throws { sk.send(DidOpenTextDocument(textDocument: TextDocumentItem( - uri: .url(url), + uri: DocumentURI(url), language: language, version: 1, text: try sources.sourceCache.get(url)))) diff --git a/Sources/SKTestSupport/SKTibsTestWorkspace.swift b/Sources/SKTestSupport/SKTibsTestWorkspace.swift index c0177f9d..4dd02c7e 100644 --- a/Sources/SKTestSupport/SKTibsTestWorkspace.swift +++ b/Sources/SKTestSupport/SKTibsTestWorkspace.swift @@ -62,7 +62,7 @@ public final class SKTibsTestWorkspace { func initWorkspace(clientCapabilities: ClientCapabilities) { let buildPath = AbsolutePath(builder.buildRoot.path) testServer.server!.workspace = Workspace( - rootUri: .url(sources.rootDirectory), + rootUri: DocumentURI(sources.rootDirectory), clientCapabilities: clientCapabilities, buildSettings: CompilationDatabaseBuildSystem(projectRoot: buildPath), index: index, @@ -82,7 +82,7 @@ extension SKTibsTestWorkspace { extension SKTibsTestWorkspace { public func openDocument(_ url: URL, language: Language) throws { sk.send(DidOpenTextDocument(textDocument: TextDocumentItem( - uri: .url(url), + uri: DocumentURI(url), language: language, version: 1, text: try sources.sourceCache.get(url)))) @@ -134,13 +134,13 @@ extension Position { extension Location { public init(_ loc: TestLocation) { - self.init(uri: .url(loc.url), range: Range(Position(loc))) + self.init(uri: DocumentURI(loc.url), range: Range(Position(loc))) } /// Incorrectly use the UTF-8 column index in place of the UTF-16 one, to match the incorrect /// implementation in SourceKitServer when using the index. public init(badUTF16 loc: TestLocation) { - self.init(uri: .url(loc.url), range: Range(Position(badUTF16: loc))) + self.init(uri: DocumentURI(loc.url), range: Range(Position(badUTF16: loc))) } } @@ -162,5 +162,5 @@ extension TibsToolchain { } extension TestLocation { - public var docIdentifier: TextDocumentIdentifier { TextDocumentIdentifier(.url(url)) } + public var docIdentifier: TextDocumentIdentifier { TextDocumentIdentifier(url) } } diff --git a/Sources/SourceKit/SourceKitServer.swift b/Sources/SourceKit/SourceKitServer.swift index 32c9e11f..979d1bd3 100644 --- a/Sources/SourceKit/SourceKitServer.swift +++ b/Sources/SourceKit/SourceKitServer.swift @@ -288,7 +288,7 @@ extension SourceKitServer { indexOptions: indexOptions) } else if let path = req.params.rootPath { self.workspace = try? Workspace( - rootUri: .url(URL(fileURLWithPath: path)), + rootUri: DocumentURI(URL(fileURLWithPath: path)), clientCapabilities: req.params.capabilities, toolchainRegistry: self.toolchainRegistry, buildSetup: self.options.buildSetup, @@ -444,7 +444,7 @@ extension SourceKitServer { utf16index: symbolOccurrence.location.utf8Column - 1) let symbolLocation = Location( - uri: .url(URL(fileURLWithPath: symbolOccurrence.location.path)), + uri: DocumentURI(URL(fileURLWithPath: symbolOccurrence.location.path)), range: Range(symbolPosition)) return SymbolInformation( @@ -565,7 +565,7 @@ extension SourceKitServer { return nil } return Location( - uri: .url(URL(fileURLWithPath: occur.location.path)), + uri: DocumentURI(URL(fileURLWithPath: occur.location.path)), range: Range(Position( line: occur.location.line - 1, // 1-based -> 0-based // FIXME: we need to convert the utf8/utf16 column, which may require reading the file! @@ -612,7 +612,7 @@ extension SourceKitServer { return nil } return Location( - uri: .url(URL(fileURLWithPath: occur.location.path)), + uri: DocumentURI(URL(fileURLWithPath: occur.location.path)), range: Range(Position( line: occur.location.line - 1, // 1-based -> 0-based // FIXME: we need to convert the utf8/utf16 column, which may require reading the file! @@ -665,7 +665,7 @@ extension SourceKitServer { return nil } return Location( - uri: .url(URL(fileURLWithPath: occur.location.path)), + uri: DocumentURI(URL(fileURLWithPath: occur.location.path)), range: Range(Position( line: occur.location.line - 1, // 1-based -> 0-based // FIXME: we need to convert the utf8/utf16 column, which may require reading the file! diff --git a/Sources/SourceKit/Workspace.swift b/Sources/SourceKit/Workspace.swift index 342efc2e..3f5857f2 100644 --- a/Sources/SourceKit/Workspace.swift +++ b/Sources/SourceKit/Workspace.swift @@ -83,7 +83,7 @@ public final class Workspace { let settings = BuildSystemList() self.buildSettings = settings - if case .url(let rootUrl) = rootUri, let rootPath = try? AbsolutePath(validating: rootUrl.path) { + if let rootUrl = rootUri.fileURL, let rootPath = try? AbsolutePath(validating: rootUrl.path) { if let buildServer = BuildServerBuildSystem(projectRoot: rootPath, buildSetup: buildSetup) { settings.providers.insert(buildServer, at: 0) } else { diff --git a/Sources/SourceKit/clangd/ClangLanguageServer.swift b/Sources/SourceKit/clangd/ClangLanguageServer.swift index 34324e5e..c9643388 100644 --- a/Sources/SourceKit/clangd/ClangLanguageServer.swift +++ b/Sources/SourceKit/clangd/ClangLanguageServer.swift @@ -107,7 +107,7 @@ extension ClangLanguageServerShim { } public func documentUpdatedBuildSettings(_ uri: DocumentURI, language: Language) { - guard case .url(let url) = uri else { + guard let url = uri.fileURL else { // FIXME: The clang workspace can probably be reworked to support non-file URIs. log("Received updated build settings for non-file URI '\(uri)'. Ignoring the update.") return diff --git a/Sources/SourceKit/sourcekitd/CursorInfo.swift b/Sources/SourceKit/sourcekitd/CursorInfo.swift index 51c11965..f28ca855 100644 --- a/Sources/SourceKit/sourcekitd/CursorInfo.swift +++ b/Sources/SourceKit/sourcekitd/CursorInfo.swift @@ -120,7 +120,7 @@ extension SwiftLanguageServer { let offset: Int = dict[keys.offset], let pos = snapshot.positionOf(utf8Offset: offset) { - location = Location(uri: .url(URL(fileURLWithPath: filepath)), range: Range(pos)) + location = Location(uri: DocumentURI(URL(fileURLWithPath: filepath)), range: Range(pos)) } let refactorActionsArray: SKResponseArray? = dict[keys.refactor_actions] diff --git a/Sources/SourceKit/sourcekitd/SwiftLanguageServer.swift b/Sources/SourceKit/sourcekitd/SwiftLanguageServer.swift index 7b1b0adb..c74b4d69 100644 --- a/Sources/SourceKit/sourcekitd/SwiftLanguageServer.swift +++ b/Sources/SourceKit/sourcekitd/SwiftLanguageServer.swift @@ -125,7 +125,14 @@ extension SwiftLanguageServer { let name: String = dict[self.keys.name] { self.queue.async { - self.handleDocumentUpdate(uri: DocumentURI(string: name)) + let uri: DocumentURI + if name.starts(with: "/") { + // If sourcekitd returns us a path, translate it back into a URL + uri = DocumentURI(URL(fileURLWithPath: name)) + } else { + uri = DocumentURI(string: name) + } + self.handleDocumentUpdate(uri: uri) } } } diff --git a/Tests/LanguageServerProtocolTests/CodingTests.swift b/Tests/LanguageServerProtocolTests/CodingTests.swift index b4894de2..fb99474f 100644 --- a/Tests/LanguageServerProtocolTests/CodingTests.swift +++ b/Tests/LanguageServerProtocolTests/CodingTests.swift @@ -18,7 +18,7 @@ final class CodingTests: XCTestCase { func testValueCoding() { let url = URL(fileURLWithPath: "/foo.swift") - let uri = DocumentURI.url(url) + let uri = DocumentURI(url) // The \\/\\/\\/ is escaping file:// + /foo.swift, which is silly but allowed by json. let urljson = "file:\\/\\/\\/foo.swift" diff --git a/Tests/SKCoreTests/BuildServerBuildSystemTests.swift b/Tests/SKCoreTests/BuildServerBuildSystemTests.swift index 883cd72e..aa54aad1 100644 --- a/Tests/SKCoreTests/BuildServerBuildSystemTests.swift +++ b/Tests/SKCoreTests/BuildServerBuildSystemTests.swift @@ -39,14 +39,14 @@ final class BuildServerBuildSystemTests: XCTestCase { // test settings with a response let fileURL = URL(fileURLWithPath: "/path/to/some/file.swift") - let settings = buildSystem.settings(for: .url(fileURL), Language.swift) + let settings = buildSystem.settings(for: DocumentURI(fileURL), Language.swift) XCTAssertNotNil(settings) XCTAssertEqual(settings?.compilerArguments, ["-a", "-b"]) XCTAssertEqual(settings?.workingDirectory, fileURL.deletingLastPathComponent().path) // test error let missingFileURL = URL(fileURLWithPath: "/path/to/some/missingfile.missing") - XCTAssertNil(buildSystem.settings(for: .url(missingFileURL), Language.swift)) + XCTAssertNil(buildSystem.settings(for: DocumentURI(missingFileURL), Language.swift)) } func testFileRegistration() throws { @@ -57,9 +57,9 @@ final class BuildServerBuildSystemTests: XCTestCase { let fileUrl = URL(fileURLWithPath: "/some/file/path") let expectation = XCTestExpectation(description: "\(fileUrl) settings updated") - let buildSystemDelegate = TestDelegate(fileExpectations: [.url(fileUrl): expectation]) + let buildSystemDelegate = TestDelegate(fileExpectations: [DocumentURI(fileUrl): expectation]) buildSystem.delegate = buildSystemDelegate - buildSystem.registerForChangeNotifications(for: .url(fileUrl)) + buildSystem.registerForChangeNotifications(for: DocumentURI(fileUrl)) XCTAssertEqual(XCTWaiter.wait(for: [expectation], timeout: 15), .completed) } @@ -174,7 +174,7 @@ final class BuildServerBuildSystemTests: XCTestCase { data: .dictionary(["key": "value"])): expectation, ]) buildSystem.delegate = buildSystemDelegate - buildSystem.registerForChangeNotifications(for: .url(fileUrl)) + buildSystem.registerForChangeNotifications(for: DocumentURI(fileUrl)) let result = XCTWaiter.wait(for: [expectation], timeout: 15) if result != .completed { diff --git a/Tests/SKCoreTests/CompilationDatabaseTests.swift b/Tests/SKCoreTests/CompilationDatabaseTests.swift index b629b61b..7fa10751 100644 --- a/Tests/SKCoreTests/CompilationDatabaseTests.swift +++ b/Tests/SKCoreTests/CompilationDatabaseTests.swift @@ -10,6 +10,7 @@ // //===----------------------------------------------------------------------===// +import LanguageServerProtocol import LSPTestSupport import SKCore import TSCBasic @@ -200,7 +201,7 @@ final class CompilationDatabaseTests: XCTestCase { let buildSystem: BuildSystem = CompilationDatabaseBuildSystem( projectRoot: AbsolutePath("/a"), fileSystem: fs) - let settings = buildSystem.settings(for: .url(URL(fileURLWithPath: "/a/a.swift")), .swift) + let settings = buildSystem.settings(for: DocumentURI(URL(fileURLWithPath: "/a/a.swift")), .swift) XCTAssertNotNil(settings) XCTAssertEqual(settings?.workingDirectory, "/a") XCTAssertEqual(settings?.compilerArguments, ["-swift-version", "4", "/a/a.swift"]) diff --git a/Tests/SKSwiftPMWorkspaceTests/SwiftPMWorkspaceTests.swift b/Tests/SKSwiftPMWorkspaceTests/SwiftPMWorkspaceTests.swift index b047df67..5b9756db 100644 --- a/Tests/SKSwiftPMWorkspaceTests/SwiftPMWorkspaceTests.swift +++ b/Tests/SKSwiftPMWorkspaceTests/SwiftPMWorkspaceTests.swift @@ -11,6 +11,7 @@ //===----------------------------------------------------------------------===// import Build +import LanguageServerProtocol import SKCore import SKSwiftPMWorkspace import SKTestSupport @@ -301,7 +302,7 @@ final class SwiftPMWorkspaceTests: XCTestCase { let bswift = packageRoot.appending(components: "Sources", "libB", "b.swift") XCTAssertNotNil(ws.settings(for: aswift.asURI, .swift)) XCTAssertNil(ws.settings(for: bswift.asURI, .swift)) - XCTAssertNil(ws.settings(for: .url(URL(string: "https://www.apple.com")!), .swift)) + XCTAssertNil(ws.settings(for: DocumentURI(URL(string: "https://www.apple.com")!), .swift)) } } diff --git a/Tests/SourceKitTests/BuildSystemTests.swift b/Tests/SourceKitTests/BuildSystemTests.swift index d9a47e7f..72cc0d2e 100644 --- a/Tests/SourceKitTests/BuildSystemTests.swift +++ b/Tests/SourceKitTests/BuildSystemTests.swift @@ -132,29 +132,29 @@ final class BuildSystemTests: XCTestCase { } """ - buildSystem.buildSettingsByFile[.url(url)] = FileBuildSettings(compilerArguments: args) + buildSystem.buildSettingsByFile[DocumentURI(url)] = FileBuildSettings(compilerArguments: args) sk.allowUnexpectedNotification = false sk.sendNoteSync(DidOpenTextDocument(textDocument: TextDocumentItem( - uri: .url(url), + uri: DocumentURI(url), language: .objective_c, version: 12, text: text )), { (note: Notification) in XCTAssertEqual(note.params.diagnostics.count, 1) - XCTAssertEqual(text, self.workspace.documentManager.latestSnapshot(.url(url))!.text) + XCTAssertEqual(text, self.workspace.documentManager.latestSnapshot(DocumentURI(url))!.text) }) // Modify the build settings and inform the delegate. // This should trigger a new publish diagnostics and we should no longer have errors. - buildSystem.buildSettingsByFile[.url(url)] = FileBuildSettings(compilerArguments: args + ["-DFOO"]) - testServer.server?.fileBuildSettingsChanged([.url(url)]) + buildSystem.buildSettingsByFile[DocumentURI(url)] = FileBuildSettings(compilerArguments: args + ["-DFOO"]) + testServer.server?.fileBuildSettingsChanged([DocumentURI(url)]) let expectation = XCTestExpectation(description: "refresh") sk.handleNextNotification { (note: Notification) in XCTAssertEqual(note.params.diagnostics.count, 0) - XCTAssertEqual(text, self.workspace.documentManager.latestSnapshot(.url(url))!.text) + XCTAssertEqual(text, self.workspace.documentManager.latestSnapshot(DocumentURI(url))!.text) expectation.fulfill() } @@ -166,9 +166,9 @@ final class BuildSystemTests: XCTestCase { func testSwiftDocumentUpdatedBuildSettings() { let url = URL(fileURLWithPath: "/a.swift") - let args = FallbackBuildSystem().settings(for: .url(url), .swift)!.compilerArguments + let args = FallbackBuildSystem().settings(for: DocumentURI(url), .swift)!.compilerArguments - buildSystem.buildSettingsByFile[.url(url)] = FileBuildSettings(compilerArguments: args) + buildSystem.buildSettingsByFile[DocumentURI(url)] = FileBuildSettings(compilerArguments: args) let text = """ #if FOO @@ -181,14 +181,14 @@ final class BuildSystemTests: XCTestCase { sk.allowUnexpectedNotification = false sk.sendNoteSync(DidOpenTextDocument(textDocument: TextDocumentItem( - uri: .url(url), + uri: DocumentURI(url), language: .swift, version: 12, text: text )), { (note: Notification) in // Syntactic analysis - no expected errors here. XCTAssertEqual(note.params.diagnostics.count, 0) - XCTAssertEqual(text, self.workspace.documentManager.latestSnapshot(.url(url))!.text) + XCTAssertEqual(text, self.workspace.documentManager.latestSnapshot(DocumentURI(url))!.text) }, { (note: Notification) in // Semantic analysis - expect one error here. XCTAssertEqual(note.params.diagnostics.count, 1) @@ -196,7 +196,7 @@ final class BuildSystemTests: XCTestCase { // Modify the build settings and inform the delegate. // This should trigger a new publish diagnostics and we should no longer have errors. - buildSystem.buildSettingsByFile[.url(url)] = FileBuildSettings(compilerArguments: args + ["-DFOO"]) + buildSystem.buildSettingsByFile[DocumentURI(url)] = FileBuildSettings(compilerArguments: args + ["-DFOO"]) let expectation = XCTestExpectation(description: "refresh") expectation.expectedFulfillmentCount = 2 @@ -210,7 +210,7 @@ final class BuildSystemTests: XCTestCase { XCTAssertEqual(note.params.diagnostics.count, 0) expectation.fulfill() } - testServer.server?.fileBuildSettingsChanged([.url(url)]) + testServer.server?.fileBuildSettingsChanged([DocumentURI(url)]) let result = XCTWaiter.wait(for: [expectation], timeout: 5) if result != .completed { @@ -224,7 +224,7 @@ final class BuildSystemTests: XCTestCase { sk.allowUnexpectedNotification = false sk.sendNoteSync(DidOpenTextDocument(textDocument: TextDocumentItem( - uri: .url(url), + uri: DocumentURI(url), language: .swift, version: 12, text: """ @@ -232,18 +232,18 @@ final class BuildSystemTests: XCTestCase { """ )), { (note: Notification) in XCTAssertEqual(note.params.diagnostics.count, 1) - XCTAssertEqual("func", self.workspace.documentManager.latestSnapshot(.url(url))!.text) + XCTAssertEqual("func", self.workspace.documentManager.latestSnapshot(DocumentURI(url))!.text) }) // Modify the build settings and inform the SourceKitServer. // This shouldn't trigger new diagnostics since nothing actually changed (false alarm). - testServer.server?.fileBuildSettingsChanged([.url(url)]) + testServer.server?.fileBuildSettingsChanged([DocumentURI(url)]) let expectation = XCTestExpectation(description: "refresh doesn't occur") expectation.isInverted = true sk.handleNextNotification { (note: Notification) in XCTAssertEqual(note.params.diagnostics.count, 1) - XCTAssertEqual("func", self.workspace.documentManager.latestSnapshot(.url(url))!.text) + XCTAssertEqual("func", self.workspace.documentManager.latestSnapshot(DocumentURI(url))!.text) expectation.fulfill() } diff --git a/Tests/SourceKitTests/DocumentColorTests.swift b/Tests/SourceKitTests/DocumentColorTests.swift index c7772521..3c1038f0 100644 --- a/Tests/SourceKitTests/DocumentColorTests.swift +++ b/Tests/SourceKitTests/DocumentColorTests.swift @@ -52,7 +52,7 @@ final class DocumentColorTests: XCTestCase { let url = URL(fileURLWithPath: "/a.swift") sk.send(DidOpenTextDocument(textDocument: TextDocumentItem( - uri: .url(url), + uri: DocumentURI(url), language: .swift, version: 12, text: text))) @@ -65,7 +65,7 @@ final class DocumentColorTests: XCTestCase { let url = URL(fileURLWithPath: "/a.swift") sk.send(DidOpenTextDocument(textDocument: TextDocumentItem( - uri: .url(url), + uri: DocumentURI(url), language: .swift, version: 12, text: text))) diff --git a/Tests/SourceKitTests/DocumentSymbolTests.swift b/Tests/SourceKitTests/DocumentSymbolTests.swift index 6c8965cb..b8ce9de3 100644 --- a/Tests/SourceKitTests/DocumentSymbolTests.swift +++ b/Tests/SourceKitTests/DocumentSymbolTests.swift @@ -55,7 +55,7 @@ func initialize(capabilities: DocumentSymbolCapabilities) { let url = URL(fileURLWithPath: "/a.swift") sk.send(DidOpenTextDocument(textDocument: TextDocumentItem( - uri: .url(url), + uri: DocumentURI(url), language: .swift, version: 17, text: text diff --git a/Tests/SourceKitTests/ExecuteCommandTests.swift b/Tests/SourceKitTests/ExecuteCommandTests.swift index 38014c25..09074e87 100644 --- a/Tests/SourceKitTests/ExecuteCommandTests.swift +++ b/Tests/SourceKitTests/ExecuteCommandTests.swift @@ -79,7 +79,7 @@ final class ExecuteCommandTests: XCTestCase { } XCTAssertEqual(WorkspaceEdit(fromLSPDictionary: resultDict), WorkspaceEdit(changes: [ - .url(loc.url): [ + DocumentURI(loc.url): [ TextEdit(range: Position(line: 1, utf16index: 29).. String {\n/*sr:extractStart*/var a = \"/*sr:string*/\"\n return a\n}\n\n"), TextEdit(range: Position(line: 1, utf16index: 2)..