Получить полное имя для ссылок, использующих скаламету

Я пытаюсь написать простую программу для обхода всего ссылочного кода, начиная с данного метода, используя 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, но я не могу найти его внутри.

Так что я думаю, что сгенерированный анонимным компилятор отсутствует в текущей семантической базе данных.

Другие вопросы по тегам