src\RoslynAnalyzers\Utilities\Compiler\Extensions\IOperationExtensions.cs (33)
62public static bool HasNullConstantValue(this IOperation operation)
67public static bool TryGetBoolConstantValue(this IOperation operation, out bool constantValue)
84public static ImmutableArray<IOperation> GetTopmostExplicitDescendants(this IOperation operation)
91var builder = ImmutableArray.CreateBuilder<IOperation>();
92var operationsToProcess = new Queue<IOperation>();
105foreach (var child in operation.Children)
121public static bool IsOperationNoneRoot(this IOperation operation)
132public static TOperation? GetAncestor<TOperation>(this IOperation root, OperationKind ancestorKind, Func<TOperation, bool>? predicate = null)
133where TOperation : class, IOperation
140var ancestor = root;
167public static IOperation? GetAncestor(this IOperation root, ImmutableArray<OperationKind> ancestorKinds, Func<IOperation, bool>? predicate = null)
174var ancestor = root;
209public static IOperation? GetInstance(this IInstanceReferenceOperation operation, bool isInsideAnonymousObjectInitializer)
216for (IOperation? current = operation; current != null && current.Kind != OperationKind.Block; current = current.Parent)
259public static IOperation GetRoot(this IOperation operation)
274private static readonly BoundedCache<Compilation, ConcurrentDictionary<IOperation, ControlFlowGraph?>> s_operationToCfgCache
277public static bool TryGetEnclosingControlFlowGraph(this IOperation operation, [NotNullWhen(returnValue: true)] out ControlFlowGraph? cfg)
294private static ControlFlowGraph? CreateControlFlowGraph(IOperation operation)
332this IOperation operation, IMethodSymbol lambdaOrLocalFunction, out PooledHashSet<ISymbol> builder)
343foreach (var child in operation.Descendants())
385public static bool IsWithinLambdaOrLocalFunction(this IOperation operation, [NotNullWhen(true)] out IOperation? containingLambdaOrLocalFunctionOperation)
411[NotNullWhen(returnValue: true)] out IOperation? elementOfParentTupleContainingTuple)
416IOperation previousOperation = tupleOperation;
417var currentOperation = tupleOperation.Parent;
449public static IOperation? GetInstance(this IInvocationOperation invocationOperation)
452public static IOperation? GetThrownException(this IThrowOperation operation)
454var thrownObject = operation.Exception;
478IOperation potentialLeftSide = operation;
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\CopyAnalysis\CopyAnalysis.CopyDataFlowOperationVisitor.cs (9)
39public override CopyAnalysisData Flow(IOperation statement, BasicBlock block, CopyAnalysisData input)
94protected override CopyAbstractValue GetCopyAbstractValue(IOperation operation) => base.GetCachedAbstractValue(operation);
106protected override void SetAbstractValueForAssignment(AnalysisEntity targetAnalysisEntity, IOperation? assignedValueOperation, CopyAbstractValue assignedValue)
118protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, CopyAbstractValue assignedValue)
305protected override CopyAbstractValue ComputeAnalysisValueForReferenceOperation(IOperation operation, CopyAbstractValue defaultValue)
327IOperation leftOperand,
328IOperation rightOperand,
380protected override PredicateValueKind SetValueForIsNullComparisonOperator(IOperation leftOperand, bool equals, CopyAnalysisData targetAnalysisData) => PredicateValueKind.Unknown;
594public override CopyAbstractValue DefaultVisit(IOperation operation, object? argument)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\DisposeAnalysis\DisposeAnalysis.DisposeDataFlowOperationVisitor.cs (14)
81protected override DisposeAbstractValue HandleInstanceCreation(IOperation creation, PointsToAbstractValue instanceLocation, DisposeAbstractValue defaultValue)
108private void HandleDisposingOperation(IOperation disposingOperation, IOperation? disposedInstance)
126private void HandlePossibleInvalidatingOperation(IOperation invalidatedInstance)
139private void HandlePossibleEscapingOperation(IOperation escapingOperation, ImmutableHashSet<AbstractLocation> escapedLocations)
152protected override void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, DisposeAbstractValue value)
158protected override void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, DisposeAbstractValue assignedValue, bool mayBeAssignment = false)
164protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, DisposeAbstractValue assignedValue)
220public override DisposeAbstractValue DefaultVisit(IOperation operation, object? argument)
226public override DisposeAbstractValue Visit(IOperation? operation, object? argument)
236protected override void HandlePossibleThrowingOperation(IOperation operation)
259IOperation? visitedInstance,
262IOperation originalOperation,
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\ParameterValidationAnalysis\ParameterValidationAnalysis.ParameterValidationDataFlowOperationVisitor.cs (15)
97protected override void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, ParameterValidationAbstractValue assignedValue, bool mayBeAssignment = false)
106protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, ParameterValidationAbstractValue assignedValue)
111protected override void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, ParameterValidationAbstractValue value)
146private void MarkValidatedLocations(IOperation operation)
149private IEnumerable<AbstractLocation> GetNotValidatedLocations(IOperation operation)
155private static bool IsHazardousIfNull(IOperation operation)
174private void HandlePotentiallyHazardousOperation(IOperation operation, IEnumerable<AbstractLocation> nonValidatedLocations)
220public override ParameterValidationAbstractValue Visit(IOperation? operation, object? argument)
252IOperation? visitedInstance,
255IOperation originalOperation,
266IOperation originalOperation,
277IOperation originalOperation,
285private void ProcessRegularInvocationOrCreation(IMethodSymbol? targetMethod, ImmutableArray<IArgumentOperation> arguments, IOperation operation)
356private void ProcessLambdaOrLocalFunctionInvocation(IMethodSymbol targetMethod, IOperation invocation)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\PointsToAnalysis\PointsToAnalysis.PointsToDataFlowOperationVisitor.cs (44)
30private readonly PooledDictionary<IOperation, ImmutableHashSet<AbstractLocation>.Builder> _escapedOperationLocationsBuilder;
31private readonly PooledDictionary<IOperation, ImmutableHashSet<AbstractLocation>.Builder> _escapedReturnValueLocationsBuilder;
44_escapedOperationLocationsBuilder = PooledDictionary<IOperation, ImmutableHashSet<AbstractLocation>.Builder>.GetInstance();
45_escapedReturnValueLocationsBuilder = PooledDictionary<IOperation, ImmutableHashSet<AbstractLocation>.Builder>.GetInstance();
53public ImmutableDictionary<IOperation, ImmutableHashSet<AbstractLocation>> GetEscapedLocationsThroughOperationsMap()
56public ImmutableDictionary<IOperation, ImmutableHashSet<AbstractLocation>> GetEscapedLocationsThroughReturnValuesMap()
99public override PointsToAnalysisData Flow(IOperation statement, BasicBlock block, PointsToAnalysisData input)
169protected override PointsToAbstractValue GetPointsToAbstractValue(IOperation operation) => base.GetCachedAbstractValue(operation);
195protected override CopyAbstractValue GetCopyAbstractValue(IOperation operation)
212protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, PointsToAbstractValue assignedValue)
273protected override PointsToAbstractValue ComputeAnalysisValueForReferenceOperation(IOperation operation, PointsToAbstractValue defaultValue)
332protected override void ProcessReturnValue(IOperation? returnValue)
344private protected override PointsToAbstractValue GetAbstractValueForImplicitWrappingTaskCreation(IOperation returnValueOperation, PointsToAbstractValue returnValue, PointsToAbstractValue implicitTaskPointsToValue)
361IOperation leftOperand,
362IOperation rightOperand,
380protected override PredicateValueKind SetValueForIsNullComparisonOperator(IOperation leftOperand, bool equals, PointsToAnalysisData targetAnalysisData)
388IOperation target,
389IOperation assignedValueOperation,
399IOperation target,
627private void HandleEscapingOperation(IOperation escapingOperation, IOperation escapedInstance)
632private void HandleEscapingOperation(IOperation escapingOperation, IOperation escapedInstance, PooledDictionary<IOperation, ImmutableHashSet<AbstractLocation>.Builder> builder)
637foreach (var capturedOperation in escapedInstancePointsToValue.LValueCapturedOperations)
718private void HandlePossibleEscapingForAssignment(IOperation target, IOperation value, IOperation operation)
730protected override void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, PointsToAbstractValue assignedValue, bool mayBeAssignment = false)
740protected override void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, PointsToAbstractValue value)
751public override PointsToAbstractValue DefaultVisit(IOperation operation, object? argument)
787IOperation? currentInstanceOperation = operation.GetInstance(IsInsideAnonymousObjectInitializer);
799where TOperation : IOperation
921private PointsToAbstractValue VisitInvocationCommon(IOperation operation, IOperation? instance)
942IOperation? visitedInstance,
945IOperation originalOperation,
1029IOperation originalOperation,
1039IOperation originalOperation,
1052private NullAbstractValue GetNullStateBasedOnInstanceOrReferenceValue(IOperation? referenceOrInstance, ITypeSymbol? operationType, NullAbstractValue defaultValue)
1068private PointsToAbstractValue GetValueBasedOnInstanceOrReferenceValue(IOperation? referenceOrInstance, IOperation operation, PointsToAbstractValue defaultValue)
1209IOperation operation,
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\PropertySetAnalysis\PropertySetAnalysis.PropertySetDataFlowOperationVisitor.cs (20)
135protected override void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, PropertySetAbstractValue value)
139protected override void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, PropertySetAbstractValue assignedValue, bool mayBeAssignment = false)
143protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, PropertySetAbstractValue assignedValue)
200out IOperation? propertySetInstance))
232if (this.TryUnwrapFlowCaptureReference(operation.Target, out IOperation? lValueOperation, OperationKind.PropertyReference, OperationKind.FieldReference))
279this.TryUnwrapFlowCaptureReference(operation.Target, out IOperation? lValue, OperationKind.PropertyReference);
456public override PropertySetAbstractValue VisitInvocation_NonLambdaOrDelegateOrLocalFunction(IMethodSymbol method, IOperation? visitedInstance, ImmutableArray<IArgumentOperation> visitedArguments, bool invokedAsDelegate, IOperation originalOperation, PropertySetAbstractValue defaultValue)
478IOperation? propertySetInstance = visitedInstance;
516[NotNullWhen(returnValue: true)] out IOperation? instance)
532IOperation value = argumentOperation.Value;
597IOperation propertySetInstance,
635public override PropertySetAbstractValue VisitInvocation_LocalFunction(IMethodSymbol localFunction, ImmutableArray<IArgumentOperation> visitedArguments, IOperation originalOperation, PropertySetAbstractValue defaultValue)
643public override PropertySetAbstractValue VisitInvocation_Lambda(IFlowAnonymousFunctionOperation lambda, ImmutableArray<IArgumentOperation> visitedArguments, IOperation originalOperation, PropertySetAbstractValue defaultValue)
651protected override void ProcessReturnValue(IOperation? returnValue)
668private void MergeInterproceduralResults(IOperation originalOperation)
705private bool TryUnwrapFlowCaptureReference(IOperation flowCaptureReferenceOperation, [NotNullWhen(returnValue: true)] out IOperation? unwrappedOperation, params OperationKind[] kinds)
713IOperation lValueOperation = lValuePointsToAbstractValue.LValueCapturedOperations.First();
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\TaintedDataAnalysis\TaintedDataAnalysis.TaintedDataOperationVisitor.cs (12)
176public override TaintedDataAbstractValue DefaultVisit(IOperation operation, object? argument)
185foreach (IOperation childOperation in operation.ChildOperations)
231protected override TaintedDataAbstractValue ComputeAnalysisValueForReferenceOperation(IOperation operation, TaintedDataAbstractValue defaultValue)
263IOperation? visitedInstance,
266IOperation originalOperation,
352IOperation? thenTaintedTargetOperation = visitedInstance != null && thenTaintedTarget == TaintedTargetValue.This
357var operation = visitedInstance != null && ifTaintedParameter == TaintedTargetValue.This
423public override TaintedDataAbstractValue VisitInvocation_LocalFunction(IMethodSymbol localFunction, ImmutableArray<IArgumentOperation> visitedArguments, IOperation originalOperation, TaintedDataAbstractValue defaultValue)
437public override TaintedDataAbstractValue VisitInvocation_Lambda(IFlowAnonymousFunctionOperation lambda, ImmutableArray<IArgumentOperation> visitedArguments, IOperation originalOperation, TaintedDataAbstractValue defaultValue)
491.Select<IOperation, TaintedDataAbstractValue>(this.GetCachedAbstractValue)
561IOperation originalOperation)
763private void SetTaintedForEntity(IOperation operation, TaintedDataAbstractValue value)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\ValueContentAnalysis\ValueContentAnalysis.ValueContentDataFlowOperationVisitor.cs (9)
78protected override CopyAbstractValue GetCopyAbstractValue(IOperation operation)
93protected override PredicateValueKind SetValueForIsNullComparisonOperator(IOperation leftOperand, bool equals, ValueContentAnalysisData targetAnalysisData)
97IOperation leftOperand,
98IOperation rightOperand,
114private void SetValueForComparisonOperator(IOperation target, IOperation assignedValue, bool equals, ref PredicateValueKind predicateValueKind, ValueContentAnalysisData targetAnalysisData)
184public override ValueContentAbstractValue DefaultVisit(IOperation operation, object? argument)
272IOperation? visitedInstance,
275IOperation originalOperation,
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\AbstractLocation.cs (23)
22/// 1. An allocation or an object creation operation (<see cref="CreateAllocationLocation(IOperation, ITypeSymbol, PointsToAnalysisContext)"/>).
23/// 2. Location for the implicit 'this' or 'Me' instance being analyzed (<see cref="CreateThisOrMeLocation(INamedTypeSymbol, ImmutableStack{IOperation})"/>).
24/// 3. Location created for certain symbols which do not have a declaration in executable code, i.e. no <see cref="IOperation"/> for declaration (such as parameter symbols, member symbols, etc. - <see cref="CreateSymbolLocation(ISymbol, ImmutableStack{IOperation})"/>/>).
26/// See <see cref="CreateFlowCaptureLocation(InterproceduralCaptureId, ITypeSymbol, ImmutableStack{IOperation})"/>
35private AbstractLocation(IOperation? creation, ImmutableStack<IOperation>? creationCallStack, AnalysisEntity? analysisEntity, ISymbol? symbol, InterproceduralCaptureId? captureId, ITypeSymbol? locationType, bool isSpecialSingleton)
40CreationCallStack = creationCallStack ?? ImmutableStack<IOperation>.Empty;
48private static AbstractLocation Create(IOperation? creation, ImmutableStack<IOperation>? creationCallStack, AnalysisEntity? analysisEntity, ISymbol? symbol, InterproceduralCaptureId? captureId, ITypeSymbol? locationType)
56public static AbstractLocation CreateAllocationLocation(IOperation creation, ITypeSymbol locationType, PointsToAnalysisContext analysisContext)
58internal static AbstractLocation CreateAllocationLocation(IOperation creation, ITypeSymbol locationType, ImmutableStack<IOperation>? callStack)
62public static AbstractLocation CreateThisOrMeLocation(INamedTypeSymbol namedTypeSymbol, ImmutableStack<IOperation>? creationCallStack)
64public static AbstractLocation CreateSymbolLocation(ISymbol symbol, ImmutableStack<IOperation>? creationCallStack)
66public static AbstractLocation CreateFlowCaptureLocation(InterproceduralCaptureId captureId, ITypeSymbol locationType, ImmutableStack<IOperation>? creationCallStack)
69public IOperation? Creation { get; }
70public ImmutableStack<IOperation> CreationCallStack { get; }
76public IOperation? GetTopOfCreationCallStackOrCreation()
134foreach (var creation in CreationCallStack)
154SyntaxNode? TryGetSyntaxNodeToReportDiagnostic(IOperation creation, PointsToAnalysisResult pointsToAnalysisResult)
177SyntaxNode? TryGetSyntaxNodeToReportDiagnosticCore(IOperation operation)
182SyntaxNode? TryGetSyntaxNodeToReportDiagnosticForPointsValue(PointsToAbstractValue pointsToValue, IOperation operation)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\AnalysisEntityDataFlowOperationVisitor.cs (11)
47protected override TAbstractAnalysisValue ComputeAnalysisValueForReferenceOperation(IOperation operation, TAbstractAnalysisValue defaultValue)
191protected override TAnalysisData GetMergedAnalysisDataForPossibleThrowingOperation(TAnalysisData? existingData, IOperation operation)
210protected override void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, TAbstractAnalysisValue value)
218protected override void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, TAbstractAnalysisValue assignedValue, bool mayBeAssignment = false)
238protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, TAbstractAnalysisValue assignedValue)
252protected virtual void SetAbstractValueForAssignment(AnalysisEntity targetAnalysisEntity, IOperation? assignedValueOperation, TAbstractAnalysisValue assignedValue)
264private void SetAbstractValueForAssignment(AnalysisEntity targetAnalysisEntity, AnalysisEntity? assignedValueEntity, IOperation? assignedValueOperation, TAbstractAnalysisValue assignedValue)
360private void TransferValueTypeInstanceAnalysisDataForAssignment(AnalysisEntity targetAnalysisEntity, AnalysisEntity? valueAnalysisEntity, IOperation? assignedValueOperation)
759private void HandleDeconstructionAssignment(IOperation target, ImmutableHashSet<AnalysisEntity> childEntities)
772var element = tupleOperation.Elements[i];
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\AnalysisEntityFactory.cs (20)
30private readonly Dictionary<IOperation, AnalysisEntity?> _analysisEntityMap;
35private readonly Func<IOperation, PointsToAbstractValue>? _getPointsToAbstractValue;
39private readonly ImmutableStack<IOperation>? _interproceduralCallStack;
40private readonly Func<IOperation, AnalysisEntity?>? _interproceduralGetAnalysisEntityForFlowCapture;
41private readonly Func<ISymbol, ImmutableStack<IOperation>?> _getInterproceduralCallStackForOwningSymbol;
46Func<IOperation, PointsToAbstractValue>? getPointsToAbstractValue,
52ImmutableStack<IOperation>? interproceduralCallStack,
54Func<IOperation, AnalysisEntity?>? interproceduralGetAnalysisEntityForFlowCapture,
55Func<ISymbol, ImmutableStack<IOperation>?> getInterproceduralCallStackForOwningSymbol)
93where T : IOperation
109private static AbstractIndex CreateAbstractIndex(IOperation operation)
125public bool TryCreate(IOperation operation, [NotNullWhen(returnValue: true)] out AnalysisEntity? analysisEntity)
135IOperation? instance = null;
316IOperation? instance = null;
349if (tupleOperation.TryGetParentTupleOperation(out var parentTupleOperationOpt, out var elementOfParentTupleContainingTuple) &&
410public bool TryGetForInterproceduralAnalysis(IOperation operation, out AnalysisEntity? analysisEntity)
413private AnalysisEntity GetOrCreateForFlowCapture(CaptureId captureId, ITypeSymbol? type, IOperation flowCaptureOrReference, bool isLValueFlowCapture)
440ITypeSymbol type, IOperation? instance, [NotNullWhen(returnValue: true)] out AnalysisEntity? analysisEntity)
532ImmutableStack<IOperation>? interproceduralCallStackForSymbolDeclaration;
540interproceduralCallStackForSymbolDeclaration = ImmutableStack<IOperation>.Empty;
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\DataFlowAnalysisResult.cs (11)
26private readonly ImmutableDictionary<IOperation, TAbstractAnalysisValue> _operationStateMap;
27private readonly ImmutableDictionary<IOperation, PredicateValueKind> _predicateValueKindMap;
28private readonly ImmutableDictionary<IOperation, IDataFlowAnalysisResult<TAbstractAnalysisValue>> _interproceduralResultsMap;
35ImmutableDictionary<IOperation, TAbstractAnalysisValue> operationStateMap,
36ImmutableDictionary<IOperation, PredicateValueKind> predicateValueKindMap,
38ImmutableDictionary<IOperation, IDataFlowAnalysisResult<TAbstractAnalysisValue>> interproceduralResultsMap,
87internal DataFlowAnalysisResult<TBlockAnalysisResult, TAbstractAnalysisValue> With(ImmutableDictionary<IOperation, TAbstractAnalysisValue> operationStateMap)
98public TAbstractAnalysisValue this[IOperation operation]
147internal DataFlowAnalysisResult<TBlockAnalysisResult, TAbstractAnalysisValue>? TryGetInterproceduralResult(IOperation operation)
168internal IEnumerable<DataFlowAnalysisResult<TBlockAnalysisResult, TAbstractAnalysisValue>> TryGetLambdaOrLocalFunctionResults(IOperation lambdaOrLocalFunctionOperation)
222public PredicateValueKind GetPredicateKind(IOperation operation) => _predicateValueKindMap.TryGetValue(operation, out var valueKind) ? valueKind : PredicateValueKind.Unknown;
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\DataFlowOperationVisitor.cs (91)
47private readonly ImmutableDictionary<IOperation, TAbstractAnalysisValue>.Builder _valueCacheBuilder;
48private readonly ImmutableDictionary<IOperation, PredicateValueKind>.Builder _predicateValueKindCacheBuilder;
51private readonly HashSet<IOperation> _visitedFlowBranchConditions;
53private readonly HashSet<IOperation>? _returnValueOperations;
113private readonly Stack<IOperation> _interproceduralCallStack;
118private readonly ImmutableDictionary<IOperation, IDataFlowAnalysisResult<TAbstractAnalysisValue>>.Builder _interproceduralResultsBuilder;
152public ImmutableDictionary<IOperation, IDataFlowAnalysisResult<TAbstractAnalysisValue>> InterproceduralResultsMap => _interproceduralResultsBuilder.ToImmutable();
275_valueCacheBuilder = ImmutableDictionary.CreateBuilder<IOperation, TAbstractAnalysisValue>();
276_predicateValueKindCacheBuilder = ImmutableDictionary.CreateBuilder<IOperation, PredicateValueKind>();
281_returnValueOperations = OwningSymbol is IMethodSymbol method && !method.ReturnsVoid ? new HashSet<IOperation>() : null;
282_interproceduralResultsBuilder = ImmutableDictionary.CreateBuilder<IOperation, IDataFlowAnalysisResult<TAbstractAnalysisValue>>();
289_interproceduralCallStack = new Stack<IOperation>();
298foreach (var operation in analysisContext.InterproceduralAnalysisData.CallStack)
377foreach (var operation in _returnValueOperations)
419public virtual TAnalysisData Flow(IOperation statement, BasicBlock block, TAnalysisData input)
428private void AfterVisitRoot(IOperation operation)
434foreach (var descendant in operation.DescendantsAndSelf())
806IOperation returnValueOperation,
814protected virtual void ProcessReturnValue(IOperation? returnValue)
829private TAbstractAnalysisValue GetAbstractValueForReturnOperation(IOperation returnValueOperation, out PointsToAbstractValue? implicitTaskPointsToValue)
850protected virtual void HandlePossibleThrowingOperation(IOperation operation)
869IOperation? instance = null;
870IOperation? invocation = null;
930protected virtual TAnalysisData GetMergedAnalysisDataForPossibleThrowingOperation(TAnalysisData? existingData, IOperation operation)
1019internal ImmutableDictionary<IOperation, TAbstractAnalysisValue> GetStateMap() => _valueCacheBuilder.ToImmutable();
1021internal ImmutableDictionary<IOperation, PredicateValueKind> GetPredicateValueKindMap() => _predicateValueKindCacheBuilder.ToImmutable();
1045public TAbstractAnalysisValue GetCachedAbstractValue(IOperation operation)
1079protected void CacheAbstractValue(IOperation operation, TAbstractAnalysisValue value)
1089protected NullAbstractValue GetNullAbstractValue(IOperation operation) => GetPointsToAbstractValue(operation).NullState;
1091protected virtual CopyAbstractValue GetCopyAbstractValue(IOperation operation)
1103protected virtual PointsToAbstractValue GetPointsToAbstractValue(IOperation operation)
1115protected virtual ValueContentAbstractValue GetValueContentAbstractValue(IOperation operation)
1127protected ImmutableHashSet<AbstractLocation> GetEscapedLocations(IOperation operation)
1211protected virtual TAbstractAnalysisValue ComputeAnalysisValueForReferenceOperation(IOperation operation, TAbstractAnalysisValue defaultValue)
1247IOperation sourceOperand,
1250IOperation operation,
1386private void PerformPredicateAnalysis(IOperation operation)
1495var current = operation.Parent;
1515var current = operation.Parent;
1544private void PerformPredicateAnalysisCore(IOperation operation, TAnalysisData targetAnalysisData)
1715IOperation? leftOperand = null;
1716IOperation? rightOperand = null;
1788bool IsNotNullWhenFalse(IOperation operation)
1806bool IsNotNullWhenTrue(IOperation operation)
1825protected virtual void SetPredicateValueKind(IOperation operation, TAnalysisData analysisData, PredicateValueKind predicateValueKind)
1894protected virtual PredicateValueKind SetValueForEqualsOrNotEqualsComparisonOperator(IOperation leftOperand, IOperation rightOperand, bool equals, bool isReferenceEquality, TAnalysisData targetAnalysisData)
1900protected virtual PredicateValueKind SetValueForIsNullComparisonOperator(IOperation leftOperand, bool equals, TAnalysisData targetAnalysisData)
1939protected virtual void ProcessThrowValue(IOperation? thrownValue)
1946protected abstract void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, TAbstractAnalysisValue value);
1947protected abstract void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, TAbstractAnalysisValue assignedValue, bool mayBeAssignment = false);
1948protected abstract void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, TAbstractAnalysisValue assignedValue);
1949private void HandleFlowCaptureReferenceAssignment(IFlowCaptureReferenceOperation flowCaptureReference, IOperation assignedValueOperation, TAbstractAnalysisValue assignedValue)
1962var target = pointsToValue.LValueCapturedOperations.First();
1973foreach (var capturedOperation in pointsToValue.LValueCapturedOperations)
1984foreach (var capturedOperation in pointsToValue.LValueCapturedOperations)
2024private void ResetValueTypeInstanceAnalysisData(IOperation operation)
2043private void ResetReferenceTypeInstanceAnalysisData(IOperation operation)
2061private void ResetInstanceAnalysisData(IOperation? operation)
2189protected bool TryGetInterproceduralAnalysisResult(IOperation operation, [NotNullWhen(returnValue: true)] out TAnalysisResult? analysisResult)
2204IOperation? instanceReceiver,
2206IOperation originalOperation,
2347var popped = _interproceduralCallStack.Pop();
2574AnalysisEntity? GetAnalysisEntityForFlowCapture(IOperation operation)
2760protected TAbstractAnalysisValue VisitArray(IEnumerable<IOperation> operations, object? argument)
2762foreach (var operation in operations)
2770public override TAbstractAnalysisValue Visit(IOperation? operation, object? argument)
2805private TAbstractAnalysisValue VisitCore(IOperation operation, object? argument)
2824public override TAbstractAnalysisValue DefaultVisit(IOperation operation, object? argument)
2905IOperation elementInitializer = operation.ElementValues[index];
3287using var _1 = PooledHashSet<(IMethodSymbol method, IOperation? instance)>.GetInstance(out var methodTargetsOptBuilder);
3312PooledHashSet<(IMethodSymbol method, IOperation? instance)> methodTargetsOptBuilder,
3317IOperation operation,
3318PooledHashSet<(IMethodSymbol method, IOperation? instance)> methodTargetsOptBuilder,
3323IOperation? operation,
3325PooledHashSet<(IMethodSymbol method, IOperation? instance)> methodTargetsOptBuilder,
3331IOperation? instance;
3379void AddMethodTarget(IMethodSymbol method, IOperation? instance)
3393bool HandleCreationOpt(IOperation? creation)
3438out ImmutableHashSet<(IMethodSymbol method, IOperation? instance)>? resolvedMethodTargets)
3442using var _1 = PooledHashSet<(IMethodSymbol method, IOperation? instance)>.GetInstance(out var methodTargetsOptBuilder);
3535IOperation? visitedInstance,
3538IOperation originalOperation,
3566private ImmutableStack<IOperation>? GetInterproceduralCallStackForOwningSymbol(ISymbol forOwningSymbol)
3579IOperation originalOperation,
3597IOperation originalOperation,
3637public virtual void HandleEnterLockOperation(IOperation lockedObject)
3669foreach (var element in operation.Elements)
3687var assignedValueOperation = operation.Elements[i];
3695foreach (var element in operation.Elements)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\InterproceduralAnalysisConfiguration.cs (1)
95IOperation operation,
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\OperationExtensions.cs (32)
18public static bool IsTargetOfObjectMemberInitializer(this IOperation operation)
34public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
239public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
259public static bool IsInLeftOfDeconstructionAssignment(this IOperation operation, [NotNullWhen(true)] out IDeconstructionAssignmentOperation? deconstructionAssignment)
263var previousOperation = operation;
264var current = operation.Parent;
295public static bool IsAnyCompoundAssignment(this IOperation operation)
308public static bool IsInsideCatchRegion(this IOperation operation, ControlFlowGraph cfg)
328foreach (var descendant in block.DescendantOperations())
341public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
343foreach (var operationBlock in operationBlocks)
354public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
357public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(true)] out IOperation? foundOperation)
361foreach (var descendant in operationBlock.DescendantsAndSelf())
374public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
377public static bool IsNumericLiteral(this IOperation operation)
380public static bool IsNullLiteral(this IOperation operand)
389public static IOperation? WalkDownConversion(this IOperation? operation)
399public static bool IsSingleThrowNotImplementedOperation([NotNullWhen(true)] this IOperation? firstBlock)
415var firstOp = block.Operations.Length == 1
437static IOperation? TryGetSingleExplicitStatement(ImmutableArray<IOperation> operations)
439IOperation? firstOp = null;
440foreach (var operation in operations)
454static bool IsThrowNotImplementedOperation(INamedTypeSymbol notImplementedExceptionType, IOperation? operation)
461public static IOperation? UnwrapImplicitConversion(this IOperation? value)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.AnalysisData.cs (14)
61protected abstract PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
132public abstract void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId);
137public abstract void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol);
138public abstract void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget);
139public abstract void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget);
140public abstract void SetEmptyInvocationTargetsForDelegate(IOperation write);
141public abstract bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets);
143protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> CreateSymbolsWriteMap(
146var symbolsWriteMap = PooledDictionary<(ISymbol Symbol, IOperation Write), bool>.GetInstance();
150protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> UpdateSymbolsWriteMap(
151PooledDictionary<(ISymbol Symbol, IOperation Write), bool> symbolsWriteMap,
158(ISymbol, IOperation) key = (parameter, null);
201public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten, bool isRef)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.BasicBlockAnalysisData.cs (9)
28private readonly Dictionary<ISymbol, PooledHashSet<IOperation>> _reachingWrites;
74public void ForEachCurrentWrite<TArg>(ISymbol symbol, Action<IOperation, TArg> action, TArg arg)
86public bool ForEachCurrentWrite<TArg>(ISymbol symbol, Func<IOperation, TArg, bool> action, TArg arg)
90foreach (var value in values)
104public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten)
108values = PooledHashSet<IOperation>.GetInstance();
223private static void AddEntries(Dictionary<ISymbol, PooledHashSet<IOperation>> result, BasicBlockAnalysisData source)
231values = PooledHashSet<IOperation>.GetInstance();
240foreach (var operation in operations)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (33)
41private readonly PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>> _lValueFlowCapturesMap;
48private readonly PooledDictionary<IOperation, PooledHashSet<IOperation>> _reachingDelegateCreationTargets;
69private readonly PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>> _symbolWritesInsideBlockRangeMap;
77PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
81PooledDictionary<IOperation, PooledHashSet<IOperation>> reachingDelegateCreationTargets,
99_lValueFlowCapturesMap = PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
103_symbolWritesInsideBlockRangeMap = PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
110protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
134reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
189foreach (var operation in cfg.OriginalOperation.Descendants())
215private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
220var operations = PooledHashSet<IOperation>.GetInstance();
224writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
241PooledHashSet<IOperation> operationsBuilder,
248foreach (var operation in cfg.Blocks[i].DescendantOperations())
273void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
275foreach (var target in targets)
462public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
466captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
514public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
522var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
544foreach (var target in targetsBuilderForSymbolWrite)
561public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
571public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
583public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
586private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
588var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
597public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.OperationTreeAnalysisData.cs (9)
21PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
34protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
63public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
69public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
71public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
73public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
75public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
77public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.Walker.cs (20)
27private IOperation _currentRootOperation;
29private PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>> _pendingWritesMap;
36IEnumerable<IOperation> operations,
51private void Visit(ISymbol containingSymbol, IEnumerable<IOperation> operations, AnalysisData analysisData, CancellationToken cancellationToken)
58_pendingWritesMap = PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
65foreach (var operation in operations)
93private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo)
101private void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
107private void OnReferenceFound(ISymbol symbol, IOperation operation)
159private bool MakePendingWrite(IOperation operation, ISymbol symbolOpt)
166var set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
175set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
407private void ProcessPossibleDelegateCreationAssignment(ISymbol symbol, IOperation write)
415IOperation initializerValue = null;
431private void ProcessPossibleDelegateCreation(IOperation creation, IOperation write)
433var currentOperation = creation;
497private void AnalyzePossibleDelegateInvocation(IOperation operation)
534foreach (var target in targets)
549void AnalyzeDelegateInvocation(IOperation target)
src\Analyzers\Core\Analyzers\RemoveUnnecessarySuppressions\SuppressMessageAttributeState.cs (9)
46out ImmutableArray<(string name, IOperation value)> namedAttributeArguments)
48var operation = (model.GetOperation(attributeSyntax, cancellationToken) as IAttributeOperation)?.Operation;
55using var _ = ArrayBuilder<(string name, IOperation value)>.GetInstance(out var builder);
56foreach (var initializer in initializerOperation.Initializers)
70public static bool HasValidScope(ImmutableArray<(string name, IOperation value)> namedAttributeArguments, out TargetScope targetScope)
88ImmutableArray<(string name, IOperation value)> namedAttributeArguments,
92out IOperation? targetValueOperation,
128ImmutableArray<(string name, IOperation value)> namedAttributeArguments,
131[NotNullWhen(returnValue: true)] out IOperation? argumentValueOperation)
src\Analyzers\Core\Analyzers\RemoveUnusedParametersAndValues\AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.BlockAnalyzer.cs (17)
32/// We use this value in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/> to determine whether to bail from analysis or not.
45/// We use this value in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/> to determine whether to bail from analysis or not.
51/// We use this value in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/> to determine whether to bail from analysis or not.
98var firstBlock = context.OperationBlocks[0];
138foreach (var operationBlock in context.OperationBlocks)
149foreach (var operationBlock in context.OperationBlocks)
170var value = expressionStatement.Operation;
253/// delegate escape, and corresponding bail out from flow analysis in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/>.
257private static bool IsHandledDelegateCreationOrAnonymousFunctionTreeShape(IOperation operation)
301/// delegate escape, and corresponding bail out from flow analysis in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/>.
306private static bool IsHandledLocalOrParameterReferenceTreeShape(IOperation operation)
366private bool ShouldAnalyze(IOperation operationBlock, ISymbol owningSymbol, ref bool hasUnknownOperationNoneDescendant)
377foreach (var operation in operationBlock.Descendants())
490foreach (var operationBlock in context.OperationBlocks)
590IOperation unreadWriteOperation,
633bool IsRemovableAssignmentWithoutSideEffects(IOperation unusedSymbolWriteOperation)
657static bool IsRemovableAssignmentValueWithoutSideEffects(IOperation assignmentValue)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\OperationExtensions.cs (32)
18public static bool IsTargetOfObjectMemberInitializer(this IOperation operation)
34public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
239public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
259public static bool IsInLeftOfDeconstructionAssignment(this IOperation operation, [NotNullWhen(true)] out IDeconstructionAssignmentOperation? deconstructionAssignment)
263var previousOperation = operation;
264var current = operation.Parent;
295public static bool IsAnyCompoundAssignment(this IOperation operation)
308public static bool IsInsideCatchRegion(this IOperation operation, ControlFlowGraph cfg)
328foreach (var descendant in block.DescendantOperations())
341public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
343foreach (var operationBlock in operationBlocks)
354public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
357public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(true)] out IOperation? foundOperation)
361foreach (var descendant in operationBlock.DescendantsAndSelf())
374public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
377public static bool IsNumericLiteral(this IOperation operation)
380public static bool IsNullLiteral(this IOperation operand)
389public static IOperation? WalkDownConversion(this IOperation? operation)
399public static bool IsSingleThrowNotImplementedOperation([NotNullWhen(true)] this IOperation? firstBlock)
415var firstOp = block.Operations.Length == 1
437static IOperation? TryGetSingleExplicitStatement(ImmutableArray<IOperation> operations)
439IOperation? firstOp = null;
440foreach (var operation in operations)
454static bool IsThrowNotImplementedOperation(INamedTypeSymbol notImplementedExceptionType, IOperation? operation)
461public static IOperation? UnwrapImplicitConversion(this IOperation? value)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.AnalysisData.cs (14)
61protected abstract PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
132public abstract void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId);
137public abstract void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol);
138public abstract void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget);
139public abstract void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget);
140public abstract void SetEmptyInvocationTargetsForDelegate(IOperation write);
141public abstract bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets);
143protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> CreateSymbolsWriteMap(
146var symbolsWriteMap = PooledDictionary<(ISymbol Symbol, IOperation Write), bool>.GetInstance();
150protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> UpdateSymbolsWriteMap(
151PooledDictionary<(ISymbol Symbol, IOperation Write), bool> symbolsWriteMap,
158(ISymbol, IOperation) key = (parameter, null);
201public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten, bool isRef)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.BasicBlockAnalysisData.cs (9)
28private readonly Dictionary<ISymbol, PooledHashSet<IOperation>> _reachingWrites;
74public void ForEachCurrentWrite<TArg>(ISymbol symbol, Action<IOperation, TArg> action, TArg arg)
86public bool ForEachCurrentWrite<TArg>(ISymbol symbol, Func<IOperation, TArg, bool> action, TArg arg)
90foreach (var value in values)
104public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten)
108values = PooledHashSet<IOperation>.GetInstance();
223private static void AddEntries(Dictionary<ISymbol, PooledHashSet<IOperation>> result, BasicBlockAnalysisData source)
231values = PooledHashSet<IOperation>.GetInstance();
240foreach (var operation in operations)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (33)
41private readonly PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>> _lValueFlowCapturesMap;
48private readonly PooledDictionary<IOperation, PooledHashSet<IOperation>> _reachingDelegateCreationTargets;
69private readonly PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>> _symbolWritesInsideBlockRangeMap;
77PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
81PooledDictionary<IOperation, PooledHashSet<IOperation>> reachingDelegateCreationTargets,
99_lValueFlowCapturesMap = PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
103_symbolWritesInsideBlockRangeMap = PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
110protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
134reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
189foreach (var operation in cfg.OriginalOperation.Descendants())
215private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
220var operations = PooledHashSet<IOperation>.GetInstance();
224writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
241PooledHashSet<IOperation> operationsBuilder,
248foreach (var operation in cfg.Blocks[i].DescendantOperations())
273void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
275foreach (var target in targets)
462public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
466captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
514public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
522var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
544foreach (var target in targetsBuilderForSymbolWrite)
561public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
571public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
583public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
586private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
588var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
597public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.OperationTreeAnalysisData.cs (9)
21PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
34protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
63public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
69public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
71public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
73public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
75public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
77public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.Walker.cs (20)
27private IOperation _currentRootOperation;
29private PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>> _pendingWritesMap;
36IEnumerable<IOperation> operations,
51private void Visit(ISymbol containingSymbol, IEnumerable<IOperation> operations, AnalysisData analysisData, CancellationToken cancellationToken)
58_pendingWritesMap = PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
65foreach (var operation in operations)
93private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo)
101private void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
107private void OnReferenceFound(ISymbol symbol, IOperation operation)
159private bool MakePendingWrite(IOperation operation, ISymbol symbolOpt)
166var set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
175set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
407private void ProcessPossibleDelegateCreationAssignment(ISymbol symbol, IOperation write)
415IOperation initializerValue = null;
431private void ProcessPossibleDelegateCreation(IOperation creation, IOperation write)
433var currentOperation = creation;
497private void AnalyzePossibleDelegateInvocation(IOperation operation)
534foreach (var target in targets)
549void AnalyzeDelegateInvocation(IOperation target)
src\Analyzers\CSharp\Analyzers\UsePatternCombinators\AnalyzedPattern.cs (12)
19public readonly IOperation Target;
21private AnalyzedPattern(IOperation target)
77private Type(TypeSyntax type, IOperation target) : base(target)
84internal sealed class Source(PatternSyntax patternSyntax, IOperation target) : AnalyzedPattern(target)
92internal sealed class Constant(ExpressionSyntax expression, IOperation target) : AnalyzedPattern(target)
100internal sealed class Relational(BinaryOperatorKind operatorKind, ExpressionSyntax value, IOperation target) : AnalyzedPattern(target)
116private Binary(AnalyzedPattern leftPattern, AnalyzedPattern rightPattern, bool isDisjunctive, SyntaxToken token, IOperation target) : base(target)
126var leftTarget = leftPattern.Target;
127var rightTarget = rightPattern.Target;
132var target = (leftConv, rightConv) switch
153var compareTarget = target == leftTarget ? rightTarget : leftTarget;
181private Not(AnalyzedPattern pattern, IOperation target) : base(target)
src\Analyzers\CSharp\CodeFixes\ConvertToRecord\ConvertToRecordHelpers.cs (44)
46Arguments: [IArgumentOperation { Value: IOperation arg }]
117Operations: [IReturnOperation { ReturnedValue: IOperation returnedValue }]
140Operand: IOperation operand
159LeftOperand: IOperation leftOperand,
160RightOperand: IOperation rightOperand,
380foreach (var assignment in initializer.Initializers)
385Value: IOperation { Syntax: ExpressionSyntax syntax }
421Func<IOperation, T?> captureAssignedSymbol)
433foreach (var operation in body.Operations)
439Target: IOperation assignee,
440Value: IOperation assignment
476private static bool IsSafeAssignment(IOperation operation)
507IEnumerable<IOperation>? statementsToCheck = null;
530if (bodyOps is [IReturnOperation { ReturnedValue: IOperation value }] &&
567IOperation? operation,
606private static IParameterSymbol? GetParamFromArgument(IOperation operation)
609private static ISymbol? GetReferencedSymbolObject(IOperation reference)
625private static bool IsDotEqualsInvocation(IOperation operation)
631Instance: IOperation instance,
632Arguments: [IArgumentOperation { Value: IOperation arg }]
655IOperation operation,
699private static bool ReturnsFalseImmediately(IEnumerable<IOperation> operation)
724IOperation condition,
734(_, IUnaryOperation { OperatorKind: UnaryOperatorKind.Not, Operand: IOperation newCondition })
783IOperation condition,
788IEnumerable<IOperation>? additionalConditions = null)
794(_, IUnaryOperation { OperatorKind: UnaryOperatorKind.Not, Operand: IOperation newCondition })
805LeftOperand: IOperation leftOperation,
806RightOperand: IOperation rightOperation,
817LeftOperand: IOperation leftOperation,
818RightOperand: IOperation rightOperation,
879IEnumerable<IOperation> statementsToCheck,
895IReturnOperation { ReturnedValue: IOperation value } => TryAddEqualizedFieldsForCondition(
899Condition: IOperation condition,
900WhenTrue: IOperation whenTrue,
956ImmutableArray<IOperation> bodyOps,
961[NotNullWhen(true)] out IEnumerable<IOperation>? statementsToCheck)
969Condition: IOperation condition,
970WhenTrue: IOperation whenTrue,
1050IOperation whenTrue,
1051IOperation? whenFalse,
1052IEnumerable<IOperation> otherOps,
1054out IEnumerable<IOperation> remainingStatements)
1069: ImmutableArray<IOperation>.Empty))
ConvertIfToSwitch\AbstractConvertIfToSwitchCodeRefactoringProvider.Analyzer.cs (20)
50public abstract bool HasUnreachableEndPoint(IOperation operation);
72public (ImmutableArray<AnalyzedSwitchSection>, TExpressionSyntax TargetExpression) AnalyzeIfStatementSequence(ReadOnlySpan<IOperation> operations)
75if (!ParseIfStatementSequence(operations, sections, topLevel: true, out var defaultBodyOpt))
97ReadOnlySpan<IOperation> operations,
100out IOperation? defaultBodyOpt)
133var nextStatement = operations[current];
153private bool ParseIfStatement(IOperation operation, ArrayBuilder<AnalyzedSwitchSection> sections, out IOperation? defaultBodyOpt)
182private bool ParseIfStatementOrBlock(IOperation op, ArrayBuilder<AnalyzedSwitchSection> sections, out IOperation? defaultBodyOpt)
206private bool ParseSwitchLabels(IOperation operation, ArrayBuilder<AnalyzedSwitchLabel> labels)
228private AnalyzedSwitchLabel? ParseSwitchLabel(IOperation operation)
277private AnalyzedPattern? ParsePattern(IOperation operation, ArrayBuilder<TExpressionSyntax> guards)
392bool CheckTargetExpression(IOperation left, IOperation right)
396private static (BoundKind Kind, IOperation Expression, IOperation Value) GetRangeBound(IBinaryOperation op)
442private static bool IsConstant(IOperation operation)
450private bool CheckTargetExpression(IOperation operation)
471private bool CheckConstantType(IOperation operation)
InitializeParameter\AbstractAddParameterCheckCodeRefactoringProvider.cs (24)
237IOperation statement, IParameterSymbol parameter,
246var operation = semanticModel.GetOperation(coalesceNode, cancellationToken);
260private static bool IsIfNullCheck(IOperation statement, IParameterSymbol parameter)
264var condition = ifStatement.Condition;
293private static bool IsIfNumericCheck(IOperation statement, IParameterSymbol parameter)
297var condition = ifStatement.Condition.UnwrapImplicitConversion();
331static bool IsNumericCheckOperands(IOperation operand1, IOperation operand2, IParameterSymbol parameter)
371foreach (var statement in blockStatement.Operations)
407foreach (var statement in blockStatement.Operations)
453foreach (var statement in blockStatement.Operations)
463private static bool IsEnumIsDefinedCheck(IOperation statement, IParameterSymbol parameter, IMethodSymbol? enumIsDefinedGenericMethod, IMethodSymbol? enumIsDefinedNonGenericMethod)
467var condition = ifStatement.Condition;
491private static bool IsAnyThrowInvocation(IOperation statement, IParameterSymbol? parameter, ReadOnlySpan<string> possibleTypeNames, Func<string, bool> methodNamePredicate)
515private static bool IsAnyThrowIfNullInvocation(IOperation statement, IParameterSymbol? parameter)
520private static bool IsAnyThrowIfNumericCheckInvocation(IOperation statement, IParameterSymbol? parameter)
525private static bool IsStringCheck(IOperation condition, IParameterSymbol parameter)
538private static bool IsNullCheck(IOperation operand1, IOperation operand2, IParameterSymbol parameter)
807var checkStatement = TryFindParameterCheckStatement(
817var checkStatement = TryFindParameterCheckStatement(
837private static IOperation? TryFindParameterCheckStatement(
847foreach (var statement in blockStatement.Operations)
911foreach (var statement in blockStatement.Operations)
src\Analyzers\Core\Analyzers\RemoveUnnecessarySuppressions\SuppressMessageAttributeState.cs (9)
46out ImmutableArray<(string name, IOperation value)> namedAttributeArguments)
48var operation = (model.GetOperation(attributeSyntax, cancellationToken) as IAttributeOperation)?.Operation;
55using var _ = ArrayBuilder<(string name, IOperation value)>.GetInstance(out var builder);
56foreach (var initializer in initializerOperation.Initializers)
70public static bool HasValidScope(ImmutableArray<(string name, IOperation value)> namedAttributeArguments, out TargetScope targetScope)
88ImmutableArray<(string name, IOperation value)> namedAttributeArguments,
92out IOperation? targetValueOperation,
128ImmutableArray<(string name, IOperation value)> namedAttributeArguments,
131[NotNullWhen(returnValue: true)] out IOperation? argumentValueOperation)
src\Analyzers\Core\Analyzers\RemoveUnusedParametersAndValues\AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.BlockAnalyzer.cs (17)
32/// We use this value in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/> to determine whether to bail from analysis or not.
45/// We use this value in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/> to determine whether to bail from analysis or not.
51/// We use this value in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/> to determine whether to bail from analysis or not.
98var firstBlock = context.OperationBlocks[0];
138foreach (var operationBlock in context.OperationBlocks)
149foreach (var operationBlock in context.OperationBlocks)
170var value = expressionStatement.Operation;
253/// delegate escape, and corresponding bail out from flow analysis in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/>.
257private static bool IsHandledDelegateCreationOrAnonymousFunctionTreeShape(IOperation operation)
301/// delegate escape, and corresponding bail out from flow analysis in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/>.
306private static bool IsHandledLocalOrParameterReferenceTreeShape(IOperation operation)
366private bool ShouldAnalyze(IOperation operationBlock, ISymbol owningSymbol, ref bool hasUnknownOperationNoneDescendant)
377foreach (var operation in operationBlock.Descendants())
490foreach (var operationBlock in context.OperationBlocks)
590IOperation unreadWriteOperation,
633bool IsRemovableAssignmentWithoutSideEffects(IOperation unusedSymbolWriteOperation)
657static bool IsRemovableAssignmentValueWithoutSideEffects(IOperation assignmentValue)
ValueTracking\ValueTracker.OperationCollector.cs (13)
25public Task VisitAsync(IOperation operation, CancellationToken cancellationToken)
46private async Task VisitReturnDescendentsAsync(IOperation operation, bool allowImplicit, CancellationToken cancellationToken)
49foreach (var returnOperation in returnOperations)
56private async Task VisitDefaultAsync(IOperation operation, CancellationToken cancellationToken)
89private async Task<bool> TryVisitChildrenAsync(IOperation operation, CancellationToken cancellationToken)
91foreach (var child in operation.ChildOperations)
111private Task VisitReferenceAsync(IOperation operation, CancellationToken cancellationToken)
142Task AddReferenceAsync(IOperation operation, CancellationToken cancellationToken)
173private async Task AddOperationAsync(IOperation operation, ISymbol symbol, CancellationToken cancellationToken)
275private static bool IsContainedIn<TContainingOperation>(IOperation? operation) where TContainingOperation : IOperation
278private static bool IsContainedIn<TContainingOperation>(IOperation? operation, [NotNullWhen(returnValue: true)] out TContainingOperation? containingOperation) where TContainingOperation : IOperation
src\RoslynAnalyzers\Utilities\Compiler\Extensions\IOperationExtensions.cs (33)
62public static bool HasNullConstantValue(this IOperation operation)
67public static bool TryGetBoolConstantValue(this IOperation operation, out bool constantValue)
84public static ImmutableArray<IOperation> GetTopmostExplicitDescendants(this IOperation operation)
91var builder = ImmutableArray.CreateBuilder<IOperation>();
92var operationsToProcess = new Queue<IOperation>();
105foreach (var child in operation.Children)
121public static bool IsOperationNoneRoot(this IOperation operation)
132public static TOperation? GetAncestor<TOperation>(this IOperation root, OperationKind ancestorKind, Func<TOperation, bool>? predicate = null)
133where TOperation : class, IOperation
140var ancestor = root;
167public static IOperation? GetAncestor(this IOperation root, ImmutableArray<OperationKind> ancestorKinds, Func<IOperation, bool>? predicate = null)
174var ancestor = root;
209public static IOperation? GetInstance(this IInstanceReferenceOperation operation, bool isInsideAnonymousObjectInitializer)
216for (IOperation? current = operation; current != null && current.Kind != OperationKind.Block; current = current.Parent)
259public static IOperation GetRoot(this IOperation operation)
274private static readonly BoundedCache<Compilation, ConcurrentDictionary<IOperation, ControlFlowGraph?>> s_operationToCfgCache
277public static bool TryGetEnclosingControlFlowGraph(this IOperation operation, [NotNullWhen(returnValue: true)] out ControlFlowGraph? cfg)
294private static ControlFlowGraph? CreateControlFlowGraph(IOperation operation)
332this IOperation operation, IMethodSymbol lambdaOrLocalFunction, out PooledHashSet<ISymbol> builder)
343foreach (var child in operation.Descendants())
385public static bool IsWithinLambdaOrLocalFunction(this IOperation operation, [NotNullWhen(true)] out IOperation? containingLambdaOrLocalFunctionOperation)
411[NotNullWhen(returnValue: true)] out IOperation? elementOfParentTupleContainingTuple)
416IOperation previousOperation = tupleOperation;
417var currentOperation = tupleOperation.Parent;
449public static IOperation? GetInstance(this IInvocationOperation invocationOperation)
452public static IOperation? GetThrownException(this IThrowOperation operation)
454var thrownObject = operation.Exception;
478IOperation potentialLeftSide = operation;
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\OperationExtensions.cs (32)
18public static bool IsTargetOfObjectMemberInitializer(this IOperation operation)
34public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
239public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
259public static bool IsInLeftOfDeconstructionAssignment(this IOperation operation, [NotNullWhen(true)] out IDeconstructionAssignmentOperation? deconstructionAssignment)
263var previousOperation = operation;
264var current = operation.Parent;
295public static bool IsAnyCompoundAssignment(this IOperation operation)
308public static bool IsInsideCatchRegion(this IOperation operation, ControlFlowGraph cfg)
328foreach (var descendant in block.DescendantOperations())
341public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
343foreach (var operationBlock in operationBlocks)
354public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
357public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(true)] out IOperation? foundOperation)
361foreach (var descendant in operationBlock.DescendantsAndSelf())
374public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
377public static bool IsNumericLiteral(this IOperation operation)
380public static bool IsNullLiteral(this IOperation operand)
389public static IOperation? WalkDownConversion(this IOperation? operation)
399public static bool IsSingleThrowNotImplementedOperation([NotNullWhen(true)] this IOperation? firstBlock)
415var firstOp = block.Operations.Length == 1
437static IOperation? TryGetSingleExplicitStatement(ImmutableArray<IOperation> operations)
439IOperation? firstOp = null;
440foreach (var operation in operations)
454static bool IsThrowNotImplementedOperation(INamedTypeSymbol notImplementedExceptionType, IOperation? operation)
461public static IOperation? UnwrapImplicitConversion(this IOperation? value)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.AnalysisData.cs (14)
61protected abstract PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
132public abstract void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId);
137public abstract void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol);
138public abstract void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget);
139public abstract void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget);
140public abstract void SetEmptyInvocationTargetsForDelegate(IOperation write);
141public abstract bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets);
143protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> CreateSymbolsWriteMap(
146var symbolsWriteMap = PooledDictionary<(ISymbol Symbol, IOperation Write), bool>.GetInstance();
150protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> UpdateSymbolsWriteMap(
151PooledDictionary<(ISymbol Symbol, IOperation Write), bool> symbolsWriteMap,
158(ISymbol, IOperation) key = (parameter, null);
201public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten, bool isRef)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.BasicBlockAnalysisData.cs (9)
28private readonly Dictionary<ISymbol, PooledHashSet<IOperation>> _reachingWrites;
74public void ForEachCurrentWrite<TArg>(ISymbol symbol, Action<IOperation, TArg> action, TArg arg)
86public bool ForEachCurrentWrite<TArg>(ISymbol symbol, Func<IOperation, TArg, bool> action, TArg arg)
90foreach (var value in values)
104public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten)
108values = PooledHashSet<IOperation>.GetInstance();
223private static void AddEntries(Dictionary<ISymbol, PooledHashSet<IOperation>> result, BasicBlockAnalysisData source)
231values = PooledHashSet<IOperation>.GetInstance();
240foreach (var operation in operations)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (33)
41private readonly PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>> _lValueFlowCapturesMap;
48private readonly PooledDictionary<IOperation, PooledHashSet<IOperation>> _reachingDelegateCreationTargets;
69private readonly PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>> _symbolWritesInsideBlockRangeMap;
77PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
81PooledDictionary<IOperation, PooledHashSet<IOperation>> reachingDelegateCreationTargets,
99_lValueFlowCapturesMap = PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
103_symbolWritesInsideBlockRangeMap = PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
110protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
134reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
189foreach (var operation in cfg.OriginalOperation.Descendants())
215private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
220var operations = PooledHashSet<IOperation>.GetInstance();
224writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
241PooledHashSet<IOperation> operationsBuilder,
248foreach (var operation in cfg.Blocks[i].DescendantOperations())
273void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
275foreach (var target in targets)
462public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
466captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
514public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
522var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
544foreach (var target in targetsBuilderForSymbolWrite)
561public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
571public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
583public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
586private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
588var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
597public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.OperationTreeAnalysisData.cs (9)
21PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
34protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
63public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
69public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
71public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
73public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
75public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
77public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.Walker.cs (20)
27private IOperation _currentRootOperation;
29private PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>> _pendingWritesMap;
36IEnumerable<IOperation> operations,
51private void Visit(ISymbol containingSymbol, IEnumerable<IOperation> operations, AnalysisData analysisData, CancellationToken cancellationToken)
58_pendingWritesMap = PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
65foreach (var operation in operations)
93private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo)
101private void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
107private void OnReferenceFound(ISymbol symbol, IOperation operation)
159private bool MakePendingWrite(IOperation operation, ISymbol symbolOpt)
166var set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
175set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
407private void ProcessPossibleDelegateCreationAssignment(ISymbol symbol, IOperation write)
415IOperation initializerValue = null;
431private void ProcessPossibleDelegateCreation(IOperation creation, IOperation write)
433var currentOperation = creation;
497private void AnalyzePossibleDelegateInvocation(IOperation operation)
534foreach (var target in targets)
549void AnalyzeDelegateInvocation(IOperation target)
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\LanguageServices\InitializeParameter\InitializeParameterHelpersCore.cs (11)
38public static bool IsParameterReference(IOperation? operation, IParameterSymbol parameter)
43IOperation? value, IParameterSymbol parameter)
76public static IOperation? TryFindFieldOrPropertyAssignmentStatement(IParameterSymbol parameter, IBlockOperation? blockStatement)
79private static IOperation? TryFindFieldOrPropertyAssignmentStatement(
85foreach (var statement in blockStatement.Operations)
99var target = targetTuple.Elements[i];
100var value = valueTuple.Elements[i];
117IOperation operation,
146IOperation? operation, INamedTypeSymbol containingType,
163public static bool IsFieldOrPropertyAssignment(IOperation statement, INamedTypeSymbol containingType, [NotNullWhen(true)] out IAssignmentOperation? assignmentExpression)
167IOperation statement, INamedTypeSymbol containingType,