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.