Я разрабатываю аннотацию scala macro, которая обогащает объекты различными определениями (cf. play form macro). Помимо всего прочего, я хочу, чтобы объект содержал псевдоним типаКак определить псевдоним типа для более высокого типа типа с помощью аннотации scala macro (предпочтительно с использованием квазикварталов)
type WFS = FS[_, _, _, _]
для различного количества аргументов подстановки.
Я уже пытался извлечь значение одного типа шаблонного
q"type WFS = FS[_]" match { q"type WFS = FS[$t]" => t }
и надеялся использовать извлеченное значение в списке параметров типа (например, Q "тип WFS = FS [.. $ tplist ] "). Однако приведенное выше утверждение дает ошибку:
scala> q"type WFS = FS[_]" match { case q"type WFS = FS[$t]" => t }
scala.MatchError: type WFS = FS[_$1] forSome {
<synthetic> type _$1 >: _root_.scala.Nothing <: _root_.scala.Any
} (of class scala.reflect.internal.Trees$TypeDef)
at .<init>(<console>:15)
at .<clinit>(<console>)
at .<init>(<console>:7)
at .<clinit>(<console>)
at $print(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43
Есть ли другой - возможно, проще - способ построения необходимого дерева?
Спасибо, это было хорошее наблюдение! Теперь я попытался построить тип WFS с помощью типа 'q 'WFS = FS [.. $ typeParams] forSome {.. $ typeDefs}", где каждый 'typeParam' был сконструирован' tq' $ {newTypeName (s "C $ index ")}" 'и каждый' typeDef' на 'q" type $ typeParam "'. К сожалению, это приводит к исключению компилятора: no-symbol не имеет владельца в scala.reflect.internal.SymbolTable.abort (SymbolTable.scala: 49) at scala.tools.nsc.Global.abort (Global.scala: 254) at scala.reflect.internal.Symbols $ NoSymbol.owner (Symbols.scala: 3248) – Stefan
Ой, это эквивалент исключения NullPointerException для символов.Обычно компилятор заполняет символы в деревьях, чтобы сказать, к какому определению (символу) указывает имя. Я не понимаю (пока) макрокоманды, чтобы дать продуманный комментарий - я подозреваю, что вам лучше задавать следующий вопрос с исходным кодом. – Blaisorblade