diff --git a/packages/opencode/src/lsp/server.ts b/packages/opencode/src/lsp/server.ts index 7102d0d8ed3e..97977435ddd1 100644 --- a/packages/opencode/src/lsp/server.ts +++ b/packages/opencode/src/lsp/server.ts @@ -1881,10 +1881,10 @@ export namespace LSPServer { async spawn(root) { const bin = which("LSPServer") ?? (process.platform === "win32" ? which("LSPServer.exe") : null) if (!bin) { - log.info("LSPServer not found, please install CangjieSDK first") + log.info("LSPServer not found, please install Cangjie SDK and source envsetup.sh first") return } - const proc = spawn(bin, [], { + const proc = spawn(bin, ["--stdio"], { cwd: root, }) proc.on("error", (err) => { diff --git a/packages/opencode/test/lsp/cangjie-server.test.ts b/packages/opencode/test/lsp/cangjie-server.test.ts new file mode 100644 index 000000000000..ddb83600331d --- /dev/null +++ b/packages/opencode/test/lsp/cangjie-server.test.ts @@ -0,0 +1,46 @@ +import { describe, expect, test, beforeEach } from "bun:test" +import path from "path" +import { spawn } from "child_process" +import { LSPClient } from "../../src/lsp/client" +import { LSPServer } from "../../src/lsp/server" +import { Instance } from "../../src/project/instance" +import { Log } from "../../src/util/log" + +function spawnFakeServer() { + const serverPath = path.join(__dirname, "../fixture/lsp/fake-lsp-server.js") + return { + process: spawn(process.execPath, [serverPath], { + stdio: "pipe", + }), + } +} + +describe("Cangjie LSP server", () => { + beforeEach(async () => { + await Log.init({ print: true }) + }) + + test("config has correct id and extensions", () => { + const info = LSPServer.Cangjie + expect(info.id).toBe("cangjie") + expect(info.extensions).toEqual([".cj"]) + }) + + test("initializes over stdio", async () => { + const handle = spawnFakeServer() + + const client = await Instance.provide({ + directory: process.cwd(), + fn: () => + LSPClient.create({ + serverID: "cangjie", + server: handle as unknown as LSPServer.Handle, + root: process.cwd(), + }), + }) + + expect(client.connection).toBeDefined() + + await client.shutdown() + }) +})