Интеллектуальный поиск и генерация кода Java, желательно с использованием Python?

По сути, я делаю много разового генерации кода, масштабного рефакторинга и т. Д. И т. Д. В Java.

Мой язык инструментов - Python, но я приму любые решения, которые вы можете предложить.


Вот упрощенная иллюстрация того, что я хотел бы, в псевдокоде

Генерация реализации для интерфейса

search within my project:
  for each Interface as iName:
    write class(name=iName+"Impl", implements=iName)
    search within the body of iName:
      for each Method as mName:
        write method(name=mName, body="// TODO implement this...")

По сути, инструмент, который я ищу, позволит мне:

  • разбирать файлы в соответствии с их структурой Java ("поиск интерфейсов")
  • поиск слов, контекстуализированных элементами и типами языка ("переменные типа SomeClass", "вызовы метода doStuff() для экземпляров SomeClass")
  • выполнять поиск со структурным контекстом ("в теле текущего результата")
  • легко заменить или сгенерировать код (с помощью помощников для генерации, как указано выше, или функций для замены, "переименовать интерфейс в Foo", "вставить строку Blah.Blah()" и т. д.)

Дело в том, что я не хочу тратить много времени на написание этих вещей, так как они обычно одноразовые. Но иногда мне нужно что-то более умное, чем то, что предлагает grep. Не было бы слишком сложно написать упрощенную версию этого, но если я собираюсь использовать что-то подобное, я бы ожидал, что это будет надежно.

Любые предложения инструмента / библиотеки, которые помогут мне достичь этого?


Изменить, чтобы добавить пояснения

  1. Python определенно не нужен; Я возьму все, что это. Я просто предлагаю это, если есть выбор.
  2. Это должно использоваться в сочетании с рефакторингом IDE; иногда он просто не делает все, что я хочу.
  3. В тех случаях, когда я использую для генерации кода (как выше), это для увеличения вывода других генераторов кода. например, библиотека, которую мы используем, выводит тонну интерфейсов, и нам нужно сделать стандартные реализации каждого из них, чтобы связать ее с нашей кодовой базой.

3 ответа

Решение

Во-первых, мне неизвестно о каком-либо инструменте или библиотеках, реализованных в Python, которые специально предназначены для рефакторинга кода Java, и поиск в Google не дал мне никаких указаний.

Во-вторых, я бы сказал, что написание такого достойного инструмента или библиотеки для рефакторинга Java в Python было бы большой задачей. Вам нужно будет реализовать клиентскую часть компилятора Java (лексер / парсер, сборщик AST и анализатор типов) в Python, а затем выяснить, как интегрировать это с программным редактором. Я не удивлен, что никто не сделал этого... учитывая, что зрелые альтернативы уже существуют.

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

Учитывая этот мрачный прогноз, какие есть альтернативы:

Одна альтернатива - использовать одну из существующих IDE Java (например, NetBeans, Eclipse, IDEA и т. Д.) В качестве инструмента рефакторинга. ОП не сможет расширить возможности такого инструмента в коде Python, но есть вероятность, что он на самом деле не понадобится. Я ожидаю, что по крайней мере один из этих IDE сделает 95% того, что ему нужно, и (если он реалистичен) этого должно быть достаточно. Особенно, если учесть, что в IDE есть много случайных функций, которые помогают упростить рефакторинг; например, структурное редактирование, отмена / повтор, инкрементная компиляция, интеллектуальное завершение кода, интеллектуальный поиск, представления иерархии типов и вызовов и т. д.

(Помимо... если существующие IDE не достаточно хороши (@WizardOfOdds - только вызов OP может сделать этот вызов!!), было бы более разумно попытаться расширить возможности рефакторинга существующей IDE, чем начинать заново в другой реализации язык.)

В зависимости от того, что он на самом деле делает, генерация кода на основе модели может быть другой альтернативой. Например, если рефакторинг происходит из-за того, что он часто создает и воссоздает свои объектные модели, то альтернативой является кодирование моделей на некотором языке моделирования и генерация его кода из этих моделей. Мой инструмент выбора при выполнении подобных задач - Eclipse EMF и связанные с ним технологии. Технологии EMF включают генерацию редакторов, сериализацию XML, постоянство, запросы, преобразование модели в модель и так далее. Я использовал EMF для реализации и развертывания проектов с объектными моделями, состоящими из 50-100 различных классов со сложными отношениями и требованиями проверки. Поддержка EMF для слияния изменений исходного кода при регенерации из обновленной модели является ключевой особенностью.

Ява имеет свою долю критики в наши дни, но в области инструментов - это не оправдано.

Мы избалованы выбором; Eclipse, Netbeans, Intellij - это три большие IDE. Все они предлагают отличные уровни поиска и рефакторинга. Я думаю, что Eclipse имеет преимущество в Netbeans, а Intellij часто опережает Eclipse.

Вы также можете использовать инструменты статического анализа, такие как FindBugs, CheckTyle и т. Д., Чтобы найти проблемы - например, чрезмерно длинные методы и классы, слишком сложный код.

Если вы действительно хотите использовать свои навыки Python - взгляните на Jython. Это интерпретатор Python, написанный на Java.

Если вы пишете код на Java, я настоятельно рекомендую вам использовать IDE NetBeans. Он имеет встроенную поддержку рефакторинга. Eclipse также поддерживает подобные вещи (хотя я предпочитаю NetBeans). Оба проекта имеют открытый исходный код, поэтому, если вы хотите увидеть, как они выполняют этот рефакторинг, вы можете посмотреть их исходный код.

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