Есть ли работающий инструмент рефакторинга С++?

Кто-нибудь знает полнофункциональный инструмент рефакторинга для С++, который надежно работает с большими базами кода (около 100 000 строк)?

Я пробовал все, что мог найти снова и снова за последние годы: SlickEdit, Eclipse CDT. Все они были не пригодны для использования.

СУЩНОСТЬ: Я взял время и оценил "Visual Assist X", а также "Refactor for С++". Оба имеют некоторые впечатляющие функции, но оба они далеки от совершенства. Извлечение большого блока кода обычно не выполняется без ручных модификаций - и поэтому не окупается.

"Visual Assist X" имеет приятные функции, такие как гораздо более полное автозаполнение и т.д. Но это приводит к тому, что многие моменты мерцают и замедляются в определенные моменты.

По моему мнению, поэтому ответ: "Нет, нет готового инструмента рефакторинга для С++"

ОБНОВЛЕНИЕ Март 2015 Что касается hdoghmens, ответ сегодня я попробовал Resharper для С++. Его ссылка https://www.jetbrains.com/resharper/ ничего не говорит о С++. Но я нашел Resharper С++, который был анонсирован более года назад:

https://www.jetbrains.com/resharper/features/cpp.html

Я попробовал VC2010, используя базу кода 20 МБ.

Тест 1: Метод извлечения: приводит к исключению Resharper. Исходный код не изменился.

Тест 2: Метод извлечения с различным источником: Прекрасно работает

Тест 3: Изменить подпись извлеченной функции: Результаты в сломанном С++-коде:

bool myclass::do_work123(<unknown long Color>int& Filled*&, long, int&)

Возможно, поэтому С++ не указан на главной странице.

По моему мнению, ответ на этот вопрос по-прежнему есть "НЕТ" .

Ответ 2

Visual Assist и Visual Studio значительно облегчают работу с большими кодовыми базами. Visual Assist хорошо отслеживает, как используется класс или член, и более эффективен при переименовании без ложных срабатываний, чем поиск и замена.

Ответ 3

Я ожидаю, что clang значительно изменит ландшафт инструментов рефакторинга С++ там в течение следующих нескольких лет. Это модульный компилятор с открытым исходным кодом, который предоставляет API для синтаксического анализа и семантического анализа кода на С++. IDE и другие инструменты смогут использовать этот API, а не выполнять сложную работу по написанию собственного анализатора и семантического анализатора.

Google уже сделал крупномасштабный инструмент рефакторинга, используя clang.

Ответ 4

Mozilla имеет свой собственный инструмент рефакторинга под названием Pork (Wiki, Вики-разработчик). Здесь - блог разработчика за Pork. Из того, что я читал, Pork успешно использовалась в рефакторингах в Mozilla.

Свинина должна помочь, если вы пришли из * nix land, для Visual Studio я тоже рекомендую Visual Assist.

Ответ 5

Если вы используете emacs, попробуйте Xrefactory. Он поддерживает извлечение метода, переименование классов/функций/переменных и вставки/удаления/перемещения параметров. Он также имеет очень хороший/быстрый механизм завершения кода.

Ответ 6

Наш DMS Software Reengineering Toolkit - это механизм преобразования, предназначенный для выполнения сложных преобразований по большим телам кода, включая С++. Он был использован для создания надежных изменений в системах миллионов строк кода. Он работает с использованием точных анализаторов и трансформаторов с использованием компилятора.

Он имеет полный анализатор С++ с разрешением имени и типа, строит АСТ кода, может применять процедурные или исходные преобразования (с синтаксисом поверхности С++) для пересмотра этих деревьев и регенерировать компилируемый вывод с сохраненными комментариями. (Edit: 7/1/2011: теперь С++ 1X, насколько мы понимаем стандарт:)

Он был использован для крупномасштабных проектов реинжиниринга, включая повторное архивирование компонентов С++ и 100% полностью автоматизированных переводов между langauges. Вы можете прочитать об этом на веб-сайте.

DMS также используется для создания произвольных инструментов анализа исходного кода. Примеры включают обнаружение клонов, покрытие тестов, умную разницу (сравнение структур исходного кода и абстрактных операций редактирования, а не строк с простой вставкой и удалением) и т.д.

В настоящее время это не интерактивный инструмент рефакторинга. Мы считаем, что для большинства рефакторингов вам нужны глубокие анализы и анализ данных. У DMS есть общий механизм для поддержки этого, и этот механизм реализован для C, COBOL и Java в данный момент, причем С++ находится в очереди. Это трудная работа. Вы не увидите много серьезных инструментов рефакторинга С++ от кого-либо, пока эта проблема не будет решена хорошо. Сначала вам нужен полный анализатор С++: -}

