Language Support

June 4, 2026 · View on GitHub

Install reference

LanguageServerInstall
TypeScript / JavaScripttypescript-language-servernpm i -g typescript-language-server typescript
Pythonpyright-langservernpm i -g pyright
Gogoplsgo install golang.org/x/tools/gopls@latest
Rustrust-analyzerrustup component add rust-analyzer
C / C++clangdapt install clangd / brew install llvm
Rubysolargraphgem install solargraph
PHPintelephensenpm i -g intelephense
Javajdtlseclipse.jdt.ls snapshots
YAMLyaml-language-servernpm i -g yaml-language-server
JSONvscode-json-language-servernpm i -g vscode-langservers-extracted
Dockerfiledocker-langservernpm i -g dockerfile-language-server-nodejs
C#csharp-lsdotnet tool install -g csharp-ls
Kotlinkotlin-language-serverGitHub releases
Lualua-language-serverGitHub releases
Swiftsourcekit-lspShips with Xcode / Swift toolchain
ZigzlsGitHub releases (match Zig version)
CSSvscode-css-language-servernpm i -g vscode-langservers-extracted
HTMLvscode-html-language-servernpm i -g vscode-langservers-extracted
Terraformterraform-lsreleases.hashicorp.com
Scalametalscs install metals (Coursier)
Gleamgleam (built-in)GitHub releases
Elixirelixir-lsGitHub releases
Prismaprisma-language-servernpm i -g @prisma/language-server
SQLsqlsgo install github.com/sqls-server/sqls@latest
Clojureclojure-lspGitHub releases
NixnilGitHub releases
Dartdart language-serverShips with Dart SDK (brew install dart)
MongoDBmongodb-language-servernpm i -g @mongodb-js/mongodb-language-server

CI tool coverage matrix

Tier 1 (start_lsp, open_document, get_diagnostics, inspect_symbol) verified for all 30 languages. Tier 2: 34 additional tools.

LanguageTier 1symbolsdefinitionreferencescompletionsworkspaceformatdeclarationtype_hierarchyhovercall_hiersem_toksig_help
TypeScriptpasspasspasspasspasspasspasspasspasspasspasspass
Pythonpasspasspasspasspasspasspasspasspass
Gopasspasspasspasspasspasspasspasspasspasspass
Rustpasspasspasspasspasspasspasspasspasspass
Javapasspasspasspass
Cpasspasspasspasspasspasspasspasspasspasspass
PHPpasspasspasspasspasspasspasspasspasspass
C++passpasspasspasspasspasspasspasspasspasspass
JavaScriptpasspasspasspasspasspasspasspasspasspasspass
Rubypasspasspasspasspasspasspasspasspasspasspass
YAMLpasspasspasspasspass
JSONpasspasspasspasspass
Dockerfilepasspasspasspass
C#passpasspasspasspasspasspasspasspasspasspass
Kotlinpasspasspasspasspasspasspasspasspasspasspass
Luapasspasspasspasspasspasspasspasspass
Swiftpasspasspasspasspasspasspasspasspass
Zigpasspasspasspasspassfailpasspasspasspass
CSSpasspasspasspasspasspass
HTMLpasspasspasspasspass
Terraformpasspasspasspasspasspasspass
Scalapasspasspasspasspasspasspasspasspass
Gleampasspasspasspasspassfailpasspass
Elixirpassfailpasspasspasspasspasspasspasspass
Prismapasspasspasspasspasspass
SQLpasspasspasspasspasspasspass
Clojurepasspasspasspasspasspasspasspass
Nixpasspasspasspasspass
Dartpasspasspasspasspasspasspasspass
MongoDBpasspasspasspass

See ci-notes.md for per-language CI quirks.


Current (30 languages, CI-tested)

stable = all Tier 1 tools pass CI. experimental = server works but CI results are informational.

LanguageLanguage ServerStatus
TypeScripttypescript-language-serverstable
Pythonpyright-langserverstable
Gogoplsstable
Rustrust-analyzerstable
Javajdtlsflaky (cold-start indexing)
Cclangdstable
PHPintelephensestable
C++clangdstable
JavaScripttypescript-language-serverstable
Rubysolargraphstable
YAMLyaml-language-serverstable
JSONvscode-json-language-serverstable
Dockerfiledocker-langserverstable
C#csharp-lsstable
Kotlinkotlin-language-serverstable
Lualua-language-serverstable
Swiftsourcekit-lspstable (macos-latest runner)
Zigzlsstable
CSSvscode-css-language-serverstable
HTMLvscode-html-language-serverstable
Terraformterraform-lsstable
Scalametalsexperimental
Gleamgleam (built-in lsp)stable
Elixirelixir-lsexperimental
Prismaprisma-language-serverexperimental
SQLsqlsstable (postgres:16 service container)
Clojureclojure-lspstable
Nixnilexperimental
Dartdart language-serverstable
MongoDBmongodb-language-serverexperimental

