
Иногда встречаются ситуации когда необходимо немного изменить модуль в котором часто встречается однотипный код для которого нужно сделать небольшие поправки, в некоторых случаях спасают программы в которых по маске можно передалать код, однако при увеличении условий изменения, сложность операций возрастает и массовое изменение становится рутинным процессом.
Что бы избежать этого я поделюсь своими опытом в области массового изменения кода в сцене.
Мое самое первое применение массового парсинга и преобразование кода было когда я 3 года назад начал занимаца нашей сценовской вики и встал вопрос как оперативно добавить в вики код сцены с комментариями по шаблону. Для этого я создал проект в котором было 3 TMemo и в 3 прохода программа открывала каждый модуль искала нужные процедуры функции классы и коментарии к ним и делала соответсвующие перестановки. В результате которых получалась готовая вики страница с шаблоном. Программа была не идеальна и я бы сказал быдлокодесркая но она работала, тем не менее проект был закрыт ибо встала другая проблема нужно было такую массу перенести на вики и всю эту кучю страниц мне не хотелось вставлять вручную.

Буквально с годик Ростислав Ярский начал создавать GLScene 1.2 которая могла бы работать на платформе андроид и он сразу же ее имена модулей сделал в стиле C, однако FPC на только рождавшейся платформе андроид не воспринимал данное именование лишь только крайне сырой компилятор без андроида версии 2.7.1 мог это делать. По этому посовещавшись я пришел к выводу что придется переделывать имена модулей с точками на имена с нижним пробелом.
Для применения данной операции я решил сначала создать 2 списка, списка имен модулей с точками и через ТоталКомандер переделать первый список во второй в котором были имена модулей с "_". Затем создав программу парсер я просто напросто заменял во всех модулях встречающейся элементы модулей. Далее что бы это сработало полно я создал скрипт который изменял названия модулей на нужные в SVN репозиторий ибо просто так переименовать модуль нельзя было.
В результате я смог массово переименовать все модули за буквально час+ 2 дня ушло на разработку парсинга, тогда как Ярский потратил на все переделывания вручную целый месяц.
И вот недавно при разработках андроида встала проблема, дело в том что адаптер сцены позволяет работать на любых машинах. Однако на тех машинах на которых не встречается какой либо функции, на этапе динамической загрузки ставится заглушка. Она позволяет при вызовах прервать операцию рендеринга и вывести сообщение о том что произошел вызов не загрузившейся функции.
Все было бы хорошо и на обычной машине операцию каким нибудь макаром можно было бы отследить однако в данной ситуации небыло как такового дебаггера и все что можно было узнать о происходящих процессах это LogCat консоль и информация в ней.

Посовещавшись мы решили сделать с использованием парсинга заглушку на каждую функцию или метод встречающийся в OpenGLAdapterе в котором кроме варнинга выводилась бы имя функции или метода которого не удалось загрузить.
Следует отметить что возможно данная операция не потребовалась бы если бы в лазарусе работали анонимные методы Reference to procedure. А так как их небыло то пришлось добавить 5640 строчек безполезного кода и нужного только для отладки.
Дабы бесполезный код немазолил глаза, я его запихнул в отдельный модуль под названием glcaps.inc и подключал в нужный момент, данный метод работы с массивным кодом я позаимствовал у разрабочиков лазаруса.
Собственно вот так я делал массовые изменения кода если кому то потребуются исходник могу скинуть. Пример перехода от "." к "_" именованиям можно применить и для перехода от GLScene 1.1 к новой и обратно.
Спасибо за внимание! С уважением Рустам Асмандияров!