Use a single rust LSP server instance for entire cargo workspace (#2292)

This commit is contained in:
Anton
2025-08-29 22:55:20 -07:00
committed by opencode
parent 0c7a887dbc
commit 0c30a6f303

View File

@@ -515,7 +515,35 @@ export namespace LSPServer {
export const RustAnalyzer: Info = {
id: "rust",
root: NearestRoot(["Cargo.toml", "Cargo.lock"]),
root: async (file, app) => {
const crateRoot = await NearestRoot(["Cargo.toml", "Cargo.lock"])(file, app)
if (crateRoot === undefined) {
return undefined
}
let currentDir = crateRoot
while (currentDir !== path.dirname(currentDir)) {
// Stop at filesystem root
const cargoTomlPath = path.join(currentDir, "Cargo.toml")
try {
const cargoTomlContent = await Bun.file(cargoTomlPath).text()
if (cargoTomlContent.includes("[workspace]")) {
return currentDir
}
} catch (err) {
// File doesn't exist or can't be read, continue searching up
}
const parentDir = path.dirname(currentDir)
if (parentDir === currentDir) break // Reached filesystem root
currentDir = parentDir
// Stop if we've gone above the app root
if (!currentDir.startsWith(app.path.root)) break
}
return crateRoot
},
extensions: [".rs"],
async spawn(_, root) {
const bin = Bun.which("rust-analyzer")