Как заставить IntelliJ IDEA распознавать код, созданный макросами?

фон

у меня есть проект Scala, управляемый sbt, который использует обычный макет проекта sbt для проектов Scala с макросами, т. е. подпроекта, который содержит макросы основной проект, который является фактическим приложением и зависит от подпроекта макроса. Макросы макрос аннотации которые, по сути, генерируют сопутствующие объекты для регулярных классов. Сгенерированные сопутствующие объекты объявляют, среди других членов, apply/unapply методы.

я использовал плагин sbt-idea для создания соответствующего проекта IntelliJ IDEA, и я использую консоль sbt из sbt-плагина IDEA для компиляции и запуска моего приложения 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).

2 ответов


С последней сборкой плагинов Scala существует API, который можно использовать для написания собственного плагина для поддержки ваших макросов: http://blog.jetbrains.com/scala/2015/10/14/intellij-api-to-build-scala-macros-support/

теперь каждый может использовать этот API, чтобы сделать свои макросы более дружественными к своей любимой среде IDE. Для этого вам нужно реализовать SyntheticMembersInjector, и зарегистрировать его в плагин.xml-файл:

<extensions defaultExtensionNs="org.intellij.scala">
  <syntheticMemberInjector implementation="org.jetbrains.example.injector.Injector"/>
</extensions>

Кажется, что есть ограниченная поддержка, если таковая имеется.

цитата по этой ссылке: http://blog.jetbrains.com/scala/2014/01/23/heading-to-the-perfect-scala-code-analysis/

Alexander Podkhalyuzin says:    

30 января 2014 в 10: 13 утра

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

С наилучшими пожеланиями, Александр Podkhalyuzin.