Я играл с каким-то макросом и наткнулся на что-то странное.
Давайте определим следующий макрос:
import scala.reflect.macros.blackbox
class Macro(val c: blackbox.Context) {
import c.universe._
def m() = {
val optSymb = typeOf[Option[_]].typeSymbol
def d() = {
val optSymb = typeOf[Option[_]].typeSymbol
q""
}
d()
}
}
В этом случае все работает правильно, и я могу получить символ для опции [_].
Но если указать тип возврата функции a c .Tree, внутренняя функция optSymb
не смогла скомпилировать с No TypeTag available for Option[_]
Например:
import scala.reflect.macros.blackbox
class Macro(val c: blackbox.Context) {
import c.universe._
def m() : c.Tree = {
val optSymb = typeOf[Option[_]].typeSymbol # compile
def d() : c.Tree = {
val optSymb = typeOf[Option[_]].typeSymbol # does not compile
q""
}
d()
}
}
Что-то еще, если я укажу тип возвращаемого значения как другой тип, который не содержит c.Tree
(нет Option[c.Tree]
, List[c.Tree]
, ...), компиляция работает .
Или, если я точно определю тип Option: val optSymb = typeOf[Option[String]].typeSymbol
. Это тоже компилируется.
Проверка реализации typeTag:
def typeOf[T](implicit ttag: TypeTag[T]): Type = ttag.tpe
Компилятор должен иметь возможность неявно использовать ttag для Option.
Любая идея, что мне не хватает ?
Я использую scala 2.12.10.