LuaLS / LuaLS/lua-language-server
Renamed file considered deleted inside directory junction
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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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