コード例 #1
0
 private IEnumerable <RegisteredType> GetInitialBatch(
     TypeDependencyKind kind)
 {
     return(_types.Values
            .Where(t => t.Dependencies.All(d => d.Kind != kind))
            .Distinct());
 }
コード例 #2
0
 public TypeDependency(
     ITypeReference typeReference,
     TypeDependencyKind kind)
 {
     TypeReference = typeReference
                     ?? throw new ArgumentNullException(nameof(typeReference));
     Kind = kind;
 }
コード例 #3
0
        private bool CompleteTypes(
            TypeDependencyKind kind,
            Func <RegisteredType, bool> action)
        {
            var processed = new HashSet <ITypeReference>();
            var batch     = new List <RegisteredType>(
                GetInitialBatch(kind));
            bool failed = false;

            while (!failed && processed.Count < _types.Count && batch.Count > 0)
            {
                foreach (RegisteredType registeredType in batch)
                {
                    if (!action(registeredType))
                    {
                        failed = true;
                        break;
                    }

                    foreach (ITypeReference reference in
                             registeredType.References)
                    {
                        processed.Add(reference);
                    }
                }

                if (!failed)
                {
                    batch.Clear();
                    batch.AddRange(GetNextBatch(processed, kind));
                }
            }

            if (!failed && processed.Count < _types.Count)
            {
                foreach (RegisteredType type in _types.Values.Distinct()
                         .Where(t => !processed.Contains(t.References[0])))
                {
                    string name = type.Type.Name.HasValue
                        ? type.Type.Name.Value
                        : type.References.ToString();

                    _errors.Add(SchemaErrorBuilder.New()
                                .SetMessage(string.Format(
                                                TypeResources.TypeInitializer_CannotResolveDependency,
                                                name,
                                                string.Join(", ", type.Dependencies
                                                            .Where(t => t.Kind == kind)
                                                            .Select(t => t.TypeReference))))
                                .SetTypeSystemObject(type.Type)
                                .Build());
                }

                return(false);
            }

            return(_errors.Count == 0);
        }
コード例 #4
0
 public CompleteConfiguration(
     Action <ITypeCompletionContext, TDefinition> configure,
     TDefinition owner,
     ApplyConfigurationOn on,
     ITypeReference?typeReference = null,
     TypeDependencyKind kind      = TypeDependencyKind.Default)
     : base((c, d) => configure(c, (TDefinition)d), owner, on, typeReference, kind)
 {
 }
コード例 #5
0
        public void RegisterDependency(
            ITypeReference reference,
            TypeDependencyKind kind)
        {
            if (reference == null)
            {
                throw new ArgumentNullException(nameof(reference));
            }

            _typeDependencies.Add(new TypeDependency(reference, kind));
        }
コード例 #6
0
        public IDependencyDescriptor DependsOn <TType>(bool mustBeNamed)
            where TType : ITypeSystem
        {
            TypeDependencyKind kind = mustBeNamed
                ? TypeDependencyKind.Named
                : TypeDependencyKind.Default;

            _configuration.Dependencies.Add(
                TypeDependency.FromSchemaType(
                    typeof(TType), kind));

            return(this);
        }
コード例 #7
0
        public void RegisterDependencyRange(
            IEnumerable <ITypeReference> references,
            TypeDependencyKind kind)
        {
            if (references == null)
            {
                throw new ArgumentNullException(nameof(references));
            }

            foreach (ITypeReference reference in references)
            {
                _typeDependencies.Add(new TypeDependency(reference, kind));
            }
        }
コード例 #8
0
        protected void DependsOn(
            NameString typeName,
            bool mustBeNamedOrCompleted)
        {
            typeName.EnsureNotEmpty(nameof(typeName));

            TypeDependencyKind kind = mustBeNamedOrCompleted
                ? DependencyKind
                : TypeDependencyKind.Default;

            _configuration.AddDependency(
                new TypeDependency(
                    TypeReference.Create(new NamedTypeNode(typeName), TypeContext.None),
                    kind));
        }
コード例 #9
0
        public IDependencyDescriptor DependsOn(
            NameString typeName,
            bool mustBeNamed)
        {
            typeName.EnsureNotEmpty(nameof(typeName));

            TypeDependencyKind kind = mustBeNamed
                ? TypeDependencyKind.Named
                : TypeDependencyKind.Default;

            _configuration.Dependencies.Add(
                new TypeDependency(
                    new SyntaxTypeReference(
                        new NamedTypeNode(typeName), TypeContext.None),
                    kind));

            return(this);
        }
