Scala макрос "TypeTag недоступен для Option [_]" во внутренней функции - PullRequest
0 голосов
/ 18 марта 2020

Я играл с каким-то макросом и наткнулся на что-то странное.

Давайте определим следующий макрос:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...