CI job structure

JobLanguagesRunner
multi-lang-coreGo, TypeScript, Python, Rust, Kotlinubuntu-latest
multi-lang-javaJavaubuntu-latest (continue-on-error)
multi-lang-extendedC, C++, JavaScript, PHP, Ruby, YAML, JSON, Dockerfile, C#, CSS, HTMLubuntu-latest
multi-lang-zigZigubuntu-latest
multi-lang-terraformTerraformubuntu-latest
multi-lang-luaLuaubuntu-latest
multi-lang-swiftSwiftmacos-latest
multi-lang-scalaScalaubuntu-latest (continue-on-error)
multi-lang-gleamGleamubuntu-latest
multi-lang-elixirElixirubuntu-latest (continue-on-error)
multi-lang-prismaPrismaubuntu-latest (continue-on-error)
multi-lang-sqlSQLubuntu-latest (postgres:16 service)
multi-lang-clojureClojureubuntu-latest
multi-lang-nixNixubuntu-latest (continue-on-error)
multi-lang-dartDartubuntu-latest
multi-lang-mongodbMongoDBubuntu-latest (continue-on-error)
speculative-testGo, TypeScript, Python, Rust, C++, C#, Dart, Java (speculative sessions)ubuntu-latest

Adding a language: what's required

Each new language needs three things:

  1. langConfig entry in test/multi_lang_test.go buildLanguageConfigs():

    • binary (language server executable name)
    • serverArgs (e.g. []string{"--stdio"})
    • fixture directory path
    • file path (primary fixture file)
    • hoverLine/hoverColumn: position of a named symbol in the primary file
    • definitionLine/definitionColumn: position of a symbol whose definition is in secondFile
    • referenceLine/referenceColumn: position to query for references
    • completionLine/completionColumn: position inside a method call for completions
    • workspaceSymbol: a symbol name that workspace symbol search should return
    • secondFile: cross-file fixture (for definition + references across files)
    • supportsFormatting: whether the server formats documents
    • declarationLine/declarationColumn: optional, for C-style go_to_declaration
    • highlightLine/highlightColumn: position for document highlight testing
    • inlayHintEndLine: end line for inlay hint range
    • renameSymbolLine/renameSymbolColumn/renameSymbolName: position and new name for rename testing (set to 0 to skip)
    • codeActionLine/codeActionEndLine: line range for code action testing
  2. Fixture files in test/fixtures/<lang>/:

    • A primary file with a Person class/struct (or similar named symbol)
    • A greeter cross-file that imports and calls Person
    • A build/project file if the language server requires one (e.g. go.mod, build.zig, Package.swift, build.sbt)
    • Follow the pattern of existing fixtures (hover target, definition cross-ref, completion context)
  3. CI install step in the appropriate .github/workflows/ci.yml job:

    • JVM-based: Java → multi-lang-java, Kotlin → multi-lang-core
    • Lightweight npm/binary → multi-lang-extended
    • macOS-only → dedicated job with runs-on: macos-latest
    • Heavy/slow startup → dedicated job with continue-on-error: true
    • Everything else → dedicated job (keeps extended job install time bounded)

Tier 3: next expansion candidates

Bash (bash-language-server)

  • Install: npm install -g bash-language-server
  • Binary: bash-language-server, language ID shellscript
  • Fixture: test/fixtures/bash/, simple script with functions
  • Notes: Good hover and completions. Definition/references limited.

Haskell (haskell-language-server)

  • Install: ghcup install hls (slow and fragile in CI)
  • Blocker: ghcup setup adds 5+ minutes; GHC version matrix complexity

Tier 4: complex / skip for now

LanguageServerBlocker
Haskellhaskell-language-serverghcup setup is slow and fragile in CI
OCamlocamllspopam setup nontrivial
Elmelm-language-serverNiche; requires elm + elm-format
Rr-languageserverNiche; R package install in CI adds complexity

Language expansion summary

TierLanguagesCount
CurrentTypeScript, Python, Go, Rust, Java, C, PHP, C++, JavaScript, Ruby, YAML, JSON, Dockerfile, C#, Kotlin, Lua, Swift, Zig, CSS, HTML, Terraform, Scala, Gleam, Elixir, Prisma, SQL, Clojure, Nix, Dart, MongoDB30
Tier 3 candidatesBash1
Potential total31

The 30-language set covers systems, web, JVM, scripting, infrastructure, config, functional, schema, query, document-database, and Nix/functional-package-manager domains.