diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index bd9aa67..dde7f4e 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -13,7 +13,7 @@ jobs: fail-fast: false matrix: os: [windows-latest, macos-latest, ubuntu-latest] - oscript_version: ['1.3.0', 'stable', 'dev'] + oscript_version: ['1.7.0', 'stable', 'dev'] steps: # Загрузка проекта diff --git a/.vscode/launch.json b/.vscode/launch.json index 347529c..5ca1ec2 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,7 +8,7 @@ "name": "Отладка 1Script", "type": "oscript", "request": "launch", - "program": "${workspaceFolder}/tests/test.os", + "program": "${file}", "args": [], "cwd": "${workspaceRoot}", "env": {}, diff --git a/README.md b/README.md index bd40c04..1496f3d 100644 --- a/README.md +++ b/README.md @@ -231,3 +231,462 @@ docs - todo; // Имя поля, в котором хранится ссылка на исходный объект. Перем Поле_ИнстансОбъекта Экспорт; ``` + +--- + +## Новая версия API + + +## Пример использования: + +```bsl +#Использовать decorator + +КакойТоКласс = Новый КакойТоКласс(); +КакойТоКласс.Поле = 123; + +Поле = Новый Поле("НовоеПоле") + .Публичное() + .ЗначениеПоУмолчанию("ЗначениеПоУмолчанию"); + +Метод = Новый Метод("ДобавленнаяФункция") + .Публичный() + .ТелоМетода("Возврат Поле + 1;"); + +Перехватчик = Новый Перехватчик("ДобавленнаяФункция") + .ТипПерехватчика(ТипыПерехватчиковМетода.Перед) + .Тело("Сообщить(""Привет, мир!"")"); + +Декоратор = Новый КонструкторДекоратора(КакойТоКласс) + .ДобавитьИмпорт(Новый Импорт("fs")) + .ДобавитьПоле(Поле) + .ДобавитьМетод(Метод) + .ДобавитьПерехватчик(Перехватчик) + .Построить(); + +Ожидаем.Что(Декоратор.Поле).Равно(123); +Ожидаем.Что(Декоратор.РоднаяФункцияВозвращающаяИстина()).ЭтоИстина(); +Ожидаем.Что(Декоратор.ДобавленнаяФункция()).Равно(124); +``` + +## Документация по методам + +### ПостроительДекоратора + +#### ПриСозданииОбъекта + +```bsl +// Конструктор +// +// Параметры: +// Объект - Произвольный - Инстанс объекта, над которым нужно создать декоратор +// - Тип - Тип объекта, инстанс которого нужно создатьи задекорировать +// - Неопределено - Декоратор создаётся с нуля +// +Процедура ПриСозданииОбъекта(Объект = Неопределено) +``` + +#### ДобавитьПоле + +```bsl +// Добавляет в декоратор новое поле +// +// Параметры: +// Поле - Поле - Добавляемое поле +// +// Возвращаемое значение: +// ПостроительДекоратора - Ссылка на текущий инстанс ПостроительДекоратора +// +Функция ДобавитьПоле(Поле) Экспорт +``` + +#### ДобавитьМетод + +```bsl +// Добавляет в декоратор новый метод. +// +// Параметры: +// Метод - Метод - Добавляемый метод. +// +// Возвращаемое значение: +// ПостроительДекоратора - Ссылка на текущий инстанс ПостроительДекоратора +// +Функция ДобавитьМетод(Метод) Экспорт +``` + +#### ДобавитьПерехватчик + +```bsl +// Добавляет в декоратор перехватчик +// +// Параметры: +// Перехватчик - Перехватчик - Добавляемый перехватчик +// +// Возвращаемое значение: +// ПостроительДекоратора - Ссылка на текущий инстанс ПостроительДекоратора +// +Функция ДобавитьПерехватчик(Перехватчик) Экспорт +``` + +#### ДобавитьИмпорт + +```bsl +// Добавляет в декоратор импорт библиотеки (#Использовать). +// +// Параметры: +// Импорт - Импорт - Импорт бибилотеки +// +// Возвращаемое значение: +// ПостроительДекоратора - Ссылка на текущий инстанс ПостроительДекоратора +// +Функция ДобавитьИмпорт(Импорт) Экспорт +``` + +#### ДобавитьШагИнициализации + +```bsl +// Добавляет в декоратор шаг инициализации в тело модуля. +// +// Параметры: +// ШагИнициализации - ШагИнициализации - Выполняемый шаг инициализации +// +// Возвращаемое значение: +// ПостроительДекоратора - Ссылка на текущий инстанс ПостроительДекоратора +// +Функция ДобавитьШагИнициализации(ШагИнициализации) Экспорт +``` + +#### ДобавитьЗначениеПараметраКонструктораПоТипу + +```bsl +// Добавляет значение параметра для инициалзации объекта, в случае создания декоратора из типа +// +// Параметры: +// ЗначениеПараметра - Произвольный - Значение параметра конструктора по типу +// +// Возвращаемое значение: +// ПостроительДекоратора - Ссылка на текущий инстанс ПостроительДекоратора +// +Функция ДобавитьЗначениеПараметраКонструктораПоТипу(ЗначениеПараметра) Экспорт +``` + +#### ТекстСценария +```bsl +// Получить сконструированный текст сценария будущего декоратора +// +// Возвращаемое значение: +// Строка - Текст сценария декоратора +// +Функция ТекстСценария() Экспорт +``` + +#### Построить + +```bsl +// Сконструировать готовый декоратор по настройкам конструктора Декоратор. +// +// Параметры: +// ТекстСценария - Строка - Текст сценария декоратора. Если не задан, формируется автоматически. +// +// Возвращаемое значение: +// Произвольный - Декоратор над объектом, переданным в конструктор Декоратор +// +Функция Построить(ТекстСценария = Неопределено) Экспорт +``` + +### Аннотация + +#### ПриСозданииОбъекта + +```bsl +// Конструктор +// +// Параметры: +// ИмяАннотации - Строка - Имя добавляемой аннотации +// +Процедура ПриСозданииОбъекта(ИмяАннотации) +``` + +#### ДобавитьПараметр + +```bsl +// Добавлет параметр аннотации, допускается указание одного безымянного параметра +// +// Параметры: +// Значение - Строка, Число, Булево, Дата - Значение параметра +// Имя - Строка - Необязательный, имя параметра +// +// Возвращаемое значение: +// Аннотация - Ссылка на текущий инстанс Аннотация +// +Функция ДобавитьПараметр(Значение, Имя = "") Экспорт +``` + +### Импорт + +#### ПриСозданииОбъекта + +```bsl +// Конструктор +// +// Параметры: +// ПодключаемаяБиблиотека - Строка - Имя или путь подключаемой библиотеки +// +Процедура ПриСозданииОбъекта(ПодключаемаяБиблиотека) +``` + +#### ТипПодключения + +``` +// Устанавливает тип подключения библиотеки +// +// Параметры: +// УстанавлеваемыйТипПодключения - ТипыПодключенияБибилотек - Устанавливаемый тип подключения библиотеки +// +// Возвращаемое значение: +// Импорт - Ссылка на текущий инстанс Импорт +// +Функция ТипПодключения(УстанавлеваемыйТипПодключения) Экспорт +``` + +#### Метод + +```bsl +// Конструктор +// +// Параметры: +// ИмяМетода - Строка - Имя создаваемого метода +// +Процедура ПриСозданииОбъекта(ИмяМетода) +``` + +#### ДобавитьАннотацию + +```bsl +// Добавляет аннотацию метода +// +// Параметры: +// Аннотация - Аннотация - Добавляемая аннотация +// +// Возвращаемое значение: +// Метод - Ссылка на текущий инстанс Метод +// +Функция ДобавитьАннотацию(Аннотация) Экспорт +``` +#### ТелоМетода + +```bsl +// Устанавливает тело метода +// +// Параметры: +// ТелоМетода - Строка - Устанавливаемое тело метода +// +// Возвращаемое значение: +// Метод - Ссылка на текущий инстанс Метод +// +Функция ТелоМетода(ТелоМетода) Экспорт +``` + +#### ДобавитьПараметр + +```bsl +// Добавляет параметр метода +// +// Параметры: +// Параметр - ПараметрМетода - Добавляемый параметр метода +// +// Возвращаемое значение: +// Метод - Ссылка на текущий инстанс Метод +// +Функция ДобавитьПараметр(Параметр) Экспорт +``` + +#### Публичный + +```bsl +// Устанавливает экспорт метода +// +// Возвращаемое значение: +// Метод - Ссылка на текущий инстанс Метод +// +Функция Публичный() Экспорт +``` + +### ПараметрМетода + +#### ПриСозданииОбъекта + +```bsl +// Конструктор +// +// Параметры: +// ИмяПараметра - Строка - Имя параметра метода +// +Процедура ПриСозданииОбъекта(ИмяПараметра) +``` + +#### ПоЗначению + +```bsl +// Устанавливает Знач параметра +// +// Возвращаемое значение: +// ПараметрМетода - Ссылка на текущий инстанс ПараметрМетода +// +Функция ПоЗначению() Экспорт +``` + +#### ЗначениеПоУмолчанию + +```bsl +// Устанавливает значение по умолчанию для параметра +// +// Параметры: +// ЗначениеПоУмолчаниюПараметра - Строка, Число, Дата, Булево, Неопределено - Значение параметра по умолчанию +// +// Возвращаемое значение: +// ПараметрМетода - Ссылка на текущий инстанс ПараметрМетода +// +Функция ЗначениеПоУмолчанию(ЗначениеПоУмолчаниюПараметра) Экспорт +``` +#### ДобавитьАннотацию + +```bsl +// Добавляет аннотацию параметра +// +// Параметры: +// Аннотация - Аннотация - Добавляемая аннотация +// +// Возвращаемое значение: +// ПараметрМетода - Ссылка на текущий инстанс ПараметрМетода +// +Функция ДобавитьАннотацию(Аннотация) Экспорт +``` + +### Перехватчик + +#### ПриСозданииОбъекта + +```bsl +// Конструктор +// +// Параметры: +// ИмяПерехватываемогоМетода - Строка - Имя метода для которого предназначен перехватчик +// +Процедура ПриСозданииОбъекта(ИмяПерехватываемогоМетода) +``` + +#### Тело + +```bsl +// Устанавливает тело перехватчика +// +// Параметры: +// ТелоПерехватчика - Строка - Устанавливаемое тело перехватчика +// +// Возвращаемое значение: +// Перехватчик - Ссылка на текущий инстанс Перехватчик +// +Функция Тело(ТелоПерехватчика) Экспорт +``` + +#### ТипПерехватчика + +```bsl +// Устанавливает тип перехватчика +// +// Параметры: +// ТипПерехватчика - ТипыПерехватчиковМетода - Устанавливаемое тип перехватчика +// +// Возвращаемое значение: +// Перехватчик - Ссылка на текущий инстанс Перехватчик +// +Функция ТипПерехватчика(ТипПерехватчика) Экспорт +``` + +### Поле + +#### ПриСозданииОбъекта + +```bsl +// Конструктор +// +// Параметры: +// ИмяПоля - Строка - Имя поля +// +Процедура ПриСозданииОбъекта(ИмяПоля) +``` + +#### Публичное + +```bsl +// Устанавливает Экспорт поля +// +// Возвращаемое значение: +// Поле - Ссылка на текущий инстанс Поле +// +Функция Публичное() Экспорт +``` + +#### ЗначениеПоУмолчанию + +```bsl +// Устанавливает значение по умолчанию для поля +// +// Параметры: +// УстанавливаемоеЗначениеПоУмолчанию - Произвольный - Значение поля по умолчанию +// +// Возвращаемое значение: +// Поле - Ссылка на текущий инстанс Поле +// +Функция ЗначениеПоУмолчанию(УстанавливаемоеЗначениеПоУмолчанию) Экспорт +``` + +#### ДобавитьАннотацию + +```bsl +// Добавляет аннотацию поля +// +// Параметры: +// Аннотация - Аннотация - Добавляемая аннотация +// +// Возвращаемое значение: +// Поле - Ссылка на текущий инстанс Поле +// +Функция ДобавитьАннотацию(Аннотация) Экспорт +``` + +### ШагИнициализации + +#### ПриСозданииОбъекта + +```bsl +// Конструктор +// +// Параметры: +// ТелоШага - Строка - тело шага инциализации +// +Процедура ПриСозданииОбъекта(ТелоШага) +``` + +### Перечисление ТипыПерехватчиковМетода + +#### Перед +Перехватчик вызывается перед выполнением перехватываемого метода + +#### После +Перехватчик вызывается после выполнения перехватываемого метода + +### Перечисление ТипыПодключенияБибилотек + +#### ПоИмени +Библиотека подключается по имени: +```bsl +#Использовать fs +``` + +#### ПоПути +Библиотека подключается по пути к библиотеке: +```bsl +#Использовать "./libs/myLib" +``` diff --git a/cache/.lock b/cache/.lock deleted file mode 100644 index e69de29..0000000 diff --git a/lib.config b/lib.config index b1e475f..6a8dcf8 100644 --- a/lib.config +++ b/lib.config @@ -1,5 +1,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/packagedef b/packagedef index 5e368a4..e30a6ab 100644 --- a/packagedef +++ b/packagedef @@ -1,6 +1,6 @@ // BSLLS:CodeOutOfRegion-off Описание.Имя("decorator") - .Версия("1.2.0") + .Версия("1.3.0") .Автор("Nikita Gryzlov") .АдресАвтора("nixel2007@gmail.com") .Описание("Библиотека для создания декораторов над объектами") diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275\320\234\320\265\321\202\320\276\320\264\320\260.os_template" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275\320\234\320\265\321\202\320\276\320\264\320\260.os_template" index 5972b42..e36dd9f 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275\320\234\320\265\321\202\320\276\320\264\320\260.os_template" +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275\320\234\320\265\321\202\320\276\320\264\320\260.os_template" @@ -1,5 +1,5 @@ // {АннотацияМетода} -Функция Декоратор_ИмяМетода(Декоратор_ОписаниеПараметровМетода) Экспорт +Функция Декоратор_ИмяМетода(Декоратор_ОписаниеПараметровМетода) // {Экспорт} // {Декоратор_ПередВызовомМетода} diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275\320\234\320\265\321\202\320\276\320\264\320\260\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os_template" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275\320\234\320\265\321\202\320\276\320\264\320\260\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os_template" deleted file mode 100644 index 0cd230e..0000000 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275\320\234\320\265\321\202\320\276\320\264\320\260\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os_template" +++ /dev/null @@ -1,35 +0,0 @@ -// {АннотацияМетода} -Функция Декоратор_ИмяМетода(Декоратор_ОписаниеПараметровМетода) Экспорт - - Декоратор_ЗначениеПоля = Декоратор_Рефлектор.ПолучитьСвойство( - ЭтотОбъект, - Константы_Декоратор.Поле_ИнстансОбъекта - ); - ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ЗначениеПоля); - - // {Декоратор_ВыполняемаяСтрока} - // {Декоратор_ТипМетода} - Декоратор_ВозвращаемоеИзМетодаЗначение = NULL; - - Декоратор_Лог.Отладка(Декоратор_ВыполняемаяСтрока); - Декоратор_Лог.Отладка(Декоратор_ТипМетода); - - // {Декоратор_ПередВызовомМетода} - - Если Декоратор_ТипМетода Тогда - Декоратор_ВозвращаемоеИзМетодаЗначение = Вычислить(Декоратор_ВыполняемаяСтрока); - Иначе - Выполнить(Декоратор_ВыполняемаяСтрока); - КонецЕсли; - - ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ЗначениеПоля, ЭтотОбъект); - - Если Декоратор_ВозвращаемоеИзМетодаЗначение = Декоратор_ЗначениеПоля Тогда - Декоратор_ВозвращаемоеИзМетодаЗначение = ЭтотОбъект; - КонецЕсли; - - // {Декоратор_ПослеВызоваМетода} - - // {Декоратор_ВозвращаемоеЗначение} - -КонецФункции diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275\320\242\320\265\320\273\320\276\320\234\320\265\321\202\320\276\320\264\320\260\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os_template" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275\320\242\320\265\320\273\320\276\320\234\320\265\321\202\320\276\320\264\320\260\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os_template" new file mode 100644 index 0000000..6a567ff --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275\320\242\320\265\320\273\320\276\320\234\320\265\321\202\320\276\320\264\320\260\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os_template" @@ -0,0 +1,30 @@ +Декоратор_ЗначениеПоля = Декоратор_Рефлектор.ПолучитьСвойство( + ЭтотОбъект, + Константы_Декоратор.Поле_ИнстансОбъекта +); +ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ЗначениеПоля); + +// {Декоратор_ВыполняемаяСтрока} +// {Декоратор_ТипМетода} +Декоратор_ВозвращаемоеИзМетодаЗначение = NULL; + +Декоратор_Лог.Отладка(Декоратор_ВыполняемаяСтрока); +Декоратор_Лог.Отладка(Декоратор_ТипМетода); + +// {Декоратор_ПередВызовомМетода} + +Если Декоратор_ТипМетода Тогда + Декоратор_ВозвращаемоеИзМетодаЗначение = Вычислить(Декоратор_ВыполняемаяСтрока); +Иначе + Выполнить(Декоратор_ВыполняемаяСтрока); +КонецЕсли; + +ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ЗначениеПоля, ЭтотОбъект); + +Если Декоратор_ВозвращаемоеИзМетодаЗначение = Декоратор_ЗначениеПоля Тогда + Декоратор_ВозвращаемоеИзМетодаЗначение = ЭтотОбъект; +КонецЕсли; + +// {Декоратор_ПослеВызоваМетода} + +// {Декоратор_ВозвращаемоеЗначение} diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\320\270\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\320\270\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200.os" new file mode 100644 index 0000000..13a6940 --- /dev/null +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\320\270\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200.os" @@ -0,0 +1,21 @@ +#Область ПрограммныйИнтерфейс + +Функция ОписаниеАннотаций(Аннотации, ВОднуСтроку = Ложь) Экспорт + + ОписаниеАннотаций = Новый Массив(); + + Для каждого Аннотация Из Аннотации Цикл + + ОписаниеАннотаций.Добавить( + Аннотация.Описание() + ); + + КонецЦикла; + + Разделитель = ?(ВОднуСтроку, " ", Символы.ПС); + + Возврат СтрСоединить(ОписаниеАннотаций, Разделитель) + +КонецФункции + +#КонецОбласти diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\321\215\321\210\320\270\321\200\321\203\320\265\320\274\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\321\215\321\210\320\270\321\200\321\203\320\265\320\274\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265.os" index b988535..c75afb0 100644 --- "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\321\215\321\210\320\270\321\200\321\203\320\265\320\274\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265.os" +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\321\215\321\210\320\270\321\200\321\203\320\265\320\274\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265.os" @@ -1,6 +1,13 @@ -Перем ТекстШаблонаОбъектаДекоратора; -Перем ТекстШаблонаМетодаДекоратора; -Перем ТекстШаблонаПользовательскогоМетода; +#Область ОписаниеПеременных + +Перем ТекстШаблонаОбъектаДекоратора; // Шаблон объекта дкоратора +Перем ТекстШаблонаМетодаДекоратора; // Шаблон декорируемого метода +Перем ТекстШаблонаПользовательскогоМетода; // Шаблон добавляемого метода +Перем ТекстШаблонаТелоМетодаДекоратора; // Шаблон тела декорируемого метода + +#КонецОбласти + +#Область ПрограммныйИнтерфейс // Текст шаблона с содержимым сценария декоратора // @@ -16,11 +23,24 @@ КонецФункции Функция ТекстШаблонаМетодаДекоратора() Экспорт + Если ТекстШаблонаМетодаДекоратора = Неопределено Тогда - ТекстШаблонаМетодаДекоратора = ПрочитатьТекстШаблона("ШаблонМетодаДекоратора.os_template"); + + ТекстШаблона = ТекстШаблонаПользовательскогоМетода(); + + ТекстШаблона = СтрЗаменить(ТекстШаблона, "// {Декоратор_ПередВызовомМетода}", ""); + ТекстШаблона = СтрЗаменить(ТекстШаблона, "// {Декоратор_ПослеВызоваМетода}", ""); + + ТекстШаблонаМетодаДекоратора = СтрЗаменить( + ТекстШаблона, + "// {Декоратор_ТекстМетода}", + ТекстШаблонаТелоМетодаДекоратора() + ); + КонецЕсли; Возврат ТекстШаблонаМетодаДекоратора; + КонецФункции Функция ТекстШаблонаПользовательскогоМетода() Экспорт @@ -31,6 +51,18 @@ Возврат ТекстШаблонаПользовательскогоМетода; КонецФункции +Функция ТекстШаблонаТелоМетодаДекоратора() Экспорт + Если ТекстШаблонаТелоМетодаДекоратора = Неопределено Тогда + ТекстШаблонаТелоМетодаДекоратора = ПрочитатьТекстШаблона("ШаблонТелоМетодаДекоратора.os_template"); + КонецЕсли; + + Возврат ТекстШаблонаТелоМетодаДекоратора; +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + Функция ПрочитатьТекстШаблона(ИмяШаблона) КаталогТекущегоСценария = ТекущийСценарий().Каталог; ПутьКШаблонуДекоратора = ОбъединитьПути( @@ -46,3 +78,5 @@ Возврат ТекстШаблонаДекоратора; КонецФункции + +#КонецОбласти diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200.os" "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200.os" new file mode 100644 index 0000000..4996f16 --- /dev/null +++ "b/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200.os" @@ -0,0 +1,15 @@ +Функция ОписаниеЗначения(Значение) Экспорт + + Если Значение = Неопределено Тогда + Возврат "Неопределено"; + ИначеЕсли ТипЗнч(Значение) = Тип("Строка") Тогда + Возврат СтрШаблон("""%1""", Значение); + ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда + Возврат Формат(Значение, "БЛ=Ложь; БИ=Истина"); + ИначеЕсли ТипЗнч(Значение) = Тип("Дата") Тогда + Возврат Формат(Значение, "ДФ=yyyyMMdd"); + Иначе + Возврат Строка(Значение); + КонецЕсли; + +КонецФункции diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217.os" new file mode 100644 index 0000000..2153508 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217.os" @@ -0,0 +1,90 @@ +#Использовать "../internal" + +#Область ОписаниеПеременных + +Перем Имя; // Имя аннотации +Перем ПараметрыАннотации; // Параметры аннотации + +#КонецОбласти + +// Конструктор +// +// Параметры: +// ИмяАннотации - Строка - Имя добавляемой аннотации +// +Процедура ПриСозданииОбъекта(ИмяАннотации) + + Имя = ИмяАннотации; + + ПараметрыАннотации = Новый Массив; + +КонецПроцедуры + +#Область ПрограммныйИнтерфейс + +// Добавлет параметр аннотации, допускается указание одного безымянного параметра +// +// Параметры: +// Значение - Строка, Число, Булево, Дата - Значение параметра +// Имя - Строка - Необязательный, имя параметра +// +// Возвращаемое значение: +// Аннотация - Ссылка на текущий инстанс Аннотация +// +Функция ДобавитьПараметр(Значение, Имя = "") Экспорт + + // В случае если у аннотации один параметр, его имя можно опустить, проверим этот инвариант + Если ПустаяСтрока(Имя) И ПараметрыАннотации.Количество() <> 0 Тогда + ВызватьИсключение "Запрещено указывать параметр аннотации без имени если параметров больше одного"; + КонецЕсли; + + ПараметрАннотации = Новый Структура( + "Имя, Значение", + Имя, + Значение + ); + + ПараметрыАннотации.Добавить(ПараметрАннотации); + + Возврат ЭтотОбъект; + +КонецФункции + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Строковое представление аннотации +// +// Возвращаемое значение: +// Строка - Строковое представление аннотации +// +Функция Описание() Экспорт + + ОписаниеПараметров = Новый Массив(); + + Для каждого ПараметрАннотации Из ПараметрыАннотации Цикл + + Значение = ПараметрыМенеджер.ОписаниеЗначения(ПараметрАннотации.Значение); + + ОписаниеПараметров.Добавить(?( + ПустаяСтрока(ПараметрАннотации.Имя), + Значение, + СтрШаблон("%1 = %2", ПараметрАннотации.Имя, Значение) + )); + + КонецЦикла; + + Если ОписаниеПараметров.Количество() = 0 Тогда + + Возврат СтрШаблон("&%1", Имя); + + Иначе + + Возврат СтрШаблон("&%1(%2)", Имя, СтрСоединить(ОписаниеПараметров, ", ")); + + КонецЕсли; + +КонецФункции + +#КонецОбласти diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\274\320\277\320\276\321\200\321\202.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\274\320\277\320\276\321\200\321\202.os" new file mode 100644 index 0000000..1eb53af --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\274\320\277\320\276\321\200\321\202.os" @@ -0,0 +1,63 @@ +#Использовать "../internal" + +#Область ОписаниеПеременных + +Перем Библиотека; // Подключаемая библиотека +Перем ТипПодключения; // Тип подключения библиотеки + +#КонецОбласти + +// Конструктор +// +// Параметры: +// ПодключаемаяБиблиотека - Строка - Имя или путь подключаемой библиотеки +// +Процедура ПриСозданииОбъекта(ПодключаемаяБиблиотека) + + Библиотека = ПодключаемаяБиблиотека; + + ТипПодключения = ТипыПодключенияБибилотек.ПоИмени; + +КонецПроцедуры + +#Область ПрограммныйИнтерфейс + +// Устанавливает тип подключения библиотеки +// +// Параметры: +// УстанавлеваемыйТипПодключения - ТипыПодключенияБибилотек - Устанавливаемый тип подключения библиотеки +// +// Возвращаемое значение: +// Импорт - Ссылка на текущий инстанс Импорт +// +Функция ТипПодключения(УстанавлеваемыйТипПодключения) Экспорт + + ТипПодключения = УстанавлеваемыйТипПодключения; + + Возврат ЭтотОбъект; + +КонецФункции + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Строковое представление импорта +// +// Возвращаемое значение: +// Строка - Строковое представление импорта +// +Функция Описание() Экспорт + + Возврат СтрШаблон( + "#Использовать %1", + ?( + ТипПодключения = ТипыПодключенияБибилотек.ПоИмени, + Библиотека, + ПараметрыМенеджер.ОписаниеЗначения(Библиотека) + ) + ); + +КонецФункции + +#КонецОбласти diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" index 08f179a..8b0eddc 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" @@ -390,7 +390,8 @@ НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ВыполняемаяСтрока}", ВыполняемаяСтрока); НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ТипМетода}", ТипМетода); НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ВозвращаемоеЗначение}", ВозвращаемоеЗначение); - + НовыйМетод = СтрЗаменить(НовыйМетод, "// {Экспорт}", "Экспорт"); + ДобавитьПерехватчикиМетода(ИмяМетода, НовыйМетод); НовыйМетод = НовыйМетод + Символы.ПС; @@ -415,6 +416,7 @@ НовыйМетод = СтрЗаменить(НовыйМетод, "Декоратор_ИмяМетода", ИмяМетода); НовыйМетод = СтрЗаменить(НовыйМетод, "Декоратор_ОписаниеПараметровМетода", ОписаниеПараметровМетода); НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ТекстМетода}", Метод.ТекстМетода); + НовыйМетод = СтрЗаменить(НовыйМетод, "// {Экспорт}", "Экспорт"); ДобавитьПерехватчикиМетода(ИмяМетода, НовыйМетод); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\321\202\320\276\320\264.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\321\202\320\276\320\264.os" new file mode 100644 index 0000000..df01d8f --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\321\202\320\276\320\264.os" @@ -0,0 +1,137 @@ +#Использовать "../internal" + +#Область ОписаниеПеременных + +Перем Имя; // Имя метода +Перем Аннотации; // Аннотации метода +Перем Тело; // Тело метода +Перем Параметры; // Параметры метода +Перем Публичный; // Экспортный метод + +#КонецОбласти + +// Конструктор +// +// Параметры: +// ИмяМетода - Строка - Имя создаваемого метода +// +Процедура ПриСозданииОбъекта(ИмяМетода) + + Имя = ИмяМетода; + + Аннотации = Новый Массив; + Параметры = Новый Массив; + Тело = ""; + Публичный = Ложь; + +КонецПроцедуры + +#Область ПрограммныйИнтерфейс + +// Добавляет аннотацию метода +// +// Параметры: +// Аннотация - Аннотация - Добавляемая аннотация +// +// Возвращаемое значение: +// Метод - Ссылка на текущий инстанс Метод +// +Функция ДобавитьАннотацию(Аннотация) Экспорт + + Аннотации.Добавить(Аннотация); + + Возврат ЭтотОбъект; + +КонецФункции + +// Устанавливает тело метода +// +// Параметры: +// ТелоМетода - Строка - Устанавливаемое тело метода +// +// Возвращаемое значение: +// Метод - Ссылка на текущий инстанс Метод +// +Функция ТелоМетода(ТелоМетода) Экспорт + + Тело = ТелоМетода; + + Возврат ЭтотОбъект; + +КонецФункции + +// Добавляет параметр метода +// +// Параметры: +// Параметр - ПараметрМетода - Добавляемый параметр метода +// +// Возвращаемое значение: +// Метод - Ссылка на текущий инстанс Метод +// +Функция ДобавитьПараметр(Параметр) Экспорт + + Параметры.Добавить(Параметр); + + Возврат ЭтотОбъект; + +КонецФункции + +// Устанавливает экспорт метода +// +// Возвращаемое значение: +// Метод - Ссылка на текущий инстанс Метод +// +Функция Публичный() Экспорт + + Публичный = Истина; + + Возврат ЭтотОбъект; + +КонецФункции + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Имя метода +// +// Возвращаемое значение: +// Строка - Имя метода +// +Функция ИмяМетода() Экспорт + Возврат Имя; +КонецФункции + +// Строковое представление метода +// +// Возвращаемое значение: +// Строка - Строковое представление метода +// +Функция Описание() Экспорт + + ОписаниеПараметров = Новый Массив(); + + Для Каждого Параметр Из Параметры Цикл + + ОписаниеПараметров.Добавить( + Параметр.Описание() + ); + + КонецЦикла; + + НовыйМетод = КэшируемыеДанные.ТекстШаблонаПользовательскогоМетода(); + + СтрокаАннотацийМетода = АннотацииМенеджер.ОписаниеАннотаций(Аннотации); + ОписаниеПараметровМетода = СтрСоединить(ОписаниеПараметров, ", "); + + НовыйМетод = СтрЗаменить(НовыйМетод, "// {АннотацияМетода}", СтрокаАннотацийМетода); + НовыйМетод = СтрЗаменить(НовыйМетод, "Декоратор_ИмяМетода", Имя); + НовыйМетод = СтрЗаменить(НовыйМетод, "Декоратор_ОписаниеПараметровМетода", ОписаниеПараметровМетода); + НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ТекстМетода}", Тело); + НовыйМетод = СтрЗаменить(НовыйМетод, "// {Экспорт}", ?(Публичный, "Экспорт", "")); + + Возврат НовыйМетод; + +КонецФункции + +#КонецОбласти diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\234\320\265\321\202\320\276\320\264\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\234\320\265\321\202\320\276\320\264\320\260.os" new file mode 100644 index 0000000..f7bf11d --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\234\320\265\321\202\320\276\320\264\320\260.os" @@ -0,0 +1,101 @@ +#Использовать "../internal" + +#Область ОписаниеПеременных + +Перем ПоЗначению; // Параметр передаётся по значению +Перем Имя; // Имя параметра +Перем ЕстьЗначениеПоУмолчанию; // Задано значение по умолчанию для параметра +Перем ЗначениеПоУмолчанию; // Значение по умолчанию параметра +Перем Аннотации; // Аннотации параметра + +#КонецОбласти + +// Конструктор +// +// Параметры: +// ИмяПараметра - Строка - Имя параметра метода +// +Процедура ПриСозданииОбъекта(ИмяПараметра) + + Имя = ИмяПараметра; + + ПоЗначению = Ложь; + ЕстьЗначениеПоУмолчанию = Ложь; + Аннотации = Новый Массив; + +КонецПроцедуры + +#Область ПрограммныйИнтерфейс + +// Устанавливает Знач параметра +// +// Возвращаемое значение: +// ПараметрМетода - Ссылка на текущий инстанс ПараметрМетода +// +Функция ПоЗначению() Экспорт + + ПоЗначению = Истина; + + Возврат ЭтотОбъект; + +КонецФункции + +// Устанавливает значение по умолчанию для параметра +// +// Параметры: +// ЗначениеПоУмолчаниюПараметра - Строка, Число, Дата, Булево, Неопределено - Значение параметра по умолчанию +// +// Возвращаемое значение: +// ПараметрМетода - Ссылка на текущий инстанс ПараметрМетода +// +Функция ЗначениеПоУмолчанию(ЗначениеПоУмолчаниюПараметра) Экспорт + + ЗначениеПоУмолчанию = ЗначениеПоУмолчаниюПараметра; + ЕстьЗначениеПоУмолчанию = Истина; + + Возврат ЭтотОбъект; + +КонецФункции + +// Добавляет аннотацию параметра +// +// Параметры: +// Аннотация - Аннотация - Добавляемая аннотация +// +// Возвращаемое значение: +// ПараметрМетода - Ссылка на текущий инстанс ПараметрМетода +// +Функция ДобавитьАннотацию(Аннотация) Экспорт + + Аннотации.Добавить(Аннотация); + + Возврат ЭтотОбъект; + +КонецФункции + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Строковое представление параметра +// +// Возвращаемое значение: +// Строка - Строковое представление параметра +// +Функция Описание() Экспорт + + ОписаниеАннотаций = АннотацииМенеджер.ОписаниеАннотаций(Аннотации, Истина); + + ОписаниеЗначенияПоУмолчанию = ПараметрыМенеджер.ОписаниеЗначения(ЗначениеПоУмолчанию); + + Возврат СтрШаблон( + "%1 %2 %3 %4", + ОписаниеАннотаций, + ?(ПоЗначению, "Знач", ""), + Имя, + ?(ЕстьЗначениеПоУмолчанию, СтрШаблон(" = %1", ОписаниеЗначенияПоУмолчанию), "") + ); + +КонецФункции + +#КонецОбласти diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\265\321\200\320\265\321\205\320\262\320\260\321\202\321\207\320\270\320\272.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\265\321\200\320\265\321\205\320\262\320\260\321\202\321\207\320\270\320\272.os" new file mode 100644 index 0000000..42fec54 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\265\321\200\320\265\321\205\320\262\320\260\321\202\321\207\320\270\320\272.os" @@ -0,0 +1,77 @@ +#Область ОписаниеПеременных + +Перем ИмяМетода; // Имя перехватываемого метода +Перем Тип; // Тип перехватчика +Перем Тело; // Тело перехватчика + +#КонецОбласти + +// Конструктор +// +// Параметры: +// ИмяПерехватываемогоМетода - Строка - Имя метода для которого предназначен перехватчик +// +Процедура ПриСозданииОбъекта(ИмяПерехватываемогоМетода) + + ИмяМетода = ИмяПерехватываемогоМетода; + +КонецПроцедуры + +#Область ПрограммныйИнтерфейс + +// Устанавливает тело перехватчика +// +// Параметры: +// ТелоПерехватчика - Строка - Устанавливаемое тело перехватчика +// +// Возвращаемое значение: +// Перехватчик - Ссылка на текущий инстанс Перехватчик +// +Функция Тело(ТелоПерехватчика) Экспорт + + Тело = ТелоПерехватчика; + + Возврат ЭтотОбъект; + +КонецФункции + +// Устанавливает тип перехватчика +// +// Параметры: +// ТипПерехватчика - ТипыПерехватчиковМетода - Устанавливаемое тип перехватчика +// +// Возвращаемое значение: +// Перехватчик - Ссылка на текущий инстанс Перехватчик +// +Функция ТипПерехватчика(ТипПерехватчика) Экспорт + + Тип = ТипПерехватчика; + + Возврат ЭтотОбъект; + +КонецФункции + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Описание перехватчика +// +// Возвращаемое значение: +// Структура - описание перехватчика: +// * ИмяМетода - Строка - Перехватываемый метод +// * ТипПерехватчика - ТипыПерехватчиковМетода - Тип перехватчика +// * ТелоПерехватчика - Строка - Исполняемый код перехватчика +// +Функция Описание() Экспорт + + Возврат Новый Структура( + "ИмяМетода, ТипПерехватчика, ТелоПерехватчика", + ИмяМетода, + Тип, + Тело + ); + +КонецФункции + +#КонецОбласти diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\273\320\265.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\273\320\265.os" new file mode 100644 index 0000000..cc7749b --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\273\320\265.os" @@ -0,0 +1,118 @@ +#Использовать "../internal" + +#Область ОписаниеПеременных + +Перем Имя; // Имя поля +Перем Публичное; // Поле экспортное +Перем ЗначениеПоУмолчанию; // Значение поля по умолчанию +Перем ЕстьЗначениеПоУмолчанию; // Есть значение по умолчанию +Перем Аннотации; // Аннотации поля + +#КонецОбласти + +// Конструктор +// +// Параметры: +// ИмяПоля - Строка - Имя поля +// +Процедура ПриСозданииОбъекта(ИмяПоля) + + Имя = ИмяПоля; + + Публичное = Ложь; + ЕстьЗначениеПоУмолчанию = Ложь; + Аннотации = Новый Массив; + +КонецПроцедуры + +#Область ПрограммныйИнтерфейс + +// Устанавливает Экспорт поля +// +// Возвращаемое значение: +// Поле - Ссылка на текущий инстанс Поле +// +Функция Публичное() Экспорт + + Публичное = Истина; + + Возврат ЭтотОбъект; + +КонецФункции + +// Устанавливает значение по умолчанию для поля +// +// Параметры: +// УстанавливаемоеЗначениеПоУмолчанию - Произвольный - Значение поля по умолчанию +// +// Возвращаемое значение: +// Поле - Ссылка на текущий инстанс Поле +// +Функция ЗначениеПоУмолчанию(УстанавливаемоеЗначениеПоУмолчанию) Экспорт + + ЕстьЗначениеПоУмолчанию = Истина; + ЗначениеПоУмолчанию = УстанавливаемоеЗначениеПоУмолчанию; + + Возврат ЭтотОбъект; + +КонецФункции + +// Добавляет аннотацию поля +// +// Параметры: +// Аннотация - Аннотация - Добавляемая аннотация +// +// Возвращаемое значение: +// Поле - Ссылка на текущий инстанс Поле +// +Функция ДобавитьАннотацию(Аннотация) Экспорт + + Аннотации.Добавить(Аннотация); + + Возврат ЭтотОбъект; + +КонецФункции + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Строковое представление поля +// +// Возвращаемое значение: +// Строка - Строковое представление поля +// +Функция Описание() Экспорт + + ОписаниеАннотаций = АннотацииМенеджер.ОписаниеАннотаций(Аннотации); + + Возврат СтрШаблон( + "%1 + |Перем %2 %3;", + ОписаниеАннотаций, + Имя, + ?(Публичное, "Экспорт", "") + ); + +КонецФункции + +// Описание значения по умолчанию поля +// +// Возвращаемое значение: +// Структура - Описание значения по умолчанию поля: +// * ИмяПоля - Строка - Имя поля +// * ЕстьЗначениеПоУмолчанию - Булево - Значение по умолчанию задано +// * ЗначениеПоУмолчанию - Произваольный - Значение по умолчанию +// +Функция ОписаниеЗначенияПоУмолчанию() Экспорт + + Возврат Новый Структура( + "ИмяПоля, ЕстьЗначениеПоУмолчанию, ЗначениеПоУмолчанию", + Имя, + ЕстьЗначениеПоУмолчанию, + ЗначениеПоУмолчанию + ); + +КонецФункции + +#КонецОбласти diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" new file mode 100644 index 0000000..aa628e0 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" @@ -0,0 +1,519 @@ +#Использовать logos +#Использовать "../internal" + +#Область ОписаниеПеременных + +// Инстанс логгера +Перем Лог; + +// Ссылка на исходный объект +Перем ИсходныйОбъект; + +// Ссылка на конструируемый декоратор +Перем Декоратор; + +// Массив добавленных пользователем методов +Перем ПользовательскиеМетоды; + +// Массив добавленных пользователем полей +Перем ПользовательскиеПоля; + +// Массив добавленных польвователем импортов библиотек +Перем ПользовательскиеИмпорты; + +// Массив добавленнных пользователем шагов инициализации +Перем ПользовательскиеШагиИнициализации; + +// Массив добавленных пользователем перехватичков вызовов методов +Перем ПерехватчикиМетодов; + +// Массив значения параметров инициализатора объекта по типу +Перем ЗначенияПараметровКонструктораПоТипу; + +// Декоратор создаётся из типа +Перем РежимСозданияИзТипа; + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Добавляет в декоратор новое поле +// +// Параметры: +// Поле - Поле - Добавляемое поле +// +// Возвращаемое значение: +// ПостроительДекоратора - Ссылка на текущий инстанс ПостроительДекоратора +// +Функция ДобавитьПоле(Поле) Экспорт + + ПользовательскиеПоля.Добавить(Поле); + + Возврат ЭтотОбъект; + +КонецФункции + +// Добавляет в декоратор новый метод. +// +// Параметры: +// Метод - Метод - Добавляемый метод. +// +// Возвращаемое значение: +// ПостроительДекоратора - Ссылка на текущий инстанс ПостроительДекоратора +// +Функция ДобавитьМетод(Метод) Экспорт + + ПользовательскиеМетоды.Добавить(Метод); + + Возврат ЭтотОбъект; + +КонецФункции + +// Добавляет в декоратор перехватчик +// +// Параметры: +// Перехватчик - Перехватчик - Добавляемый перехватчик +// +// Возвращаемое значение: +// ПостроительДекоратора - Ссылка на текущий инстанс ПостроительДекоратора +// +Функция ДобавитьПерехватчик(Перехватчик) Экспорт + + ПерехватчикиМетодов.Добавить(Перехватчик); + + Возврат ЭтотОбъект; + +КонецФункции + +// Добавляет в декоратор импорт библиотеки (#Использовать). +// +// Параметры: +// Импорт - Импорт - Импорт бибилотеки +// +// Возвращаемое значение: +// ПостроительДекоратора - Ссылка на текущий инстанс ПостроительДекоратора +// +Функция ДобавитьИмпорт(Импорт) Экспорт + + ПользовательскиеИмпорты.Добавить(Импорт); + + Возврат ЭтотОбъект; + +КонецФункции + +// Добавляет в декоратор шаг инициализации в тело модуля. +// +// Параметры: +// ШагИнициализации - ШагИнициализации - Выполняемый шаг инициализации +// +// Возвращаемое значение: +// ПостроительДекоратора - Ссылка на текущий инстанс ПостроительДекоратора +// +Функция ДобавитьШагИнициализации(ШагИнициализации) Экспорт + + ПользовательскиеШагиИнициализации.Добавить(ШагИнициализации); + + Возврат ЭтотОбъект; + +КонецФункции + +// Добавляет значение параметра для инициалзации объекта, в случае создания декоратора из типа +// +// Параметры: +// ЗначениеПараметра - Произвольный - Значение параметра конструктора по типу +// +// Возвращаемое значение: +// ПостроительДекоратора - Ссылка на текущий инстанс ПостроительДекоратора +// +Функция ДобавитьЗначениеПараметраКонструктораПоТипу(ЗначениеПараметра) Экспорт + + Если Не РежимСозданияИзТипа Тогда + ВызватьИсключение "Значения параметров конструктора по типу задаются только для декораторов типа"; + КонецЕсли; + + ЗначенияПараметровКонструктораПоТипу.Добавить(ЗначениеПараметра); + + Возврат ЭтотОбъект; + +КонецФункции + +// Получить сконструированный текст сценария будущего декоратора +// +// Возвращаемое значение: +// Строка - Текст сценария декоратора +// +Функция ТекстСценария() Экспорт + + Лог.Отладка("Тип исходного объекта: %1", ТипЗнч(ИсходныйОбъект)); + Лог.Отладка("Представление исходного объекта: %1", ИсходныйОбъект); + + ТекстСценарияДекоратора = КэшируемыеДанные.ТекстШаблонаОбъектаДекоратора(); + + ТекстСценарияДекоратора = СтрЗаменить(ТекстСценарияДекоратора, "// {Область импортов}", ОбластьИмпортов()); + ТекстСценарияДекоратора = СтрЗаменить(ТекстСценарияДекоратора, "// {Область переменных}", ОбластьПеременных()); + ТекстСценарияДекоратора = СтрЗаменить(ТекстСценарияДекоратора, "// {Область методов}", ОбластьМетодов()); + ТекстСценарияДекоратора = СтрЗаменить(ТекстСценарияДекоратора, "// {Инициализация}", ОбластьИнициализации()); + + Возврат ТекстСценарияДекоратора; + +КонецФункции + +// Сконструировать готовый декоратор по настройкам конструктора Декоратор. +// +// Параметры: +// ТекстСценария - Строка - Текст сценария декоратора. Если не задан, формируется автоматически. +// +// Возвращаемое значение: +// Произвольный - Декоратор над объектом, переданным в конструктор Декоратор +// +Функция Построить(ТекстСценария = Неопределено) Экспорт + Если ТекстСценария = Неопределено Тогда + ТекстСценария = ТекстСценария(); + КонецЕсли; + Декоратор = СоздатьДекоратор(ТекстСценария); + Возврат Декоратор; +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Конструктор +// +// Параметры: +// Объект - Произвольный - Инстанс объекта, над которым нужно создать декоратор +// - Тип - Тип объекта, инстанс которого нужно создатьи задекорировать +// - Неопределено - Декоратор создаётся с нуля +// +Процедура ПриСозданииОбъекта(Объект = Неопределено) + + ИсходныйОбъект = Объект; + + РежимСозданияИзТипа = ТипЗнч(ИсходныйОбъект) = Тип("Тип"); + + Лог = Логирование.ПолучитьЛог("oscript.lib.decorator"); + + ПользовательскиеМетоды = Новый Массив; + ПользовательскиеПоля = Новый Массив; + ПользовательскиеИмпорты = Новый Массив; + ПользовательскиеШагиИнициализации = Новый Массив; + ПерехватчикиМетодов = Новый Массив; + ЗначенияПараметровКонструктораПоТипу = Новый Массив; + +КонецПроцедуры + +Функция ОбластьИмпортов() + + ОбластьИмпортов = Новый Массив; + + Для Каждого Импорт Из ПользовательскиеИмпорты Цикл + ОбластьИмпортов.Добавить(Импорт.Описание()); + КонецЦикла; + + Возврат СтрСоединить(ОбластьИмпортов, Символы.ПС); + +КонецФункции + +Функция ОбластьПеременных() + + ОбластьПеременных = Новый Массив(); + + ДобавитьДекорируемыеПоля(ОбластьПеременных); + ДобавитьПользовательскиеПоля(ОбластьПеременных); + + Возврат СтрСоединить(ОбластьПеременных, Символы.ПС); + +КонецФункции + +Процедура ДобавитьДекорируемыеПоля(ОбластьПеременных) + + Если ИсходныйОбъект = Неопределено Тогда + Возврат; + КонецЕсли; + + Рефлектор = Новый Рефлектор; + Свойства = Рефлектор.ПолучитьТаблицуСвойств(ИсходныйОбъект); + + Лог.Отладка("Количество свойств: %1", Свойства.Количество()); + + Для Каждого Свойство Из Свойства Цикл + + Поле = Новый Поле(Свойство.Имя) + .Публичное(); + + Для каждого АннотацияСвойства Из Свойство.Аннотации Цикл + + Аннотация = Новый Аннотация(АннотацияСвойства.Имя); + + Если АннотацияСвойства.Параметры = Неопределено Тогда + + Поле.ДобавитьАннотацию(Аннотация); + + Продолжить; + + КонецЕсли; + + Для каждого ПараметрАннотации Из АннотацияСвойства.Параметры Цикл + + Аннотация.ДобавитьПараметр(ПараметрАннотации.Значение, ПараметрАннотации.Имя); + + КонецЦикла; + + Поле.ДобавитьАннотацию(Аннотация); + + КонецЦикла; + + ОбластьПеременных.Добавить(Поле.Описание()); + + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьПользовательскиеПоля(ОбластьПеременных) + + Для Каждого ПользовательскоеПоле Из ПользовательскиеПоля Цикл + + ОбластьПеременных.Добавить(ПользовательскоеПоле.Описание()); + + КонецЦикла; + +КонецПроцедуры + +Функция ОбластьМетодов() + + ОбластьМетодов = Новый Массив; + + ДобавитьДекорируемыеМетоды(ОбластьМетодов); + ДобавитьПользовательскиеМетоды(ОбластьМетодов); + + Возврат СтрСоединить(ОбластьМетодов, Символы.ПС); + +КонецФункции + +Функция ОбластьИнициализации() + + ОбластьИнициализации = Новый Массив; + + Для Каждого ПользовательскийШаг Из ПользовательскиеШагиИнициализации Цикл + ОбластьИнициализации.Добавить(ПользовательскийШаг.Описание()); + КонецЦикла; + + Возврат СтрСоединить(ОбластьИнициализации, Символы.ПС); + +КонецФункции + +Процедура ДобавитьДекорируемыеМетоды(ОбластьМетодов) + + Если ИсходныйОбъект = Неопределено Тогда + Возврат; + КонецЕсли; + + Рефлектор = Новый Рефлектор; + МетодыИсходногоОбъекта = Рефлектор.ПолучитьТаблицуМетодов(ИсходныйОбъект); + Лог.Отладка("Количество методов: %1", МетодыИсходногоОбъекта.Количество()); + + Для Каждого МетодИсходногоОбъекта Из МетодыИсходногоОбъекта Цикл + + Если Не МетодИсходногоОбъекта.Экспорт Тогда + Продолжить; + КонецЕсли; + + ИмяМетода = ПолучитьИмяМетода(МетодИсходногоОбъекта.Имя); + + Метод = Новый Метод(ИмяМетода) + .Публичный(); + + Для каждого АннотацияИсходногоОбъекта Из МетодИсходногоОбъекта.Аннотации Цикл + + Аннотация = Новый Аннотация(АннотацияИсходногоОбъекта.Имя); + + Если АннотацияИсходногоОбъекта.Параметры = Неопределено Тогда + + Метод.ДобавитьАннотацию(Аннотация); + + Продолжить; + + КонецЕсли; + + Для каждого ПараметрАннотации Из АннотацияИсходногоОбъекта.Параметры Цикл + + Аннотация.ДобавитьПараметр(ПараметрАннотации.Значение, ПараметрАннотации.Имя); + + КонецЦикла; + + Метод.ДобавитьАннотацию(Аннотация); + + КонецЦикла; + + ИменаПараметров = Новый Массив(); + + Для Каждого ПараметрМетода Из МетодИсходногоОбъекта.Параметры Цикл + + ИменаПараметров.Добавить(ПараметрМетода.Имя); + + Параметр = Новый ПараметрМетода(ПараметрМетода.Имя); + + Если ПараметрМетода.ПоЗначению Тогда + Параметр.ПоЗначению(); + КонецЕсли; + + Если ПараметрМетода.ЕстьЗначениеПоУмолчанию Тогда + Параметр.ЗначениеПоУмолчанию(Неопределено); + КонецЕсли; + + Для каждого АннотацияПараметрМетода Из ПараметрМетода.Аннотации Цикл + + Аннотация = Новый Аннотация(АннотацияПараметрМетода.Имя); + + Если АннотацияПараметрМетода.Параметры = Неопределено Тогда + + Параметр.ДобавитьАннотацию(Аннотация); + + Продолжить; + + КонецЕсли; + + Для каждого ПараметрАннотации Из АннотацияПараметрМетода.Параметры Цикл + + Аннотация.ДобавитьПараметр(ПараметрАннотации.Значение, ПараметрАннотации.Имя); + + КонецЦикла; + + Параметр.ДобавитьАннотацию(Аннотация); + + КонецЦикла; + + Метод.ДобавитьПараметр(Параметр); + + КонецЦикла; + + ТелоМетода = КэшируемыеДанные.ТекстШаблонаТелоМетодаДекоратора(); + ТипМетода = СтрШаблон( + "Декоратор_ТипМетода = %1;", + ПараметрыМенеджер.ОписаниеЗначения(МетодИсходногоОбъекта.ЭтоФункция) + ); + + ШаблонВыполняемаяСтрока = "Декоратор_ВыполняемаяСтрока = ""Декоратор_ИсходныйОбъект.%1(%2)"";"; + ВыполняемаяСтрока = СтрШаблон(ШаблонВыполняемаяСтрока, ИмяМетода, СтрСоединить(ИменаПараметров, ", ")); + ВозвращаемоеЗначение = "Возврат Декоратор_ВозвращаемоеИзМетодаЗначение;"; + + ТелоМетода = СтрЗаменить(ТелоМетода, "// {Декоратор_ВыполняемаяСтрока}", ВыполняемаяСтрока); + ТелоМетода = СтрЗаменить(ТелоМетода, "// {Декоратор_ТипМетода}", ТипМетода); + ТелоМетода = СтрЗаменить(ТелоМетода, "// {Декоратор_ВозвращаемоеЗначение}", ВозвращаемоеЗначение); + + Метод.ТелоМетода(ТелоМетода); + + НовыйМетод = Метод.Описание(); + + ДобавитьПерехватчикиМетода(ИмяМетода, НовыйМетод); + + ОбластьМетодов.Добавить(НовыйМетод); + + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьПользовательскиеМетоды(ОбластьМетодов) + + Для Каждого Метод Из ПользовательскиеМетоды Цикл + + НовыйМетод = Метод.Описание(); + + ДобавитьПерехватчикиМетода(Метод.ИмяМетода(), НовыйМетод); + + ОбластьМетодов.Добавить(НовыйМетод); + + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьПерехватчикиМетода(ИмяМетода, ТекстМетода) + + ТекстыПерехватчиков = ТекстыПерехватчиков(ИмяМетода); + + ТекстМетода = СтрЗаменить( + ТекстМетода, + "// {Декоратор_ПередВызовомМетода}", + СтрСоединить(ТекстыПерехватчиков.Получить(ТипыПерехватчиковМетода.Перед), Символы.ПС) + ); + + ТекстМетода = СтрЗаменить( + ТекстМетода, + "// {Декоратор_ПослеВызоваМетода}", + СтрСоединить(ТекстыПерехватчиков.Получить(ТипыПерехватчиковМетода.После), Символы.ПС) + ); + +КонецПроцедуры + +Функция ТекстыПерехватчиков(ИмяМетода) + + Результат = Новый Соответствие; + + Результат.Вставить(ТипыПерехватчиковМетода.Перед, Новый Массив); + Результат.Вставить(ТипыПерехватчиковМетода.После, Новый Массив); + + Для каждого Перехватчик Из ПерехватчикиМетодов Цикл + + Перехватчик = Перехватчик.Описание(); + + Если Перехватчик.ИмяМетода <> ИмяМетода Тогда + Продолжить; + КонецЕсли; + + Результат.Получить(Перехватчик.ТипПерехватчика).Добавить(Перехватчик.ТелоПерехватчика); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьИмяМетода(Знач ИмяМетода) + ВозвращаемоеЗначение = ИмяМетода; + ШаблонНовогоИмени = "_%1"; + + НедопустимыеИмена = Новый Массив; + НедопустимыеИмена.Добавить("найти"); + + Если НЕ НедопустимыеИмена.Найти(Нрег(ИмяМетода)) = Неопределено Тогда + ВозвращаемоеЗначение = СтрШаблон(ШаблонНовогоИмени, ИмяМетода); + КонецЕсли; + + Возврат ВозвращаемоеЗначение; +КонецФункции + +Функция СоздатьДекоратор(ТекстСценария) + + Лог.Отладка(ТекстСценария); + + Декоратор = ЗагрузитьСценарийИзСтроки(ТекстСценария); + + ИнстансИсходногоОбъекта = Неопределено; + Если РежимСозданияИзТипа Тогда + ИнстансИсходногоОбъекта = Новый(ИсходныйОбъект, ЗначенияПараметровКонструктораПоТипу); + Иначе + ИнстансИсходногоОбъекта = ИсходныйОбъект; + КонецЕсли; + + Рефлектор = Новый Рефлектор(); + Рефлектор.УстановитьСвойство(Декоратор, Константы_Декоратор.Поле_ИнстансОбъекта, ИнстансИсходногоОбъекта); + + Для Каждого ПользовательскоеПоле Из ПользовательскиеПоля Цикл + + ОписаниеЗначения = ПользовательскоеПоле.ОписаниеЗначенияПоУмолчанию(); + + Если ОписаниеЗначения.ЕстьЗначениеПоУмолчанию Тогда + Рефлектор.УстановитьСвойство(Декоратор, ОписаниеЗначения.ИмяПоля, ОписаниеЗначения.ЗначениеПоУмолчанию); + КонецЕсли; + + КонецЦикла; + + Если ИнстансИсходногоОбъекта <> Неопределено Тогда + ОбработкаДекоратора.СинхронизироватьПоля(ИнстансИсходногоОбъекта, Декоратор); + КонецЕсли; + + Возврат Декоратор; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\320\270.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\320\270.os" new file mode 100644 index 0000000..d6654ee --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\263\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\320\270.os" @@ -0,0 +1,29 @@ +#Область ОписаниеПеременных + +Перем Тело; // Текст шага инициализации + +#КонецОбласти + +// Конструктор +// +// Параметры: +// ТелоШага - Строка - тело шага инциализации +// +Процедура ПриСозданииОбъекта(ТелоШага) + + Тело = ТелоШага; + +КонецПроцедуры + +#Область СлужебныйПрограммныйИнтерфейс + +// Строковое представление шага инциализации +// +// Возвращаемое значение: +// Строка - Строковое представление шага инциализации +// +Функция Описание() Экспорт + Возврат Тело; +КонецФункции + +#КонецОбласти diff --git "a/src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\270\320\277\321\213\320\237\320\265\321\200\320\265\321\205\320\262\320\260\321\202\321\207\320\270\320\272\320\276\320\262\320\234\320\265\321\202\320\276\320\264\320\260.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\270\320\277\321\213\320\237\320\265\321\200\320\265\321\205\320\262\320\260\321\202\321\207\320\270\320\272\320\276\320\262\320\234\320\265\321\202\320\276\320\264\320\260.os" similarity index 100% rename from "src/internal/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\270\320\277\321\213\320\237\320\265\321\200\320\265\321\205\320\262\320\260\321\202\321\207\320\270\320\272\320\276\320\262\320\234\320\265\321\202\320\276\320\264\320\260.os" rename to "src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\270\320\277\321\213\320\237\320\265\321\200\320\265\321\205\320\262\320\260\321\202\321\207\320\270\320\272\320\276\320\262\320\234\320\265\321\202\320\276\320\264\320\260.os" diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\270\320\277\321\213\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\321\217\320\221\320\270\320\261\320\270\320\273\320\276\321\202\320\265\320\272.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\270\320\277\321\213\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\321\217\320\221\320\270\320\261\320\270\320\273\320\276\321\202\320\265\320\272.os" new file mode 100644 index 0000000..67fca32 --- /dev/null +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\270\320\277\321\213\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\270\321\217\320\221\320\270\320\261\320\270\320\273\320\276\321\202\320\265\320\272.os" @@ -0,0 +1,5 @@ +Перем ПоИмени Экспорт; +Перем ПоПути Экспорт; + +ПоИмени = "ПоИмени"; +ПоПути = "ПоПути"; diff --git "a/tests/fixtures/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\276\320\271\320\232\320\273\320\260\321\201\321\201.os" "b/tests/fixtures/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\276\320\271\320\232\320\273\320\260\321\201\321\201.os" index 32bad28..8dc435e 100644 --- "a/tests/fixtures/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\276\320\271\320\232\320\273\320\260\321\201\321\201.os" +++ "b/tests/fixtures/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\276\320\271\320\232\320\273\320\260\321\201\321\201.os" @@ -1,10 +1,16 @@ +&АннотацияБезПараметра +&АннотацияСПараметром("Значение") +&АннотацияСИменованнымПараметром(ИмяПараметра = "Значение") Перем Поле Экспорт; +&АннотацияБезПараметра +&АннотацияСПараметром("Значение") +&АннотацияСИменованнымПараметром(ИмяПараметра = "Значение") Функция ТестоваяФункция() Экспорт Возврат 1; КонецФункции -Процедура ИзменитьЗначениеПоля(НовоеЗначение) Экспорт +Процедура ИзменитьЗначениеПоля(&АннотацияБезПараметра &АннотацияСПараметром("Значение") &АннотацияСИменованнымПараметром(ИмяПараметра = "Значение") НовоеЗначение) Экспорт Поле = НовоеЗначение; КонецПроцедуры diff --git "a/tests/fixtures/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\276\320\271\320\232\320\273\320\260\321\201\321\201\320\241\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\276\320\274.os" "b/tests/fixtures/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\276\320\271\320\232\320\273\320\260\321\201\321\201\320\241\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\276\320\274.os" new file mode 100644 index 0000000..3d015f2 --- /dev/null +++ "b/tests/fixtures/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\276\320\271\320\232\320\273\320\260\321\201\321\201\320\241\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\276\320\262\320\260\320\275\320\275\321\213\320\274\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\276\320\274.os" @@ -0,0 +1,7 @@ +Перем Парам1 Экспорт; +Перем Парам2 Экспорт; + +Процедура ПриСозданииОбъекта(пПарам1, пПарам2 = 2) + Парам1 = пПарам1; + Парам2 = пПарам2; +КонецПроцедуры diff --git a/tests/test.os "b/tests/\320\242\320\265\321\201\321\202\321\213_\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" similarity index 100% rename from tests/test.os rename to "tests/\320\242\320\265\321\201\321\202\321\213_\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213_\320\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" "b/tests/\320\242\320\265\321\201\321\202\321\213_\320\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" new file mode 100644 index 0000000..2cc630c --- /dev/null +++ "b/tests/\320\242\320\265\321\201\321\202\321\213_\320\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\224\320\265\320\272\320\276\321\200\320\260\321\202\320\276\321\200\320\260.os" @@ -0,0 +1,423 @@ +#Использовать ".." +#Использовать "./fixtures" +#Использовать asserts + +&Тест +Процедура ДекораторСоздаетсяПоОбъекту() Экспорт + Декоратор = Новый ПостроительДекоратора(Новый МойКласс).Построить(); + + Ожидаем.Что(ОбработкаДекоратора.ИсходныйТип(Декоратор)).Равно(Тип("МойКласс")); +КонецПроцедуры + +&Тест +Процедура ДекораторСоздаетсяПоТипу() Экспорт + Декоратор = Новый ПостроительДекоратора(Тип("МойКласс")).Построить(); + + Ожидаем.Что(ОбработкаДекоратора.ИсходныйТип(Декоратор)).Равно(Тип("МойКласс")); +КонецПроцедуры + +&Тест +Процедура ДекораторСоздаетсяПоТипуСПараметризованнымКонструктором() Экспорт + + ПроверяемыйТип = Тип("МойКлассСПараметризованнымКонструктором"); + + Декоратор = Новый ПостроительДекоратора(ПроверяемыйТип) + .ДобавитьЗначениеПараметраКонструктораПоТипу(1) + .Построить(); + + Ожидаем.Что(ОбработкаДекоратора.ИсходныйТип(Декоратор)).Равно(ПроверяемыйТип); + Ожидаем.Что(Декоратор.Парам1).Равно(1); + Ожидаем.Что(Декоратор.Парам2).Равно(2); + + Декоратор = Новый ПостроительДекоратора(ПроверяемыйТип) + .ДобавитьЗначениеПараметраКонструктораПоТипу(1) + .ДобавитьЗначениеПараметраКонструктораПоТипу(3) + .Построить(); + + Ожидаем.Что(ОбработкаДекоратора.ИсходныйТип(Декоратор)).Равно(ПроверяемыйТип); + Ожидаем.Что(Декоратор.Парам1).Равно(1); + Ожидаем.Что(Декоратор.Парам2).Равно(3); + +КонецПроцедуры + +&Тест +Процедура ДекораторСоздаетсяБезИсходногоОбъекта() Экспорт + Декоратор = Новый ПостроительДекоратора().Построить(); + + Ожидаем.Что(ОбработкаДекоратора.ИсходныйТип(Декоратор)).Равно(Тип("Неопределено")); +КонецПроцедуры + +&Тест +Процедура ФункцииОбъектаНаследуются() Экспорт + Декоратор = Новый ПостроительДекоратора(Тип("МойКласс")).Построить(); + + Ожидаем.Что(Декоратор.ТестоваяФункция()).Равно(1); +КонецПроцедуры + +&Тест +Процедура ФункцииТипаНаследуются() Экспорт + Декоратор = Новый ПостроительДекоратора(Новый МойКласс).Построить(); + + Ожидаем.Что(Декоратор.ТестоваяФункция()).Равно(1); +КонецПроцедуры + +&Тест +Процедура ПоляОбъектаНаследуются() Экспорт + + МойКласс = Новый МойКласс; + МойКласс.Поле = 123; + + Декоратор = Новый ПостроительДекоратора(МойКласс).Построить(); + + Ожидаем.Что(Декоратор.Поле).Равно(123); +КонецПроцедуры + +&Тест +Процедура ПоляТипаНаследуются() Экспорт + + Декоратор = Новый ПостроительДекоратора(Тип("МойКласс")).Построить(); + + Ожидаем.Что(Декоратор.Поле).ЭтоНеопределено(); + +КонецПроцедуры + +&Тест +Процедура ПоляОбъектаСинхронизируютсяЯвно() Экспорт + МойКласс = Новый МойКласс; + МойКласс.Поле = 123; + + Декоратор = Новый ПостроительДекоратора(МойКласс).Построить(); + + Ожидаем.Что(Декоратор.Поле).Равно(МойКласс.Поле); +КонецПроцедуры + +&Тест +Процедура ПоляОбъектаСинхронизируютсяОбратно() Экспорт + МойКласс = Новый МойКласс; + МойКласс.Поле = 123; + + Декоратор = Новый ПостроительДекоратора(МойКласс).Построить(); + Декоратор.ИзменитьЗначениеПоля(100); + + Ожидаем.Что(Декоратор.Поле).Равно(100); +КонецПроцедуры + +&Тест +Процедура ФункцияДобавляется() Экспорт + + МойКласс = Новый МойКласс; + + НовыйМетод = Новый Метод("ДобавленнаяФункция") + .Публичный() + .ТелоМетода("Возврат Истина;"); + + Декоратор = Новый ПостроительДекоратора(МойКласс) + .ДобавитьМетод(НовыйМетод) + .Построить(); + + Результат = Декоратор.ДобавленнаяФункция(); + + Ожидаем.Что(Результат).ЭтоИстина(); +КонецПроцедуры + +&Тест +Процедура ФункцияСПараметрамиДобавляется() Экспорт + + МойКласс = Новый МойКласс; + + НовыйМетод = Новый Метод("ДобавленнаяФункция") + .Публичный() + .ДобавитьПараметр(Новый ПараметрМетода("Параметр1")) + .ДобавитьПараметр(Новый ПараметрМетода("Параметр2").ЗначениеПоУмолчанию(2)) + .ТелоМетода("Возврат Новый Структура(""Параметр1, Параметр2"", Параметр1, Параметр2);"); + + Декоратор = Новый ПостроительДекоратора(МойКласс) + .ДобавитьМетод(НовыйМетод) + .Построить(); + + Результат = Декоратор.ДобавленнаяФункция(Истина); + + Ожидаем.Что(Результат.Свойство("Параметр1")).ЭтоИстина(); + Ожидаем.Что(Результат.Свойство("Параметр2")).ЭтоИстина(); + Ожидаем.Что(Результат.Параметр1).ЭтоИстина(); + Ожидаем.Что(Результат.Параметр2).Равно(2); + +КонецПроцедуры + +&Тест +Процедура ПерехватчикиДобавленныхФункцийРаботаютКорректно() Экспорт + + МойКласс = Новый МойКласс; + МойКласс.Поле = 123; + + ИмяМетода = "ЗначениеПоля"; + + НовыйМетод = Новый Метод(ИмяМетода) + .Публичный() + .ТелоМетода("Поле = Поле + 1;"); + + ПерехватчикПеред = Новый Перехватчик(ИмяМетода) + .ТипПерехватчика(ТипыПерехватчиковМетода.Перед) + .Тело("КэшПоля = Поле;"); + + ПерехватчикПосле = Новый Перехватчик(ИмяМетода) + .ТипПерехватчика(ТипыПерехватчиковМетода.После) + .Тело("КэшПоля = КэшПоля - 1;"); + + Декоратор = Новый ПостроительДекоратора(МойКласс) + .ДобавитьПоле(Новый Поле("КэшПоля").Публичное()) + .ДобавитьПерехватчик(ПерехватчикПеред) + .ДобавитьМетод(НовыйМетод) + .ДобавитьПерехватчик(ПерехватчикПосле) + .Построить(); + + Декоратор.ЗначениеПоля(); + + Ожидаем.Что(Декоратор.Поле).Равно(124); + Ожидаем.Что(Декоратор.КэшПоля).Равно(122); + +КонецПроцедуры + +&Тест +Процедура ПерехватчикиДекораторруемыхФункцийРаботаютКорректно() Экспорт + + МойКласс = Новый МойКласс; + МойКласс.Поле = 123; + + ПерехватчикПеред = Новый Перехватчик("ИзменитьЗначениеПоля") + .ТипПерехватчика(ТипыПерехватчиковМетода.Перед) + .Тело("КэшПоля = Поле;"); + + ПерехватчикПосле = Новый Перехватчик("ИзменитьЗначениеПоля") + .ТипПерехватчика(ТипыПерехватчиковМетода.После) + .Тело("КэшПоля = КэшПоля - Поле;"); + + Декоратор = Новый ПостроительДекоратора(МойКласс) + .ДобавитьПоле(Новый Поле("КэшПоля").Публичное()) + .ДобавитьПерехватчик(ПерехватчикПеред) + .ДобавитьПерехватчик(ПерехватчикПосле) + .Построить(); + + Декоратор.ИзменитьЗначениеПоля(20); + + Ожидаем.Что(Декоратор.Поле).Равно(20); + Ожидаем.Что(Декоратор.КэшПоля).Равно(103); + +КонецПроцедуры + +&Тест +Процедура ПриватноеПолеДобавляется() Экспорт + + Декоратор = Новый ПостроительДекоратора(Новый МойКласс) + .ДобавитьПоле( + Новый Поле("ПриватноеПоле1") + .ЗначениеПоУмолчанию("ффф")) + .ДобавитьПоле( + Новый Поле("ПриватноеПоле2")) + .Построить(); + + Рефлектор = Новый Рефлектор(); + + Ожидаем.Что(Рефлектор.ПолучитьСвойство(Декоратор, "ПриватноеПоле1")).Равно("ффф"); + Ожидаем.Что(Рефлектор.ПолучитьСвойство(Декоратор, "ПриватноеПоле2")).ЭтоНеопределено(); + + ИсключениеВозникло = Ложь; + Попытка + А = Декоратор.ПриватноеПоле1; + Исключение + ИсключениеВозникло = Истина; + КонецПопытки; + + Ожидаем.Что(ИсключениеВозникло, "Получилось обратиться к приватному полю").ЭтоИстина(); +КонецПроцедуры + +&Тест +Процедура ПубличноеПолеДобавляется() Экспорт + + Декоратор = Новый ПостроительДекоратора(Новый МойКласс) + .ДобавитьПоле( + Новый Поле("ПубличноеПоле1") + .Публичное() + .ЗначениеПоУмолчанию("ффф")) + .ДобавитьПоле( + Новый Поле("ПубличноеПоле2") + .Публичное()) + .Построить(); + + Рефлектор = Новый Рефлектор(); + + Ожидаем.Что(Рефлектор.ПолучитьСвойство(Декоратор, "ПубличноеПоле1")).Равно("ффф"); + Ожидаем.Что(Рефлектор.ПолучитьСвойство(Декоратор, "ПубличноеПоле2")).ЭтоНеопределено(); + + ИсключениеВозникло = Ложь; + Попытка + А = Декоратор.ПубличноеПоле1; + Исключение + ИсключениеВозникло = Истина; + КонецПопытки; + + Ожидаем.Что(ИсключениеВозникло, "Не получилось обратиться к публичному полю").ЭтоЛожь(); +КонецПроцедуры + +&Тест +Процедура АннотированноеПолеДобавляется() Экспорт + + Поле = Новый Поле("ПубличноеПоле") + .Публичное() + .ДобавитьАннотацию(Новый Аннотация("АннотацияБезПараметра")) + .ДобавитьАннотацию( + Новый Аннотация("АннотацияСПараметром") + .ДобавитьПараметр("Значение")) + .ДобавитьАннотацию( + Новый Аннотация("АннотацияСИменованнымПараметром") + .ДобавитьПараметр("Значение", "ИмяПараметра")); + + Декоратор = Новый ПостроительДекоратора() + .ДобавитьПоле(Поле) + .Построить(); + + Рефлектор = Новый Рефлектор; + + ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(Декоратор); + + Ожидаем.Что(ТаблицаСвойств.Количество()).Равно(1); + Ожидаем.Что(ТаблицаСвойств[0].Имя).Равно("ПубличноеПоле"); + + // Далее все тесты закоментированны, так как есть баг движка и аннотаций полей нет + // https://github.com/EvilBeaver/OneScript/issues/1184 + + // Ожидаем.Что(ТаблицаСвойств[0].Аннотации.Количество()).Равно(3); + + // Ожидаем.Что(ТаблицаСвойств[0].Аннотации[0].Имя).Равно("АннотацияБезПараметра"); + // Ожидаем.Что(ТаблицаСвойств[0].Аннотации[0].Параметры.Количество()).Равно(0); + + // Ожидаем.Что(ТаблицаСвойств[0].Аннотации[1].Имя).Равно("АннотацияСПараметром"); + // Ожидаем.Что(ТаблицаСвойств[0].Аннотации[1].Параметры.Количество()).Равно(1); + // Ожидаем.Что(ТаблицаСвойств[0].Аннотации[1].Параметры[0].Имя).Равно(""); + // Ожидаем.Что(ТаблицаСвойств[0].Аннотации[1].Параметры[0].Значение).Равно("Значение"); + + // Ожидаем.Что(ТаблицаСвойств[0].Аннотации[2].Имя).Равно("АннотацияСИменованнымПараметром"); + // Ожидаем.Что(ТаблицаСвойств[0].Аннотации[2].Параметры.Количество()).Равно(1); + // Ожидаем.Что(ТаблицаСвойств[0].Аннотации[2].Параметры[0].Имя).Равно("ИмяПараметра"); + // Ожидаем.Что(ТаблицаСвойств[0].Аннотации[2].Параметры[0].Значение).Равно("Значение"); + +КонецПроцедуры + +&Тест +Процедура АннотированныйМетодДобавляется() Экспорт + + Метод = Новый Метод("ПубличныйМетод") + .Публичный() + .ДобавитьАннотацию(Новый Аннотация("АннотацияБезПараметра")) + .ДобавитьАннотацию( + Новый Аннотация("АннотацияСПараметром") + .ДобавитьПараметр("Значение")) + .ДобавитьАннотацию( + Новый Аннотация("АннотацияСИменованнымПараметром") + .ДобавитьПараметр("Значение", "ИмяПараметра")); + + Декоратор = Новый ПостроительДекоратора() + .ДобавитьМетод(Метод) + .Построить(); + + Рефлектор = Новый Рефлектор; + + ТаблицаМетодов = Рефлектор.ПолучитьТаблицуМетодов(Декоратор); + + Ожидаем.Что(ТаблицаМетодов[1].Имя).Равно("ПубличныйМетод"); + + Ожидаем.Что(ТаблицаМетодов[1].Аннотации.Количество()).Равно(3); + + Ожидаем.Что(ТаблицаМетодов[1].Аннотации[0].Имя).Равно("АннотацияБезПараметра"); + Ожидаем.Что(ТаблицаМетодов[1].Аннотации[0].Параметры).ЭтоНеопределено(); + + Ожидаем.Что(ТаблицаМетодов[1].Аннотации[1].Имя).Равно("АннотацияСПараметром"); + Ожидаем.Что(ТаблицаМетодов[1].Аннотации[1].Параметры.Количество()).Равно(1); + Ожидаем.Что(ТаблицаМетодов[1].Аннотации[1].Параметры[0].Имя).ЭтоНеопределено(); + Ожидаем.Что(ТаблицаМетодов[1].Аннотации[1].Параметры[0].Значение).Равно("Значение"); + + Ожидаем.Что(ТаблицаМетодов[1].Аннотации[2].Имя).Равно("АннотацияСИменованнымПараметром"); + Ожидаем.Что(ТаблицаМетодов[1].Аннотации[2].Параметры.Количество()).Равно(1); + Ожидаем.Что(ТаблицаМетодов[1].Аннотации[2].Параметры[0].Имя).Равно("ИмяПараметра"); + Ожидаем.Что(ТаблицаМетодов[1].Аннотации[2].Параметры[0].Значение).Равно("Значение"); + +КонецПроцедуры + +&Тест +Процедура ИмпортДобавляется() Экспорт + + ТекстСценарияДекоратора = Новый ПостроительДекоратора(Новый МойКласс) + .ДобавитьИмпорт(Новый Импорт("asserts")) + .ДобавитьИмпорт(Новый Импорт(".").ТипПодключения(ТипыПодключенияБибилотек.ПоПути)) + .ТекстСценария(); + + Ожидаем.Что(ТекстСценарияДекоратора) + .Содержит("#Использовать asserts") + .Содержит("#Использовать "".""") + ; + +КонецПроцедуры + +&Тест +Процедура ПользовательскийШагДобавляется() Экспорт + + ТекстСценарияДекоратора = Новый ПостроительДекоратора(Новый МойКласс) + .ДобавитьШагИнициализации(Новый ШагИнициализации("А = 0;")) + .ДобавитьШагИнициализации(Новый ШагИнициализации("Сообщить(А);")) + .ТекстСценария(); + + Ожидаем.Что(ТекстСценарияДекоратора) + .Содержит("А = 0; + |Сообщить(А);") + ; + +КонецПроцедуры + +&Тест +Процедура ИсходныйТипОпределяетсяРекурсивно() Экспорт + + Декоратор = Новый ПостроительДекоратора(Новый МойКласс()).Построить(); + ДекораторОтДекоратора = Новый ПостроительДекоратора(Декоратор).Построить(); + + Ожидаем.Что(ОбработкаДекоратора.ИсходныйТип(ДекораторОтДекоратора)).Равно(Тип("МойКласс")); + +КонецПроцедуры + +&Тест +Процедура ПереопределениеТекстаСценария() Экспорт + + ПостроительДекоратора = Новый ПостроительДекоратора(Новый МойКласс()) + .ДобавитьПоле(Новый Поле("МоеПоле").Публичное()); + ТекстСценария = ПостроительДекоратора.ТекстСценария(); + ТекстСценария = ТекстСценария + Символы.ПС + "МоеПоле = 100;"; + + Декоратор = ПостроительДекоратора.Построить(ТекстСценария); + + Ожидаем.Что(Декоратор.МоеПоле).Равно(100); + +КонецПроцедуры + +&Тест +Процедура ПереопределилсяВозвращаемыйЭтотОбъект() Экспорт + + Декоратор = Новый ПостроительДекоратора(Новый МойКласс).Построить(); + + Ожидаем.Что(Декоратор.ВернутьЭтотОбъект()).Равно(Декоратор); + +КонецПроцедуры + +&Тест +Процедура НекорректныеПараметрыАннотации() Экспорт + + Аннотация = Новый Аннотация("Тест") + .ДобавитьПараметр("Значение"); + + Попытка + Аннотация.ДобавитьПараметр("ЗначениеЛомающееАннотацию") + Исключение + ИсключениеВозникло = Истина; + КонецПопытки; + + Ожидаем.Что(ИсключениеВозникло, "Получилось добавить не корректный парамтр аннотации").ЭтоИстина(); + +КонецПроцедуры