понедельник, 30 марта 2015 г.

КопиПаста

Пока не нашел для scala работающей тулзы для поиска копипасты в коде. (Коллега немного грешен, в аду не я по этому поводу гореть буду). Есть 1-2 неработающих, но они на 2.9 и как-то уже несколько лет не активны.

Как всегда, (даже если вас съели) есть два выхода.

Тупой, и в то же время, обычно работающий вариант, смотреть на это все как на строки. И искать плагиат. Баян. Через "а".

А крутой способ - это иметь AST, и искать похожие поддеревья. В чем крутизна, что строить/парсить/лексить scala не надо, начиная с 2.11 тут нормальные механизмы. Пока руки коротки, но скоро все подключу.

Очевидно, что в каждом компиляторе все проходят через шаги c AST. То есть основная задача - это внедриться в процесс и в нужный момент искать копипасту. В реальности проблемы, что обычно это написано как монолитный кусок (тут можно бы добавить, но я тактично промолчу) кода. В C# почти сделали Roslynd, но я уже два года вне темы и C#. В gcc внедряются как-то, но я вообще вне темы. Уровень вхождения там сильно выше.

А в scala видится несложным. Макросы должны быть гораздо проще, но лично мне макросы пока тоже далековаты, хотя в пару мест и можно было бы запихнуть. Тут что-то рефлексией попахивает. В общем, надо копать.

Комментариев нет: