Scala宏,如何获得标识符的完整解析符号(术语名和类型名)?
我使用一个宏注释,根据类的另一个方法中的代码内省,向类添加一个方法。我从类定义中提取方法的语法树,但是在方法中,术语和类型的标识符没有展开。这些标识符还不包含有关导入、类内的其他定义和隐式转换的信息Scala宏,如何获得标识符的完整解析符号(术语名和类型名)?,scala,macros,Scala,Macros,我使用一个宏注释,根据类的另一个方法中的代码内省,向类添加一个方法。我从类定义中提取方法的语法树,但是在方法中,术语和类型的标识符没有展开。这些标识符还不包含有关导入、类内的其他定义和隐式转换的信息 import geo.model.meta.src.state.IStateCoding import java.util.{Collection ⇒ JCollection} import scala.collection.JavaConverters._ @
import geo.model.meta.src.state.IStateCoding
import java.util.{Collection ⇒ JCollection}
import scala.collection.JavaConverters._
@IntrospectionGenerator
class IntrospectionTest(
val a:Int,
val b:String,
map:ConcurrentHashMap[String, JCollection[String]]
){
def inrospectionTarget: IntrospectionTest = {
val map = new ConcurrentHashMap[String, JCollection[String]]()
map.put("some", Seq("bar").asJava)
new IntrospectionTest(a, b, map)
}
}
//Macros definition example
@compileTimeOnly("enable macro paradise to expand macro annotations")
class IntrospectionGenerator extends StaticAnnotation{
def macroTransform(annottees: Any*): Any = macro IntrospectionGenerator.impl
}
object IntrospectionGenerator {
def impl(c: Context)(annottees: c.Expr[Any]*): c.Expr[Any] = {
import c.universe._
annottees.map(_.tree) match{
case (cls @ ClassDef(modifiers, className, typeDefs, template)) :: Nil⇒
val nonInferedContent = template.body.collectFirst{
case DefDef(_, TermName("copyState"), Nil, Nil, _, content) ⇒
content
}.get
val idents = nonInferedContent.collect{
case iden @ Ident(name) ⇒
idents //HOW TO GET SYMBOL FOR THIS IDENTIFIER?
}.flatten
val generatedMethod = q"override def copyStateSource = $someStructure"
val extTemplate = Template(
template.parents,
template.self,
template.body ::: generatedMethod :: Nil
)
c.Expr(ClassDef(modifiers, className, typeDefs, extTemplate))
case _ ⇒
c.abort(c.enclosingPosition, "incorrect use of StateCodingMacro")
}
}
}
1) 如何在类的上下文中为方法手动创建上下文(黑盒),以便该上下文知道类中的所有定义
2) 如果没有常见的类型检查调用,如何在AST of方法中获得某个标识符(类或方法的完整限定名)的定义?我希望保留原始的树结构,但同时理解此树中的术语和类型的标识符所指的内容。上述代码中的标识符示例:JCollection、asJava、a、b、map、内省测试