Skip to content

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

Description

@hiovi

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions