Scala инструмент для удаления всего неиспользуемого кода

Я пишу плагин Scala для редактора, который я использую, чтобы выделить все неиспользуемые пути кода (может быть неиспользованным defs, vals, classes а также implicits), и дать пользователю возможность вытащить их из .scala файл.

Как я могу это сделать? Чтобы упростить проблему, давайте представим, что у нас только один корневой уровень .scala файл без внешней зависимости от библиотек или любых других файлов кода.

В идеале я хотел бы, чтобы это был плагин SBT, который, учитывая один такой Foo.scala файл, выплюнул бы Foo_min.Scala файл со всем неиспользованным кодом удален.

3 ответа

Решение

Scalafix имеет переписать для этого: RemoveUnusedImports

Следуйте этим инструкциям, чтобы запустить его: https://scalacenter.github.io/scalafix/

Вам нужен какой-то семантический API, чтобы пройтись по коду и задать вопросы типа "эта переменная / импорт когда-либо использовалась"?

Насколько я знаю, Intellij использует Meta programming System для достижения тех же целей. Для Scala, вы можете ждать scalametaверсия 2.0, которая (скорее всего) будет поддерживать семантический API.

Вы в основном ищете callgraph.

Полный, но сложный список вызовов для кода Scala реализован в Dotty Linker. Это состояние искусства. Однако даже создание более простого callgraph не является тривиальной задачей. Я не удивлюсь, если реализация Meta будет ограничена для выполнения такой задачи. В частности, вы должны быть очень осторожны с последствиями и областью видимости, особенно учитывая тот факт, что мета-макросы расширяются после typer.

Создание вашего собственного callgraph требует символов, типов и неявных поисков. Боюсь, вам нужно дождаться выхода Semantic API в Scala Meta 2.0.

Другие вопросы по тегам