首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用scalameta为引用获取一个完全限定的名称

使用scalameta为引用获取一个完全限定的名称
EN

Stack Overflow用户
提问于 2018-03-03 23:07:23
回答 1查看 164关注 0票数 1

我试图编写一个简单的程序,从使用scalameta的给定方法开始遍历所有引用的代码。

我能够跟踪调用,但无法解析方法引用。

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

代码语言:javascript
复制
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
}

FindMe.scala生成和加载语义数据库,检查someRecognizeableName方法的使用情况。

我可以在db.names列表中看到第一个调用:

代码语言:javascript
复制
[87..108): someRecognizeableName => _root_.codelab.FindMe.someRecognizeableName(Int,Int).

但是,当我不调用该方法时,第二个方法就是传递引用,如下所示:

代码语言:javascript
复制
[159..180): someRecognizeableName => local2_src_main_scala_codelab_FindMe_scala

因此,当我试图跟踪从main开始的引用时,在第二种情况下,我不会得到someRecognizeableName引用的完全限定名。

问:是否有办法从语义数据库中为该引用获取一个完全限定的名称?

复制以上内容的完整源

运行说明:

代码语言:javascript
复制
analyzeme $ sbt compile
analyzer $ sbt "run ../analyzeme"

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
name := "analyzer"
version := "0.1"
scalaVersion := "2.12.4"

libraryDependencies += "org.scalameta" %% "scalameta" % "3.4.0"
libraryDependencies += "org.scalameta" %% "contrib" % "3.4.0"
EN

回答 1

Stack Overflow用户

发布于 2018-03-08 11:30:28

代码语言:javascript
复制
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) }
}

我调试了代码,在第二种情况下,编译器传递了一个匿名符号,它不能从当前的语义数据库中访问,它可能应该出现在审美观部分中,但我在里面找不到它。

因此,我猜在当前的语义数据库中缺少生成的匿名编译器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49090189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档