A useful function to contribute to Scala Metals lsp server with Emacs
I am in the process of contributing a feature to Scala Metals LSP server. The change is about adding a code action to stub functions/methods after declaring their usagen.
Anyway, it was nice I could focus on the change because I could add tests and run my code against them to see progress.
Naturally tests are never exhaustive. As soon as I ran my enhanced version of Metals locally, I found out my code action wouldn't work. There I go at debugging with println.
The pain I felt was reinstalling my latest version of Metals each time: add a println, reinstall, try again, fix code and repeat. The reinstall bit also consisted in multiple steps:
sbt publishLocal
- (first time only)
sbt ++2.13.15 mtags/publishLocal
- install snapshot via coursier as explained in the vim section
- restart metals in my Scala buffer
I got soon tired and added the following to my Emacs configuration:
(defun my/reinstall-metals-snapshot () "Reinstall metals from snapshot created with sbt publishLocal. TODO: edit this function with the right version." (interactive) ;; (shell-command "cd your-metals-path; sbt publishLocal") (call-process (lsp-package-path 'coursier) nil (get-buffer-create "*Coursier log*") t "bootstrap" "--java-opt" "-Xss4m" "--java-opt" "-Xms100m" (concat "org.scalameta:metals_" lsp-metals-install-scala-version ":" "1.4.1-SNAPSHOT") "-o" lsp-metals-metals-store-path "-f") (with-demoted-errors "%S" (funcall-interactively 'lsp-workspace-restart (lsp--read-workspace))) )
I left out the publishLocal
step because it is quicker running sbt
and interactively publish the snapshot.
Also I quickly hacked this, so I just hardcoded the snapshot version I needed.
Anyway that saved a lot of time in fixing the issues I found interactively. I may end up writing about tips to contribute to Metals later, if anybody is curious.
Happy contributing!