Подтвердить что ты не робот

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

4b9b3361

Ответ 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, но это не простая задача, поэтому я не могу пообещать, что это будет сделано в ближайшее время.

С уважением, Александр Подхалюзин.