Language server hangs on initialize when workspace root has no rescript.json (monorepo)

Aperta
#1,192 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
58/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
node.js
Ambito
devtools

Direzione di ricerca

Esegui la riproduzione Python stdio fornita con node_modules/@rescript/language-server/out/cli.js usando una rootUri per una directory senza rescript.json, quindi traccia la gestione di initialize e l’individuazione del progetto. È completato quando initialize restituisce prontamente il controllo per quel workspace, individuando un progetto oppure segnalando che il workspace non è supportato o è vuoto; verifica che il caso esistente con la root del progetto continui a rispondere.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Summary

When the editor workspace root is a monorepo root that does not itself contain a rescript.json, the language server never responds to the LSP initialize request — it hangs silently and produces no stderr output. Editors that spawn one server instance per workspace (Zed) are left with a dead server: every request (formatting, hover, completions, code actions) fails until the process is torn down.

Environment

  • @rescript/language-server 1.74.0 (also reproduced on 1.72.0)
  • macOS 26, Node v24.13.0
  • Editor: Zed 1.18 (extension rescript 0.4.4), but this is reproducible standalone over stdio

Repo layout

  monorepo/                      ← workspace root, no rescript.json here
    packages/
      my-app/
        rescript.json            ← the actual ReScript project
        src/...

Reproduction

Pipe a framed initialize request to the server over stdio:

  python3 - <<'EOF'
  import subprocess, json
  msg = json.dumps({"jsonrpc":"2.0","id":1,"method":"initialize","params":{
    "rootUri":"file:///path/to/monorepo",   # no rescript.json at this level
    "capabilities":{}}})
  payload = f"Content-Length: {len(msg)}\r\n\r\n{msg}"
  p = subprocess.Popen(["node","node_modules/@rescript/language-server/out/cli.js","--stdio"],
                       stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  try:
      out, err = p.communicate(payload.encode(), timeout=10)
      print("responded:", b'"id":1' in out)
  except subprocess.TimeoutExpired:
      p.kill(); print("HUNG: no response in 10s")
  EOF

Results

scenario result
rootUri = directory containing rescript.json responds immediately, documentFormattingProvider: true
rootUri = monorepo root (no rescript.json at root) hangs indefinitely, no stderr
same, with workspaceFolders including the rescript.json dir still hangs
same, with rootUri at root + cwd at the rescript.json dir still hangs
both 1.72.0 and 1.74.0 identical behavior

Expected behavior

The server should respond to initialize even when the root has no rescript.json — either by locating the nearest project in the workspace, or by reporting an empty/unsupported workspace so the editor can degrade gracefully (or the user can be told to add the project folder).

Actual behavior

Silent hang. In Zed this manifests as: launch → cannot read LSP message headers → teardown → every subsequent request logs rescript-language-server failed: server shut down. Formatting-on-save, hover, and completions are all silently dead. The user sees no error explaining that the workspace root needs to be (or contain) a ReScript project.

Workarounds

  • Open the directory containing rescript.json as the workspace root, or
  • Bypass the LSP formatter via an external formatter (rescript format --stdin .res) — but semantic features remain dead.
Lingua principale
ReScript
Stelle
354
Fork
63
Merge medio
11h 29m
PR unite (30g)
1

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di rescript-lang/rescript-vscode

Tutte le issue di rescript-lang/rescript-vscode

Issue simili

Altre issue su DevTools

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.