コード例 #10
0
        public static TypeDependency FromSchemaType(
            IExtendedType type,
            TypeDependencyKind kind = TypeDependencyKind.Default)
        {
            if (type is null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            if (!type.IsSchemaType)
            {
                throw new ArgumentException(
                          TypeResources.TypeDependency_MustBeSchemaType,
                          nameof(type));
            }

            return(new TypeDependency(
                       Descriptors.TypeReference.Create(type),
                       kind));
        }
コード例 #11
0
        public static TypeDependency FromSchemaType(
            Type type,
            TypeDependencyKind kind)
        {
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            if (BaseTypes.IsSchemaType(type))
            {
                TypeContext context   = SchemaTypeReference.InferTypeContext(type);
                var         reference = new ClrTypeReference(type, context);
                return(new TypeDependency(reference, kind));
            }

            throw new ArgumentException(
                      TypeResources.TypeDependency_MustBeSchemaType,
                      nameof(type));
        }
コード例 #12
0
        protected void DependsOn(IExtendedType schemaType, bool mustBeNamedOrCompleted)
        {
            if (schemaType is null)
            {
                throw new ArgumentNullException(nameof(schemaType));
            }

            if (!schemaType.IsSchemaType)
            {
                throw new ArgumentException(
                          TypeResources.DependencyDescriptorBase_OnlyTsoIsAllowed,
                          nameof(schemaType));
            }

            TypeDependencyKind kind = mustBeNamedOrCompleted
                ? DependencyKind
                : TypeDependencyKind.Default;

            _configuration.AddDependency(
                TypeDependency.FromSchemaType(schemaType, kind));
        }
コード例 #13
0
        private IEnumerable <RegisteredType> GetNextBatch(
            ISet <ITypeReference> processed,
            TypeDependencyKind kind)
        {
            foreach (RegisteredType type in _typeRegistry.Types)
            {
                if (!processed.Contains(type.References[0]))
                {
                    IEnumerable <ITypeReference> references =
                        type.Dependencies.Where(t => t.Kind == kind)
                        .Select(t => t.TypeReference);

                    if (TryNormalizeDependencies(references,
                                                 out IReadOnlyList <ITypeReference>?normalized) &&
                        processed.IsSupersetOf(normalized))
                    {
                        yield return(type);
                    }
                }
            }
        }
コード例 #14
0
        protected void DependsOn(Type schemaType, bool mustBeNamedOrCompleted)
        {
            if (schemaType == null)
            {
                throw new ArgumentNullException(nameof(schemaType));
            }

            if (!typeof(ITypeSystemMember).IsAssignableFrom(schemaType))
            {
                throw new ArgumentException(
                          TypeResources.DependencyDescriptorBase_OnlyTsoIsAllowed,
                          nameof(schemaType));
            }

            TypeDependencyKind kind = mustBeNamedOrCompleted
                ? DependencyKind
                : TypeDependencyKind.Default;

            _configuration.Dependencies.Add(
                TypeDependency.FromSchemaType(
                    schemaType, kind));
        }
コード例 #15
0
        protected void DependsOn(Type schemaType, bool mustBeNamedOrCompleted)
        {
            if (schemaType == null)
            {
                throw new ArgumentNullException(nameof(schemaType));
            }

            if (!typeof(ITypeSystem).IsAssignableFrom(schemaType))
            {
                // TODO : resources
                throw new ArgumentException(
                          "Only type system objects are allowed.");
            }

            TypeDependencyKind kind = mustBeNamedOrCompleted
                ? DependencyKind
                : TypeDependencyKind.Default;

            _configuration.Dependencies.Add(
                TypeDependency.FromSchemaType(
                    schemaType, kind));
        }
コード例 #16
0
        private bool ProcessTypes(
            TypeDependencyKind kind,
            Func <RegisteredType, bool> action)
        {
            var processed = new HashSet <ITypeReference>();
            var batch     = new List <RegisteredType>(GetInitialBatch(kind));
            var failed    = false;

            while (!failed &&
                   processed.Count < _typeRegistry.Count &&
                   batch.Count > 0)
            {
                foreach (RegisteredType registeredType in batch)
                {
                    if (!action(registeredType))
                    {
                        failed = true;
                        break;
                    }

                    foreach (ITypeReference reference in registeredType.References)
                    {
                        processed.Add(reference);
                    }
                }

                if (!failed)
                {
                    batch.Clear();
                    batch.AddRange(GetNextBatch(processed, kind));
                }
            }

            if (!failed && processed.Count < _typeRegistry.Count)
            {
                foreach (RegisteredType type in _typeRegistry.Types
                         .Where(t => !processed.Contains(t.References[0])))
                {
                    string name = type.Type.Name.HasValue
                        ? type.Type.Name.Value
                        : type.References[0].ToString() !;

                    ITypeReference[] references =
                        type.Dependencies.Where(t => t.Kind == kind)
                        .Select(t => t.TypeReference).ToArray();

                    IReadOnlyList <ITypeReference> needed =
                        TryNormalizeDependencies(references,
                                                 out IReadOnlyList <ITypeReference>?normalized)
                            ? normalized.Except(processed).ToArray()
                            : references;

                    _errors.Add(SchemaErrorBuilder.New()
                                .SetMessage(
                                    TypeInitializer_CannotResolveDependency,
                                    name,
                                    string.Join(", ", needed))
                                .SetTypeSystemObject(type.Type)
                                .Build());
                }

                return(false);
            }

            return(_errors.Count == 0);
        }