Răsfoiți Sursa

add ruby formatter and lsp

Dax Raad 7 luni în urmă
părinte
comite
72d48759d7

+ 27 - 0
packages/opencode/src/format/formatter.ts

@@ -131,3 +131,30 @@ export const ruff: Info = {
     return Bun.which("ruff") !== null
     return Bun.which("ruff") !== null
   },
   },
 }
 }
+
+export const rubocop: Info = {
+  name: "rubocop",
+  command: ["rubocop", "--autocorrect", "$FILE"],
+  extensions: [".rb", ".rake", ".gemspec", ".ru"],
+  async enabled() {
+    return Bun.which("rubocop") !== null
+  },
+}
+
+export const standardrb: Info = {
+  name: "standardrb",
+  command: ["standardrb", "--fix", "$FILE"],
+  extensions: [".rb", ".rake", ".gemspec", ".ru"],
+  async enabled() {
+    return Bun.which("standardrb") !== null
+  },
+}
+
+export const htmlbeautifier: Info = {
+  name: "htmlbeautifier",
+  command: ["htmlbeautifier", "$FILE"],
+  extensions: [".erb", ".html.erb"],
+  async enabled() {
+    return Bun.which("htmlbeautifier") !== null
+  },
+}

+ 1 - 1
packages/opencode/src/lsp/index.ts

