File: DataFlow\FeatureChecksValue.cs
Web Access
Project: src\src\tools\illink\src\ILLink.RoslynAnalyzer\ILLink.RoslynAnalyzer.csproj (ILLink.RoslynAnalyzer)
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
 
using ILLink.Shared.DataFlow;
 
namespace ILLink.RoslynAnalyzer.DataFlow
{
    // Represents the feature conditions checked in a conditional expression,
    // such as
    //     Debug.Assert(RuntimeFeatures.IsDynamicCodeSupported)
    // or
    //     if (!RuntimeFeatures.IsDynamicCodeSupported)
    // For now, this is only designed to track the built-in "features"/"capabilities"
    // like RuntimeFeatures.IsDynamicCodeSupported, where a true return value
    // indicates that a feature/capability is available.
    public record struct FeatureChecksValue : INegate<FeatureChecksValue>, IDeepCopyValue<FeatureChecksValue>
    {
        public ValueSet<string> EnabledFeatures;
        public ValueSet<string> DisabledFeatures;
 
        public static readonly FeatureChecksValue All = new FeatureChecksValue(ValueSet<string>.Unknown, ValueSet<string>.Empty);
 
        public static readonly FeatureChecksValue None = new FeatureChecksValue(ValueSet<string>.Empty, ValueSet<string>.Empty);
 
        public FeatureChecksValue(string enabledFeature)
        {
            EnabledFeatures = new ValueSet<string>(enabledFeature);
            DisabledFeatures = ValueSet<string>.Empty;
        }
 
        private FeatureChecksValue(ValueSet<string> enabled, ValueSet<string> disabled)
        {
            EnabledFeatures = enabled;
            DisabledFeatures = disabled;
        }
 
        public FeatureChecksValue And(FeatureChecksValue other)
        {
            return new FeatureChecksValue(
                ValueSet<string>.Union(EnabledFeatures.DeepCopy(), other.EnabledFeatures.DeepCopy()),
                ValueSet<string>.Union(DisabledFeatures.DeepCopy(), other.DisabledFeatures.DeepCopy()));
        }
 
        public FeatureChecksValue Or(FeatureChecksValue other)
        {
            return new FeatureChecksValue(
                ValueSet<string>.Intersection(EnabledFeatures.DeepCopy(), other.EnabledFeatures.DeepCopy()),
                ValueSet<string>.Intersection(DisabledFeatures.DeepCopy(), other.DisabledFeatures.DeepCopy()));
        }
 
        public FeatureChecksValue Negate()
        {
            return new FeatureChecksValue(DisabledFeatures.DeepCopy(), EnabledFeatures.DeepCopy());
        }
 
        public FeatureChecksValue DeepCopy()
        {
            return new FeatureChecksValue(EnabledFeatures.DeepCopy(), DisabledFeatures.DeepCopy());
        }
    }
}