Получите полное имя для ссылок, используя scalameta

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

Я смог следить за вызовами, но не смог разрешить ссылки на методы.

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
}

Сгенерирована и загружена 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/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"

анализатор/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"

person Gabor Juhasz    schedule 03.03.2018    source источник


Ответы (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, но я не могу найти его внутри.

Поэтому я предполагаю, что сгенерированный компилятором анонимный файл отсутствует в текущей semanticdb.

person wangzaixiang    schedule 08.03.2018