它的层次结构如下:
object X extends Y{
...
}
trait Y extends Z {
...
}
trait Z {
def run(): Unit
}
我解析了包含X
的Scala文件
我想知道它的父代还是祖辈是Z
。
我可以如下检查父类:假设x: Defn.Object
是我解析的X
类,
x
.children.collect { case c: Template => c }
.flatMap(p => p.children.collectFirst { case c: Init => c }
将给Y
。
**问题:**知道如何获取X
(上例中为Z
)父对象的父对象吗?
加载Y
(与我加载X
的方式相同)并找到它的父类似乎不是一个好主意,因为上面是扫描过程的一部分,在src/main/scala
下的所有文件中,我试图找到扩展Z
并实现run
的所有类,所以我看不到一种简单而有效的方法来创建一个包含所有中间类的图,以便以正确的顺序加载它们并检查它们的父类。
1条答案
按热度按时间pxiryf3j1#
您似乎希望Scalameta不是在语法上而是在语义上处理您的源代码。那么你需要SemanticDB。可能最方便的使用Semancdb的方法是Scalafix
sbt out/compile
的输出其他示例:
https://github.com/olafurpg/scalafix-codegen(语义)
https://github.com/DmytroMitin/scalafix-codegen(语义)
https://github.com/DmytroMitin/scalameta-demo(句法)
Is it possible to using macro to modify the generated code of structural-typing instance invocation?(语义)
Scala conditional compilation(语法)
Macro annotation to override toString of Scala function(语法)
How to merge multiple imports in scala?(句法)
您可以避免使用Scalafix,但这样您就必须手动使用SemancDB的内部
产出:
语义数据库代码似乎在Scala 3中工作正常
https://scastie.scala-lang.org/DmytroMitin/3QQwsDG2Rqm71qa6mMMkTw/36[copy](在SCastie
-Dscala.usejavacp=true
对object scala.runtime in compiler mirror not found
没有帮助,所以我使用Coursier来保证scala-library
在路径上,在本地没有Coursier的情况下它可以工作)