Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/opencode/src/lsp/language.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export const LANGUAGE_EXTENSIONS: Record<string, string> = {
".dockerfile": "dockerfile",
".ex": "elixir",
".exs": "elixir",
".heex": "phoenix-heex",
".erl": "erlang",
".ets": "typescript",
".hrl": "erlang",
Expand Down
97 changes: 54 additions & 43 deletions packages/opencode/src/lsp/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -558,62 +558,73 @@ export namespace LSPServer {
},
}

export const ElixirLS: Info = {
id: "elixir-ls",
extensions: [".ex", ".exs"],
export const Expert: Info = {
id: "expert",
extensions: [".ex", ".exs", ".heex"],
root: NearestRoot(["mix.exs", "mix.lock"]),
async spawn(root) {
let binary = Bun.which("elixir-ls")
if (!binary) {
const elixirLsPath = path.join(Global.Path.bin, "elixir-ls")
binary = path.join(
Global.Path.bin,
"elixir-ls-master",
"release",
process.platform === "win32" ? "language_server.bat" : "language_server.sh",
)
let bin = Bun.which("expert", {
PATH: process.env["PATH"] + path.delimiter + Global.Path.bin,
})

if (!(await Filesystem.exists(binary))) {
const elixir = Bun.which("elixir")
if (!elixir) {
log.error("elixir is required to run elixir-ls")
return
}
if (!bin) {
if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) return
log.info("downloading expert from GitHub releases")

if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) return
log.info("downloading elixir-ls from GitHub releases")
const releaseResponse = await fetch("https://api.github.com/repos/elixir-lang/expert/releases/latest")
if (!releaseResponse.ok) {
log.error("failed to fetch expert release info")
return
}

const response = await fetch("https://github.com/elixir-lsp/elixir-ls/archive/refs/heads/master.zip")
if (!response.ok) return
const zipPath = path.join(Global.Path.bin, "elixir-ls.zip")
if (response.body) await Filesystem.writeStream(zipPath, response.body)
const release = (await releaseResponse.json()) as any

const ok = await Archive.extractZip(zipPath, Global.Path.bin)
.then(() => true)
.catch((error) => {
log.error("Failed to extract elixir-ls archive", { error })
return false
})
if (!ok) return
const platform = process.platform
const arch = process.arch

await fs.rm(zipPath, {
force: true,
recursive: true,
})
let expertPlatform = platform as string
if (platform === "win32") expertPlatform = "windows"

await $`mix deps.get && mix compile && mix elixir_ls.release2 -o release`
.quiet()
.cwd(path.join(Global.Path.bin, "elixir-ls-master"))
.env({ MIX_ENV: "prod", ...process.env })
let expertArch = arch as string
if (arch === "x64") expertArch = "amd64"

log.info(`installed elixir-ls`, {
path: elixirLsPath,
})
const ext = platform === "win32" ? ".exe" : ""
const assetName = `expert_${expertPlatform}_${expertArch}${ext}`

const supported = [
"expert_darwin_amd64",
"expert_darwin_arm64",
"expert_linux_amd64",
"expert_linux_arm64",
"expert_windows_amd64.exe",
]

if (!supported.includes(assetName)) {
log.error(`platform ${platform} (${arch}) is not supported by expert`)
return
}

const asset = release.assets.find((a: any) => a.name === assetName)
if (!asset) {
log.error(`could not find asset ${assetName} in latest expert release`)
return
}

const response = await fetch(asset.browser_download_url)
if (!response.ok) {
log.error("failed to download expert")
return
}

bin = path.join(Global.Path.bin, platform === "win32" ? "expert.exe" : "expert")
if (response.body) await Filesystem.writeStream(bin, response.body)
await fs.chmod(bin, 0o755)

log.info("installed expert", { path: bin })
}

return {
process: spawn(binary, {
process: spawn(bin, ["--stdio"], {
cwd: root,
}),
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/content/docs/ar/lsp.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ description: يتكامل OpenCode مع خوادم LSP لديك.
| clojure-lsp | .clj, .cljs, .cljc, .edn | توفر أمر `clojure-lsp` |
| dart | .dart | توفر أمر `dart` |
| deno | .ts, .tsx, .js, .jsx, .mjs | توفر أمر `deno` (يكتشف تلقائيا deno.json/deno.jsonc) |
| elixir-ls | .ex, .exs | توفر أمر `elixir` |
| expert | .ex, .exs, .heex | تثبيت تلقائي من إصدارات GitHub |
| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | وجود تبعية `eslint` في المشروع |
| fsharp | .fs, .fsi, .fsx, .fsscript | تثبيت `.NET SDK` |
| gleam | .gleam | توفر أمر `gleam` |
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/content/docs/bs/lsp.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ OpenCode dolazi sa nekoliko ugrađenih LSP servera za popularne jezike:
| clojure-lsp | .clj, .cljs, .cljc, .edn | `clojure-lsp` komanda dostupna |
| dart | .dart | `dart` komanda dostupna |
| deno | .ts, .tsx, .js, .jsx, .mjs | `deno` komanda dostupna (automatski detektuje deno.json) |
| elixir-ls | .ex, .exs | `elixir` komanda dostupna |
| expert | .ex, .exs, .heex | Auto-instalacija sa GitHub izdanja |
| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | `eslint` ovisnost u projektu |
| fsharp | .fs, .fsi, .fsx, .fsscript | `.NET SDK` instaliran |
| gleam | .gleam | `gleam` komanda dostupna |
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/content/docs/da/lsp.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ OpenCode leveres med flere indbyggede LSP-servere til populære sprog:
| clojure-lsp | .clj,.cljs,.cljc,.edn | `clojure-lsp` kommando tilgængelig |
| dart | .dart | `dart` kommando tilgængelig |
| deno | .ts,.tsx,.js,.jsx,.mjs | `deno` kommando tilgængelig (auto-detects deno.json/deno.jsonc) |
| elixir-ls | .ex,.exs | `elixir` kommando tilgængelig |
| expert | .ex, .exs, .heex | Auto-installerer fra GitHub-udgivelser |
| eslint | .ts,.tsx,.js,.jsx,.mjs,.cjs,.mts,.cts,.vue | `eslint` afhængighed i projekt |
| fsharp | .fs,.fsi,.fsx,.fsscript | `.NET SDK` installere |
| gleam | .gleam | `gleam` kommando tilgængelig |
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/content/docs/de/lsp.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ OpenCode verfügt über mehrere integrierte LSP-Server für gängige Sprachen:
| clojure-lsp | .clj, .cljs, .cljc, .edn | `clojure-lsp`-Befehl verfügbar |
| dart | .dart | `dart`-Befehl verfügbar |
| deno | .ts, .tsx, .js, .jsx, .mjs | `deno`-Befehl verfügbar (automatische Erkennung von deno.json/deno.jsonc) |
| elixir-ls | .ex, .exs | `elixir`-Befehl verfügbar |
| expert | .ex, .exs, .heex | Automatische Installation von GitHub-Releases |
| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | `eslint` dependency in project |
| fsharp | .fs, .fsi, .fsx, .fsscript | `.NET SDK` installed |
| gleam | .gleam | `gleam`-Befehl verfügbar |
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/content/docs/es/lsp.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ OpenCode viene con varios servidores LSP integrados para idiomas populares:
| clojure-lsp | .clj, .cljs, .cljc, .edn | Comando `clojure-lsp` disponible |
| dart | .dart | Comando `dart` disponible |
| deno | .ts, .tsx, .js, .jsx, .mjs | Comando `deno` disponible (detecta automáticamente deno.json/deno.jsonc) |
| elixir-ls | .ex, .exs | Comando `elixir` disponible |
| expert | .ex, .exs, .heex | Auto-instala desde lanzamientos de GitHub |
| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | `eslint` dependencia en proyecto |
| fsharp | .fs, .fsi, .fsx, .fsscript | `.NET SDK` instalado |
| gleam | .gleam | Comando `gleam` disponible |
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/content/docs/fr/lsp.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ OpenCode est livré avec plusieurs serveurs LSP intégrés pour les langages pop
| clojure-lsp | .clj, .cljs, .cljc, .edn | Commande `clojure-lsp` disponible |
| dart | .dart | Commande `dart` disponible |
| deno | .ts, .tsx, .js, .jsx, .mjs | Commande `deno` disponible (détection automatique deno.json/deno.jsonc) |
| elixir-ls | .ex, .ex | Commande `elixir` disponible |
| expert | .ex, .exs, .heex | Installation automatique depuis les releases GitHub |
| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | Dépendance `eslint` dans le projet |
| fsharp | .fs, .fsi, .fsx, .fsscript | `.NET SDK` installé |
| gleam | .gleam | Commande `gleam` disponible |
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/content/docs/it/lsp.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ OpenCode include diversi server LSP integrati per linguaggi popolari:
| clojure-lsp | .clj, .cljs, .cljc, .edn | comando `clojure-lsp` disponibile |
| dart | .dart | comando `dart` disponibile |
| deno | .ts, .tsx, .js, .jsx, .mjs | comando `deno` disponibile (rileva automaticamente deno.json/deno.jsonc) |
| elixir-ls | .ex, .exs | comando `elixir` disponibile |
| expert | .ex, .exs, .heex | Installazione automatica da rilasci GitHub |
| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | dipendenza `eslint` nel progetto |
| fsharp | .fs, .fsi, .fsx, .fsscript | `.NET SDK` installato |
| gleam | .gleam | comando `gleam` disponibile |
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/content/docs/ja/lsp.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ OpenCode には、一般的な言語用のいくつかの組み込み LSP サー
| clojure-lsp | .clj, .cljs, .cljc, .edn | `clojure-lsp` command available |
| dart | .dart | `dart` command available |
| deno | .ts, .tsx, .js, .jsx, .mjs | `deno` command available (auto-detects deno.json/deno.jsonc) |
| elixir-ls | .ex, .exs | `elixir` command available |
| expert | .ex, .exs, .heex | GitHubリリースから自動インストール |
| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | `eslint` dependency in project |
| fsharp | .fs, .fsi, .fsx, .fsscript | `.NET SDK` installed |
| gleam | .gleam | `gleam` command available |
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/content/docs/ko/lsp.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ OpenCode는 널리 사용되는 언어를 위해 여러 built-in LSP 서버를
| clojure-lsp | .clj, .cljs, .cljc, .edn | `clojure-lsp` 명령 사용 가능 |
| dart | .dart | `dart` 명령 사용 가능 |
| deno | .ts, .tsx, .js, .jsx, .mjs | `deno` 명령 사용 가능 (`deno.json`/`deno.jsonc` 자동 감지) |
| elixir-ls | .ex, .exs | `elixir` 명령 사용 가능 |
| expert | .ex, .exs, .heex | GitHub 릴리스에서 자동 설치 |
| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | 프로젝트에 `eslint` dependency 존재 |
| fsharp | .fs, .fsi, .fsx, .fsscript | `.NET SDK` 설치됨 |
| gleam | .gleam | `gleam` 명령 사용 가능 |
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/content/docs/lsp.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ OpenCode comes with several built-in LSP servers for popular languages:
| clojure-lsp | .clj, .cljs, .cljc, .edn | `clojure-lsp` command available |
| dart | .dart | `dart` command available |
| deno | .ts, .tsx, .js, .jsx, .mjs | `deno` command available (auto-detects deno.json/deno.jsonc) |
| elixir-ls | .ex, .exs | `elixir` command available |
| expert | .ex, .exs, .heex | Auto-installs from GitHub releases |
| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | `eslint` dependency in project |
| fsharp | .fs, .fsi, .fsx, .fsscript | `.NET SDK` installed |
| gleam | .gleam | `gleam` command available |
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/content/docs/nb/lsp.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ OpenCode kommer med flere innebygde LSP-servere for populære språk:
| clojure-lsp | .clj, .cljs, .cljc, .edn | `clojure-lsp` kommando tilgjengelig |
| dart | .dart | `dart` kommando tilgjengelig |
| deno | .ts, .tsx, .js, .jsx, .mjs | `deno` kommando tilgjengelig (automatisk oppdager deno.json/deno.jsonc) |
| elixir-ls | .ex, .exs | `elixir` kommando tilgjengelig |
| expert | .ex, .exs, .heex | Auto-installerer fra GitHub-utgivelser |
| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | `eslint` avhengighet i prosjekt |
| fsharp | .fs, .fsi, .fsx, .fsscript | `.NET SDK` installert |
| gleam | .gleam | `gleam` kommando tilgjengelig |
Expand Down
Loading
Loading