Skip to content

Commit

Permalink
fixed #1184
Browse files Browse the repository at this point in the history
Грязный хак получения аннотаций для полей объекта
  • Loading branch information
EvilBeaver committed Aug 29, 2022
1 parent 2800e07 commit ffe8dbe
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 1 deletion.
18 changes: 17 additions & 1 deletion src/ScriptEngine/Machine/IRuntimeContextInstance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -56,13 +59,26 @@ public static IEnumerable<VariableInfo> 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<AnnotationDefinition>();

if (i == 0)
return Array.Empty<AnnotationDefinition>();

var variable = userScript.Module.Variables[i - 1];
return variable.Annotations;
}

public static IValue GetPropValue(this IRuntimeContextInstance context, string propName)
{
int propNum = context.FindProperty(propName);
Expand Down
104 changes: 104 additions & 0 deletions tests/annotations.os
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@

ВсеТесты.Добавить("ТестДолжен_ПроверитьПолучениеАннотацийМетода");
ВсеТесты.Добавить("ТестДолжен_ПроверитьПолучениеАннотацийПараметров");
ВсеТесты.Добавить("ТестДолжен_ПроверитьАннотацииПолейЗагрузитьСценарий");
ВсеТесты.Добавить("ТестДолжен_ПроверитьАннотацииПолейЗагрузитьСценарийИзСтроки");

Возврат ВсеТесты;

Expand Down Expand Up @@ -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];

Если ПараметрАннотации.Имя <> "ИмяПараметра" Или ПараметрАннотации.Значение <> "Значение" Тогда

ВызватьИсключение
"Ожидали, что у параметра третьей аннотации будет имя ИмяПараметра и строка Значение в поле значение, а там:
| Имя = " + ПараметрАннотации.Имя + " Значение = " + ПараметрАннотации.Значение;

КонецЕсли;

КонецПроцедуры

0 comments on commit ffe8dbe

Please sign in to comment.