Skip to content

Commit

Permalink
В рефлектор добавлен метод ИзвестныеТипы()
Browse files Browse the repository at this point in the history
Добавлен метод который возвращает все зарегистрированные типы в виде
ТаблицаЗначений<Имя, Значение, Примитивный, Пользовательский, Коллекция>
  • Loading branch information
sfaqer committed Oct 18, 2023
1 parent 9c4247d commit 806dd26
Show file tree
Hide file tree
Showing 3 changed files with 217 additions and 2 deletions.
46 changes: 46 additions & 0 deletions src/ScriptEngine.HostedScript/Library/Reflector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,52 @@ public static Type ReflectContext(Type clrType)
.Build();
}

/// <summary>
/// Возвращает все известные типы
/// </summary>
/// <param name="filter">Структура - Условия поиска. Ключ - имя колонки, значение - искомое значение </param>
/// <returns>
/// ТаблицаЗначений:
/// * Имя - Строка - Имя типа
/// * Значение - Тип - Тип
/// * Примитивный - Булево - Это примитивный тип
/// * Пользовательский - Булево - Это пользовательский типа
/// * Коллекция - Булево - Это коллекция
/// </returns>
[ContextMethod("ИзвестныеТипы", "KnownTypes")]
public ValueTable.ValueTable KnownTypes(StructureImpl filter = default)
{
var result = new ValueTable.ValueTable();

var nameColumn = result.Columns.Add("Имя", TypeDescription.StringType());
var valueColumn = result.Columns.Add("Значение", new TypeDescription(new List<TypeTypeValue>() { new TypeTypeValue(CommonTypes.Type) }));
var primitiveColumn = result.Columns.Add("Примитивный", TypeDescription.BooleanType());
var userColumn = result.Columns.Add("Пользовательский", TypeDescription.BooleanType());
var collectionColumn = result.Columns.Add("Коллекция", TypeDescription.BooleanType());

TypeManager.RegisteredTypes().ForEach(descriptor =>
{
var implementingClass = TypeManager.GetImplementingClass(descriptor.ID);

var row = result.Add();

row.Set(nameColumn, ValueFactory.Create(descriptor.ToString()));
row.Set(valueColumn, new TypeTypeValue(descriptor));
row.Set(primitiveColumn, ValueFactory.Create(implementingClass == typeof(DataType)));
row.Set(userColumn, ValueFactory.Create(implementingClass == typeof(AttachedScriptsFactory)));
row.Set(collectionColumn, ValueFactory.Create(
implementingClass.GetInterface(nameof(ICollectionContext)) != null)
);
});

if (filter != default)
{
result = result.Copy(filter);
}

return result;
}

[ScriptConstructor]
public static IRuntimeContextInstance CreateNew()
{
Expand Down
11 changes: 11 additions & 0 deletions src/ScriptEngine/Machine/TypeManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public interface ITypeManager
bool IsKnownType(Type type);
bool IsKnownType(string typeName);
Type NewInstanceHandler { get; set; }
IReadOnlyList<TypeDescriptor> RegisteredTypes();
}

class StandartTypeManager : ITypeManager
Expand Down Expand Up @@ -206,6 +207,11 @@ public Type NewInstanceHandler
}
}

public IReadOnlyList<TypeDescriptor> RegisteredTypes()
{
return _knownTypes.Select(type => type.Descriptor).ToList();
}

public TypeDescriptor GetTypeDescriptorFor(IValue typeTypeValue)
{
if (typeTypeValue.DataType != DataType.Type)
Expand Down Expand Up @@ -323,6 +329,11 @@ public static TypeFactory GetFactoryFor(string typeName)

return factory;
}

public static IReadOnlyList<TypeDescriptor> RegisteredTypes()
{
return _instance.RegisteredTypes();
}
}

}
162 changes: 160 additions & 2 deletions tests/reflector.os
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьПустыеАннотации");
ВсеТесты.Добавить("ТестДолжен_ПроверитьПриватныеПоля");

ВсеТесты.Добавить("ТестДолжен_ПроверитьИзвестныеТипы");
ВсеТесты.Добавить("ТестДолжен_ПроверитьИзвестныеТипы_СОтборомКоллекция");
ВсеТесты.Добавить("ТестДолжен_ПроверитьИзвестныеТипы_СОтборомПримитивный");
ВсеТесты.Добавить("ТестДолжен_ПроверитьИзвестныеТипы_СОтборомПользовательский");

