Scala 如何提取函数调用

Scala how to extract function invocations

给定一串 Scala 代码,我需要提取任何函数调用的 class 和名称,例如,我想输出如下内容:

com.a.b.c.SomeClassA.someFunctionA
com.a.b.c.SomeClassA.someFunctionB
com.a.b.c.SomeClassB.anotherFunctionA

为此,我为提供的代码字符串生成一个 AST 并进行检查。我在处理应用节点方面取得了一些成功,但是,我没有看到适用于所有情况的简单规则来获取我需要的信息,例如:

val val2 = val1.someFunctionA
val2.someFunctionB

从 AST 中确定 val2 的类型似乎并不简单,因为生成该类型的子树可以任意复杂。

是否有一种简单的机制可以让我检查 AST 以提取函数名称和每个函数的 class?

我确实注意到,在我的调试器中,在 Select 节点下,限定符有一个包含 underlyingCache 的 rawtpe,这个 underlyingCache 似乎有我需要的类型信息,但我没有能够可靠地提取这些数据(也许是因为我正在研究 AST 的实现细节?)。

我应该采用完全不同的方法吗?欢迎任何想法。

这些符号将为您提供有关 类 和方法的信息。

一个非常暴力的解决方案,其中 tree 是类型检查 Tree 代表 val val1 = new A(); val val2 = val1.foo; val2.bar:

scala> val set = tree.collect { case method if method.symbol != null && method.symbol.isMethod => method.symbol }.toSet
set: scala.collection.immutable.Set[tb.u.Symbol] = Set(constructor A, method foo, method bar)

scala> set.map(sym => s"${sym.owner.name}.${sym.name}")
res25: scala.collection.immutable.Set[String] = Set(A.<init>, A.foo, B.bar)