File: RuntimeSource\Configuration.Binder\Specs\Types\CollectionSpec.cs
Web Access
Project: src\src\Tools\ConfigurationSchemaGenerator\ConfigurationSchemaGenerator.csproj (ConfigurationSchemaGenerator)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.CodeAnalysis;
using SourceGenerators;
 
namespace Microsoft.Extensions.Configuration.Binder.SourceGeneration
{
    internal abstract record CollectionSpec : ComplexTypeSpec
    {
        protected CollectionSpec(ITypeSymbol type) : base(type) { }
 
        public required TypeRef ElementTypeRef { get; init; }
 
    }
 
    internal abstract record CollectionWithCtorInitSpec : CollectionSpec
    {
        protected CollectionWithCtorInitSpec(ITypeSymbol type) : base(type) { }
 
        public required CollectionInstantiationStrategy InstantiationStrategy { get; init; }
 
        public required CollectionInstantiationConcreteType InstantiationConcreteType { get; init; }
 
        public required CollectionPopulationCastType PopulationCastType { get; init; }
    }
 
    internal sealed record ArraySpec : CollectionSpec
    {
        public ArraySpec(ITypeSymbol type) : base(type) { }
    }
 
    internal sealed record EnumerableSpec : CollectionWithCtorInitSpec
    {
        public EnumerableSpec(ITypeSymbol type) : base(type) { }
    }
 
    internal sealed record DictionarySpec : CollectionWithCtorInitSpec
    {
        public DictionarySpec(INamedTypeSymbol type) : base(type) { }
 
        public required TypeRef KeyTypeRef { get; init; }
    }
 
    internal enum CollectionInstantiationStrategy
    {
        NotApplicable = 0,
        ParameterlessConstructor = 1,
        CopyConstructor = 2,
        LinqToDictionary = 3,
    }
 
    internal enum CollectionInstantiationConcreteType
    {
        Self = 0,
        Dictionary = 1,
        List = 2,
        HashSet = 3,
    }
 
    internal enum CollectionPopulationCastType
    {
        NotApplicable = 0,
        IDictionary = 1,
        ICollection = 2,
        ISet = 3,
    }
}