rescript-lang / rescript-lang/rescript-vscode

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

Open
#1,192 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
ReScript
Stars
354
Forks
63
Avg merge
11h 29m
Merged PRs (30d)
1

Description

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.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Run the provided Python stdio reproduction against node_modules/@rescript/language-server/out/cli.js with a rootUri for a directory without rescript.json, then trace initialize handling and project discovery. Done means initialize returns promptly for that workspace, either locating a project or reporting an unsupported or empty workspace; verify the existing project-root case still responds.

Written by the indexing model from the issue text.

Assessment

Tech stack
node.js
Domain
devtools
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
58/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.