Только что написал две новые команды, которые может обработать dpp:
#assert булево выражение
Пример вызова:
#assert (2 + 2 = 4) and (0 = Cardinal(nil))
Проверяет истинность утверждения, если оно не выполняется - выводит в лог информацию о том в каком файле, в какой строке, когда, и какое утверждение не верно.
#return результат
Пример:
#return ERROR_CANNOT_DO_ANYTHING
Возвращает из функции указанный результат, и выходит из функции
Это весьма простые конструкции, и добавление их поддержки требует написания парочки методов. В коде dpp есть глобальный класс PreProcessor, в котором нужно зарегистрировать необходимые обработчики. В настоящий момент поддерживаются только построчные обработчики:
// Line - текущая обрабатываемая строка в файле
// Fragment - часть строки, идущая после приставки
// (см. StartWord в RegistLineProcessor)
// через S возвращается то, что нужно вставить
// вместо приставки и Fragment'а
TLineProcessor = procedure (
PreProcessor: TPreProcessor;
const Line, Fragment: TString;
out S: TString
) of object;
К примеру, обработчик конструкции #assert выглядит так:
procedure TDebugProcessor.AssertProcess(
PreProcessor: TPreProcessor;
const Line, Fragment: TString;
out S: TString
);
begin
S := 'Debug.Assert(' + Fragment + ', ''' +
PreProcessor.CurrentFileName +
'(' + IntToStr(PreProcessor.CurrentLine) + ') ' +
Stringalize(Fragment) + ''');';
end;
Единственное, что я прокомментирую в этом коде, - функция Stringalize преобразует строку к печатному виду. А именно, если написать
#assert S = 'hello'
то чтобы сконструировать строку, содержащую "S = 'hello'" для печати в лог, мы должны удвоить кавычки по правилам паскаля. Именно это и делает Stringalize.
Для полного счастья осталось зарегистрировать функцию в обработчике:
PreProcessor.RegistLineProcessor('#assert', '*', AssertProcess);
Первый параметр (я его называю приставкой или StartWord) - с чего должна начинаться конструкция.
Второй параметр - паттерн, задающий как должна выглядет строка после приставки. В данном случае может быть что угодно, но, например, конструкция
#(6, 7, 2, 'hello')-> Notifier
не имеет опознавательных знаков в приставке, и потому задается паттерном
(*)->*
(на самом деле он другой, но это не важно).
Совершенно аналогично написан #return.
Комментариев нет:
Отправить комментарий