Как заставить 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.