Problem with Rename query in Language Server

I’m running into a problem that may be due to my inexperience with Javascript.

I’ve implemented C/C++ language server extension and am working on support global symbol renaming (via clangd), but I find that this doesn’t work if the calculated position of the symbol to rename is at character 0 or 1 (and I suspect also at line 0 or 1.). The reason for this appears to be that when I send the parameter object to clangd, those two specific values get converted to boolean “false” or “true”, which clangd definitely objects to. These are supposed to be JSON numbers.

For example:

  const params = {
    newName: newName,
    position: {
      line: Number(selectedPos.line),
      character: Number(selectedPos.character),
    },
    textDocument: { uri: editor.document.uri },
  };

  console.error("Sending", JSON.stringify(params));

  const response = await client.sendRequest("textDocument/rename", params);

From clangd, I see the following:

C-Dragon[10:17:48.360000] Sending {"newName":"nng_version2","position":{"line":2002,"character":0},"textDocument":{"uri":"file:///Users/garrettdamore/Projects/nng/src/nng.c"}}

clang Language Server[10:17:48.382000] V[10:17:48.381] <<< {"id":12,"jsonrpc":"2.0","method":"textDocument/rename","params":{"newName":"nng_version2","position":{"character":false,"line":2002},"textDocument":{"uri":"file:///Users/garrettdamore/Projects/nng/src/nng.c"}}}

clang Language Server[10:17:48.382000] 

clang Language Server[10:17:48.382000] I[10:17:48.381] <-- textDocument/rename(12)

clang Language Server[10:17:48.382000] E[10:17:48.381] Failed to decode textDocument/rename request: expected integer at (root).position.character

clang Language Server[10:17:48.382000] V[10:17:48.381] {

clang Language Server[10:17:48.382000]   "newName": "nng_version2",

clang Language Server[10:17:48.382000]   "position": {

clang Language Server[10:17:48.382000]     "character": /* error: expected integer */ false,

clang Language Server[10:17:48.382000]     "line": 2002

clang Language Server[10:17:48.382000]   },

clang Language Server[10:17:48.382000]   "textDocument": { ... }

clang Language Server[10:17:48.382000] }

clang Language Server[10:17:48.382000] I[10:17:48.381] --> reply:textDocument/rename(12) 0 ms, error: -32602: failed to decode textDocument/rename request: expected integer at (root).position.character

clang Language Server[10:17:48.382000] V[10:17:48.381] >>> {"error":{"code":-32602,"message":"failed to decode textDocument/rename request: expected integer at (root).position.character"},"id":12,"jsonrpc":"2.0"}

Is there any way I can prevent Nova from turning these fields into booleans?

I am starting to suspect this is a bug in Nova. I’m not sure how to deal with it, but it is going to impact some other work I want to do, because sometimes I need to express something starting at column 0.