宏:使用嵌套类型损坏的knownDirectSubclasses? [英] Macros: knownDirectSubclasses broken with nested type?

查看:58
本文介绍了宏:使用嵌套类型损坏的knownDirectSubclasses?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个宏,它枚举了密封特征的直接子类型:

I have a macro which enumerates the direct sub types of a sealed trait:

import scala.reflect.macros.Context
import language.experimental.macros

object Checker {
  def apply[A]: Unit = macro applyImpl[A]

  def applyImpl[A: c.WeakTypeTag](c: Context): c.Expr[Unit] = {
    val tpe = c.weakTypeOf[A].typeSymbol.asClass
    require (tpe.isSealed)
    tpe.typeSignature // SI-7046
    require (tpe.knownDirectSubclasses.nonEmpty)

    import c.universe._
    c.Expr[Unit](reify {} .tree)
  }
}

然后这有效:

sealed trait A
case class A1(i: Int) extends A

object NotNested {
  val nada = Checker[A]
}

但这失败了:

object Nested {
  sealed trait A
  case class A1(i: Int) extends A

  val nada = Checker[A]
}

[error] java.lang.IllegalArgumentException: requirement failed: 
        Did not find sub classes

我以为我遇到了 SI-7046 ,所以我添加了调用tpe.typeSignature,但这显然无济于事.

I thought I ran into SI-7046, so I added the call to tpe.typeSignature, but that doesn't help apparently.

我需要使用Scala 2.10.2来解决此问题.我猜我必须以某种方式强制执行一些额外的类型树?

I need a work around for this using Scala 2.10.2. Somehow I must enforce some extra type trees to be initialised, I guess?

推荐答案

以下是可能的解决方法(您对@EugeneBurmako的看法如何).

A possible workaround is following (what do you think @EugeneBurmako).

val cls: ClassSymbol = sub.asClass

println(s"knownDirectSubclasses = ${cls.knownDirectSubclasses}")
// print "knownDirectSubclasses = Set()"

val subsub = cls.owner.typeSignature.decls.filter {
  case c: ClassSymbol =>
    cls != c && c.selfType.baseClasses.contains(cls)

  case _ => false
}

println(s"subsub = $subsub")
// print the actual sub classes

这篇关于宏:使用嵌套类型损坏的knownDirectSubclasses?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