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)); }
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)); }