Is there a way to get the direct parents of a ClassSymbol in macro context?

依然范特西╮ 提交于 2019-12-11 03:15:35

问题


Im trying to get the direct super classes / traits of a ClassSymbol. The method baseClasses() does not work for me as it also includes the super super.. types.

The java.lang.Class.getSuperclass() and java.lang.Class.getInterfaces() would actually be sufficient for my use case, but I can't find a way to go from ClassSymbol to java.lang.Class in macro context!


回答1:


If you use macro - you can't obtain runtime-object Class for class which does not exist (loaded) in compile-time (so you can't have an access to compiling classess from there). But, you could write your own function:

def getDirectBase(a: ClassSymbol) = { 
   val base = a.baseClasses.toSet - a //`baseClasses` contains `a` itself
   val basebase = base.flatMap { 
      case x: ClassSymbol => x.baseClasses.toSet - x
   }
   base -- basebase
}

Results (examples obtained using run-time reflection, but compile-time should be same here):

scala> class A
scala> class B extends A
scala> class C extends B

scala> typeOf[C].typeSymbol.asInstanceOf[ClassSymbol].baseClasses
res37: List[reflect.runtime.universe.Symbol] = List(class C, class B, class A, class Object, class Any)

scala> getDirectBase(typeOf[C].typeSymbol.asInstanceOf[ClassSymbol])
res38: scala.collection.immutable.Set[reflect.runtime.universe.Symbol] = Set(class B)


来源:https://stackoverflow.com/questions/28067387/is-there-a-way-to-get-the-direct-parents-of-a-classsymbol-in-macro-context

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!