Как заставить IntelliJ IDEA распознать код, созданный макросами?
Фон
У меня есть проект Scala, управляемый sbt, который использует обычный макет проекта sbt для проектов Scala с макросами, подпроект, содержащий макросы основного проекта, который является фактическим приложением, и который зависит от подпроекта макроса. Макросы макрокоманды, которые, по сути, создают объекты-компаньоны для обычных классов. Сгенерированные объекты-компаньоны объявляют среди других членов методы apply/unapply.
Я использовал плагин sbt-idea для создания соответствующего проекта IntelliJ IDEA, и я использую консоль sbt из модуля IDEA sbt-plugin для компиляции и запуска приложения Scala.
Все работает более или менее точно, за исключением того, что созданные объекты-компаньоны и, что более важно, их члены, такие как apply/unapply, не распознаются IDEA. Таким образом, я получаю криволинейную линию везде, где я, например, применяю метод.
Моя настройка - IntelliJ IDEA CE 133.471 с плагинами SBT 1.5.1 и Scala 0.28.363 на Windows 7 x64.
Вопросы
Как заставить IntelliJ IDEA распознавать код (классы, объекты, методы,...), который был сгенерирован макросами Scala (макрокоманды, если быть точным)?
Известно, что другие IDE, например Eclipse, работают лучше в таких настройках?
Связанные
Этот вопрос (который менее подробно) по существу спрашивает то же самое, но еще не получил ответа (2014-02-26).
В соответствии с разработчиком JetBrains функция, о которой я просил, находится в их долгосрочном списке дел, но не будет реализован ни один (2014-03-05).
Ответы
Ответ 1
С помощью последней сборки плагина Scala существует API, который можно использовать для создания собственного плагина для поддержки ваших макросов: http://blog.jetbrains.com/scala/2015/10/14/intellij-api-to-build-scala-macros-support/
Теперь каждый может использовать этот API, чтобы сделать их макросы более дружественными к их любимой среде IDE. Для этого вам необходимо реализовать SyntheticMembersInjector и зарегистрировать его в файле plugin.xml:
<extensions defaultExtensionNs="org.intellij.scala">
<syntheticMemberInjector implementation="org.jetbrains.example.injector.Injector"/>
</extensions>
Ответ 2
Похоже на ограниченную поддержку, если таковая имеется.
Цитата по этой ссылке: http://blog.jetbrains.com/scala/2014/01/23/heading-to-the-perfect-scala-code-analysis/
Alexander Podkhalyuzin says:
30 января 2014 года в 10:13
Мы начали поддержку макросов Scala, но это не простая задача, поэтому я не могу пообещать, что это будет сделано в ближайшее время.
С уважением,
Александр Подхалюзин.