src\440320f3f10733a8\ValueContentAbstractValue.cs (24)
20public partial class ValueContentAbstractValue : CacheBasedEquatable<ValueContentAbstractValue>
25public static ValueContentAbstractValue UndefinedState { get; } = new ValueContentAbstractValue(ImmutableHashSet<object?>.Empty, ValueContainsNonLiteralState.Undefined);
26public static ValueContentAbstractValue InvalidState { get; } = new ValueContentAbstractValue(ImmutableHashSet<object?>.Empty, ValueContainsNonLiteralState.Invalid);
27public static ValueContentAbstractValue MayBeContainsNonLiteralState { get; } = new ValueContentAbstractValue(ImmutableHashSet<object?>.Empty, ValueContainsNonLiteralState.Maybe);
28public static ValueContentAbstractValue DoesNotContainLiteralOrNonLiteralState { get; } = new ValueContentAbstractValue(ImmutableHashSet<object?>.Empty, ValueContainsNonLiteralState.No);
29public static ValueContentAbstractValue ContainsNullLiteralState { get; } = new ValueContentAbstractValue(ImmutableHashSet.Create((object?)null), ValueContainsNonLiteralState.No);
30public static ValueContentAbstractValue ContainsEmptyStringLiteralState { get; } = new ValueContentAbstractValue(ImmutableHashSet.Create<object?>(string.Empty), ValueContainsNonLiteralState.No);
31public static ValueContentAbstractValue ContainsZeroIntergralLiteralState { get; } = new ValueContentAbstractValue(ImmutableHashSet.Create<object?>(0), ValueContainsNonLiteralState.No);
32public static ValueContentAbstractValue ContainsOneIntergralLiteralState { get; } = new ValueContentAbstractValue(ImmutableHashSet.Create<object?>(1), ValueContainsNonLiteralState.No);
33private static ValueContentAbstractValue ContainsTrueLiteralState { get; } = new ValueContentAbstractValue(ImmutableHashSet.Create<object?>(true), ValueContainsNonLiteralState.No);
34private static ValueContentAbstractValue ContainsFalseLiteralState { get; } = new ValueContentAbstractValue(ImmutableHashSet.Create<object?>(false), ValueContainsNonLiteralState.No);
42internal static ValueContentAbstractValue Create(object literal, ITypeSymbol type)
79private static ValueContentAbstractValue Create(ImmutableHashSet<object?> literalValues, ValueContainsNonLiteralState nonLiteralState)
155protected override bool ComputeEqualsByHashCodeParts(CacheBasedEquatable<ValueContentAbstractValue> obj)
157var other = (ValueContentAbstractValue)obj;
164/// and returns a new <see cref="ValueContentAbstractValue"/> with the result.
166internal ValueContentAbstractValue Merge(ValueContentAbstractValue otherState)
238internal ValueContentAbstractValue IntersectLiteralValues(ValueContentAbstractValue value2)
250/// and returns a new <see cref="ValueContentAbstractValue"/> with the result.
252internal ValueContentAbstractValue MergeBinaryOperation(
253ValueContentAbstractValue otherState,
src\440320f3f10733a8\ValueContentAnalysis.CoreAnalysisDataDomain.cs (12)
10using CoreValueContentAnalysisData = DictionaryAnalysisData<AnalysisEntity, ValueContentAbstractValue>;
11using ValueContentAnalysisResult = DataFlowAnalysisResult<ValueContentBlockAnalysisResult, ValueContentAbstractValue>;
13public partial class ValueContentAnalysis : ForwardDataFlowAnalysis<ValueContentAnalysisData, ValueContentAnalysisContext, ValueContentAnalysisResult, ValueContentBlockAnalysisResult, ValueContentAbstractValue>
18private sealed class CoreAnalysisDataDomain : AnalysisEntityMapAbstractDomain<ValueContentAbstractValue>
20public CoreAnalysisDataDomain(AbstractValueDomain<ValueContentAbstractValue> valueDomain, PointsToAnalysisResult? pointsToAnalysisResult)
25protected override ValueContentAbstractValue GetDefaultValue(AnalysisEntity analysisEntity) => ValueContentAbstractValue.MayBeContainsNonLiteralState;
26protected override bool CanSkipNewEntry(AnalysisEntity analysisEntity, ValueContentAbstractValue value) => value.NonLiteralState == ValueContainsNonLiteralState.Maybe;
27protected override void AssertValidEntryForMergedMap(AnalysisEntity analysisEntity, ValueContentAbstractValue value)
41var forwardEdgeValue = forwardEdgeAnalysisData[key];
42if (backEdgeAnalysisData.TryGetValue(key, out var backEdgeValue) &&
46forwardEdgeAnalysisData[key] = ValueContentAbstractValue.MayBeContainsNonLiteralState;
src\440320f3f10733a8\ValueContentAnalysis.ValueContentDataFlowOperationVisitor.cs (44)
13using ValueContentAnalysisResult = DataFlowAnalysisResult<ValueContentBlockAnalysisResult, ValueContentAbstractValue>;
15public partial class ValueContentAnalysis : ForwardDataFlowAnalysis<ValueContentAnalysisData, ValueContentAnalysisContext, ValueContentAnalysisResult, ValueContentBlockAnalysisResult, ValueContentAbstractValue>
20private sealed class ValueContentDataFlowOperationVisitor : PredicateAnalysisEntityDataFlowOperationVisitor<ValueContentAnalysisData, ValueContentAnalysisContext, ValueContentAnalysisResult, ValueContentAbstractValue>
36protected override void SetAbstractValue(AnalysisEntity analysisEntity, ValueContentAbstractValue value)
39private void SetAbstractValue(ValueContentAnalysisData analysisData, AnalysisEntity analysisEntity, ValueContentAbstractValue value)
42private static void SetAbstractValue(ValueContentAnalysisData analysisData, AnalysisEntity analysisEntity, ValueContentAbstractValue value, bool hasCompletePointsToAnalysisResult)
45if (value == ValueContentAbstractValue.MayBeContainsNonLiteralState &&
63protected override ValueContentAbstractValue GetAbstractValue(AnalysisEntity analysisEntity)
64=> CurrentAnalysisData.TryGetValue(analysisEntity, out var value) ? value : ValueDomain.UnknownOrMayBeValue;
66protected override ValueContentAbstractValue GetAbstractDefaultValue(ITypeSymbol? type)
68ValueContentAbstractValue.DoesNotContainLiteralOrNonLiteralState :
69ValueContentAbstractValue.ContainsNullLiteralState;
115ValueContentAbstractValue currentAssignedValue = GetCachedAbstractValue(assignedValue);
119if (CurrentAnalysisData.TryGetValue(targetEntity, out var existingTargetValue) &&
122var newValue = currentAssignedValue.IntersectLiteralValues(existingTargetValue);
183public override ValueContentAbstractValue DefaultVisit(IOperation operation, object? argument)
189ValueContentAbstractValue.MayBeContainsNonLiteralState :
190ValueContentAbstractValue.ContainsNullLiteralState;
193if (ValueContentAbstractValue.IsSupportedType(operation.Type, out var valueTypeSymbol))
198ValueContentAbstractValue.Create(operation.ConstantValue.Value, valueTypeSymbol) :
199ValueContentAbstractValue.ContainsNullLiteralState;
205PointsToAnalysis.NullAbstractValue.Invalid => ValueContentAbstractValue.InvalidState,
207PointsToAnalysis.NullAbstractValue.Null => ValueContentAbstractValue.ContainsNullLiteralState,
209_ => ValueContentAbstractValue.MayBeContainsNonLiteralState,
223public override ValueContentAbstractValue VisitBinaryOperatorCore(IBinaryOperation operation, object? argument)
225var leftValue = Visit(operation.LeftOperand, argument);
226var rightValue = Visit(operation.RightOperand, argument);
230public override ValueContentAbstractValue ComputeValueForCompoundAssignment(
232ValueContentAbstractValue targetValue,
233ValueContentAbstractValue assignedValue,
240public override ValueContentAbstractValue ComputeValueForIncrementOrDecrementOperation(IIncrementOrDecrementOperation operation, ValueContentAbstractValue targetValue)
242var incrementValue = ValueContentAbstractValue.ContainsOneIntergralLiteralState;
248public override ValueContentAbstractValue VisitObjectCreation(IObjectCreationOperation operation, object? argument)
255public override ValueContentAbstractValue VisitFieldReference(IFieldReferenceOperation operation, object? argument)
257var value = base.VisitFieldReference(operation, argument);
263return ValueContentAbstractValue.ContainsEmptyStringLiteralState;
269public override ValueContentAbstractValue VisitInvocation_NonLambdaOrDelegateOrLocalFunction(
275ValueContentAbstractValue defaultValue)
282public override ValueContentAbstractValue VisitInterpolatedString(IInterpolatedStringOperation operation, object? argument)
286return ValueContentAbstractValue.ContainsEmptyStringLiteralState;
289ValueContentAbstractValue mergedValue = Visit(operation.Parts[0], argument);
292var newValue = Visit(operation.Parts[i], argument);
src\440320f3f10733a8\ValueContentAnalysisContext.cs (9)
15using InterproceduralValueContentAnalysisData = InterproceduralAnalysisData<ValueContentAnalysisData, ValueContentAnalysisContext, ValueContentAbstractValue>;
16using ValueContentAnalysisResult = DataFlowAnalysisResult<ValueContentBlockAnalysisResult, ValueContentAbstractValue>;
21public sealed class ValueContentAnalysisContext : AbstractDataFlowAnalysisContext<ValueContentAnalysisData, ValueContentAnalysisContext, ValueContentAnalysisResult, ValueContentAbstractValue>
24AbstractValueDomain<ValueContentAbstractValue> valueDomain,
35Func<IOperation, ValueContentAbstractValue>? getValueForAdditionalSupportedValueTypeOperation,
49public Func<IOperation, ValueContentAbstractValue>? GetValueForAdditionalSupportedValueTypeOperation { get; }
52AbstractValueDomain<ValueContentAbstractValue> valueDomain,
63Func<IOperation, ValueContentAbstractValue>? getValueContentValueForAdditionalSupportedValueTypeOperation,
94protected override bool ComputeEqualsByHashCodeParts(AbstractDataFlowAnalysisContext<ValueContentAnalysisData, ValueContentAnalysisContext, ValueContentAnalysisResult, ValueContentAbstractValue> obj)
src\440320f3f10733a8\ValueContentAnalysisData.cs (15)
8using CoreValueContentAnalysisData = DictionaryAnalysisData<AnalysisEntity, ValueContentAbstractValue>;
15public sealed class ValueContentAnalysisData : AnalysisEntityBasedPredicateAnalysisData<ValueContentAbstractValue>
21internal ValueContentAnalysisData(IDictionary<AnalysisEntity, ValueContentAbstractValue> fromData)
31private ValueContentAnalysisData(ValueContentAnalysisData data1, ValueContentAnalysisData data2, MapAbstractDomain<AnalysisEntity, ValueContentAbstractValue> coreDataAnalysisDomain)
38PredicatedAnalysisData<AnalysisEntity, ValueContentAbstractValue> predicatedData1,
39PredicatedAnalysisData<AnalysisEntity, ValueContentAbstractValue> predicatedData2,
41MapAbstractDomain<AnalysisEntity, ValueContentAbstractValue> coreDataAnalysisDomain)
46protected override AbstractValueDomain<ValueContentAbstractValue> ValueDomain => ValueContentAnalysis.ValueDomainInstance;
47public override AnalysisEntityBasedPredicateAnalysisData<ValueContentAbstractValue> Clone() => new ValueContentAnalysisData(this);
49public override int Compare(AnalysisEntityBasedPredicateAnalysisData<ValueContentAbstractValue> other, MapAbstractDomain<AnalysisEntity, ValueContentAbstractValue> coreDataAnalysisDomain)
52public override AnalysisEntityBasedPredicateAnalysisData<ValueContentAbstractValue> WithMergedData(AnalysisEntityBasedPredicateAnalysisData<ValueContentAbstractValue> data, MapAbstractDomain<AnalysisEntity, ValueContentAbstractValue> coreDataAnalysisDomain)
55internal void Reset(ValueContentAbstractValue resetValue)