metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-11-21 01:44 pm

diff и смысл сравниваемых файлов

А вот скажите, есть ли какая-нибудь вариация diff, умеющая не только сравнивать текст, а кроме того, еще и пользоваться информацией о структуре или смысле этого текста?
Например, сравнение двух исходников было бы намного гуманнее, если сначала их оба отпарсить в AST, а потом только сравнивать - сразу прекратились бы всевозможные заморочки типа "поменяли порядок расположения методов, переформатировали код - diff показывает хрень".
Если сравнивать что-то вроде таблиц БД, то очевидно, что сначала надо сравнить их метаданные, построить (возможно, при помощи человекопользователя) трансформацию одной таблицы в другую, а потом уже с ее учетом сравнивать, "что изменилось в записях".
В принципе, наверно можно такое сделать, прикрутив между diff и файлами какие-то промежуточные фильтры.

[identity profile] sorhed.livejournal.com 2010-11-21 12:46 pm (UTC)(link)
Мечта миллионов программистов реализована в IntelliJ IDEA. Но из командной строки не работает.

(весь код в редакторе парсится в AST в реальном времени, оттого и рефакторинги все работают как положено).

[identity profile] sergiej.livejournal.com 2010-11-21 01:05 pm (UTC)(link)
Кто бы сомневался. А Эклипс, конечно, не умеет :)

[identity profile] altmind.livejournal.com 2010-11-21 03:07 pm (UTC)(link)
неверно. в eclipse для java - structured compare. только вот толку, все равно текстовой дифф удобне.

[identity profile] sergiej.livejournal.com 2010-11-21 05:08 pm (UTC)(link)
Ну как кому, там текстовый дифф присутствует рядом, структуральное сравнение только для навигации. ИМХО это в тысячу раз удобнее чем бегать по тексту.

[identity profile] basanov.livejournal.com 2010-11-21 02:09 pm (UTC)(link)
Не работает дифф. Если я делаю ренейм класса, после чего изменяется 50 файлов, то любой другой программист видит 50 изменившихся файлов, а не "произведен ренейм".

[identity profile] thesz.livejournal.com 2010-11-21 05:12 pm (UTC)(link)
В darcs есть изменение "переименование".