1

I'm trying to write a simple program to traverse all the referenced code starting from a given method using scalameta.

I was able to follow the calls but could not resolve method references.

analyzeme/src/main/scala/codelab/FindMe.scala

package codelab

object FindMe {
  def main(args: Array[String]): Unit = {
    val x = someRecognizeableName(1, 2)
    val y = List(1, 2, 3)
    y.foldLeft(0)(someRecognizeableName)
  }
  def someRecognizeableName(a: Int, b: Int): Int = a + b
}

Generated and loaded semanticdb for FindMe.scala and checking the usages of someRecognizeableName method.

I can see the first call in the db.names list:

[87..108): someRecognizeableName => _root_.codelab.FindMe.someRecognizeableName(Int,Int).

The second one, though, when I don't call the method, just pass the reference is showing up as this:

[159..180): someRecognizeableName => local2_src_main_scala_codelab_FindMe_scala

So when I try to follow references startin from main, I don't get a fully qualified name of the someRecognizeableName reference in the second case.

Question: Is there a way to get a fully qualified name from semanticdb for that reference?



Full source to reproduce the above

run instructions:

analyzeme $ sbt compile
analyzer $ sbt "run ../analyzeme"

analyzeme/src/main/scala/codelab/FindMe.scala

package codelab

object FindMe {
  def main(args: Array[String]): Unit = {
    val x = someRecognizeableName(1, 2)
    val y = List(1, 2, 3)
    y.foldLeft(0)(someRecognizeableName)
  }
  def someRecognizeableName(a: Int, b: Int): Int = a + b
}

analyzer/src/main/scala/Main.scala

import org.langmeta.io.{Classpath, Sourcepath}

import scala.meta._

object Main {
  def main(args: Array[String]): Unit = {

    println(s"Loading from [${ args(0) }]")
    println()

    val cp = Classpath(s"${ args(0) }/target/scala-2.12/classes")
    val sp = Sourcepath(s"${ args(0) }/src/main/scala")

    val db = Database.load(cp, sp)

    println("* names:")
    db.names foreach println
    println()
    println("* symbols:")
    db.symbols foreach println
    println()
    println("* synthetics:")
    db.synthetics foreach println
    println()
    println("* messages:")
    db.messages foreach println
    println()
  }

}

analyzeme/build.sbt

name := "analyzee"
version := "0.1"
scalaVersion := "2.12.4"

addCompilerPlugin("org.scalameta" % "semanticdb-scalac" % "3.4.0" cross CrossVersion.full)
scalacOptions += "-Yrangepos"

analyzer/build.sbt

name := "analyzer"
version := "0.1"
scalaVersion := "2.12.4"

libraryDependencies += "org.scalameta" %% "scalameta" % "3.4.0"
libraryDependencies += "org.scalameta" %% "contrib" % "3.4.0"
Community
  • 1
  • 1
Gabor Juhasz
  • 317
  • 2
  • 9

1 Answers1

1
package codelab

object FindMe {
  def main(args: Array[String]): Unit = {
  val x = someRecognizeableName(1, 2)

  y.foldLeft(0)(someRecognizeableName)
  // same as
  y.foldLeft(0){ a, b => someRecognizeableName(a, b) }
}

I debug the code and found at the second case, the compiler passed an anonymous symbol which is not accessible from the current semanticdb, it maybe should comes in the syhthetics partion but I can't find it inside.

So I guess the compiler generated anonymous is missing in the current semanticdb.