fsharp / emacs-fsharp-mode

F# Emacs mode
Apache License 2.0
205 stars 62 forks source link

fsharp-mode-project-root breaks when the file doesn't exist #340

Open catern opened 2 months ago

catern commented 2 months ago

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

  1. 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)
dgutov commented 2 months ago

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.