diff --git a/src/ScriptEngine/Machine/IRuntimeContextInstance.cs b/src/ScriptEngine/Machine/IRuntimeContextInstance.cs index 31c5d476b..a14ac769c 100644 --- a/src/ScriptEngine/Machine/IRuntimeContextInstance.cs +++ b/src/ScriptEngine/Machine/IRuntimeContextInstance.cs @@ -5,7 +5,10 @@ This Source Code Form is subject to the terms of the at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ +using System; using System.Collections.Generic; +using System.Diagnostics; +using ScriptEngine.Machine.Contexts; namespace ScriptEngine.Machine { @@ -56,13 +59,26 @@ public static IEnumerable GetProperties(this IRuntimeContextInstan { Identifier = context.GetPropName(i), Type = SymbolType.ContextProperty, - Index = i + Index = i, + Annotations = HackGetAnnotations(context, i) }; } return infos; } + private static AnnotationDefinition[] HackGetAnnotations(IRuntimeContextInstance context, int i) + { + if (!(context is UserScriptContextInstance userScript)) + return Array.Empty(); + + if (i == 0) + return Array.Empty(); + + var variable = userScript.Module.Variables[i - 1]; + return variable.Annotations; + } + public static IValue GetPropValue(this IRuntimeContextInstance context, string propName) { int propNum = context.FindProperty(propName); diff --git a/tests/annotations.os b/tests/annotations.os index c5ef73365..030e00993 100644 --- a/tests/annotations.os +++ b/tests/annotations.os @@ -11,6 +11,8 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьПолучениеАннотацийМетода"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПолучениеАннотацийПараметров"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьАннотацииПолейЗагрузитьСценарий"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьАннотацииПолейЗагрузитьСценарийИзСтроки"); Возврат ВсеТесты; @@ -92,3 +94,105 @@ юТест.ПроверитьРавенство(Парам4.Аннотации.Количество(), 0); КонецПроцедуры + +Процедура ТестДолжен_ПроверитьАннотацииПолейЗагрузитьСценарий() Экспорт + + Файл = ПолучитьИмяВременногоФайла(".os"); + + Запись = Новый ЗаписьТекста(Файл); + Запись.Записать(ТекстСценария()); + Запись.Закрыть(); + + Сценарий = ЗагрузитьСценарий(Файл); + + УдалитьФайлы(Файл); + + ПроверитьАннотацииПоляСценария(Сценарий); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьАннотацииПолейЗагрузитьСценарийИзСтроки() Экспорт + + Сценарий = ЗагрузитьСценарийИзСтроки(ТекстСценария()); + + ПроверитьАннотацииПоляСценария(Сценарий); + +КонецПроцедуры + +Функция ТекстСценария() + + Возврат + "&АннотацияБезПараметра + |&АннотацияСПараметром(""Значение"") + |&АннотацияСИменованнымПараметром(ИмяПараметра = ""Значение"") + |Перем Поле Экспорт;"; + +КонецФункции + +Процедура ПроверитьАннотацииПоляСценария(Сценарий) + + Рефлектор = Новый Рефлектор(); + + ТаблицаСвойств = Рефлектор.ПолучитьТаблицуСвойств(Сценарий); + + Если ТаблицаСвойств.Количество() <> 1 Тогда + ВызватьИсключение "Ожидали, что в таблице свойств будет одно свойство а это не так"; + КонецЕсли; + + КоличествоАннотаций = ТаблицаСвойств[0].Аннотации.Количество(); + + Если КоличествоАннотаций <> 3 Тогда + ВызватьИсключение "Ожидали, что в таблице аннотаций свойства будет 3 аннотации а их там " + КоличествоАннотаций; + КонецЕсли; + + ИмяАннотации = ТаблицаСвойств[0].Аннотации[0].Имя; + + Если ИмяАннотации <> "АннотацияБезПараметра" Тогда + ВызватьИсключение "Ожидали, что первой аннотацией свойства будет АннотацияБезПараметра а там " + ИмяАннотации; + КонецЕсли; + + ИмяАннотации = ТаблицаСвойств[0].Аннотации[1].Имя; + + Если ИмяАннотации <> "АннотацияСПараметром" Тогда + ВызватьИсключение "Ожидали, что второй аннотацией свойства будет АннотацияСПараметром а там " + ИмяАннотации; + КонецЕсли; + + КоличествоПараметров = ТаблицаСвойств[0].Аннотации[1].Параметры.Количество(); + + Если КоличествоПараметров <> 1 Тогда + ВызватьИсключение "Ожидали, что количество параметров второй аннотации будет равно 1 а их там " + КоличествоПараметров; + КонецЕсли; + + ПараметрАннотации = ТаблицаСвойств[0].Аннотации[1].Параметры[0]; + + Если ПараметрАннотации.Имя <> Неопределено Или ПараметрАннотации.Значение <> "Значение" Тогда + + ВызватьИсключение + "Ожидали, что у параметра второй аннотации будет имя Неопределено и строка Значение в поле значение, а там: + | Имя = " + ПараметрАннотации.Имя + " Значение = " + ПараметрАннотации.Значение; + + КонецЕсли; + + ИмяАннотации = ТаблицаСвойств[0].Аннотации[2].Имя; + + Если ИмяАннотации <> "АннотацияСИменованнымПараметром" Тогда + ВызватьИсключение "Ожидали, что третьей аннотацией свойства будет АннотацияСИменованнымПараметром а там " + ИмяАннотации; + КонецЕсли; + + КоличествоПараметров = ТаблицаСвойств[0].Аннотации[2].Параметры.Количество(); + + Если КоличествоПараметров <> 1 Тогда + ВызватьИсключение "Ожидали, что количество параметров третьей аннотации будет равно 1 а их там " + КоличествоПараметров; + КонецЕсли; + + ПараметрАннотации = ТаблицаСвойств[0].Аннотации[2].Параметры[0]; + + Если ПараметрАннотации.Имя <> "ИмяПараметра" Или ПараметрАннотации.Значение <> "Значение" Тогда + + ВызватьИсключение + "Ожидали, что у параметра третьей аннотации будет имя ИмяПараметра и строка Значение в поле значение, а там: + | Имя = " + ПараметрАннотации.Имя + " Значение = " + ПараметрАннотации.Значение; + + КонецЕсли; + +КонецПроцедуры \ No newline at end of file