src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\ValueContentAnalysis\ValueContentAbstractValue.cs (24)
21public partial class ValueContentAbstractValue : CacheBasedEquatable<ValueContentAbstractValue>
26public static ValueContentAbstractValue UndefinedState { get; } = new ValueContentAbstractValue(ImmutableHashSet<object?>.Empty, ValueContainsNonLiteralState.Undefined);
27public static ValueContentAbstractValue InvalidState { get; } = new ValueContentAbstractValue(ImmutableHashSet<object?>.Empty, ValueContainsNonLiteralState.Invalid);
28public static ValueContentAbstractValue MayBeContainsNonLiteralState { get; } = new ValueContentAbstractValue(ImmutableHashSet<object?>.Empty, ValueContainsNonLiteralState.Maybe);
29public static ValueContentAbstractValue DoesNotContainLiteralOrNonLiteralState { get; } = new ValueContentAbstractValue(ImmutableHashSet<object?>.Empty, ValueContainsNonLiteralState.No);
30public static ValueContentAbstractValue ContainsNullLiteralState { get; } = new ValueContentAbstractValue(ImmutableHashSet.Create((object?)null), ValueContainsNonLiteralState.No);
31public static ValueContentAbstractValue ContainsEmptyStringLiteralState { get; } = new ValueContentAbstractValue(ImmutableHashSet.Create<object?>(string.Empty), ValueContainsNonLiteralState.No);
32public static ValueContentAbstractValue ContainsZeroIntergralLiteralState { get; } = new ValueContentAbstractValue(ImmutableHashSet.Create<object?>(0), ValueContainsNonLiteralState.No);
33public static ValueContentAbstractValue ContainsOneIntergralLiteralState { get; } = new ValueContentAbstractValue(ImmutableHashSet.Create<object?>(1), ValueContainsNonLiteralState.No);
34private static ValueContentAbstractValue ContainsTrueLiteralState { get; } = new ValueContentAbstractValue(ImmutableHashSet.Create<object?>(true), ValueContainsNonLiteralState.No);
35private static ValueContentAbstractValue ContainsFalseLiteralState { get; } = new ValueContentAbstractValue(ImmutableHashSet.Create<object?>(false), ValueContainsNonLiteralState.No);
43internal static ValueContentAbstractValue Create(object literal, ITypeSymbol type)
80private static ValueContentAbstractValue Create(ImmutableHashSet<object?> literalValues, ValueContainsNonLiteralState nonLiteralState)
156protected override bool ComputeEqualsByHashCodeParts(CacheBasedEquatable<ValueContentAbstractValue> obj)
158var other = (ValueContentAbstractValue)obj;
165/// and returns a new <see cref="ValueContentAbstractValue"/> with the result.
167internal ValueContentAbstractValue Merge(ValueContentAbstractValue otherState)
239internal ValueContentAbstractValue IntersectLiteralValues(ValueContentAbstractValue value2)
251/// and returns a new <see cref="ValueContentAbstractValue"/> with the result.
253internal ValueContentAbstractValue MergeBinaryOperation(
254ValueContentAbstractValue otherState,
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\ValueContentAnalysis\ValueContentAnalysis.CoreAnalysisDataDomain.cs (12)
11using CoreValueContentAnalysisData = DictionaryAnalysisData<AnalysisEntity, ValueContentAbstractValue>;
12using ValueContentAnalysisResult = DataFlowAnalysisResult<ValueContentBlockAnalysisResult, ValueContentAbstractValue>;
14public partial class ValueContentAnalysis : ForwardDataFlowAnalysis<ValueContentAnalysisData, ValueContentAnalysisContext, ValueContentAnalysisResult, ValueContentBlockAnalysisResult, ValueContentAbstractValue>
19private sealed class CoreAnalysisDataDomain : AnalysisEntityMapAbstractDomain<ValueContentAbstractValue>
21public CoreAnalysisDataDomain(AbstractValueDomain<ValueContentAbstractValue> valueDomain, PointsToAnalysisResult? pointsToAnalysisResult)
26protected override ValueContentAbstractValue GetDefaultValue(AnalysisEntity analysisEntity) => ValueContentAbstractValue.MayBeContainsNonLiteralState;
27protected override bool CanSkipNewEntry(AnalysisEntity analysisEntity, ValueContentAbstractValue value) => value.NonLiteralState == ValueContainsNonLiteralState.Maybe;
28protected override void AssertValidEntryForMergedMap(AnalysisEntity analysisEntity, ValueContentAbstractValue value)
42var forwardEdgeValue = forwardEdgeAnalysisData[key];
43if (backEdgeAnalysisData.TryGetValue(key, out var backEdgeValue) &&
47forwardEdgeAnalysisData[key] = ValueContentAbstractValue.MayBeContainsNonLiteralState;
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\ValueContentAnalysis\ValueContentAnalysis.ValueContentDataFlowOperationVisitor.cs (44)
14using ValueContentAnalysisResult = DataFlowAnalysisResult<ValueContentBlockAnalysisResult, ValueContentAbstractValue>;
16public partial class ValueContentAnalysis : ForwardDataFlowAnalysis<ValueContentAnalysisData, ValueContentAnalysisContext, ValueContentAnalysisResult, ValueContentBlockAnalysisResult, ValueContentAbstractValue>
21private sealed class ValueContentDataFlowOperationVisitor : PredicateAnalysisEntityDataFlowOperationVisitor<ValueContentAnalysisData, ValueContentAnalysisContext, ValueContentAnalysisResult, ValueContentAbstractValue>
37protected override void SetAbstractValue(AnalysisEntity analysisEntity, ValueContentAbstractValue value)
40private void SetAbstractValue(ValueContentAnalysisData analysisData, AnalysisEntity analysisEntity, ValueContentAbstractValue value)
43private static void SetAbstractValue(ValueContentAnalysisData analysisData, AnalysisEntity analysisEntity, ValueContentAbstractValue value, bool hasCompletePointsToAnalysisResult)
46if (value == ValueContentAbstractValue.MayBeContainsNonLiteralState &&
64protected override ValueContentAbstractValue GetAbstractValue(AnalysisEntity analysisEntity)
65=> CurrentAnalysisData.TryGetValue(analysisEntity, out var value) ? value : ValueDomain.UnknownOrMayBeValue;
67protected override ValueContentAbstractValue GetAbstractDefaultValue(ITypeSymbol? type)
69ValueContentAbstractValue.DoesNotContainLiteralOrNonLiteralState :
70ValueContentAbstractValue.ContainsNullLiteralState;
116ValueContentAbstractValue currentAssignedValue = GetCachedAbstractValue(assignedValue);
120if (CurrentAnalysisData.TryGetValue(targetEntity, out var existingTargetValue) &&
123var newValue = currentAssignedValue.IntersectLiteralValues(existingTargetValue);
184public override ValueContentAbstractValue DefaultVisit(IOperation operation, object? argument)
190ValueContentAbstractValue.MayBeContainsNonLiteralState :
191ValueContentAbstractValue.ContainsNullLiteralState;
194if (ValueContentAbstractValue.IsSupportedType(operation.Type, out var valueTypeSymbol))
199ValueContentAbstractValue.Create(operation.ConstantValue.Value, valueTypeSymbol) :
200ValueContentAbstractValue.ContainsNullLiteralState;
206PointsToAnalysis.NullAbstractValue.Invalid => ValueContentAbstractValue.InvalidState,
208PointsToAnalysis.NullAbstractValue.Null => ValueContentAbstractValue.ContainsNullLiteralState,
210_ => ValueContentAbstractValue.MayBeContainsNonLiteralState,
224public override ValueContentAbstractValue VisitBinaryOperatorCore(IBinaryOperation operation, object? argument)
226var leftValue = Visit(operation.LeftOperand, argument);
227var rightValue = Visit(operation.RightOperand, argument);
231public override ValueContentAbstractValue ComputeValueForCompoundAssignment(
233ValueContentAbstractValue targetValue,
234ValueContentAbstractValue assignedValue,
241public override ValueContentAbstractValue ComputeValueForIncrementOrDecrementOperation(IIncrementOrDecrementOperation operation, ValueContentAbstractValue targetValue)
243var incrementValue = ValueContentAbstractValue.ContainsOneIntergralLiteralState;
249public override ValueContentAbstractValue VisitObjectCreation(IObjectCreationOperation operation, object? argument)
256public override ValueContentAbstractValue VisitFieldReference(IFieldReferenceOperation operation, object? argument)
258var value = base.VisitFieldReference(operation, argument);
264return ValueContentAbstractValue.ContainsEmptyStringLiteralState;
270public override ValueContentAbstractValue VisitInvocation_NonLambdaOrDelegateOrLocalFunction(
276ValueContentAbstractValue defaultValue)
283public override ValueContentAbstractValue VisitInterpolatedString(IInterpolatedStringOperation operation, object? argument)
287return ValueContentAbstractValue.ContainsEmptyStringLiteralState;
290ValueContentAbstractValue mergedValue = Visit(operation.Parts[0], argument);
293var newValue = Visit(operation.Parts[i], argument);
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\ValueContentAnalysis\ValueContentAnalysisContext.cs (9)
16using InterproceduralValueContentAnalysisData = InterproceduralAnalysisData<ValueContentAnalysisData, ValueContentAnalysisContext, ValueContentAbstractValue>;
17using ValueContentAnalysisResult = DataFlowAnalysisResult<ValueContentBlockAnalysisResult, ValueContentAbstractValue>;
22public sealed class ValueContentAnalysisContext : AbstractDataFlowAnalysisContext<ValueContentAnalysisData, ValueContentAnalysisContext, ValueContentAnalysisResult, ValueContentAbstractValue>
25AbstractValueDomain<ValueContentAbstractValue> valueDomain,
36Func<IOperation, ValueContentAbstractValue>? getValueForAdditionalSupportedValueTypeOperation,
50public Func<IOperation, ValueContentAbstractValue>? GetValueForAdditionalSupportedValueTypeOperation { get; }
53AbstractValueDomain<ValueContentAbstractValue> valueDomain,
64Func<IOperation, ValueContentAbstractValue>? getValueContentValueForAdditionalSupportedValueTypeOperation,
95protected override bool ComputeEqualsByHashCodeParts(AbstractDataFlowAnalysisContext<ValueContentAnalysisData, ValueContentAnalysisContext, ValueContentAnalysisResult, ValueContentAbstractValue> obj)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\ValueContentAnalysis\ValueContentAnalysisData.cs (15)
9using CoreValueContentAnalysisData = DictionaryAnalysisData<AnalysisEntity, ValueContentAbstractValue>;
16public sealed class ValueContentAnalysisData : AnalysisEntityBasedPredicateAnalysisData<ValueContentAbstractValue>
22internal ValueContentAnalysisData(IDictionary<AnalysisEntity, ValueContentAbstractValue> fromData)
32private ValueContentAnalysisData(ValueContentAnalysisData data1, ValueContentAnalysisData data2, MapAbstractDomain<AnalysisEntity, ValueContentAbstractValue> coreDataAnalysisDomain)
39PredicatedAnalysisData<AnalysisEntity, ValueContentAbstractValue> predicatedData1,
40PredicatedAnalysisData<AnalysisEntity, ValueContentAbstractValue> predicatedData2,
42MapAbstractDomain<AnalysisEntity, ValueContentAbstractValue> coreDataAnalysisDomain)
47protected override AbstractValueDomain<ValueContentAbstractValue> ValueDomain => ValueContentAnalysis.ValueDomainInstance;
48public override AnalysisEntityBasedPredicateAnalysisData<ValueContentAbstractValue> Clone() => new ValueContentAnalysisData(this);
50public override int Compare(AnalysisEntityBasedPredicateAnalysisData<ValueContentAbstractValue> other, MapAbstractDomain<AnalysisEntity, ValueContentAbstractValue> coreDataAnalysisDomain)
53public override AnalysisEntityBasedPredicateAnalysisData<ValueContentAbstractValue> WithMergedData(AnalysisEntityBasedPredicateAnalysisData<ValueContentAbstractValue> data, MapAbstractDomain<AnalysisEntity, ValueContentAbstractValue> coreDataAnalysisDomain)
56internal void Reset(ValueContentAbstractValue resetValue)