src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\CopyAnalysis\CopyAnalysis.CopyDataFlowOperationVisitor.cs (41)
64protected override void AddTrackedEntities(CopyAnalysisData analysisData, HashSet<AnalysisEntity> builder, bool forInterproceduralAnalysis)
67protected override bool HasAbstractValue(AnalysisEntity analysisEntity) => CurrentAnalysisData.HasAbstractValue(analysisEntity);
71protected override void StopTrackingEntity(AnalysisEntity analysisEntity, CopyAnalysisData analysisData)
75AnalysisEntity analysisEntity,
77Func<AnalysisEntity, CopyAbstractValue> getDefaultCopyValue)
92protected override CopyAbstractValue GetAbstractValue(AnalysisEntity analysisEntity) => CurrentAnalysisData.TryGetValue(analysisEntity, out var value) ? value : CopyAbstractValue.Unknown;
98protected override void ResetAbstractValue(AnalysisEntity analysisEntity)
101protected override void SetAbstractValue(AnalysisEntity analysisEntity, CopyAbstractValue value)
106protected override void SetAbstractValueForAssignment(AnalysisEntity targetAnalysisEntity, IOperation? assignedValueOperation, CopyAbstractValue assignedValue)
118protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, CopyAbstractValue assignedValue)
136AnalysisEntity analysisEntity,
138Func<AnalysisEntity, CopyAbstractValue?> tryGetAddressSharedCopyValue,
149AnalysisEntity analysisEntity,
151Func<AnalysisEntity, CopyAbstractValue?> tryGetAddressSharedCopyValue,
246protected override void SetValueForParameterOnEntry(IParameterSymbol parameter, AnalysisEntity analysisEntity, ArgumentInfo<CopyAbstractValue>? assignedValue)
272foreach (var entity in assignedEntities)
293protected override void EscapeValueForParameterOnExit(IParameterSymbol parameter, AnalysisEntity analysisEntity)
298private CopyAbstractValue GetResetValue(AnalysisEntity analysisEntity)
300private CopyAbstractValue GetResetValue(AnalysisEntity analysisEntity, CopyAbstractValue currentValue)
307if (AnalysisEntityFactory.TryCreate(operation, out var analysisEntity))
317protected override CopyAbstractValue ComputeAnalysisValueForEscapedRefOrOutArgument(AnalysisEntity analysisEntity, IArgumentOperation operation, CopyAbstractValue defaultValue)
363foreach (var entity in rightCopyValue.AnalysisEntities)
389using var _1 = PooledHashSet<AnalysisEntity>.GetInstance(out var processedEntities);
390using var _2 = ArrayBuilder<AnalysisEntity>.GetInstance(targetAnalysisData.CoreAnalysisData.Count, out var builder);
395var key = builder[i];
431foreach (var entity in entitiesToExclude)
449Func<AnalysisEntity, bool>? predicate = null;
479using var _ = PooledHashSet<AnalysisEntity>.GetInstance(out var entitiesToFilterBuilder);
483foreach (var entity in copyValueEntities)
522private void ApplyMissingCurrentAnalysisDataCore(CopyAnalysisData mergedData, Func<AnalysisEntity, bool>? predicate)
524using var _ = PooledHashSet<AnalysisEntity>.GetInstance(out var processedEntities);
527var key = kvp.Key;
554protected override CopyAnalysisData GetTrimmedCurrentAnalysisData(IEnumerable<AnalysisEntity> withEntities)
556using var _ = PooledHashSet<AnalysisEntity>.GetInstance(out var processedEntities);
558foreach (var entity in withEntities)
574(AnalysisEntity? Instance, PointsToAbstractValue PointsToValue)? invocationInstance,
575(AnalysisEntity Instance, PointsToAbstractValue PointsToValue)? thisOrMeInstanceForCaller,
577IDictionary<AnalysisEntity, PointsToAbstractValue>? pointsToValues,
578IDictionary<AnalysisEntity, CopyAbstractValue>? copyValues,
579IDictionary<AnalysisEntity, ValueContentAbstractValue>? valueContentValues,
655if (AnalysisEntityFactory.TryCreate(operation.Target, out var analysisEntity))
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\CopyAnalysis\CopyAnalysisData.cs (21)
13using CoreCopyAnalysisData = DictionaryAnalysisData<AnalysisEntity, CopyAbstractValue>;
26internal CopyAnalysisData(IDictionary<AnalysisEntity, CopyAbstractValue> fromData)
38private CopyAnalysisData(CopyAnalysisData data1, CopyAnalysisData data2, MapAbstractDomain<AnalysisEntity, CopyAbstractValue> coreDataAnalysisDomain)
47public override int Compare(AnalysisEntityBasedPredicateAnalysisData<CopyAbstractValue> other, MapAbstractDomain<AnalysisEntity, CopyAbstractValue> coreDataAnalysisDomain)
50public override AnalysisEntityBasedPredicateAnalysisData<CopyAbstractValue> WithMergedData(AnalysisEntityBasedPredicateAnalysisData<CopyAbstractValue> data, MapAbstractDomain<AnalysisEntity, CopyAbstractValue> coreDataAnalysisDomain)
59/// We do not support the <see cref="SetAbstractValue(AnalysisEntity, CopyAbstractValue)"/> overload
62internal void SetAbstactValueForEntities(CopyAbstractValue copyValue, AnalysisEntity? entityBeingAssigned)
64foreach (var entity in copyValue.AnalysisEntities)
86public override void SetAbstractValue(AnalysisEntity key, CopyAbstractValue value)
91protected override void RemoveEntryInPredicatedData(AnalysisEntity key, CoreCopyAnalysisData predicatedData)
108foreach (var copyEntity in newValueForOldCopyEntities.AnalysisEntities)
124var originalCoreAnalysisData = new Dictionary<AnalysisEntity, CopyAbstractValue>(coreAnalysisData);
140foreach (var predicatedCopyEntity in predicatedValue.AnalysisEntities)
162foreach (var copyEntity in newCopyEntities)
184public override void Reset(Func<AnalysisEntity, CopyAbstractValue, CopyAbstractValue> getResetValue)
192internal void AssertValidCopyAnalysisData(Func<AnalysisEntity, CopyAbstractValue?>? tryGetDefaultCopyValue = null, bool initializingParameters = false)
200IDictionary<AnalysisEntity, CopyAbstractValue> map,
201Func<AnalysisEntity, CopyAbstractValue?>? tryGetDefaultCopyValue = null,
213foreach (var analysisEntity in kvp.Value.AnalysisEntities)
226foreach (var defaultCopyValyeEntity in defaultCopyValue.AnalysisEntities)
237private static void AssertValidCopyAnalysisEntity(AnalysisEntity analysisEntity)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\GlobalFlowStateAnalysis\GlobalFlowStateDataFlowOperationVisitor.cs (35)
21: AnalysisEntityDataFlowOperationVisitor<DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue>, TAnalysisContext, TAnalysisResult, TAbstractAnalysisValue>
22where TAnalysisContext : AbstractDataFlowAnalysisContext<DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue>, TAnalysisContext, TAnalysisResult, TAbstractAnalysisValue>
27protected AnalysisEntity GlobalEntity { get; }
43DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> analysisData, AnalysisEntity analysisEntity, TAbstractAnalysisValue value);
48private static AnalysisEntity GetGlobalEntity(TAnalysisContext analysisContext)
62return AnalysisEntity.Create(
71public sealed override DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> Flow(
72IOperation statement, BasicBlock block, DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> input)
78private void EnsureInitialized(DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> input)
96public override (DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> output, bool isFeasibleBranch) FlowBranch(
97BasicBlock fromBlock, BranchWithInfo branch, DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> input)
103public override DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> GetEmptyAnalysisData()
106protected sealed override DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> GetClonedAnalysisData(DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> analysisData)
109protected sealed override void AddTrackedEntities(DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> analysisData, HashSet<AnalysisEntity> builder, bool forInterproceduralAnalysis)
112protected sealed override void StopTrackingEntity(AnalysisEntity analysisEntity, DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> analysisData)
115protected sealed override TAbstractAnalysisValue GetAbstractValue(AnalysisEntity analysisEntity)
118protected override void SetAbstractValue(AnalysisEntity analysisEntity, TAbstractAnalysisValue value)
121protected sealed override bool HasAbstractValue(AnalysisEntity analysisEntity)
124protected sealed override bool HasAnyAbstractValue(DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> data)
127protected sealed override DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> GetTrimmedCurrentAnalysisData(IEnumerable<AnalysisEntity> withEntities)
130protected sealed override void ResetAbstractValue(AnalysisEntity analysisEntity)
136protected sealed override void UpdateValuesForAnalysisData(DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> targetAnalysisData)
139protected sealed override void ApplyMissingCurrentAnalysisDataForUnhandledExceptionData(DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> dataAtException, ThrownExceptionInfo throwBranchWithExceptionType)
142protected sealed override void ApplyInterproceduralAnalysisResultCore(DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> resultData)
145protected override DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> GetInitialInterproceduralAnalysisData(
147(AnalysisEntity? Instance, PointsToAbstractValue PointsToValue)? invocationInstance,
148(AnalysisEntity Instance, PointsToAbstractValue PointsToValue)? thisOrMeInstanceForCaller,
150IDictionary<AnalysisEntity, PointsToAbstractValue>? pointsToValues,
151IDictionary<AnalysisEntity, CopyAbstractValue>? copyValues,
152IDictionary<AnalysisEntity, ValueContentAbstractValue>? valueContentValues,
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\PointsToAnalysis\PointsToAnalysis.PointsToDataFlowOperationVisitor.cs (37)
32private readonly PooledDictionary<AnalysisEntity, ImmutableHashSet<AbstractLocation>.Builder> _escapedEntityLocationsBuilder;
46_escapedEntityLocationsBuilder = PooledDictionary<AnalysisEntity, ImmutableHashSet<AbstractLocation>.Builder>.GetInstance();
59public ImmutableDictionary<AnalysisEntity, ImmutableHashSet<AbstractLocation>> GetEscapedLocationsThroughEntitiesMap()
87private bool ShouldBeTracked(AnalysisEntity analysisEntity)
89private PointsToAbstractValue GetValueForEntityThatShouldNotBeTracked(AnalysisEntity analysisEntity)
130protected override void AddTrackedEntities(PointsToAnalysisData analysisData, HashSet<AnalysisEntity> builder, bool forInterproceduralAnalysis)
138foreach (var entity in TrackedEntitiesBuilder.EnumerateEntities())
149protected override bool HasAbstractValue(AnalysisEntity analysisEntity) => CurrentAnalysisData.HasAbstractValue(analysisEntity);
151protected override void StopTrackingEntity(AnalysisEntity analysisEntity, PointsToAnalysisData analysisData)
154protected override PointsToAbstractValue GetAbstractValue(AnalysisEntity analysisEntity)
175protected override void SetAbstractValue(AnalysisEntity analysisEntity, PointsToAbstractValue value)
198AnalysisEntityFactory.TryCreate(operation, out var entity) &&
209private static void SetAbstractValueCore(PointsToAnalysisData pointsToAnalysisData, AnalysisEntity analysisEntity, PointsToAbstractValue value)
212protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, PointsToAbstractValue assignedValue)
222protected override void ResetAbstractValue(AnalysisEntity analysisEntity)
233private static void ResetAbstractValueIfTracked(AnalysisEntity analysisEntity, PointsToAnalysisData pointsToAnalysisData)
242protected override PointsToAbstractValue GetDefaultValueForParameterOnEntry(IParameterSymbol parameter, AnalysisEntity analysisEntity)
249protected override void EscapeValueForParameterOnExit(IParameterSymbol parameter, AnalysisEntity analysisEntity)
260private static PointsToAbstractValue GetResetValue(AnalysisEntity analysisEntity, PointsToAbstractValue currentValue)
276AnalysisEntityFactory.TryCreate(operation, out var analysisEntity))
287protected override PointsToAbstractValue ComputeAnalysisValueForEscapedRefOrOutArgument(AnalysisEntity analysisEntity, IArgumentOperation operation, PointsToAbstractValue defaultValue)
308AnalysisEntityFactory.TryCreate(operation, out var analysisEntity))
406AnalysisEntityFactory.TryCreate(target, out var targetEntity) &&
416foreach (var analysisEntity in copyValue.AnalysisEntities)
437AnalysisEntity key,
503AnalysisEntity analysisEntity,
601protected override PointsToAnalysisData GetTrimmedCurrentAnalysisData(IEnumerable<AnalysisEntity> withEntities)
610(AnalysisEntity? Instance, PointsToAbstractValue PointsToValue)? invocationInstance,
611(AnalysisEntity Instance, PointsToAbstractValue PointsToValue)? thisOrMeInstanceForCaller,
613IDictionary<AnalysisEntity, PointsToAbstractValue>? pointsToValues,
614IDictionary<AnalysisEntity, CopyAbstractValue>? copyValues,
615IDictionary<AnalysisEntity, ValueContentAbstractValue>? valueContentValues,
645AnalysisEntityFactory.TryCreate(escapedInstance, out var escapedEntityOpt);
652AnalysisEntity? escapedEntity,
691foreach (var childEntity in GetChildAnalysisEntities(pointsToValueOfEscapedInstance))
1232AnalysisEntityFactory.TryCreate(operation, out var flowCaptureEntity))
1245AnalysisEntityFactory.TryCreate(operation, out var flowCaptureEntity))
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\PointsToAnalysis\PointsToAnalysisData.cs (13)
11using CorePointsToAnalysisData = DictionaryAnalysisData<AnalysisEntity, PointsToAbstractValue>;
27internal PointsToAnalysisData(IDictionary<AnalysisEntity, PointsToAbstractValue> fromData, Func<ITypeSymbol?, bool> isDisposable)
37PredicatedAnalysisData<AnalysisEntity, PointsToAbstractValue> predicatedData1,
38PredicatedAnalysisData<AnalysisEntity, PointsToAbstractValue> predicatedData2,
40MapAbstractDomain<AnalysisEntity, PointsToAbstractValue> coreDataAnalysisDomain,
58private PointsToAnalysisData(PointsToAnalysisData data1, PointsToAnalysisData data2, MapAbstractDomain<AnalysisEntity, PointsToAbstractValue> coreDataAnalysisDomain)
71public override int Compare(AnalysisEntityBasedPredicateAnalysisData<PointsToAbstractValue> other, MapAbstractDomain<AnalysisEntity, PointsToAbstractValue> coreDataAnalysisDomain)
74public override AnalysisEntityBasedPredicateAnalysisData<PointsToAbstractValue> WithMergedData(AnalysisEntityBasedPredicateAnalysisData<PointsToAbstractValue> data, MapAbstractDomain<AnalysisEntity, PointsToAbstractValue> coreDataAnalysisDomain)
82public override void SetAbstractValue(AnalysisEntity key, PointsToAbstractValue value)
88public override void Reset(Func<AnalysisEntity, PointsToAbstractValue, PointsToAbstractValue> getResetValue)
106foreach (var key in map.Keys)
122internal static void AssertValidPointsToAnalysisData(IDictionary<AnalysisEntity, PointsToAbstractValue> map, Func<ITypeSymbol?, bool> isDisposable)
137AnalysisEntity key,
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\TaintedDataAnalysis\TaintedDataAnalysis.TaintedDataOperationVisitor.cs (12)
59protected override void AddTrackedEntities(TaintedDataAnalysisData analysisData, HashSet<AnalysisEntity> builder, bool forInterproceduralAnalysis)
72protected override TaintedDataAbstractValue GetAbstractValue(AnalysisEntity analysisEntity)
82protected override bool HasAbstractValue(AnalysisEntity analysisEntity)
122protected override TaintedDataAbstractValue GetDefaultValueForParameterOnEntry(IParameterSymbol parameter, AnalysisEntity analysisEntity)
152protected override void SetAbstractValue(AnalysisEntity analysisEntity, TaintedDataAbstractValue value)
163private static void SetAbstractValueCore(TaintedDataAnalysisData taintedAnalysisData, AnalysisEntity analysisEntity, TaintedDataAbstractValue value)
166protected override void ResetAbstractValue(AnalysisEntity analysisEntity)
171protected override void StopTrackingEntity(AnalysisEntity analysisEntity, TaintedDataAnalysisData analysisData)
240if (AnalysisEntityFactory.TryCreate(operation, out AnalysisEntity? analysisEntity))
459AnalysisEntity analysisEntity,
765if (AnalysisEntityFactory.TryCreate(operation, out AnalysisEntity? analysisEntity))
774protected override TaintedDataAnalysisData GetTrimmedCurrentAnalysisData(IEnumerable<AnalysisEntity> withEntities)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\ValueContentAnalysis\ValueContentAnalysis.ValueContentDataFlowOperationVisitor.cs (12)
31protected override void AddTrackedEntities(ValueContentAnalysisData analysisData, HashSet<AnalysisEntity> builder, bool forInterproceduralAnalysis)
34protected override void ResetAbstractValue(AnalysisEntity analysisEntity)
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)
58protected override bool HasAbstractValue(AnalysisEntity analysisEntity)
61protected override void StopTrackingEntity(AnalysisEntity analysisEntity, ValueContentAnalysisData analysisData)
64protected override ValueContentAbstractValue GetAbstractValue(AnalysisEntity analysisEntity)
81AnalysisEntityFactory.TryCreate(operation, out var entity) &&
118AnalysisEntityFactory.TryCreate(target, out var targetEntity))
147foreach (var analysisEntity in copyValue.AnalysisEntities)
180protected override ValueContentAnalysisData GetTrimmedCurrentAnalysisData(IEnumerable<AnalysisEntity> withEntities)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\ValueContentAnalysis\ValueContentAnalysisData.cs (8)
9using CoreValueContentAnalysisData = DictionaryAnalysisData<AnalysisEntity, 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)
50public override int Compare(AnalysisEntityBasedPredicateAnalysisData<ValueContentAbstractValue> other, MapAbstractDomain<AnalysisEntity, ValueContentAbstractValue> coreDataAnalysisDomain)
53public override AnalysisEntityBasedPredicateAnalysisData<ValueContentAbstractValue> WithMergedData(AnalysisEntityBasedPredicateAnalysisData<ValueContentAbstractValue> data, MapAbstractDomain<AnalysisEntity, ValueContentAbstractValue> coreDataAnalysisDomain)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\AbstractLocation.cs (6)
17/// This is may be used to represent a location where an <see cref="DataFlow.AnalysisEntity"/> resides, i.e. <see cref="AnalysisEntity.InstanceLocation"/> or
35private AbstractLocation(IOperation? creation, ImmutableStack<IOperation>? creationCallStack, AnalysisEntity? analysisEntity, ISymbol? symbol, InterproceduralCaptureId? captureId, ITypeSymbol? locationType, bool isSpecialSingleton)
48private static AbstractLocation Create(IOperation? creation, ImmutableStack<IOperation>? creationCallStack, AnalysisEntity? analysisEntity, ISymbol? symbol, InterproceduralCaptureId? captureId, ITypeSymbol? locationType)
60public static AbstractLocation CreateAnalysisEntityDefaultLocation(AnalysisEntity analysisEntity)
86public AnalysisEntity? AnalysisEntity { get; }
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\AnalysisEntity.cs (22)
34public sealed class AnalysisEntity : CacheBasedEquatable<AnalysisEntity>
45AnalysisEntity? parent,
46AnalysisEntity? entityForInstanceLocation,
69private AnalysisEntity(ISymbol? symbol, ImmutableArray<AbstractIndex> indices, PointsToAbstractValue location, ITypeSymbol type, AnalysisEntity? parent, AnalysisEntity? entityForInstanceLocation)
94public static AnalysisEntity Create(ISymbol? symbol, ImmutableArray<AbstractIndex> indices,
95ITypeSymbol type, PointsToAbstractValue instanceLocation, AnalysisEntity? parent, AnalysisEntity? entityForInstanceLocation)
104public static AnalysisEntity Create(IInstanceReferenceOperation instanceReferenceOperation, PointsToAbstractValue instanceLocation)
109public static AnalysisEntity Create(
117public static AnalysisEntity CreateThisOrMeInstance(INamedTypeSymbol typeSymbol, PointsToAbstractValue instanceLocation)
126public AnalysisEntity WithMergedInstanceLocation(AnalysisEntity analysisEntityToMerge)
201public AnalysisEntity? EntityForInstanceLocation { get; }
203public AnalysisEntity? Parent { get; }
216internal AnalysisEntity WithIndices(ImmutableArray<AbstractIndex> indices)
219public bool EqualsIgnoringInstanceLocation(AnalysisEntity? other)
252protected override bool ComputeEqualsByHashCodeParts(CacheBasedEquatable<AnalysisEntity> obj)
254var other = (AnalysisEntity)obj;
278public bool HasAncestor(AnalysisEntity ancestor)
280AnalysisEntity? current = this.Parent;
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\AnalysisEntityBasedPredicateAnalysisData.cs (25)
17/// whose <see cref="CoreAnalysisData"/> is keyed by an <see cref="AnalysisEntity"/>.
19public abstract class AnalysisEntityBasedPredicateAnalysisData<TValue> : PredicatedAnalysisData<AnalysisEntity, TValue>
26protected AnalysisEntityBasedPredicateAnalysisData(IDictionary<AnalysisEntity, TValue> fromData)
40MapAbstractDomain<AnalysisEntity, TValue> coreDataAnalysisDomain)
50DictionaryAnalysisData<AnalysisEntity, TValue> mergedCoreAnalysisData,
51PredicatedAnalysisData<AnalysisEntity, TValue> predicatedData1,
52PredicatedAnalysisData<AnalysisEntity, TValue> predicatedData2,
54MapAbstractDomain<AnalysisEntity, TValue> coreDataAnalysisDomain)
61public DictionaryAnalysisData<AnalysisEntity, TValue> CoreAnalysisData { get; }
67public abstract AnalysisEntityBasedPredicateAnalysisData<TValue> WithMergedData(AnalysisEntityBasedPredicateAnalysisData<TValue> data, MapAbstractDomain<AnalysisEntity, TValue> coreDataAnalysisDomain);
68public abstract int Compare(AnalysisEntityBasedPredicateAnalysisData<TValue> other, MapAbstractDomain<AnalysisEntity, TValue> coreDataAnalysisDomain);
70protected int BaseCompareHelper(AnalysisEntityBasedPredicateAnalysisData<TValue> newData, MapAbstractDomain<AnalysisEntity, TValue> coreDataAnalysisDomain)
84public bool HasAbstractValue(AnalysisEntity analysisEntity) => CoreAnalysisData.ContainsKey(analysisEntity);
86public bool TryGetValue(AnalysisEntity key, [MaybeNullWhen(false)] out TValue value) => CoreAnalysisData.TryGetValue(key, out value);
89public TValue this[AnalysisEntity key] => CoreAnalysisData[key];
99public virtual void SetAbstractValue(AnalysisEntity key, TValue value)
112public void RemoveEntries(AnalysisEntity key)
131public virtual void Reset(Func<AnalysisEntity, TValue, TValue> getResetValue)
140foreach (var key in keys)
150public void StartTrackingPredicatedData(AnalysisEntity predicatedEntity, AnalysisEntityBasedPredicateAnalysisData<TValue>? truePredicateData, AnalysisEntityBasedPredicateAnalysisData<TValue>? falsePredicateData)
158public PredicateValueKind ApplyPredicatedDataForEntity(AnalysisEntity predicatedEntity, bool trueData)
167public void AddTrackedEntities(HashSet<AnalysisEntity> builder) => builder.UnionWith(CoreAnalysisData.Keys);
169private void ClearOverlappingAnalysisDataForIndexedEntity(AnalysisEntity analysisEntity, TValue value)
180using var _ = ArrayBuilder<(AnalysisEntity, TValue)>.GetInstance(CoreAnalysisData.Count, out var builder);
181foreach (var entity in CoreAnalysisData.Keys)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\AnalysisEntityDataFlowOperationVisitor.cs (107)
22/// Operation visitor to flow the abstract dataflow analysis values for <see cref="AnalysisEntity"/> instances across a given statement in a basic block.
38protected void AddTrackedEntities(HashSet<AnalysisEntity> builder, bool forInterproceduralAnalysis = false)
40protected abstract void AddTrackedEntities(TAnalysisData analysisData, HashSet<AnalysisEntity> builder, bool forInterproceduralAnalysis = false);
41protected abstract void SetAbstractValue(AnalysisEntity analysisEntity, TAbstractAnalysisValue value);
42protected abstract void ResetAbstractValue(AnalysisEntity analysisEntity);
43protected abstract TAbstractAnalysisValue GetAbstractValue(AnalysisEntity analysisEntity);
44protected abstract bool HasAbstractValue(AnalysisEntity analysisEntity);
45protected abstract void StopTrackingEntity(AnalysisEntity analysisEntity, TAnalysisData analysisData);
49if (AnalysisEntityFactory.TryCreate(operation, out var analysisEntity))
68if (AnalysisEntityFactory.TryCreate(operation, out var analysisEntity))
80protected virtual TAbstractAnalysisValue ComputeAnalysisValueForEscapedRefOrOutArgument(AnalysisEntity analysisEntity, IArgumentOperation operation, TAbstractAnalysisValue defaultValue)
90protected void ResetAnalysisData(DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> currentAnalysisData)
95foreach (var key in keys)
107using var _ = PooledHashSet<AnalysisEntity>.GetInstance(out var allEntities);
113if (AnalysisEntityFactory.TryCreateForSymbolDeclaration(local, out var analysisEntity))
125if (AnalysisEntityFactory.TryGetForFlowCapture(captureId, out var analysisEntity))
132private void StopTrackingDataForEntity(AnalysisEntity analysisEntity, PooledHashSet<AnalysisEntity> allEntities)
135private void StopTrackingDataForEntity(AnalysisEntity analysisEntity, TAnalysisData analysisData, PooledHashSet<AnalysisEntity> allEntities)
148foreach (var childEntity in GetChildAnalysisEntities(analysisEntity, allEntities))
155private void StopTrackingDataForParamArrayParameterIndices(AnalysisEntity analysisEntity, TAnalysisData analysisData, PooledHashSet<AnalysisEntity> allEntities)
159foreach (var entity in allEntities)
169protected sealed override void StopTrackingDataForParameter(IParameterSymbol parameter, AnalysisEntity analysisEntity)
172protected sealed override void StopTrackingDataForParameters(ImmutableDictionary<IParameterSymbol, AnalysisEntity> parameterEntities)
176using var _ = PooledHashSet<AnalysisEntity>.GetInstance(out var allEntities);
194using var _ = PooledHashSet<AnalysisEntity>.GetInstance(out var entitiesBuilder);
212if (AnalysisEntityFactory.TryCreateForArrayElementInitializer(arrayCreation, indices, elementType, out var analysisEntity))
220if (AnalysisEntityFactory.TryCreate(target, out var targetAnalysisEntity))
238protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, TAbstractAnalysisValue assignedValue)
252protected virtual void SetAbstractValueForAssignment(AnalysisEntity targetAnalysisEntity, IOperation? assignedValueOperation, TAbstractAnalysisValue assignedValue)
254AnalysisEntity? assignedValueEntity = null;
264private void SetAbstractValueForAssignment(AnalysisEntity targetAnalysisEntity, AnalysisEntity? assignedValueEntity, IOperation? assignedValueOperation, TAbstractAnalysisValue assignedValue)
281foreach (var entity in addressSharedCopyValue.AnalysisEntities)
292protected override void SetValueForParameterOnEntry(IParameterSymbol parameter, AnalysisEntity analysisEntity, ArgumentInfo<TAbstractAnalysisValue>? assignedValue)
305protected override void EscapeValueForParameterOnExit(IParameterSymbol parameter, AnalysisEntity analysisEntity)
314protected virtual TAbstractAnalysisValue GetDefaultValueForParameterOnEntry(IParameterSymbol parameter, AnalysisEntity analysisEntity) => ValueDomain.UnknownOrMayBeValue;
322/// Resets all the analysis data for all <see cref="AnalysisEntity"/> instances that share the same <see cref="AnalysisEntity.InstanceLocation"/>
326protected override void ResetValueTypeInstanceAnalysisData(AnalysisEntity analysisEntity)
331IEnumerable<AnalysisEntity> dependantAnalysisEntities = GetChildAnalysisEntities(analysisEntity);
339IEnumerable<AnalysisEntity> dependantAnalysisEntities = GetChildAnalysisEntities(pointsToAbstractValue);
347private void ResetInstanceAnalysisDataCore(IEnumerable<AnalysisEntity> dependantAnalysisEntities)
349foreach (var dependentAnalysisEntity in dependantAnalysisEntities)
357/// This involves transfer of data for of all <see cref="AnalysisEntity"/> instances that share the same <see cref="AnalysisEntity.InstanceLocation"/> as <paramref name="valueAnalysisEntity"/> or allocation for the <paramref name="assignedValueOperation"/>
358/// to all <see cref="AnalysisEntity"/> instances that share the same <see cref="AnalysisEntity.InstanceLocation"/> as <paramref name="targetAnalysisEntity"/>.
360private void TransferValueTypeInstanceAnalysisDataForAssignment(AnalysisEntity targetAnalysisEntity, AnalysisEntity? valueAnalysisEntity, IOperation? assignedValueOperation)
365IEnumerable<AnalysisEntity> dependentAnalysisEntities;
388foreach (AnalysisEntity dependentInstance in dependentAnalysisEntities)
391AnalysisEntity newAnalysisEntity = AnalysisEntityFactory.CreateWithNewInstanceRoot(dependentInstance, targetAnalysisEntity);
397private ImmutableHashSet<AnalysisEntity> GetChildAnalysisEntities(AnalysisEntity analysisEntity)
403return ImmutableHashSet<AnalysisEntity>.Empty;
409private static IEnumerable<AnalysisEntity> GetChildAnalysisEntities(AnalysisEntity analysisEntity, HashSet<AnalysisEntity> allEntities)
413foreach (var entity in allEntities)
422protected static bool IsChildAnalysisEntity(AnalysisEntity entity, AnalysisEntity ancestorEntity)
428protected ImmutableHashSet<AnalysisEntity> GetChildAnalysisEntities(PointsToAbstractValue? instanceLocation)
433private ImmutableHashSet<AnalysisEntity> GetChildAnalysisEntities(PointsToAbstractValue? instanceLocation, Func<AnalysisEntity, bool>? predicate)
438return ImmutableHashSet<AnalysisEntity>.Empty;
446protected static bool IsChildAnalysisEntity(AnalysisEntity entity, PointsToAbstractValue instanceLocation)
453private ImmutableHashSet<AnalysisEntity> GetChildAnalysisEntities(Func<AnalysisEntity, bool> predicate)
455var trackedEntitiesBuilder = PooledHashSet<AnalysisEntity>.GetInstance();
466(AnalysisEntity? Instance, PointsToAbstractValue PointsToValue)? invocationInstance,
467(AnalysisEntity Instance, PointsToAbstractValue PointsToValue)? thisOrMeInstanceForCaller,
469IDictionary<AnalysisEntity, PointsToAbstractValue>? pointsToValues,
470IDictionary<AnalysisEntity, CopyAbstractValue>? copyValues,
471IDictionary<AnalysisEntity, ValueContentAbstractValue>? valueContentValues,
490using var _1 = PooledHashSet<AnalysisEntity>.GetInstance(out var candidateEntitiesBuilder);
491using var _2 = PooledHashSet<AnalysisEntity>.GetInstance(out var interproceduralEntitiesToRetainBuilder);
492using var _3 = PooledHashSet<AnalysisEntity>.GetInstance(out var worklistEntities);
495using var _6 = PooledHashSet<AnalysisEntity>.GetInstance(out var childWorklistEntities);
544foreach (var candidateEntity in candidateEntitiesBuilder)
546foreach (var ancestorEntity in worklistEntities)
567foreach (var candidateEntity in candidateEntitiesBuilder)
585foreach (var childEntity in childWorklistEntities)
603bool AddWorklistEntityAndPointsToValue(AnalysisEntity? analysisEntity)
639protected abstract TAnalysisData GetTrimmedCurrentAnalysisData(IEnumerable<AnalysisEntity> withEntities);
642IEnumerable<AnalysisEntity> withEntities,
643IDictionary<AnalysisEntity, TAbstractAnalysisValue> existingValues,
644Action<TAnalysisData, AnalysisEntity, TAbstractAnalysisValue> setAbstractValue)
647foreach (var entity in withEntities)
672protected void ApplyInterproceduralAnalysisResultHelper(IDictionary<AnalysisEntity, TAbstractAnalysisValue> resultToApply)
676var entity = kvp.Key;
686internal bool ShouldStopTrackingEntityAtExit(AnalysisEntity entity)
706using var _ = PooledHashSet<AnalysisEntity>.GetInstance(out var allAnalysisEntities);
713foreach (var entity in allAnalysisEntities)
730protected DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> GetClonedAnalysisDataHelper(IDictionary<AnalysisEntity, TAbstractAnalysisValue> analysisData)
734DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> coreDataAtException,
735DictionaryAnalysisData<AnalysisEntity, TAbstractAnalysisValue> coreCurrentAnalysisData,
738Func<AnalysisEntity, bool>? predicate = null;
759private void HandleDeconstructionAssignment(IOperation target, ImmutableHashSet<AnalysisEntity> childEntities)
773var tupleElementEntity = tupleElementEntities[i];
779else if (AnalysisEntityFactory.TryCreate(element, out var elementEntity))
781AnalysisEntity? assignedValueEntity = childEntities.FirstOrDefault(c => IsMatchingAssignedEntity(tupleElementEntity, c));
791static bool IsMatchingAssignedEntity(AnalysisEntity tupleElementEntity, AnalysisEntity? childEntity)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\AnalysisEntityFactory.cs (43)
22/// Factory to create <see cref="AnalysisEntity"/> objects for operations, symbol declarations, etc.
30private readonly Dictionary<IOperation, AnalysisEntity?> _analysisEntityMap;
31private readonly Dictionary<ITupleOperation, ImmutableArray<AnalysisEntity>> _tupleElementEntitiesMap;
32private readonly Dictionary<CaptureId, AnalysisEntity> _captureIdEntityMap;
38private readonly AnalysisEntity? _interproceduralThisOrMeInstanceForCaller;
40private readonly Func<IOperation, AnalysisEntity?>? _interproceduralGetAnalysisEntityForFlowCapture;
50AnalysisEntity? interproceduralInvocationInstance,
51AnalysisEntity? interproceduralThisOrMeInstanceForCaller,
54Func<IOperation, AnalysisEntity?>? interproceduralGetAnalysisEntityForFlowCapture,
86ThisOrMeInstance = AnalysisEntity.CreateThisOrMeInstance(containingTypeSymbol, instanceLocation);
90public AnalysisEntity ThisOrMeInstance { get; }
125public bool TryCreate(IOperation operation, [NotNullWhen(returnValue: true)] out AnalysisEntity? analysisEntity)
186analysisEntity = AnalysisEntity.Create(instanceReference, instanceLocation);
208TryCreate(flowCapture.Value, out var capturedEntity) &&
311public bool TryCreateForSymbolDeclaration(ISymbol symbol, [NotNullWhen(returnValue: true)] out AnalysisEntity? analysisEntity)
323public bool TryCreateForTupleElements(ITupleOperation tupleOperation, [NotNullWhen(returnValue: true)] out ImmutableArray<AnalysisEntity> elementEntities)
346AnalysisEntity? entityForInstanceLocation = null;
348AnalysisEntity? parentEntity = null;
368parentEntity = AnalysisEntity.Create(underlyingValueTupleType, ImmutableArray<AbstractIndex>.Empty,
374using var _ = ArrayBuilder<AnalysisEntity>.GetInstance(tupleType.TupleElements.Length, out var builder);
384builder.Add(AnalysisEntity.Create(mappedValueTupleField, indices: ImmutableArray<AbstractIndex>.Empty,
397public bool TryCreateForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, [NotNullWhen(returnValue: true)] out AnalysisEntity? analysisEntity)
404public bool TryGetForFlowCapture(CaptureId captureId, out AnalysisEntity analysisEntity)
410public bool TryGetForInterproceduralAnalysis(IOperation operation, out AnalysisEntity? analysisEntity)
413private AnalysisEntity GetOrCreateForFlowCapture(CaptureId captureId, ITypeSymbol? type, IOperation flowCaptureOrReference, bool isLValueFlowCapture)
418var interproceduralFlowCaptureEntity = _interproceduralGetAnalysisEntityForFlowCapture?.Invoke(flowCaptureOrReference);
426if (!_captureIdEntityMap.TryGetValue(captureId, out var entity))
432entity = AnalysisEntity.Create(interproceduralCaptureId, type, instanceLocation);
440ITypeSymbol type, IOperation? instance, [NotNullWhen(returnValue: true)] out AnalysisEntity? analysisEntity)
455AnalysisEntity? entityForReferenceTypeInstance = null;
456AnalysisEntity? parent = null;
461if (TryCreate(instance, out var instanceEntityOpt) &&
494if (TryCreate(instance, out var instanceEntity))
515private PointsToAbstractValue? EnsureLocation(PointsToAbstractValue? instanceLocation, ISymbol? symbol, AnalysisEntity? parent)
554private AnalysisEntity Create(ISymbol? symbol, ImmutableArray<AbstractIndex> indices, ITypeSymbol type, PointsToAbstractValue? instanceLocation, AnalysisEntity? parent, AnalysisEntity? entityForInstanceLocation)
558var analysisEntity = AnalysisEntity.Create(symbol, indices, type, instanceLocation, parent, entityForInstanceLocation);
562public AnalysisEntity CreateWithNewInstanceRoot(AnalysisEntity analysisEntity, AnalysisEntity newRootInstance)
576AnalysisEntity parentOpt = CreateWithNewInstanceRoot(analysisEntity.Parent, newRootInstance);
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\AnalysisEntityMapAbstractDomain.cs (22)
16public abstract class AnalysisEntityMapAbstractDomain<TValue> : MapAbstractDomain<AnalysisEntity, TValue>
18private static readonly Func<AnalysisEntity, bool> s_defaultIsTrackedEntity = new(_ => true);
21private readonly Func<AnalysisEntity, bool> _isTrackedEntity;
26Func<AnalysisEntity, bool> isTrackedEntity,
41protected abstract TValue GetDefaultValue(AnalysisEntity analysisEntity);
42protected abstract bool CanSkipNewEntry(AnalysisEntity analysisEntity, TValue value);
47private bool CanSkipNewEntity(AnalysisEntity analysisEntity)
64protected abstract void AssertValidEntryForMergedMap(AnalysisEntity analysisEntity, TValue value);
65protected virtual void AssertValidAnalysisData(DictionaryAnalysisData<AnalysisEntity, TValue> map)
76public override DictionaryAnalysisData<AnalysisEntity, TValue> Merge(DictionaryAnalysisData<AnalysisEntity, TValue> map1, DictionaryAnalysisData<AnalysisEntity, TValue> map2)
82var resultMap = new DictionaryAnalysisData<AnalysisEntity, TValue>();
83using var _1 = PooledHashSet<AnalysisEntity>.GetInstance(out var newKeys);
90AnalysisEntity key1 = entry1.Key;
105foreach (AnalysisEntity key2 in equivalentKeys2)
133AnalysisEntity mergedKey = key1.WithMergedInstanceLocation(key2);
201var key2 = kvp.Key;
211foreach (var newKey in newKeys)
231static bool IsAnalysisEntityForFieldOrProperty(AnalysisEntity entity)
234TValue GetMergedValueForEntityPresentInOneMap(AnalysisEntity key, TValue value)
265void AddNewEntryToResultMap(AnalysisEntity key, TValue value, bool isNewKey = false)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\DataFlowOperationVisitor.cs (60)
54private ImmutableDictionary<IParameterSymbol, AnalysisEntity>? _lazyParameterEntities;
134protected abstract void SetValueForParameterOnEntry(IParameterSymbol parameter, AnalysisEntity analysisEntity, ArgumentInfo<TAbstractAnalysisValue>? assignedValue);
135protected abstract void EscapeValueForParameterOnExit(IParameterSymbol parameter, AnalysisEntity analysisEntity);
310AnalysisEntity? interproceduralInvocationInstance;
354protected CopyAbstractValue GetDefaultCopyValue(AnalysisEntity analysisEntity)
357protected CopyAbstractValue? TryGetAddressSharedCopyValue(AnalysisEntity analysisEntity)
535protected abstract void StopTrackingDataForParameter(IParameterSymbol parameter, AnalysisEntity analysisEntity);
537protected virtual void StopTrackingDataForParameters(ImmutableDictionary<IParameterSymbol, AnalysisEntity> parameterEntities)
542AnalysisEntity analysisEntity = kvp.Value;
557var builder = ImmutableDictionary.CreateBuilder<IParameterSymbol, AnalysisEntity>();
563var result = AnalysisEntityFactory.TryCreateForSymbolDeclaration(parameter, out var analysisEntity);
593AnalysisEntity analysisEntity = kvp.Value;
670protected bool IsParameterEntityForCurrentMethod(AnalysisEntity analysisEntity)
673_lazyParameterEntities.TryGetValue(parameter, out var parameterEntity) &&
968if (AnalysisEntityFactory.TryGetForFlowCapture(captureId, out var analysisEntity) &&
1139protected ImmutableHashSet<AbstractLocation> GetEscapedLocations(AnalysisEntity parameterEntity)
1152protected bool TryGetPointsToAbstractValueAtEntryBlockEnd(AnalysisEntity analysisEntity, [NotNullWhen(true)] out PointsToAbstractValue? pointsToAbstractValue)
1161protected bool TryGetNullAbstractValueAtCurrentBlockEntry(AnalysisEntity analysisEntity, out NullAbstractValue nullAbstractValue)
1175protected bool TryGetMergedNullAbstractValueAtUnhandledThrowOperationsInGraph(AnalysisEntity analysisEntity, out NullAbstractValue nullAbstractValue)
1404AnalysisEntity? predicatedFlowCaptureEntity = GetPredicatedFlowCaptureEntity();
1435var result = AnalysisEntityFactory.TryCreate(operation, out AnalysisEntity? flowCaptureReferenceEntity);
1513AnalysisEntity? GetPredicatedFlowCaptureEntity()
1526if (AnalysisEntityFactory.TryCreate(current, out var targetEntity) &&
1683var result = AnalysisEntityFactory.TryCreate(operation, out AnalysisEntity? flowCaptureReferenceEntity);
1726(AnalysisEntityFactory.TryCreate(invocation.Arguments[0].Value, out var analysisEntity) &&
1906protected virtual void StartTrackingPredicatedData(AnalysisEntity predicatedEntity, TAnalysisData? truePredicateData, TAnalysisData? falsePredicateData)
1912protected virtual void StopTrackingPredicatedData(AnalysisEntity predicatedEntity)
1918private bool HasPredicatedDataForEntity(AnalysisEntity predicatedEntity)
1921protected virtual bool HasPredicatedDataForEntity(TAnalysisData analysisData, AnalysisEntity predicatedEntity)
1927protected virtual void TransferPredicatedData(AnalysisEntity fromEntity, AnalysisEntity toEntity)
1933protected virtual PredicateValueKind ApplyPredicatedDataForEntity(TAnalysisData analysisData, AnalysisEntity predicatedEntity, bool trueData)
1948protected abstract void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, TAbstractAnalysisValue assignedValue);
1983AnalysisEntity? uniqueAnalysisEntity = null;
1986if (AnalysisEntityFactory.TryCreate(capturedOperation, out var entity))
2012/// Resets all the analysis data for all <see cref="AnalysisEntity"/> instances that share the same <see cref="AnalysisEntity.InstanceLocation"/>
2016protected abstract void ResetValueTypeInstanceAnalysisData(AnalysisEntity analysisEntity);
2019/// Resets all the analysis data for all <see cref="AnalysisEntity"/> instances that share the same <see cref="AnalysisEntity.InstanceLocation"/>
2029if (AnalysisEntityFactory.TryCreate(operation, out var analysisEntity))
2039/// Resets all the analysis data for all <see cref="AnalysisEntity"/> instances that share the same <see cref="AnalysisEntity.InstanceLocation"/>
2128(AnalysisEntity? Instance, PointsToAbstractValue PointsToValue)? invocationInstance,
2129(AnalysisEntity Instance, PointsToAbstractValue PointsToValue)? thisOrMeInstanceForCaller,
2131IDictionary<AnalysisEntity, PointsToAbstractValue>? pointsToValues,
2132IDictionary<AnalysisEntity, CopyAbstractValue>? copyValues,
2133IDictionary<AnalysisEntity, ValueContentAbstractValue>? valueContentValues,
2459(AnalysisEntity?, PointsToAbstractValue)? GetInvocationInstance()
2467if (!AnalysisEntityFactory.TryCreate(instanceReceiver, out var receiverAnalysisEntityOpt))
2496(AnalysisEntity, PointsToAbstractValue)? GetThisOrMeInstance()
2499ImmutableDictionary<IParameterSymbol, ArgumentInfo<TAbstractAnalysisValue>> GetArgumentValues(ref (AnalysisEntity? entity, PointsToAbstractValue pointsToValue)? invocationInstance)
2522if (AnalysisEntityFactory.TryCreate(argument, out var argumentEntity))
2574AnalysisEntity? GetAnalysisEntityForFlowCapture(IOperation operation)
2580if (AnalysisEntityFactory.TryGetForInterproceduralAnalysis(operation, out var analysisEntity) &&
2623var success = AnalysisEntityFactory.TryCreateForSymbolDeclaration(capturedVariable, out var capturedEntity);
2747addressSharedEntities: ImmutableDictionary<AnalysisEntity, CopyAbstractValue>.Empty,
2999var result = AnalysisEntityFactory.TryCreate(operation, out var flowCaptureReferenceEntity);
3033AnalysisEntityFactory.TryCreate(operation, out var flowCaptureEntity))
3686var tupleElementEntity = elementEntities[i];
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\InterproceduralAnalysisData.cs (11)
31(AnalysisEntity?, PointsToAbstractValue)? invocationInstance,
32(AnalysisEntity, PointsToAbstractValue)? thisOrMeInstanceForCaller,
35ImmutableDictionary<AnalysisEntity, CopyAbstractValue> addressSharedEntities,
40Func<IOperation, AnalysisEntity?> getAnalysisEntityForFlowCapture,
58public (AnalysisEntity? Instance, PointsToAbstractValue PointsToValue)? InvocationInstance { get; }
59public (AnalysisEntity Instance, PointsToAbstractValue PointsToValue)? ThisOrMeInstanceForCaller { get; }
62public ImmutableDictionary<AnalysisEntity, CopyAbstractValue> AddressSharedEntities { get; }
67public Func<IOperation, AnalysisEntity?> GetAnalysisEntityForFlowCapture { get; }
96(AnalysisEntity? Instance, PointsToAbstractValue PointsToValue)? instanceAndPointsToValue,
111(AnalysisEntity? Instance, PointsToAbstractValue PointsToValue)? left,
112(AnalysisEntity? Instance, PointsToAbstractValue PointsToValue)? right)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\PredicatedAnalysisData.cs (22)
21/// It tracks <see cref="_lazyPredicateDataMap"/>, which contains the true/false <see cref="PerEntityPredicatedAnalysisData"/> for every predicated <see cref="AnalysisEntity"/>, and
24/// on the control flow paths where the corresponding <see cref="AnalysisEntity"/> is known to have <see langword="true"/> or <see langword="false"/> value respectively.
28private DictionaryAnalysisData<AnalysisEntity, PerEntityPredicatedAnalysisData>? _lazyPredicateDataMap;
89protected void StartTrackingPredicatedData(AnalysisEntity predicatedEntity, DictionaryAnalysisData<TKey, TValue>? truePredicatedData, DictionaryAnalysisData<TKey, TValue>? falsePredicatedData)
102public void StopTrackingPredicatedData(AnalysisEntity predicatedEntity)
123public bool HasPredicatedDataForEntity(AnalysisEntity predicatedEntity)
126public void TransferPredicatedData(AnalysisEntity fromEntity, AnalysisEntity toEntity)
142protected PredicateValueKind ApplyPredicatedDataForEntity(DictionaryAnalysisData<TKey, TValue> coreAnalysisData, AnalysisEntity predicatedEntity, bool trueData)
200private static DictionaryAnalysisData<AnalysisEntity, PerEntityPredicatedAnalysisData>? Clone(DictionaryAnalysisData<AnalysisEntity, PerEntityPredicatedAnalysisData>? fromData)
207var clonedMap = new DictionaryAnalysisData<AnalysisEntity, PerEntityPredicatedAnalysisData>();
216private static DictionaryAnalysisData<AnalysisEntity, PerEntityPredicatedAnalysisData>? Merge(
217DictionaryAnalysisData<AnalysisEntity, PerEntityPredicatedAnalysisData>? predicatedData1,
218DictionaryAnalysisData<AnalysisEntity, PerEntityPredicatedAnalysisData>? predicatedData2,
242private static DictionaryAnalysisData<AnalysisEntity, PerEntityPredicatedAnalysisData> MergeForPredicatedDataInOneBranch(
243DictionaryAnalysisData<AnalysisEntity, PerEntityPredicatedAnalysisData> predicatedData,
247var result = new DictionaryAnalysisData<AnalysisEntity, PerEntityPredicatedAnalysisData>();
272private static DictionaryAnalysisData<AnalysisEntity, PerEntityPredicatedAnalysisData> MergeForPredicatedDataInBothBranches(
273DictionaryAnalysisData<AnalysisEntity, PerEntityPredicatedAnalysisData> predicatedData1,
274DictionaryAnalysisData<AnalysisEntity, PerEntityPredicatedAnalysisData> predicatedData2,
280var result = new DictionaryAnalysisData<AnalysisEntity, PerEntityPredicatedAnalysisData>();