Мне нужно действительно untypecheck деревья, которые испускаются моим макросом. Это означает не только удаление выводимых типов и всего этого, но и удаление неявных аргументов, которые выводятся компилятором. Даже не resetAllAttrs
, похоже, позаботится об этом.Как удалить все намеченные импликации в макрос?
Symbol
s, как представляется, имеет метод isSynthetic
, который указывает, был ли код сгенерирован компилятором, но, по-видимому, этот флаг установлен только для таких вещей, как автогенерируемые геттеры и сеттеры, а не для неявных значений, которые вставляет компилятор.
Я мог бы, конечно, вручную искать все неявные списки аргументов и удалять их, но тогда я также удалю те, которые были явно предоставлены пользователем моего макроса.
Так идеально для следующего кода
scala> def foo(a: Int)(implicit e: DummyImplicit) = a
foo: (a: Int)(implicit e: DummyImplicit)Int
scala> myMacro{ foo(4); foo(2)(DummyImplicit.dummyImplicit) }
myMacro
будет испускать дерево
{
foo(4);
foo(2)(Predef.this.DummyImplicit.dummyImplicit)
}
, который затем typechecked снова и скомпилирован.
Но я боюсь, что это не может быть сделано ...
Спасибо! Насколько вероятно, что этот API изменится в ближайшее время? (до того, как все изменится на scala.meta в любом случае) –
Я не знаю больше, чем в источнике. Я бы поспорил, что менее вероятен до 2.13. –