Ответ 1
Scalafix имеет переписку для этого: RemoveUnusedImports
Следуйте этим инструкциям для запуска: https://scalacenter.github.io/scalafix/#Installation
Я пишу плагин Scala для редактора, который я использую, чтобы выделить все неиспользуемые коды кода (может быть не использован defs
, vals
, classes
и implicits
) и дать пользователю возможность вытащить их из файла .scala
.
Как я могу это сделать? Чтобы упростить проблему, предположим, что у нас есть только одиночный корневой уровень .scala
файл без внешней зависимости от библиотек или любых других файлов кода.
В идеале я хотел бы, чтобы это был плагин SBT, который, учитывая один такой файл Foo.scala
, выплевывал бы файл Foo_min.Scala
при удалении всего неиспользуемого кода.
Scalafix имеет переписку для этого: RemoveUnusedImports
Следуйте этим инструкциям для запуска: https://scalacenter.github.io/scalafix/#Installation
Вам нужен какой-то семантический API для прохождения по коду и задавать такие вопросы, как "эта переменная/импорт когда-либо используется"?
Насколько я знаю, Intellij использует Meta programming System
для достижения тех же целей. Для scala вы можете дождаться выпуска scalameta
2.0, который (скорее всего) будет поддерживать семантический API.
В основном вы ищете callgraph.
Полный, но сложный callgraph для кода Scala реализован в Dotty Linker. Это современное состояние. Однако даже создание более простого callrraph не является тривиальной задачей. Я бы не удивился, если бы реализация Meta была бы ограничена для выполнения такой задачи. В частности, вам нужно быть очень осторожным с имплицитами и областями, особенно учитывая тот факт, что мета-макросы расширяются после typer.
Создание собственного callgraph требует символов, типов и неявных поисков. Боюсь, вам нужно подождать, пока не будет выпущен Semantic API в Scala Meta 2.0.