LuaLS / LuaLS/lua-language-server

Renamed file considered deleted inside directory junction

Open
#3,279 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Lua
Stars
4.4k
Forks
442
PR merge metrics
No merged PRs in 30d

Description

### How are you using the lua-language-server?

NeoVim

### Which OS are you using?

Windows

### What is the issue affecting?

Other

### Expected Behaviour

LS correctly works with files inside directory junction or symlinks.

### Actual Behaviour

LS functionality stops working after saving such a file in editor.

### Reproduction steps

1. Enable LuaLS in NeoVim.
2. Put NeoVim config files inside directory junction. E.g. I have `init.lua` file in directory `C:\dev\dotfiles\nvim` and I've created the junction to that directory in `C:\Users\RobotComp.ru\AppData\Local\nvim`. NVim reads config files from `C:\Users\RobotComp.ru\AppData\Local\nvim`.
3. Open `init.lua` in NVim, change something and save it with `:w` command.
4. After that, **any interactions with LS stop working** (hover, go to definition, etc.)
5. If I re-edit file with `:e %` command, everything starts working again.

### Additional Notes

I did some research and found the following.

When saving `init.lua`, NVim renames it several times (to `init.lua~` and back). Don't know why.
The logs (see error.log) show that the `filewatch(rename)` function is called on LS, which calls `isExists()`.
And although the file exists, `isExists()` returns false, so the file is considered deleted, and the LS "forgets" about it.

More specifically, the problem occurs in `script/filewatch.lua:18`:

```
if res :string():gsub('^%w+:', string.lower)
~= path:string():gsub('^%w+:', string.lower) then
return false
end
```

Here, it turns out that `res` contains the actual path to the file (`C:\dev\dotfiles\nvim\init.lua`), and `path` contains the path with the junction (`C:\Users\RobotComp.ru\AppData\Local\nvim\init.lua`).

Commenting out these lines makes everything work correctly (see fixed.log). However, I didn't make a PR with such changes because I didn't fully understand why this path comparison was needed at all. It seems like it fixes some other bug?

Thanks in advance :)

### Log File

[00:20:20.415][debug][#0:script\filewatch.lua:98]: filewatch: rename C:\Users\RobotComp.ru\AppData\Local\nvim\init.lua
[00:20:20.415][debug][#0:script\filewatch.lua:98]: filewatch: modify C:\Users\RobotComp.ru\AppData\Local\nvim\init.lua
[00:20:20.415][debug][#0:script\filewatch.lua:98]: filewatch: rename C:\Users\RobotComp.ru\AppData\Local\nvim\init.lua~
**[00:20:20.415][debug][#0:script\workspace\workspace.lua:592]: FileChangeType.Deleted file:///c%3A/Users/RobotComp.ru/AppData/Local/nvim/init.lua**
[00:20:20.416][debug][#0:script\workspace\workspace.lua:592]: FileChangeType.Deleted file:///c%3A/Users/RobotComp.ru/AppData/Local/nvim/init.lua~

[error.log](https://github.com/user-attachments/files/22867004/error.log)
[fixed.log](https://github.com/user-attachments/files/22867005/fixed.log)

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

Reproduce the issue on Windows with a NeoVim configuration stored through a directory junction, then read script/filewatch.lua:18 and follow the rename handling shown in the logs. Done means saving init.lua no longer causes the language server to treat the junction path as deleted, while hover and go-to-definition continue working.

Written by the indexing model from the issue text.

Assessment

Tech stack
lua, neovim
Domain
tooling
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.