Блог пользователя madkite

Автор madkite, 12 лет назад, По-русски

Как известно, codeforces требует решения в виде одного файла. Это вызывает некоторые трудности использования своих классов-утилит. Также для java требуется, чтобы класс решения был в default package (а многие другие сайты требуют ещё, чтоб класс назывался Main и никак по-другому).

CHelper Egor'а — замечательный плагин, облегчающий жизнь java-программистов на этом и других сайтах. Только вот не все любят придерживаться определённого стиля написания контестов, тестирования, хранения архива и пр., особенно если этот стиль был определён не ими. Другие не любят сложный GUI. Третьи вообще предпочитают UNIX-way, когда любая программа или плагин выполняет только одну небольшую задачу, но делает это очень хорошо.

Одним словом, CHelper показался мне слишком сложным, но вдохновлённый им я решил сделать очень маленький плагин, который делает всего одну простую вещь — генерирует Main.java, включая в него зависимости и удаляя некоторый неиспользуемый код. GUI в пагине нет — только одна кнопка на панели с правой стороны. Если нажать эту волшебную кнопку, то из активного в данный момент файла сгенерируется класс Main в default package текущего модуля. Зависимые классы, исходники которых присутствуют в текущем проекте (в котором может быть несколько модулей), будут рекурсивно включены, некоторые неиспользуемые вложенные классы, методы и поля будут аккуратно удалены. Точкой входа считается метод public static void main(String[] args). Очевидно, что для SRM'ов topcoder-а смысла этого плагина нет.

Плагин использует исключительно лексический анализатор самой IDEA (называемый PSI), и поэтому в целом не привязан к конкретным правилам оформления кода. Единственная проблема, которая может возникнуть — это конфликт имён классов, потому что при внедрении классов теряется информация об имени пакетов (он может возникнуть, если у вас два используемых класса с одним названием в разных пакетах или же вы используете класс из default package текущего модуля). Это не считается багом, это очевидные издержки архитектуры. Потому будьте аккуратны, если используете классы с одинаковыми short name, но разными fully qualified name. Также рекомендую просматривать результирующий Main.java перед отправкой.

Других функций, кроме как генерить Main.java в плагине нет и не будет. Я думаю, что генерацию по шаблону стартовых классов-решений с тестирующим кодом (и даже с выдиранием примеров из условия) лучше каждый сделает сам для себя. Для этого не нужен плагин к IDEA — достаточно простого запускаемого класса.

Плагин можно скачать отсюда: http://plugins.intellij.net/plugin/?idea&id=6870. Также можно установить через репозиторий непосредственно из самой IDEA. На скриншоте смотреть особо нечего, но если сильно хочется, можно глянуть пример здесь.

P.S. Тем, кто хочет богатого функционала и любит GUI, советую CHelper.

  • Проголосовать: нравится
  • +32
  • Проголосовать: не нравится

»
12 лет назад, # |
  Проголосовать: нравится +14 Проголосовать: не нравится

А не поделитесь этим кодом под LGPL? Я бы с удовольствием интегрировал сборку и убирание неиспользуемого кода в свой плагин (они получше моих, конечно), а лицензию менять не хочу

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится

    Пожалуйста, я сменил лицензию с GPL на LGPL.

  • »
    »
    12 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

    Один из вариантов использования: прописать в plugin.xml зависимость <depends>Olymp Plugin</depends>, а в коде вызывать GenerateMainAction.actionPerformed() — опциональным параметром можно передать имя результирующего класса (если оно отличается от Main). При желании можно оформить это сервисом (чтобы получать через ServiceManager.getService()) и сделать перегруженный метод, получающий PsiJavaFile вместо AnActionEvent.