Интеллектуальный поиск и генерация кода 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. Не было бы слишком сложно написать упрощенную версию этого, но если я собираюсь использовать что-то подобное, я бы ожидал, что это будет надежно.
Любые предложения инструмента / библиотеки, которые помогут мне достичь этого?
Изменить, чтобы добавить пояснения
- Python определенно не нужен; Я возьму все, что это. Я просто предлагаю это, если есть выбор.
- Это должно использоваться в сочетании с рефакторингом IDE; иногда он просто не делает все, что я хочу.
- В тех случаях, когда я использую для генерации кода (как выше), это для увеличения вывода других генераторов кода. например, библиотека, которую мы используем, выводит тонну интерфейсов, и нам нужно сделать стандартные реализации каждого из них, чтобы связать ее с нашей кодовой базой.
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). Оба проекта имеют открытый исходный код, поэтому, если вы хотите увидеть, как они выполняют этот рефакторинг, вы можете посмотреть их исходный код.