Возврат ВсеТесты;
КонецФункции

Expand Down Expand Up @@ -215,7 +220,7 @@
ТаблицаМетодов = Рефлектор.ПолучитьТаблицуМетодов(Пример);

юТест.ПроверитьРавенство(Строка(ТипЗнч(ТаблицаМетодов)), "ТаблицаЗначений", "ТаблицаМетодов");
юТест.ПроверитьРавенство(6, ТаблицаМетодов.Количество(), "ТаблицаМетодов.Количество()");
юТест.ПроверитьРавенство(7, ТаблицаМетодов.Количество(), "ТаблицаМетодов.Количество()");

Метод0 = ТаблицаМетодов.Найти("ВызватьМетод", "Имя");
юТест.ПроверитьНеРавенство(Неопределено, Метод0, "Метод0");
Expand Down Expand Up @@ -678,4 +683,157 @@
юТест.ПроверитьНеравенство(0, ТаблицаМетодов.Количество());
юТест.ПроверитьНеравенство(0, ТаблицаСвойств.Количество());

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

Процедура ТестДолжен_ПроверитьИзвестныеТипы() Экспорт

ПолучитьОбъектДляПроверки("МойКлассныйТип");

Рефлектор = Новый Рефлектор;

ИзвестныеТипы = Рефлектор.ИзвестныеТипы();

ПроверитьТипИзвестныхТипов(ИзвестныеТипы);

Для Каждого ИзвестныйТип Из ИзвестныеТипы Цикл
ПроверитьСтрокуИзвестныхТипов(ИзвестныйТип);
КонецЦикла;

ОписаниеТипаЧисло = ИзвестныеТипы.Найти(Тип("Число"));

юТест.ПроверитьЗаполненность(ОписаниеТипаЧисло);
юТест.ПроверитьТип(ОписаниеТипаЧисло, "СтрокаТаблицыЗначений");
юТест.ПроверитьИстину(ОписаниеТипаЧисло.Примитивный);
юТест.ПроверитьЛожь(ОписаниеТипаЧисло.Пользовательский);
юТест.ПроверитьЛожь(ОписаниеТипаЧисло.Коллекция);

ОписаниеТипаМассив = ИзвестныеТипы.Найти(Тип("Массив"));

юТест.ПроверитьЗаполненность(ОписаниеТипаМассив);
юТест.ПроверитьТип(ОписаниеТипаМассив, "СтрокаТаблицыЗначений");
юТест.ПроверитьЛожь(ОписаниеТипаМассив.Примитивный);
юТест.ПроверитьЛожь(ОписаниеТипаМассив.Пользовательский);
юТест.ПроверитьИстину(ОписаниеТипаМассив.Коллекция);

ОписаниеТипаМойКлассныйТип = ИзвестныеТипы.Найти(Тип("МойКлассныйТип"));

юТест.ПроверитьЗаполненность(ОписаниеТипаМойКлассныйТип);
юТест.ПроверитьТип(ОписаниеТипаМойКлассныйТип, "СтрокаТаблицыЗначений");
юТест.ПроверитьЛожь(ОписаниеТипаМойКлассныйТип.Примитивный);
юТест.ПроверитьИстину(ОписаниеТипаМойКлассныйТип.Пользовательский);
юТест.ПроверитьЛожь(ОписаниеТипаМойКлассныйТип.Коллекция);

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

Процедура ТестДолжен_ПроверитьИзвестныеТипы_СОтборомКоллекция() Экспорт

ПолучитьОбъектДляПроверки("МойКлассныйТип");

Рефлектор = Новый Рефлектор;

Отбор = Новый Структура("Коллекция", Истина);

ИзвестныеТипы = Рефлектор.ИзвестныеТипы(Отбор);

ПроверитьТипИзвестныхТипов(ИзвестныеТипы);

Для Каждого ИзвестныйТип Из ИзвестныеТипы Цикл
ПроверитьСтрокуИзвестныхТипов(ИзвестныйТип);

юТест.ПроверитьИстину(ИзвестныйТип.Коллекция);
юТест.ПроверитьЛожь(ИзвестныйТип.Примитивный);
юТест.ПроверитьЛожь(ИзвестныйТип.Пользовательский);

КонецЦикла;