EDIT 7/5/2011: Похоже, мы собираемся запустить интерактивную версию. Мы выиграли кафедру энергетической фазы я SBIR, чтобы исследовать, как это сделать. См. http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx (Ищите Семантические проекты под "Техасом" ). Не ожидайте результата в спешке; это всего лишь начало трехфазной многолетней программы, чтобы добраться до инструмента.

EDIT 8/11/2011: первый прогресс... теперь мы обрабатываем все директивы С++ 0x и OpenMP.

EDIT 1/4/2012: анализирует ли полный поток управления кодом С++.

РЕДАКТИРОВАТЬ 9/15/2014: теперь у нас есть синтаксический синтаксический анализатор/преобразователь С++ 14. Даже переименовывает довольно надежно в этот момент: -}

Ответ 7

В настоящее время я не могу рекомендовать инструмент рефакторинга для С++, конечно, не для больших кодовых баз из 100 тыс. строк и выше. Я надеялся, что это изменится, как OP, и я надеюсь, что когда-нибудь будет что-то. Я боюсь, что сам язык может значительно измениться, прежде чем мы увидим действительно хорошие инструменты.

btw, имеет ли SlickEdit свои функции рефакторинга?

Ответ 9

Нельзя не упомянуть Klocwork как набор рефакторинга коммерческого кода. Это выглядит очень многообещающим, когда вы проходите демонстрационное видео.

Ответ 10

Я рекомендую попробовать rtags, если вы используете emacs и еще не пробовали (есть также пакет для vim). Это клиентское/серверное приложение на основе clang, которое индексирует код C/С++, включая следующие функции:

  • перейти к определению/декларации
  • найти все ссылки, перейти к следующему/предыдущему
  • символ переименования
  • интеграция с clangs "fixits"

Я решил попробовать после просмотра этой беседы, в которой для меня были введены rtags (и emacs).

(Я должен сказать, что я пошел так далеко только после того, как мой QtCreator не смог переименовать некоторые символы правильно, что является показом-пробкой для моего использования этой большой IDE на данный момент)

Кроме того, что поддерживается rtags, мне также нужны некоторые дополнительные опрятные функции, в том числе:

  • создать определение функции/прототип
  • функция извлечения
  • создать методы getter/setter

Для этого я рекомендую использовать пакет semantic-refactor для emacs (не уверен, есть ли альтернативы для vim)

Как правило, инструменты на основе клана выглядят очень многообещающими. Если вас интересует больше информации о инструментах clang для рефакторинга С++, в том числе для проектов с большой базой кода, some отличные переговоры Чандлера Каррута.

Ответ 11

Если вы используете Visual С++ (Express Edition является бесплатным), вы можете использовать Visual Assist от www.wholetomato.com (ссылка на функции рефакторинга С++).

Он имеет 30-дневный пробный период, и мы обнаружили, что он быстрее и полнофункциональнее, чем встроенный intellisense в самом продукте Visual С++.

Ответ 12

Если вы хотите реорганизовать свою кодовую базу: MOOSE. Но это большая коллекция инструментов анализа и реинжиниринга, а не редактор.

Ответ 14

CLion выглядит очень многообещающим.

Отказ от ответственности: я еще не пробовал, так как мне нужно преобразовать свои проекты в формат CMake, чтобы использовать его.

Ответ 15

Definetely Resharper Ultimate - это путь. Счастье гарантировано:)

В бета-версии с марта 2015 года.

Ответ 16

Я нашел следующий плагин для Visual Studio 2013: Рефакторинг Visual С++ от Microsoft.

Это просто простой инструмент переименования, но он работает безупречно. После щелчка правой кнопкой мыши по символу он добавляет следующее контекстное меню:

введите описание изображения здесь

Ответ 17

Я рекомендую вам попробовать Lattix. Он позволяет анализировать большие кодовые базы C/С++, чтобы обнаружить архитектуру, выявить проблемные зависимости и перестроить код для улучшения модульности и сокращения технического долга. Lattix также предоставляет ряд алгоритмов, помогающих в процессе рефакторинга. Эти алгоритмы помогут вам понять, как перемещать элементы из одной части иерархии в другую, прерывать циклы и перемещать подсистемы, чтобы можно было улучшить сцепление и сплоченность подсистем. Вот результаты Lattix, анализирующие Android Kernel (1,6 миллиона LOC на C/С++). Полное раскрытие: я работаю для Lattix