diff --git a/README.md b/README.md index 73a352a..1de567e 100644 --- a/README.md +++ b/README.md @@ -480,6 +480,12 @@ docs - todo; #### После Перехватчик вызывается после выполнения перехватываемого метода +#### ПослеВызоваИсключения +Перехватчик вызывается если перехватываемый метод упал в исключение, в момент перед пробросом исключения + +#### ПередСинхронизациейПолей +Перехватчик вызывается в самом начале, перед синхронизацией полей декоратора и оригинального метода + ### Перечисление ТипыПодключенияБибилотек #### ПоИмени diff --git a/packagedef b/packagedef index b2c9f4a..1a28bca 100644 --- a/packagedef +++ b/packagedef @@ -1,6 +1,6 @@ // BSLLS:CodeOutOfRegion-off Описание.Имя("decorator") - .Версия("1.6.0") + .Версия("1.7.0") .Автор("Nikita Gryzlov") .АдресАвтора("nixel2007@gmail.com") .Описание("Библиотека для создания декораторов над объектами") 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 37e4680..52827a9 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" @@ -52,11 +52,8 @@ |// {АннотацияМетода} |{Функция} Декоратор_ИмяМетода(Декоратор_ОписаниеПараметровМетода) // {Экспорт} | -| Если {Декоратор_ЭтоДекорируемыйМетод} Тогда -| ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект); -| Иначе -| ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект); -| КонецЕсли; +| // {Декоратор_ПередСинхронизациейПолей} +| // {Декоратор_СинхронизироватьПоляПеред} | | Декоратор_ВозвращаемоеИзМетодаЗначение = NULL; | @@ -68,11 +65,7 @@ | | Исключение | -| Если {Декоратор_ЭтоДекорируемыйМетод} Тогда -| ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект); -| Иначе -| ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект); -| КонецЕсли; +| // {Декоратор_СинхронизироватьПоляПосле} | | // {Декоратор_ПослеВызоваИсключения} | @@ -80,11 +73,7 @@ | | КонецПопытки; | -| Если {Декоратор_ЭтоДекорируемыйМетод} Тогда -| ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект); -| Иначе -| ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект); -| КонецЕсли; +| // {Декоратор_СинхронизироватьПоляПосле} | | Если Декоратор_ВозвращаемоеИзМетодаЗначение = Декоратор_ИсходныйОбъект Тогда | Декоратор_ВозвращаемоеИзМетодаЗначение = ЭтотОбъект; 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 4985986..f220b4b 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" @@ -438,9 +438,20 @@ НовыйМетод = СтрЗаменить(НовыйМетод, "// {Экспорт}", "Экспорт"); НовыйМетод = СтрЗаменить(НовыйМетод, "{Функция}", "Функция"); НовыйМетод = СтрЗаменить(НовыйМетод, "{КонецФункции}", "КонецФункции"); - НовыйМетод = СтрЗаменить(НовыйМетод, "{Декоратор_ЭтоДекорируемыйМетод}", "Истина"); НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ТекстМетода}", ТекстМетода); - + + НовыйМетод = СтрЗаменить( + НовыйМетод, + "// {Декоратор_СинхронизироватьПоляПеред}", + "ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);" + ); + + НовыйМетод = СтрЗаменить( + НовыйМетод, + "// {Декоратор_СинхронизироватьПоляПосле}", + "ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);" + ); + ДобавитьПерехватчикиМетода(ИмяМетода, НовыйМетод, Истина); НовыйМетод = НовыйМетод + Символы.ПС; @@ -473,10 +484,22 @@ НовыйМетод = СтрЗаменить(НовыйМетод, "// {Экспорт}", "Экспорт"); НовыйМетод = СтрЗаменить(НовыйМетод, "{Функция}", "Функция"); НовыйМетод = СтрЗаменить(НовыйМетод, "{КонецФункции}", "КонецФункции"); - НовыйМетод = СтрЗаменить(НовыйМетод, "{Декоратор_ЭтоДекорируемыйМетод}", "Ложь"); НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ВыполняемаяСтрока}", ВыполняемаяСтрока); НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_ВозвращаемоеЗначение}", ВозвращаемоеЗначение); - + + // Для будущих археологов, если вы подумаете что нужно тут добавить + // ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект); + // то проверьте что работает АктивнаяЗапись в библиотеки entity + // сейчас этого куска нет потому что при его наличии в декораторе задавятся поля + // декоратора которые были заполнены не через методы, а просто установкой свойств. + НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_СинхронизироватьПоляПеред}", ""); + + НовыйМетод = СтрЗаменить( + НовыйМетод, + "// {Декоратор_СинхронизироватьПоляПосле}", + "ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);" + ); + ДобавитьПерехватчикиМетода(ИмяМетода, НовыйМетод); ОбластьМетодов = ОбластьМетодов + НовыйМетод; 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" index f8c7b8e..95e8e9f 100644 --- "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" @@ -442,7 +442,17 @@ НовыйМетод = Метод.Описание(); - НовыйМетод = СтрЗаменить(НовыйМетод, "{Декоратор_ЭтоДекорируемыйМетод}", "Истина"); + НовыйМетод = СтрЗаменить( + НовыйМетод, + "// {Декоратор_СинхронизироватьПоляПеред}", + "ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);" + ); + + НовыйМетод = СтрЗаменить( + НовыйМетод, + "// {Декоратор_СинхронизироватьПоляПосле}", + "ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект);" + ); ДобавитьПерехватчикиМетода(ИмяМетода, НовыйМетод); @@ -458,7 +468,18 @@ НовыйМетод = Метод.Описание(); - НовыйМетод = СтрЗаменить(НовыйМетод, "{Декоратор_ЭтоДекорируемыйМетод}", "Ложь"); + // Для будущих археологов, если вы подумаете что нужно тут добавить + // ОбработкаДекоратора.СинхронизироватьПоля(Декоратор_ИсходныйОбъект, ЭтотОбъект); + // то проверьте что работает АктивнаяЗапись в библиотеки entity + // сейчас этого куска нет потому что при его наличии в декораторе задавятся поля + // декоратора которые были заполнены не через методы, а просто установкой свойств. + НовыйМетод = СтрЗаменить(НовыйМетод, "// {Декоратор_СинхронизироватьПоляПеред}", ""); + + НовыйМетод = СтрЗаменить( + НовыйМетод, + "// {Декоратор_СинхронизироватьПоляПосле}", + "ОбработкаДекоратора.СинхронизироватьПоля(ЭтотОбъект, Декоратор_ИсходныйОбъект);" + ); ДобавитьПерехватчикиМетода(Метод.ИмяМетода(), НовыйМетод); @@ -474,7 +495,9 @@ ЗаменяемаяСтрокаПеред = "// {Декоратор_ПередВызовомМетода}"; ЗаменяемаяСтрокаПосле = "// {Декоратор_ПослеВызоваМетода}"; - ЗаменяемаяСтрокаПередИсключением = "// {Декоратор_ПослеВызоваИсключения}"; + + ЗаменяемаяСтрокаПослеИсключения = "// {Декоратор_ПослеВызоваИсключения}"; + ЗаменяемаяСтрокаПередСинхронизациейПолей = "// {Декоратор_ПередСинхронизациейПолей}"; ТекстМетода = СтрЗаменить( ТекстМетода, @@ -490,10 +513,16 @@ ТекстМетода = СтрЗаменить( ТекстМетода, - ЗаменяемаяСтрокаПередИсключением, + ЗаменяемаяСтрокаПослеИсключения, СтрСоединить(ТекстыПерехватчиков.Получить(ТипыПерехватчиковМетода.ПослеВызоваИсключения), Символы.ПС) ); + ТекстМетода = СтрЗаменить( + ТекстМетода, + ЗаменяемаяСтрокаПередСинхронизациейПолей, + СтрСоединить(ТекстыПерехватчиков.Получить(ТипыПерехватчиковМетода.ПередСинхронизациейПолей), Символы.ПС) + ); + КонецПроцедуры Функция ТекстыПерехватчиков(ИмяМетода) @@ -502,7 +531,9 @@ Результат.Вставить(ТипыПерехватчиковМетода.Перед, Новый Массив); Результат.Вставить(ТипыПерехватчиковМетода.После, Новый Массив); - Результат.Вставить(ТипыПерехватчиковМетода.ПослеВызоваИсключения, Новый Массив); + + Результат.Вставить(ТипыПерехватчиковМетода.ПослеВызоваИсключения, Новый Массив); + Результат.Вставить(ТипыПерехватчиковМетода.ПередСинхронизациейПолей, Новый Массив); Для каждого Перехватчик Из ПерехватчикиМетодов Цикл 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\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" index 4454082..bd7ea01 100644 --- "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\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" @@ -1,7 +1,11 @@ Перем Перед Экспорт; Перем После Экспорт; + Перем ПослеВызоваИсключения Экспорт; +Перем ПередСинхронизациейПолей Экспорт; Перед = "Перед"; После = "После"; -ПослеВызоваИсключения = "ПослеВызоваИсключения"; + +ПослеВызоваИсключения = "ПослеВызоваИсключения"; +ПередСинхронизациейПолей = "ПередСинхронизациейПолей"; 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" index 973cd3e..0d59eaf 100644 --- "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" @@ -794,3 +794,60 @@ Ожидаем.Что(Декоратор.СчетчикПерехватчикаПослеВызоваИсключения).Равно(1); КонецПроцедуры + +&Тест +Процедура ПерехватчикиПередСинхронизациейПолейДекорируемыхФункцийРаботаютКорректно() Экспорт + + // Дано + МойКласс = Новый МойКласс; + МойКласс.Поле = 123; + + ПерехватчикПередСинхронизациейПолей = Новый Перехватчик("ВернутьЭтотОбъект") + .ТипПерехватчика(ТипыПерехватчиковМетода.ПередСинхронизациейПолей) + .Тело("Поле = 124;"); + + Декоратор = Новый ПостроительДекоратора(МойКласс) + .Перехватчик(ПерехватчикПередСинхронизациейПолей) + .Построить(); + + // Когда + + Результат = Декоратор.ВернутьЭтотОбъект(); + + // Тогда + + Ожидаем.Что(Результат.Поле).Равно(124); + Ожидаем.Что(МойКласс.Поле).Равно(124); + +КонецПроцедуры + +&Тест +Процедура ПерехватчикиПередСинхронизациейПолейДобавленныхФункцийРаботаютКорректно() Экспорт + + // Дано + МойКласс = Новый МойКласс; + МойКласс.Поле = 123; + + НовыйМетод = Новый Метод("ВернутьСебя") + .Публичный() + .ТелоМетода("Возврат ЭтотОбъект;"); + + ПерехватчикПередСинхронизациейПолей = Новый Перехватчик("ВернутьСебя") + .ТипПерехватчика(ТипыПерехватчиковМетода.ПередСинхронизациейПолей) + .Тело("Поле = 124;"); + + Декоратор = Новый ПостроительДекоратора(МойКласс) + .Метод(НовыйМетод) + .Перехватчик(ПерехватчикПередСинхронизациейПолей) + .Построить(); + + // Когда + + Результат = Декоратор.ВернутьСебя(); + + // Тогда + + Ожидаем.Что(Результат.Поле).Равно(124); + Ожидаем.Что(МойКласс.Поле).Равно(124); + +КонецПроцедуры