@@ -28,7 +28,7 @@ export namespace LSP {
   export async function touchFile(input: string, waitForDiagnostics?: boolean) {
   export async function touchFile(input: string, waitForDiagnostics?: boolean) {
     const extension = path.parse(input).ext
     const extension = path.parse(input).ext
     const s = await state()
     const s = await state()
-    const matches = LSPServer.All.filter((x) =>
+    const matches = Object.values(LSPServer).filter((x) =>
       x.extensions.includes(extension),
       x.extensions.includes(extension),
     )
     )
     for (const match of matches) {
     for (const match of matches) {

+ 8 - 0
packages/opencode/src/lsp/language.ts

@@ -63,6 +63,14 @@ export const LANGUAGE_EXTENSIONS: Record<string, string> = {
   ".cshtml": "razor",
   ".cshtml": "razor",
   ".razor": "razor",
   ".razor": "razor",
   ".rb": "ruby",
   ".rb": "ruby",
+  ".rake": "ruby",
+  ".gemspec": "ruby",
+  ".ru": "ruby",
+  ".erb": "erb",
+  ".html.erb": "erb",
+  ".js.erb": "erb",
+  ".css.erb": "erb",
+  ".json.erb": "erb",
   ".rs": "rust",
   ".rs": "rust",
   ".scss": "scss",
   ".scss": "scss",
   ".sass": "sass",
   ".sass": "sass",

+ 97 - 67
packages/opencode/src/lsp/server.ts

@@ -19,78 +19,108 @@ export namespace LSPServer {
     spawn(app: App.Info): Promise<Handle | undefined>
     spawn(app: App.Info): Promise<Handle | undefined>
   }
   }
 
 
-  export const All: Info[] = [
-    {
-      id: "typescript",
-      extensions: [
-        ".ts",
-        ".tsx",
-        ".js",
-        ".jsx",
-        ".mjs",
-        ".cjs",
-        ".mts",
-        ".cts",
-      ],
-      async spawn(app) {
-        const tsserver = await Bun.resolve(
-          "typescript/lib/tsserver.js",
-          app.path.cwd,
-        ).catch(() => {})
-        if (!tsserver) return
-        const proc = spawn(
-          BunProc.which(),
-          ["x", "typescript-language-server", "--stdio"],
-          {
-            env: {
-              ...process.env,
-              BUN_BE_BUN: "1",
-            },
+  export const Typescript: Info = {
+    id: "typescript",
+    extensions: [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mts", ".cts"],
+    async spawn(app) {
+      const tsserver = await Bun.resolve(
+        "typescript/lib/tsserver.js",
+        app.path.cwd,
+      ).catch(() => {})
+      if (!tsserver) return
+      const proc = spawn(
+        BunProc.which(),
+        ["x", "typescript-language-server", "--stdio"],
+        {
+          env: {
+            ...process.env,
+            BUN_BE_BUN: "1",
           },
           },
-        )
-        return {
-          process: proc,
-          initialization: {
-            tsserver: {
-              path: tsserver,
-            },
+        },
+      )
+      return {
+        process: proc,
+        initialization: {
+          tsserver: {
+            path: tsserver,
           },
           },
-        }
-      },
+        },
+      }
     },
     },
-    {
-      id: "golang",
-      extensions: [".go"],
-      async spawn() {
-        let bin = Bun.which("gopls", {
-          PATH: process.env["PATH"] + ":" + Global.Path.bin,
+  }
+
+  export const Gopls: Info = {
+    id: "golang",
+    extensions: [".go"],
+    async spawn() {
+      let bin = Bun.which("gopls", {
+        PATH: process.env["PATH"] + ":" + Global.Path.bin,
+      })
+      if (!bin) {
+        log.info("installing gopls")
+        const proc = Bun.spawn({
+          cmd: ["go", "install", "golang.org/x/tools/gopls@latest"],
+          env: { ...process.env, GOBIN: Global.Path.bin },
+          stdout: "pipe",
+          stderr: "pipe",
+          stdin: "pipe",
+        })
+        const exit = await proc.exited
+        if (exit !== 0) {
+          log.error("Failed to install gopls")
+          return
+        }
+        bin = path.join(
+          Global.Path.bin,
+          "gopls" + (process.platform === "win32" ? ".exe" : ""),
+        )
+        log.info(`installed gopls`, {
+          bin,
         })
         })
-        if (!bin) {
-          log.info("installing gopls")
-          const proc = Bun.spawn({
-            cmd: ["go", "install", "golang.org/x/tools/gopls@latest"],
-            env: { ...process.env, GOBIN: Global.Path.bin },
-            stdout: "pipe",
-            stderr: "pipe",
-            stdin: "pipe",
-          })
-          const exit = await proc.exited
-          if (exit !== 0) {
-            log.error("Failed to install gopls")
-            return
-          }
-          bin = path.join(
-            Global.Path.bin,
-            "gopls" + (process.platform === "win32" ? ".exe" : ""),
-          )
-          log.info(`installed gopls`, {
-            bin,
-          })
+      }
+      return {
+        process: spawn(bin!),
+      }
+    },
+  }
+
+  export const RubyLsp: Info = {
+    id: "ruby-lsp",
+    extensions: [".rb", ".rake", ".gemspec", ".ru"],
+    async spawn() {
+      let bin = Bun.which("ruby-lsp", {
+        PATH: process.env["PATH"] + ":" + Global.Path.bin,
+      })
+      if (!bin) {
+        const ruby = Bun.which("ruby")
+        const gem = Bun.which("gem")
+        if (!ruby || !gem) {
+          log.info("Ruby not found, please install Ruby first")
+          return
         }
         }
-        return {
-          process: spawn(bin!),
+        log.info("installing ruby-lsp")
+        const proc = Bun.spawn({
+          cmd: ["gem", "install", "ruby-lsp", "--bindir", Global.Path.bin],
+          stdout: "pipe",
+          stderr: "pipe",
+          stdin: "pipe",
+        })
+        const exit = await proc.exited
+        if (exit !== 0) {
+          log.error("Failed to install ruby-lsp")
+          return
         }
         }
-      },
+        bin = path.join(
+          Global.Path.bin,
+          "ruby-lsp" + (process.platform === "win32" ? ".exe" : ""),
+        )
+        log.info(`installed ruby-lsp`, {
+          bin,
+        })
+      }
+      return {
+        process: spawn(bin!, ["--stdio"]),
+      }
     },
     },
-  ]
+  }
 }
 }