emacs-fsharp-mode
emacs-fsharp-mode copied to clipboard
fsharp-mode-project-root breaks when the file doesn't exist
Description
fsharp-mode adds fsharp-mode-project-root to project-find-functions, which is run by project-current. Such functions should return nil if they can't find a project; otherwise, they make cause project-current as a whole to error.
This causes Emacs to break if e.g. there's a buffer visiting a file which hasn't yet been created.
Repro steps
Please provide the steps required to reproduce the problem
- M-: (fsharp-mode-project-root "/non/existent")
Expected behavior
It should return nil as is the project-find-functions spec
Actual behavior
It errors:
Debugger entered--Lisp error: (file-missing "Opening directory" "No such file or directory" "/non")
directory-files("/non/" full ".*\\.sln$")
fsharp-mode-search-upwards(".*\\.sln$" "/non/")
fsharp-mode/find-sln("/non/existent")
fsharp-mode/find-sln-or-fsproj("/non/existent")
fsharp-mode-project-root("/non/existent")
eval((fsharp-mode-project-root "/non/existent") t)
eval-expression((fsharp-mode-project-root "/non/existent") nil nil 127)
funcall-interactively(eval-expression (fsharp-mode-project-root "/non/existent") nil nil 127)
call-interactively(eval-expression nil nil)
command-execute(eval-expression)
In general, though, I would advise against buffer-local project backends altogether (for different reasons: the "current project" becomes different between files in the same directory; file listing performance won't take advantage of git ls-files).
It seems like your goal here can be reached by the user customizing the new-ish option called project-vc-extra-root-markers instead. This would avoid the above problems.