ОписаниеТипаМассив = ИзвестныеТипы.Найти(Тип("Массив"));

юТест.ПроверитьЗаполненность(ОписаниеТипаМассив);
юТест.ПроверитьТип(ОписаниеТипаМассив, "СтрокаТаблицыЗначений");

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

Процедура ТестДолжен_ПроверитьИзвестныеТипы_СОтборомПримитивный() Экспорт

ПолучитьОбъектДляПроверки("МойКлассныйТип");

Рефлектор = Новый Рефлектор;

Отбор = Новый Структура("Примитивный", Истина);

ИзвестныеТипы = Рефлектор.ИзвестныеТипы(Отбор);

ПроверитьТипИзвестныхТипов(ИзвестныеТипы);

Для Каждого ИзвестныйТип Из ИзвестныеТипы Цикл

ПроверитьСтрокуИзвестныхТипов(ИзвестныйТип);

юТест.ПроверитьЛожь(ИзвестныйТип.Коллекция);
юТест.ПроверитьИстину(ИзвестныйТип.Примитивный);
юТест.ПроверитьЛожь(ИзвестныйТип.Пользовательский);

КонецЦикла;

ОписаниеТипаЧисло = ИзвестныеТипы.Найти(Тип("Число"));

юТест.ПроверитьЗаполненность(ОписаниеТипаЧисло);
юТест.ПроверитьТип(ОписаниеТипаЧисло, "СтрокаТаблицыЗначений");

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

Процедура ТестДолжен_ПроверитьИзвестныеТипы_СОтборомПользовательский() Экспорт

ПолучитьОбъектДляПроверки("МойКлассныйТип");

Рефлектор = Новый Рефлектор;

Отбор = Новый Структура("Пользовательский", Истина);

ИзвестныеТипы = Рефлектор.ИзвестныеТипы(Отбор);

ПроверитьТипИзвестныхТипов(ИзвестныеТипы);

Для Каждого ИзвестныйТип Из ИзвестныеТипы Цикл

ПроверитьСтрокуИзвестныхТипов(ИзвестныйТип);

юТест.ПроверитьЛожь(ИзвестныйТип.Коллекция);
юТест.ПроверитьЛожь(ИзвестныйТип.Примитивный);
юТест.ПроверитьИстину(ИзвестныйТип.Пользовательский);

КонецЦикла;

ОписаниеТипаМойКлассныйТип = ИзвестныеТипы.Найти(Тип("МойКлассныйТип"));

юТест.ПроверитьЗаполненность(ОписаниеТипаМойКлассныйТип);
юТест.ПроверитьТип(ОписаниеТипаМойКлассныйТип, "СтрокаТаблицыЗначений");

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

Процедура ПроверитьТипИзвестныхТипов(ИзвестныеТипы)

юТест.ПроверитьТип(ИзвестныеТипы, "ТаблицаЗначений");
юТест.ПроверитьНеРавенство(ИзвестныеТипы.Количество(), 0);

юТест.ПроверитьРавенство(ИзвестныеТипы.Колонки.Количество(), 5);
юТест.ПроверитьЗаполненность(ИзвестныеТипы.Колонки.Найти("Имя"));
юТест.ПроверитьЗаполненность(ИзвестныеТипы.Колонки.Найти("Значение"));
юТест.ПроверитьЗаполненность(ИзвестныеТипы.Колонки.Найти("Примитивный"));
юТест.ПроверитьЗаполненность(ИзвестныеТипы.Колонки.Найти("Пользовательский"));
юТест.ПроверитьЗаполненность(ИзвестныеТипы.Колонки.Найти("Коллекция"));

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

Процедура ПроверитьСтрокуИзвестныхТипов(ИзвестныйТип)

юТест.ПроверитьТип(ИзвестныйТип.Имя, "Строка");
юТест.ПроверитьТип(ИзвестныйТип.Значение, "Тип");
юТест.ПроверитьТип(ИзвестныйТип.Примитивный, "Булево");
юТест.ПроверитьТип(ИзвестныйТип.Пользовательский, "Булево");
юТест.ПроверитьТип(ИзвестныйТип.Коллекция, "Булево");

юТест.ПроверитьЗаполненность(ИзвестныйТип.Имя);
юТест.ПроверитьЗаполненность(ИзвестныйТип.Значение);

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

0 comments on commit 806dd26

Please sign in to comment.