mirror of
https://github.com/apple/sourcekit-lsp.git
synced 2026-03-02 18:23:24 +01:00
On Darwin platforms, this fixes the following problem: indexstore-db by itself returns realpaths but the build system might be using standardized Darwin paths (eg. realpath is `/private/tmp` but the standardized path is `/tmp`). Because of this, when inferring the main file for a file, we might get a URI that the build system doesn’t know about. To fix this, if the realpath that indexstore-db returns could not be found in the build system's source files but the standardized path is part of the source files, use the standardized path instead.
53 lines
1.8 KiB
Swift
53 lines
1.8 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#if compiler(>=6)
|
|
import BuildSystemIntegration
|
|
import Foundation
|
|
import IndexStoreDB
|
|
package import LanguageServerProtocol
|
|
import SKLogging
|
|
import SemanticIndex
|
|
import SwiftExtensions
|
|
#else
|
|
import BuildSystemIntegration
|
|
import Foundation
|
|
import IndexStoreDB
|
|
import LanguageServerProtocol
|
|
import SKLogging
|
|
import SemanticIndex
|
|
import SwiftExtensions
|
|
#endif
|
|
|
|
extension UncheckedIndex: BuildSystemIntegration.MainFilesProvider {
|
|
/// - Important: This may return realpaths when the build system might not be using realpaths. Use
|
|
/// `BuildSystemManager.mainFiles(containing:)` to work around that problem.
|
|
package func mainFiles(containing uri: DocumentURI, crossLanguage: Bool) -> Set<DocumentURI> {
|
|
let mainFiles: Set<DocumentURI>
|
|
if let filePath = orLog("File path to get main files", { try uri.fileURL?.filePath }) {
|
|
let mainFilePaths = self.underlyingIndexStoreDB.mainFilesContainingFile(
|
|
path: filePath,
|
|
crossLanguage: crossLanguage
|
|
)
|
|
mainFiles = Set(
|
|
mainFilePaths
|
|
.filter { FileManager.default.fileExists(atPath: $0) }
|
|
.map({ DocumentURI(filePath: $0, isDirectory: false) })
|
|
)
|
|
} else {
|
|
mainFiles = []
|
|
}
|
|
logger.info("Main files for \(uri.forLogging): \(mainFiles)")
|
|
return mainFiles
|
|
}
|
|
}
|