Есть ли бесплатная утилита сравнения, которая может сравнивать два файла C ++, используя их AST вместо текста?
То, о чем я думал, это что-то вроде
— конвертировать оба файла в AST
— Отобразить AST обратно как код C ++ (это канонизирует отступы)
— сделать нормальный diff между этими двумя
— Также попытайтесь обнаружить простые рефакторинги, которые были сделаны (например, добавьте / del / rename member)
Инструмент SmartDifferencer от Semantic Designs будет анализировать C ++ и вычислять разницу на основе AST; форматирование макета просто не имеет значения. Парсер является полным C ++ 11 парсером. Он может анализировать большинство исходных файлов, не раскрывая большинство директив препроцессора, если они «структурированы»; Использование препроцессора C ++ обычно не так оскорбительно, как в C.
Существуют версии SmartDifferencer для других языков.
[Раскрытие информации: я технический директор Semantic Designs]Я могу придумать два альтернативных решения вашей проблемы:
Обсудите стиль кодирования, который будет использоваться в качестве группы, и придерживайтесь его. Возможно, вам придется искать компромиссы между разными стилями кодирования членов команды.
Если вы используете управление исходным кодом, добавьте хуки, которые удаляют все форматирование при фиксации и настраивают форматирование кода при оформлении заказа. Это требует некоторых работ, но позволяет членам команды использовать свой собственный стиль форматирования. Конечно, это не решает разные мнения в именовании переменных и других неформатирующих элементах стиля кода.
Есть такие инструменты, как MOSS (http://theory.stanford.edu/~aiken/moss/) который может быть полезен
Вы можете передать код через AStyle, чтобы нормализовать отступ / интервал / форматирование перед выполнением diff. Это ничего не даст для рефакторингов, но, честно говоря, вам понадобится полный проход перед обработкой / компиляцией, чтобы сделать это правильно AFAICS.