Я хочу сгенерировать приложение типа, чтобы я мог вызвать функцию типа foo.bar[com.a.b.SomeType](baz)
, где com.a.b.SomeType
может быть любым из широкого диапазона типов. Я использовал отражение во время выполнения макроса, чтобы получить ссылку на фактический класс, представленный SomeType
, чтобы я мог делать такие вещи, как получение имени пакета, простого имени и полного имени.
Когда я пишу tq"com.a.b.SomeType"
Я получаю желаемые результаты и могу использовать интерполяцию в своем выражении, например,
val someType = tq"com.a.b.SomeType"
q"""
foo.bar[$someType](baz)
"""
Мне нужно динамически создать это tq
выражение, используя информацию о классе, которую я могу получить из среды выполнения макроса из строка. Я посмотрел на дерево, сгенерированное tq"com.example.SomeType"
, и для каждого из пакетов com, a, b, c есть ряд вложенных Select
узлов, который кажется неудобным для генерации вручную.
Select(Select(Select(Ident(TermName("com")), TermName("a")), TermName("b")), TypeName("SomeType"))
Я полагаю, что есть более простой способ, которого я просто не вижу.
С этой целью я попробовал что-то вроде:
tq"${someType.getPackage.getName}.${someType.getSimpleName}"
, но я вижу, что это неправильно и получить такие ошибки, как:
Compilation error[MyMacro.this.c.universe.Name expected but MyMacro.this.c.universe.Tree found]
Итак, каков краткий способ добиться того, что я пытаюсь сделать, когда имя типа доступно только через отражение, например, как экземпляр Class
?