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

В основном, я делаю много разовых генераций кода, крупномасштабных рефакторингов и т. Д. И т. Д. На 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 ]

2 голосов
/ 24 апреля 2010

Во-первых, мне неизвестно о каком-либо инструменте или библиотеках, реализованных в 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 слияния правок исходного кода при регенерации из обновленной модели является ключевой особенностью.

0 голосов
/ 24 апреля 2010

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

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

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

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

0 голосов
/ 24 апреля 2010

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

...