/
EvilBeaver
/
OneScript
Обзор
Документация
Войти
/
EvilBeaver
/
OneScript
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
src/OneScript.StandardLibrary/TypeDescriptions/TypeDescriptionBuilder.cs
111 строк
4 KB
Mr-Rm
оптимизация ОписанияТипов
17 дек 2025, 23:55
17 дек 2025, 23:55
daf1263
Код
Авторство
О чём код?
/*---------------------------------------------------------- This Source Code Form is subject to the terms of the Mozilla Public License, v.2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ using System.Collections.Generic; using System.Linq; using OneScript.Types; using OneScript.Values; namespace OneScript.StandardLibrary.TypeDescriptions { internal class TypeDescriptionBuilder { private NumberQualifiers _numberQualifiers; private StringQualifiers _stringQualifiers; private DateQualifiers _dateQualifiers; private BinaryDataQualifiers _binaryDataQualifiers; private const string TYPE_BINARYDATA_NAME = "ДвоичныеДанные"; private static readonly TypeComparer _comparer = new TypeComparer(); private readonly SortedSet<BslTypeValue> _types = new SortedSet<BslTypeValue>(_comparer); internal TypeDescriptionBuilder() { } public TypeDescriptionBuilder SourceDescription(TypeDescription source) { _numberQualifiers = source.NumberQualifiers; _stringQualifiers = source.StringQualifiers; _dateQualifiers = source.DateQualifiers; _binaryDataQualifiers = source.BinaryDataQualifiers; return AddTypes(source.TypesInternal()); } public TypeDescriptionBuilder AddTypes(IEnumerable<BslTypeValue> types) { foreach (var type in types) { if (type.TypeValue.ImplementingClass != typeof(BslUndefinedValue)) _types.Add(type); } return this; } public TypeDescriptionBuilder RemoveTypes(IEnumerable<BslTypeValue> types) { foreach (var type in types) { _types.Remove(type); } return this; } public TypeDescriptionBuilder SetNumberQualifiers(NumberQualifiers nq) { _numberQualifiers = nq; return this; } public TypeDescriptionBuilder SetStringQualifiers(StringQualifiers sq) { _stringQualifiers = sq; return this; } public TypeDescriptionBuilder SetDateQualifiers(DateQualifiers dq) { _dateQualifiers = dq; return this; } public TypeDescriptionBuilder SetBinaryDataQualifiers(BinaryDataQualifiers bq) { _binaryDataQualifiers = bq; return this; } public TypeDescription Build() { var hasNumber = _types.Any(type => type.TypeValue == BasicTypes.Number); var hasString = _types.Any(type => type.TypeValue == BasicTypes.String); var hasDate = _types.Any(type => type.TypeValue == BasicTypes.Date); var hasBinaryData = _types.Any(x => x.TypeValue.Name == TYPE_BINARYDATA_NAME); if (!hasNumber || _numberQualifiers == null) _numberQualifiers = new NumberQualifiers(); if (!hasString || _stringQualifiers == null) _stringQualifiers = new StringQualifiers(); if (!hasDate || _dateQualifiers == null) _dateQualifiers = new DateQualifiers(); if (!hasBinaryData || _binaryDataQualifiers == null) _binaryDataQualifiers = new BinaryDataQualifiers(); return new TypeDescription(_types, _numberQualifiers, _stringQualifiers, _dateQualifiers, _binaryDataQualifiers ); } public static TypeDescriptionBuilder OfType(TypeDescriptor commonType) { var builder = new TypeDescriptionBuilder(); builder.AddTypes(new[] { new BslTypeValue(commonType) }); return builder; } } }