How exactly do I use Metals and VS Code Debugger?

vivian picture vivian · Aug 13, 2020 · Viewed 8.6k times · Source

Metals announced that "It is now possible to run and test directly from VS Code using the new "Run", "Test", "Debug" and "Debug test" buttons." There is a nice gif showing what it can do, and I don't know how to get to that point.

I tried to launch VS Code debugger with the following configurations in launch.json

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
       {
           "type": "scala",
           "request": "launch",
           "name": "Untitled",
           "mainClass": "com.playZip.Unzip",
           "args": [],
           "jvmOptions": []
       }
    ]
}

and got this error message:

Couldn't find a debug adapter descriptor for debug type 'scala' (extension might have failed to activate)

Somebody on Gitter scalameta/metals had this problem and the answer was that he needs Bloop to support utest and I think mine does because there's a file .bloop/play-zip-test.json in my sbt project, but I'm not 100% if my Bloop supports utest and what to do if it doesn't. I tried running bloop utest and it failed because I don't have Bloop CLI installed. I have Bloop that comes with Metals.

Answer

Mario Galic picture Mario Galic · Aug 13, 2020

Document how to run or debug applications #2005 added official debugging documentation at Running and debugging your code which documents two approaches

  1. via code lenses run | debug enter image description here
  2. via a launch.json configuration

Here is a hello world example how to debug a test using VSC and Metals via launch.json approach. We will use lihaoyi/utest library and set a breakpoint in a test.

  1. Execute sbt new scala/scala-seed.g8 to create correct project structure

  2. Open... sbt project with VSC or simply cd into project and execute code .

  3. Replace ScalaTest with utest in build.sbt

    libraryDependencies += "com.lihaoyi" %% "utest" % "0.7.2" % "test",
    testFrameworks += new TestFramework("utest.runner.Framework")
    
  4. Replace test/scala/example/HelloSpec.scala with HelloTests.scala

    package example
    
    import utest._
    
    object HelloTests extends TestSuite{
      val tests = Tests{
        test("test1"){
          1
        }
      }
    }
    
  5. Import sbt build with View | Command Palette... | Metals: Import Build

  6. Put a breakpoint at line 8 and click Run and Debug

    enter image description here

  7. Select Test Suite for Pick the kind of class to debug

  8. Leave empty for Enter the name of the build target

  9. Write example.HelloTests for Enter the name of the class to debug

  10. Write Debug example.HelloTests for Enter the name of configuration

  11. This should create .vscode/launch.json

    {
        "version": "0.2.0",
        "configurations": [
            {
                "type": "scala",
                "name": "Debug example.HelloTests",
                "request": "launch",
                "testClass": "example.HelloTests"
            }
        ]
    }       
    
  12. Now you should be able to Start Debugging by clicking the green triangle and stop at the breakpoint

    enter image description here