Scala宏递归获取调用方类(stacktrace)

Scala宏递归获取调用方类(stacktrace),scala,recursion,macros,stack-trace,Scala,Recursion,Macros,Stack Trace,我有一个无法解决的问题。我希望从宏开始递归地获取类 Class A{ def myfunc = macro mymacro } Class B{ val b = new A().myfunc } Class C{ val c = new B().b } 最后,我想得到结果stacktrace so[C.C,B.B,A.myfunc]。 有没有办法做到这一点? 我已经尝试获取编码类的所有者,但我不知道如何识别真正调用B的类。 请考虑以下情况,我也有一个D类: Class D{ va

我有一个无法解决的问题。我希望从宏开始递归地获取类

Class A{
  def myfunc = macro mymacro
}
Class B{
  val b = new A().myfunc
}
Class C{
 val c = new B().b
}
最后,我想得到结果stacktrace so[C.C,B.B,A.myfunc]。 有没有办法做到这一点? 我已经尝试获取编码类的所有者,但我不知道如何识别真正调用B的类。 请考虑以下情况,我也有一个D类:

Class D{
  val d = new B().b
}
Main {
  new C.c
}
还有一个主要的例子如下:

Class D{
  val d = new B().b
}
Main {
  new C.c
}

它依赖于运行时,更像是编译时,所以宏无法以通用和可靠的方式解决这个问题。类似于:JavaStackTrace价格昂贵,不是一个干净的解决方案。我不喜欢在运行时调用stacktrace来重新创建调用类的树。宏在AST上有所有需要的信息,以便获取调用我的函数(或我的其他类)的类。主要问题之一是我们没有任何工具来访问树的父级。唯一的解决方案似乎是访问所有者符号并对宏进行类型检查。虽然我无法通过这种方式找到调用方类。我在另一个项目中创建Main2,导入您的项目并使用您的函数-宏生成的堆栈跟踪将无效,因为它只能在编译时访问类。当然,假设AST in可以访问调用该方法的任何对象。实际上,您无法访问调用您的内容,除非您希望创建自己的解析器,该解析器将扫描您的所有文件,递归地计算使用您的调用的内容,但在我上面描述的情况下,它仍然不起作用。长话短说,Java Stacktrace是唯一在实践中可行的解决方案。