Scala中的AST访问方法

Scala中的AST访问方法,scala,scala-reflect,Scala,Scala Reflect,是否有一种反射方式来访问类方法的AST class Clazz { def hello(a: Int) = (a + 1).toLong } val src = """ class Clazz { def hello(a: Int) = (a + 1).toLong } """ 我想买这样的东西 scala> val a = 100 scala> showRaw(reify((a + 1).toLong).tree) res2: Stri

是否有一种反射方式来访问类方法的AST

class Clazz {
    def hello(a: Int) = (a + 1).toLong
}

val src = 
"""
    class Clazz {
        def hello(a: Int) = (a + 1).toLong
    }
"""
我想买这样的东西

scala> val a = 100
scala> showRaw(reify((a + 1).toLong).tree)
res2: String = Select(Apply(Select(Select(Select(Select(Select(Select(Ident($line11.$read), newTermName("$iw")), newTermName("$iw")), newTermName("$iw")), newTermName("$iw")), newTermName("a")), newTermName("$plus")), List(Literal(Constant(1)))), newTermName("toLong"))
结果,


我相信这将是一个编译时世界。

您想从字符串还是从类名/方法名对中获取AST?这两种方法都可以,但从类名/方法名对中获取AST更可取。前者很简单:如果不在宏中,只需在宏中执行c.parse或ToolBox.parse。后者没有可靠的实现——我所知道的所有方法都有各种限制,其中一些方法只有在用户不是元程序员,而是他们的用户的情况下才有效!做一些特别的事情。