Получить полное имя для ссылок, использующих скаламету
Я пытаюсь написать простую программу для обхода всего ссылочного кода, начиная с данного метода, используя scalameta
,
Я мог следить за вызовами, но не мог разрешить ссылки на методы.
analyzeme/ SRC / основной / 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
}
Сгенерированный и загруженный semanticdb для FindMe.scala
и проверка использования someRecognizeableName
метод.
Я вижу первый звонок в db.names
список:
[87..108): someRecognizeableName => _root_.codelab.FindMe.someRecognizeableName(Int,Int).
Второй, однако, когда я не вызываю метод, просто передаю ссылку, которая выглядит так:
[159..180): someRecognizeableName => local2_src_main_scala_codelab_FindMe_scala
Поэтому, когда я пытаюсь следовать ссылкам, начиная с main
Я не получаю полное имя someRecognizeableName
ссылка во втором случае.
Вопрос: есть ли способ получить полное имя из semanticdb для этой ссылки?
Полный источник, чтобы воспроизвести вышеупомянутое
запустить инструкции:
analyzeme $ sbt compile
analyzer $ sbt "run ../analyzeme"
analyzeme/ SRC / основной / 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
}
Анализатор / SRC / основной / 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"
анализатор / 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"
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) }
}
Я отладил код и обнаружил, что во втором случае компилятор передал анонимный символ, который недоступен из текущей семантической базы данных, возможно, он должен входить в раздел syhthetics, но я не могу найти его внутри.
Так что я думаю, что сгенерированный анонимным компилятор отсутствует в текущей семантической базе данных.