Как я могу получить значение символа, используя отражение Scala? - PullRequest
0 голосов
/ 25 апреля 2019

Используя отражение Scala, вы можете получить значение некоторого элемента в AST.Например, когда я хочу получить значение некоторой строки в AST, я могу использовать следующий оператор, который прекрасно работает:

a.tree.children.tail.collect({case Literal(Constant(id: String)) => id}).head

Однако, когда значение я хочу получить доступявляется символом scala.Symbol вместо String, приведенное выше утверждение не возвращает значение:

a.tree.children.tail.collect({case Literal(Constant(id: Symbol)) => id}).head

Мой вопрос: scala.Symbol представляется чем-то иным, чем литеральной константой вАСТ?

1 Ответ

3 голосов
/ 25 апреля 2019

Вы можете печатать деревья

import scala.reflect.runtime.universe._

println(showRaw(reify {
  "aaa"
}.tree)) // Literal(Constant("aaa"))

println(showRaw(reify {
  'aaa
}.tree)) 
// Apply(Select(Ident(scala.Symbol), TermName("apply")), List(Literal(Constant("aaa"))))

Попробуйте

case q"Symbol.apply(${Literal(Constant(id: String))})" => id

или

case Apply(Select(Ident(TermName("Symbol")), TermName("apply")), List(Literal(Constant(id: String)))) => id

Вы можете посмотреть, как они работают с Symbol s в Shapeless

https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/singletons.scala#L142-L146

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