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"