private GlobalFlowStateAnalysisValueSet WithAdditionalAnalysisValuesCore(GlobalFlowStateAnalysisValueSet newAnalysisValues)
        {
            Debug.Assert(Kind != GlobalFlowStateAnalysisValueSetKind.Unknown);

            if (Kind != GlobalFlowStateAnalysisValueSetKind.Known)
            {
                return(newAnalysisValues);
            }

            if (newAnalysisValues.Height == 0)
            {
                return(new GlobalFlowStateAnalysisValueSet(
                           AnalysisValues.AddRange(newAnalysisValues.AnalysisValues), Parents, Height, GlobalFlowStateAnalysisValueSetKind.Known));
            }

            return(newAnalysisValues.WithRootParent(this));
        }
Esempio n. 2
0
        public override string ToString()
        {
            return(GetParentString() + GetAnalysisValuesString());

            string GetParentString()
            {
                if (Parents.IsEmpty)
                {
                    return(string.Empty);
                }

                using var parentsBuilder = ArrayBuilder <string> .GetInstance(Parents.Count);

                foreach (var parent in Parents)
                {
                    parentsBuilder.Add(parent.ToString());
                }

                var result = string.Join(" || ", parentsBuilder.Order());

                if (parentsBuilder.Count > 1)
                {
                    result = $"({result})";
                }

                return(result);
            }

            string GetAnalysisValuesString()
            {
                if (AnalysisValues.IsEmpty)
                {
                    return(string.Empty);
                }

                var result = string.Join(" && ", AnalysisValues.Select(f => f.ToString()).Order());

                if (!Parents.IsEmpty)
                {
                    result = $" && {result}";
                }

                return(result);
            }
        }
        internal GlobalFlowStateAnalysisValueSet GetNegatedValue()
        {
            Debug.Assert(Kind == GlobalFlowStateAnalysisValueSetKind.Known);

            if (Height == 0 && AnalysisValues.Count == 1)
            {
                var negatedAnalysisValues = ImmutableHashSet.Create(AnalysisValues.Single().GetNegatedValue());
                return(new GlobalFlowStateAnalysisValueSet(negatedAnalysisValues, Parents, Height, Kind));
            }
            else if (Height > 0 && AnalysisValues.Count == 0)
            {
                return(GetNegateValueFromParents(Parents));
            }
            else
            {
                var parentsBuilder = ImmutableHashSet.CreateBuilder <GlobalFlowStateAnalysisValueSet>();
                foreach (var analysisValue in AnalysisValues)
                {
                    parentsBuilder.Add(new GlobalFlowStateAnalysisValueSet(analysisValue.GetNegatedValue()));
                }

                int height;
                if (Height > 0)
                {
                    var negatedValueFromParents = GetNegateValueFromParents(Parents);
                    parentsBuilder.Add(negatedValueFromParents);
                    height = negatedValueFromParents.Height + 1;
                }
                else
                {
                    Debug.Assert(AnalysisValues.Count > 1);
                    Debug.Assert(parentsBuilder.Count > 1);
                    height = 1;
                }

                return(new GlobalFlowStateAnalysisValueSet(ImmutableHashSet <IAbstractAnalysisValue> .Empty, parentsBuilder.ToImmutable(), height, Kind));
            }