有没有办法在宏上下文中获取 ClassSymbol 的直接父级?

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

我正在尝试获取 ClassSymbol 的 direct super 类 / traits。 baseClasses() 方法对我不起作用,因为它还包括 super super.. 类型。

java.lang.Class.getSuperclass()java.lang.Class.getInterfaces() 实际上对我的用例来说已经足够了,但我找不到在宏中从 ClassSymboljava.lang.Class 的方法上下文!

如果你使用宏 - 你无法获得 运行time-object Class for class 它在编译时不存在(加载)(所以你可以'无法从那里编译 classess)。但是,您可以编写自己的函数:

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
}

结果(使用运行时反射获得的示例,但此处编译时应该相同):

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)