Explorar el Código

tweak: only spawn lsp servers for files in current instance (or cwd if instance is global) (#19058)

Aiden Cline hace 3 semanas
padre
commit
71693cc24b
Se han modificado 2 ficheros con 61 adiciones y 0 borrados
  1. 6 0
      packages/opencode/src/lsp/index.ts
  2. 55 0
      packages/opencode/test/lsp/index.test.ts

+ 6 - 0
packages/opencode/src/lsp/index.ts

@@ -177,6 +177,12 @@ export namespace LSP {
 
   async function getClients(file: string) {
     const s = await state()
+
+    // Only spawn LSP clients for files within the instance directory
+    if (!Instance.containsPath(file)) {
+      return []
+    }
+
     const extension = path.parse(file).ext || file
     const result: LSPClient.Info[] = []
 

+ 55 - 0
packages/opencode/test/lsp/index.test.ts

@@ -0,0 +1,55 @@
+import { describe, expect, spyOn, test } from "bun:test"
+import path from "path"
+import * as Lsp from "../../src/lsp/index"
+import { LSPServer } from "../../src/lsp/server"
+import { Instance } from "../../src/project/instance"
+import { tmpdir } from "../fixture/fixture"
+
+describe("lsp.spawn", () => {
+  test("does not spawn builtin LSP for files outside instance", async () => {
+    await using tmp = await tmpdir()
+    const spy = spyOn(LSPServer.Typescript, "spawn").mockResolvedValue(undefined)
+
+    try {
+      await Instance.provide({
+        directory: tmp.path,
+        fn: async () => {
+          await Lsp.LSP.touchFile(path.join(tmp.path, "..", "outside.ts"))
+          await Lsp.LSP.hover({
+            file: path.join(tmp.path, "..", "hover.ts"),
+            line: 0,
+            character: 0,
+          })
+        },
+      })
+
+      expect(spy).toHaveBeenCalledTimes(0)
+    } finally {
+      spy.mockRestore()
+      await Instance.disposeAll()
+    }
+  })
+
+  test("would spawn builtin LSP for files inside instance", async () => {
+    await using tmp = await tmpdir()
+    const spy = spyOn(LSPServer.Typescript, "spawn").mockResolvedValue(undefined)
+
+    try {
+      await Instance.provide({
+        directory: tmp.path,
+        fn: async () => {
+          await Lsp.LSP.hover({
+            file: path.join(tmp.path, "src", "inside.ts"),
+            line: 0,
+            character: 0,
+          })
+        },
+      })
+
+      expect(spy).toHaveBeenCalledTimes(1)
+    } finally {
+      spy.mockRestore()
+      await Instance.disposeAll()
+    }
+  })
+})