src\1e7e9f16bf7f1945\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\2e2796bccd1466f6\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\66dd3055a1c91c38\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\683181b2796de991\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\a03b2aad21e28a8a\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\a172c07bebba4cd8\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\b310f676f7308b7f\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\b310f676f7308b7f\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; }
135reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
205foreach (var operation in cfg.OriginalOperation.Descendants())
231private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
236var operations = PooledHashSet<IOperation>.GetInstance();
240writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
257PooledHashSet<IOperation> operationsBuilder,
264foreach (var operation in cfg.Blocks[i].DescendantOperations())
289void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
291foreach (var target in targets)
478public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
482captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
530public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
538var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
560foreach (var target in targetsBuilderForSymbolWrite)
577public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
587public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
599public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
602private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
604var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
613public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\b310f676f7308b7f\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\roslyn\src\RoslynAnalyzers\Utilities\Compiler\Extensions\IOperationExtensions.cs (33)
61public static bool HasNullConstantValue(this IOperation operation)
66public static bool TryGetBoolConstantValue(this IOperation operation, out bool constantValue)
83public static ImmutableArray<IOperation> GetTopmostExplicitDescendants(this IOperation operation)
90var builder = ImmutableArray.CreateBuilder<IOperation>();
91var operationsToProcess = new Queue<IOperation>();
104foreach (var child in operation.Children)
120public static bool IsOperationNoneRoot(this IOperation operation)
131public static TOperation? GetAncestor<TOperation>(this IOperation root, OperationKind ancestorKind, Func<TOperation, bool>? predicate = null)
132where TOperation : class, IOperation
139var ancestor = root;
166public static IOperation? GetAncestor(this IOperation root, ImmutableArray<OperationKind> ancestorKinds, Func<IOperation, bool>? predicate = null)
173var ancestor = root;
208public static IOperation? GetInstance(this IInstanceReferenceOperation operation, bool isInsideAnonymousObjectInitializer)
215for (IOperation? current = operation; current != null && current.Kind != OperationKind.Block; current = current.Parent)
258public static IOperation GetRoot(this IOperation operation)
273private static readonly BoundedCache<Compilation, ConcurrentDictionary<IOperation, ControlFlowGraph?>> s_operationToCfgCache
276public static bool TryGetEnclosingControlFlowGraph(this IOperation operation, [NotNullWhen(returnValue: true)] out ControlFlowGraph? cfg)
293private static ControlFlowGraph? CreateControlFlowGraph(IOperation operation)
331this IOperation operation, IMethodSymbol lambdaOrLocalFunction, out PooledHashSet<ISymbol> builder)
342foreach (var child in operation.Descendants())
384public static bool IsWithinLambdaOrLocalFunction(this IOperation operation, [NotNullWhen(true)] out IOperation? containingLambdaOrLocalFunctionOperation)
410[NotNullWhen(returnValue: true)] out IOperation? elementOfParentTupleContainingTuple)
415IOperation previousOperation = tupleOperation;
416var currentOperation = tupleOperation.Parent;
448public static IOperation? GetInstance(this IInvocationOperation invocationOperation)
451public static IOperation? GetThrownException(this IThrowOperation operation)
453var thrownObject = operation.Exception;
477IOperation potentialLeftSide = operation;
src\roslyn\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\roslyn\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\roslyn\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\roslyn\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\roslyn\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\roslyn\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\roslyn\src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\InterproceduralAnalysisConfiguration.cs (1)
95IOperation operation,
src\roslyn\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\roslyn\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\roslyn\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\9547feb31df4cc5d\AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.BlockAnalyzer.cs (18)
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;
232private static IOperation GetInnermostWhenNotNull(IConditionalAccessOperation operation)
269/// delegate escape, and corresponding bail out from flow analysis in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/>.
273private static bool IsHandledDelegateCreationOrAnonymousFunctionTreeShape(IOperation operation)
317/// delegate escape, and corresponding bail out from flow analysis in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/>.
322private static bool IsHandledLocalOrParameterReferenceTreeShape(IOperation operation)
382private bool ShouldAnalyze(IOperation operationBlock, ISymbol owningSymbol, ref bool hasUnknownOperationNoneDescendant)
393foreach (var operation in operationBlock.Descendants())
506foreach (var operationBlock in context.OperationBlocks)
606IOperation unreadWriteOperation,
653bool IsRemovableAssignmentWithoutSideEffects(IOperation unusedSymbolWriteOperation)
677static bool IsRemovableAssignmentValueWithoutSideEffects(IOperation assignmentValue)
src\b310f676f7308b7f\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\b310f676f7308b7f\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; }
135reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
205foreach (var operation in cfg.OriginalOperation.Descendants())
231private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
236var operations = PooledHashSet<IOperation>.GetInstance();
240writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
257PooledHashSet<IOperation> operationsBuilder,
264foreach (var operation in cfg.Blocks[i].DescendantOperations())
289void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
291foreach (var target in targets)
478public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
482captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
530public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
538var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
560foreach (var target in targetsBuilderForSymbolWrite)
577public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
587public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
599public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
602private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
604var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
613public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\b310f676f7308b7f\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\roslyn\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\roslyn\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\roslyn\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\roslyn\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\roslyn\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\roslyn\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\roslyn\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)
51public abstract bool HasUnreachableEndPoint(IOperation operation);
73public (ImmutableArray<AnalyzedSwitchSection>, TExpressionSyntax TargetExpression) AnalyzeIfStatementSequence(ReadOnlySpan<IOperation> operations)
76if (!ParseIfStatementSequence(operations, sections, topLevel: true, out var defaultBodyOpt))
98ReadOnlySpan<IOperation> operations,
101out IOperation? defaultBodyOpt)
134var nextStatement = operations[current];
154private bool ParseIfStatement(IOperation operation, ArrayBuilder<AnalyzedSwitchSection> sections, out IOperation? defaultBodyOpt)
183private bool ParseIfStatementOrBlock(IOperation op, ArrayBuilder<AnalyzedSwitchSection> sections, out IOperation? defaultBodyOpt)
207private bool ParseSwitchLabels(IOperation operation, ArrayBuilder<AnalyzedSwitchLabel> labels)
229private AnalyzedSwitchLabel? ParseSwitchLabel(IOperation operation)
278private AnalyzedPattern? ParsePattern(IOperation operation, ArrayBuilder<TExpressionSyntax> guards)
393bool CheckTargetExpression(IOperation left, IOperation right)
397private static (BoundKind Kind, IOperation Expression, IOperation Value) GetRangeBound(IBinaryOperation op)
443private static bool IsConstant(IOperation operation)
451private bool CheckTargetExpression(IOperation operation, [NotNullWhen(true)] out ITypeSymbol? switchTargetType)
474private bool CheckConstantType(IOperation operation, ITypeSymbol switchTargetType)
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\9547feb31df4cc5d\AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.BlockAnalyzer.cs (18)
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;
232private static IOperation GetInnermostWhenNotNull(IConditionalAccessOperation operation)
269/// delegate escape, and corresponding bail out from flow analysis in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/>.
273private static bool IsHandledDelegateCreationOrAnonymousFunctionTreeShape(IOperation operation)
317/// delegate escape, and corresponding bail out from flow analysis in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/>.
322private static bool IsHandledLocalOrParameterReferenceTreeShape(IOperation operation)
382private bool ShouldAnalyze(IOperation operationBlock, ISymbol owningSymbol, ref bool hasUnknownOperationNoneDescendant)
393foreach (var operation in operationBlock.Descendants())
506foreach (var operationBlock in context.OperationBlocks)
606IOperation unreadWriteOperation,
653bool IsRemovableAssignmentWithoutSideEffects(IOperation unusedSymbolWriteOperation)
677static bool IsRemovableAssignmentValueWithoutSideEffects(IOperation assignmentValue)
src\roslyn\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)
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
Microsoft.CodeQuality.Analyzers\QualityGuidelines\AvoidMultipleEnumerations\AvoidMultipleEnumerationsHelpers.cs (9)
22public static (IOperation linqChainTailOperation, EnumerationCount linqChainEnumerationCount) SkipLinqChainAndConversionMethod(
23IOperation operation,
29static (IOperation linqChainTailOperation, EnumerationCount enumerationCount) VisitLinqChainAndCoversionMethod(
30IOperation operation,
75public static bool IsValidImplicitConversion([NotNullWhen(true)] IOperation? operation, WellKnownSymbolsInfo wellKnownSymbolsInfo)
96IOperation operation,
108IOperation operation, WellKnownSymbolsInfo wellKnownSymbolsInfo, out bool enumerateInstance)
122IOperation operation,
270[NotNullWhen(true)] IOperation? operation, WellKnownSymbolsInfo wellKnownSymbolsInfo, out bool enumerateArgument)
Microsoft.NetCore.Analyzers\InteropServices\PlatformCompatibilityAnalyzer.cs (17)
325var platformSpecificOperations = PooledConcurrentDictionary<KeyValuePair<IOperation, ISymbol>,
392ValueContentAbstractValue GetValueContentValue(IOperation operation)
411private static bool HasGuardedLambdaOrLocalFunctionResult(IOperation platformSpecificOperation, SmallDictionary<string, Versions> attributes,
415if (!platformSpecificOperation.IsWithinLambdaOrLocalFunction(out var containingLambdaOrLocalFunctionOperation))
442private static bool ComputeNeedsValueContentAnalysis(IOperation operationBlock, ImmutableArray<IMethodSymbol> guardMethods, IMethodSymbol? runtimeIsOSPlatformMethod, INamedTypeSymbol? osPlatformType)
446foreach (var operation in operationBlock.Descendants())
812private static void ReportDiagnostics(IOperation operation, SmallDictionary<string, Versions> attributes,
832static void ReportSupportedDiagnostic(IOperation operation, OperationBlockAnalysisContext context, string operationName,
1002static void ReportUnsupportedDiagnostic(IOperation operation, OperationBlockAnalysisContext context, string operationName,
1232static SymbolDisplayFormat GetLanguageSpecificFormat(IOperation operation) =>
1287private static ISymbol? GetOperationSymbol(IOperation operation)
1297private static IEnumerable<ISymbol> GetPropertyAccessors(IPropertySymbol property, IOperation operation)
1322private static ISymbol GetEventAccessor(IEventSymbol iEvent, IOperation operation)
1335private static void AnalyzeOperation(IOperation operation, OperationAnalysisContext context, PooledConcurrentDictionary<KeyValuePair<IOperation, ISymbol>,
1424platformSpecificOperations.TryAdd(new KeyValuePair<IOperation, ISymbol>(operation, symbol), (notSuppressedAttributes, callSiteAttributes.Platforms));
1430platformSpecificOperations.TryAdd(new KeyValuePair<IOperation, ISymbol>(operation, symbol), (copiedAttributes, null));
Microsoft.NetCore.Analyzers\Performance\PreferDictionaryTryMethodsOverContainsKeyGuardAnalyzer.cs (31)
53public DictionaryUsageContext(IOperation dictionaryReference, IOperation containsKeyArgumentReference, IMethodSymbol addSymbol)
96public IOperation DictionaryReference { get; }
98public IOperation ContainsKeyArgumentReference { get; }
102public ImmutableArray<IOperation> AdditionalArrayIndexReferences { get; } = ImmutableArray<IOperation>.Empty;
166IOperation? guardedPath = null;
204foreach (var operation in block.Operations)
273private static bool GetParentConditionalOperation(IOperation operation, ref DictionaryUsageContext usageContext, SearchContext searchContext,
285var parentOperation = operation.Parent;
286IOperation nextOperation;
323private static bool FindUsages(IOperation operation, ref DictionaryUsageContext usageContext, SearchContext searchContext)
326foreach (var descendant in GetNonConditionalDescendantsAndSelf(operation))
448var whenTrue = conditionalOperation.WhenTrue;
456foreach (var op in block.Operations)
464foreach (var childOp in expression.Operation.DescendantsAndSelf())
466IOperation target;
522private static void FindUsageInOperationsAfterConditionBlock(IOperation sourceOperation, ref DictionaryUsageContext context, SearchContext searchContext)
525foreach (var operation in sourceOperation.Parent!.Children)
541private static bool IsSameConstantOrReferenceOperation(IOperation sourceReference, IOperation targetReference)
551private static bool IsSameReferenceOperation(IOperation? sourceReference, IOperation targetReference)
583private static bool IsAnySameReferenceOperation(IOperation source, ImmutableArray<IOperation> targets)
585foreach (var target in targets)
596private static IEnumerable<IOperation> GetNonConditionalDescendantsAndSelf(IOperation operation)
605return Enumerable.Empty<IOperation>();
611private static bool AreInstancesEqual(IOperation instance1, IOperation instance2)
Microsoft.NetCore.Analyzers\Performance\UseCountProperly.cs (13)
211IOperation? parentOperation = invocationOperation.WalkUpParentheses().WalkUpConversion().Parent;
247IOperation? parentOperation = propertyReferenceOperation.WalkUpParentheses().WalkUpConversion().Parent;
258private static bool ShouldReplaceParent(ref IOperation? parentOperation, out string? operationKey, out bool shouldNegateIsEmpty)
316IOperation? constantOperation = isInstance ? parent.Arguments[0].Value : parent.Instance;
401private static void ReportCA1827(OperationAnalysisContext context, bool shouldNegate, string operationKey, string methodName, IOperation operation)
418private static void ReportCA1828(OperationAnalysisContext context, bool shouldNegate, string operationKey, string methodName, IOperation operation)
436private static void ReportCA1829(OperationAnalysisContext context, string propertyName, IOperation operation)
448private static void ReportCA1836(OperationAnalysisContext context, string operationKey, bool shouldNegate, IOperation operation)
466IInvocationOperation invocationOperation, IOperation? parent,
527OperationAnalysisContext context, IOperation? operation, IOperation parent,
722private static bool TryGetZeroOrOneConstant(IOperation? operation, out int constant)
760private static bool IsPropertyGetOfIsEmptyUsingThisInstance(OperationAnalysisContext context, IOperation? operation, ISymbol isEmptyPropertySymbol)
Microsoft.NetCore.Analyzers\Performance\UseSearchValues.Fixer.cs (8)
62protected abstract SyntaxNode? TryReplaceArrayCreationWithInlineLiteralExpression(IOperation operation);
181private static IArgumentOperation? GetArgumentOperationAncestorOrSelf(IOperation operation) =>
198private static string GetSearchValuesFieldName(IOperation argument, bool isByte, bool removedOriginalMember)
232bool TryGetNameFromLocalOrFieldReference(IOperation? argument, [NotNullWhen(true)] out string? name)
269private SyntaxNode CreateSearchValuesCreateArgument(SyntaxNode originalSyntax, IOperation argument, out SyntaxNode? memberToRemove, CancellationToken cancellationToken)
290private SyntaxNode CreateSearchValuesCreateArgumentCore(SyntaxNode originalSyntax, IOperation argument, out SyntaxNode? memberToRemove, CancellationToken cancellationToken)
319bool TryGetArgumentFromStringToCharArray(IOperation operation, [NotNullWhen(true)] out SyntaxNode? createArgument, out SyntaxNode? memberToRemove)
341bool TryGetArgumentFromLocalOrFieldReference(IOperation operation, [NotNullWhen(true)] out SyntaxNode? createArgument, out SyntaxNode? memberToRemove)
Microsoft.NetCore.Analyzers\Runtime\UseExceptionThrowHelpers.cs (8)
366private static bool IsParameterNullCheck(IOperation condition, [NotNullWhen(true)] out IParameterReferenceOperation? parameterReference)
394private static bool IsNullOrEmptyCheck(ISymbol stringIsNullOrEmpty, ISymbol stringLength, ISymbol stringEmpty, IOperation condition, [NotNullWhen(true)] out IParameterReferenceOperation? parameterReference)
435private static bool IsArgEqualStringEmpty(ISymbol stringEmpty, IParameterSymbol arg, IOperation left, IOperation right) =>
443private static bool IsArgLengthEqual0(ISymbol stringLength, IParameterSymbol arg, IOperation left, IOperation right) =>
452private static bool IsNegativeAndOrZeroComparison(IOperation condition, [NotNullWhen(true)] out IParameterReferenceOperation? parameterReferenceOperation, [NotNullWhen(true)] out string? methodName)
528private static bool IsGreaterLessEqualThanComparison(IOperation condition, [NotNullWhen(true)] out IParameterReferenceOperation? parameterReferenceOperation, [NotNullWhen(true)] out string? methodName, [NotNullWhen(true)] out SyntaxNode? other)
Microsoft.NetCore.Analyzers\Runtime\UseStringEqualsOverStringCompare.Fixer.cs (14)
39var violation = semanticModel.GetOperation(node, token);
93public abstract bool IsMatch(IOperation violation);
100/// <see cref="IsMatch(IOperation)"/> must return <see langword="true"/> for this operation.</param>
103public abstract SyntaxNode CreateReplacementExpression(IOperation violation, SyntaxGenerator generator);
111protected IInvocationOperation GetInvocation(IOperation violation)
125protected static SyntaxNode InvertIfNotEquals(SyntaxNode stringEqualsInvocationExpression, IOperation equalsOrNotEqualsOperation, SyntaxGenerator generator)
154public override bool IsMatch(IOperation violation) => UseStringEqualsOverStringCompare.IsStringStringCase(violation, Symbols);
156public override SyntaxNode CreateReplacementExpression(IOperation violation, SyntaxGenerator generator)
178public override bool IsMatch(IOperation violation) => UseStringEqualsOverStringCompare.IsStringStringBoolCase(violation, Symbols);
180public override SyntaxNode CreateReplacementExpression(IOperation violation, SyntaxGenerator generator)
220public override bool IsMatch(IOperation violation) => UseStringEqualsOverStringCompare.IsStringStringStringComparisonCase(violation, Symbols);
222public override SyntaxNode CreateReplacementExpression(IOperation violation, SyntaxGenerator generator)
244public override bool IsMatch(IOperation violation) => UseStringEqualsOverStringCompare.IsOrdinalStringStringCase(violation, Symbols);
246public override SyntaxNode CreateReplacementExpression(IOperation violation, SyntaxGenerator generator)
Microsoft.NetCore.Analyzers\Security\DataSetDataTableInSerializableObjectGraphAnalyzer.cs (15)
109out IEnumerable<(ITypeSymbol DeserializedTypeSymbol, IOperation OperationForLocation)>? deserializedTypes))
129out IEnumerable<(ITypeSymbol DeserializedTypeSymbol, IOperation OperationForLocation)>? deserializedTypes))
149out IEnumerable<(ITypeSymbol DeserializedTypeSymbol, IOperation OperationForLocation)>? deserializedTypes)
164(javaScriptConversionOperation.Type!, (IOperation)javaScriptConversionOperation)
176(targetMethod.TypeArguments[0], (IOperation)invocationOperation)
187(typeOfOperation.TypeOperand, (IOperation)typeOfOperation)
205.Select(t => (t.TypeOperand!, (IOperation)t));
217(targetMethod.TypeArguments[0], (IOperation)invocationOperation)
227(typeOfOperation.TypeOperand, (IOperation)typeOfOperation)
236(conversionOperation.Type!, (IOperation)conversionOperation)
248out IEnumerable<(ITypeSymbol DeserializedTypeSymbol, IOperation OperationForLocation)>? deserializedTypes)
263.Select(t => (t.TypeOperand!, (IOperation)t));
273.Select(t => (t.TypeOperand!, (IOperation)t));
284IEnumerable<(ITypeSymbol DeserializedTypeSymbol, IOperation OperationForLocation)> deserializedTypes)
286foreach ((ITypeSymbol deserializedTypeSymbol, IOperation operationForLocation) in deserializedTypes)
src\0437c1690f5501bd\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\11b41c7305441175\PropertySetAnalysis.PropertySetDataFlowOperationVisitor.cs (20)
132protected override void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, PropertySetAbstractValue value)
136protected override void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, PropertySetAbstractValue assignedValue, bool mayBeAssignment = false)
140protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, PropertySetAbstractValue assignedValue)
197out IOperation? propertySetInstance))
229if (this.TryUnwrapFlowCaptureReference(operation.Target, out IOperation? lValueOperation, OperationKind.PropertyReference, OperationKind.FieldReference))
276this.TryUnwrapFlowCaptureReference(operation.Target, out IOperation? lValue, OperationKind.PropertyReference);
453public override PropertySetAbstractValue VisitInvocation_NonLambdaOrDelegateOrLocalFunction(IMethodSymbol method, IOperation? visitedInstance, ImmutableArray<IArgumentOperation> visitedArguments, bool invokedAsDelegate, IOperation originalOperation, PropertySetAbstractValue defaultValue)
475IOperation? propertySetInstance = visitedInstance;
513[NotNullWhen(returnValue: true)] out IOperation? instance)
529IOperation value = argumentOperation.Value;
594IOperation propertySetInstance,
632public override PropertySetAbstractValue VisitInvocation_LocalFunction(IMethodSymbol localFunction, ImmutableArray<IArgumentOperation> visitedArguments, IOperation originalOperation, PropertySetAbstractValue defaultValue)
640public override PropertySetAbstractValue VisitInvocation_Lambda(IFlowAnonymousFunctionOperation lambda, ImmutableArray<IArgumentOperation> visitedArguments, IOperation originalOperation, PropertySetAbstractValue defaultValue)
648protected override void ProcessReturnValue(IOperation? returnValue)
665private void MergeInterproceduralResults(IOperation originalOperation)
702private bool TryUnwrapFlowCaptureReference(IOperation flowCaptureReferenceOperation, [NotNullWhen(returnValue: true)] out IOperation? unwrappedOperation, params OperationKind[] kinds)
710IOperation lValueOperation = lValuePointsToAbstractValue.LValueCapturedOperations.First();
src\40daf5e1cab76dff\TaintedDataAnalysis.TaintedDataOperationVisitor.cs (12)
174public override TaintedDataAbstractValue DefaultVisit(IOperation operation, object? argument)
183foreach (IOperation childOperation in operation.Children)
229protected override TaintedDataAbstractValue ComputeAnalysisValueForReferenceOperation(IOperation operation, TaintedDataAbstractValue defaultValue)
261IOperation? visitedInstance,
264IOperation originalOperation,
350IOperation? thenTaintedTargetOperation = visitedInstance != null && thenTaintedTarget == TaintedTargetValue.This
355var operation = visitedInstance != null && ifTaintedParameter == TaintedTargetValue.This
421public override TaintedDataAbstractValue VisitInvocation_LocalFunction(IMethodSymbol localFunction, ImmutableArray<IArgumentOperation> visitedArguments, IOperation originalOperation, TaintedDataAbstractValue defaultValue)
435public override TaintedDataAbstractValue VisitInvocation_Lambda(IFlowAnonymousFunctionOperation lambda, ImmutableArray<IArgumentOperation> visitedArguments, IOperation originalOperation, TaintedDataAbstractValue defaultValue)
489.Select<IOperation, TaintedDataAbstractValue>(this.GetCachedAbstractValue)
559IOperation originalOperation)
761private void SetTaintedForEntity(IOperation operation, TaintedDataAbstractValue value)
src\440320f3f10733a8\ValueContentAnalysis.ValueContentDataFlowOperationVisitor.cs (9)
77protected override CopyAbstractValue GetCopyAbstractValue(IOperation operation)
92protected override PredicateValueKind SetValueForIsNullComparisonOperator(IOperation leftOperand, bool equals, ValueContentAnalysisData targetAnalysisData)
96IOperation leftOperand,
97IOperation rightOperand,
113private void SetValueForComparisonOperator(IOperation target, IOperation assignedValue, bool equals, ref PredicateValueKind predicateValueKind, ValueContentAnalysisData targetAnalysisData)
183public override ValueContentAbstractValue DefaultVisit(IOperation operation, object? argument)
271IOperation? visitedInstance,
274IOperation originalOperation,
src\47c588c5b8785708\ParameterValidationAnalysis.ParameterValidationDataFlowOperationVisitor.cs (15)
95protected override void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, ParameterValidationAbstractValue assignedValue, bool mayBeAssignment = false)
104protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, ParameterValidationAbstractValue assignedValue)
109protected override void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, ParameterValidationAbstractValue value)
144private void MarkValidatedLocations(IOperation operation)
147private IEnumerable<AbstractLocation> GetNotValidatedLocations(IOperation operation)
153private static bool IsHazardousIfNull(IOperation operation)
172private void HandlePotentiallyHazardousOperation(IOperation operation, IEnumerable<AbstractLocation> nonValidatedLocations)
218public override ParameterValidationAbstractValue Visit(IOperation? operation, object? argument)
250IOperation? visitedInstance,
253IOperation originalOperation,
264IOperation originalOperation,
275IOperation originalOperation,
283private void ProcessRegularInvocationOrCreation(IMethodSymbol? targetMethod, ImmutableArray<IArgumentOperation> arguments, IOperation operation)
354private void ProcessLambdaOrLocalFunctionInvocation(IMethodSymbol targetMethod, IOperation invocation)
src\9382845807600969\AnalysisEntityDataFlowOperationVisitor.cs (11)
46protected override TAbstractAnalysisValue ComputeAnalysisValueForReferenceOperation(IOperation operation, TAbstractAnalysisValue defaultValue)
190protected override TAnalysisData GetMergedAnalysisDataForPossibleThrowingOperation(TAnalysisData? existingData, IOperation operation)
209protected override void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, TAbstractAnalysisValue value)
217protected override void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, TAbstractAnalysisValue assignedValue, bool mayBeAssignment = false)
237protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, TAbstractAnalysisValue assignedValue)
251protected virtual void SetAbstractValueForAssignment(AnalysisEntity targetAnalysisEntity, IOperation? assignedValueOperation, TAbstractAnalysisValue assignedValue)
263private void SetAbstractValueForAssignment(AnalysisEntity targetAnalysisEntity, AnalysisEntity? assignedValueEntity, IOperation? assignedValueOperation, TAbstractAnalysisValue assignedValue)
359private void TransferValueTypeInstanceAnalysisDataForAssignment(AnalysisEntity targetAnalysisEntity, AnalysisEntity? valueAnalysisEntity, IOperation? assignedValueOperation)
758private void HandleDeconstructionAssignment(IOperation target, ImmutableHashSet<AnalysisEntity> childEntities)
771var element = tupleOperation.Elements[i];
src\afc74d572e54ec72\DisposeAnalysis.DisposeDataFlowOperationVisitor.cs (14)
78protected override DisposeAbstractValue HandleInstanceCreation(IOperation creation, PointsToAbstractValue instanceLocation, DisposeAbstractValue defaultValue)
105private void HandleDisposingOperation(IOperation disposingOperation, IOperation? disposedInstance)
123private void HandlePossibleInvalidatingOperation(IOperation invalidatedInstance)
136private void HandlePossibleEscapingOperation(IOperation escapingOperation, ImmutableHashSet<AbstractLocation> escapedLocations)
149protected override void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, DisposeAbstractValue value)
155protected override void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, DisposeAbstractValue assignedValue, bool mayBeAssignment = false)
161protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, DisposeAbstractValue assignedValue)
217public override DisposeAbstractValue DefaultVisit(IOperation operation, object? argument)
223public override DisposeAbstractValue Visit(IOperation? operation, object? argument)
233protected override void HandlePossibleThrowingOperation(IOperation operation)
256IOperation? visitedInstance,
259IOperation originalOperation,
src\ffd9070534249528\PointsToAnalysis.PointsToDataFlowOperationVisitor.cs (44)
27private readonly PooledDictionary<IOperation, ImmutableHashSet<AbstractLocation>.Builder> _escapedOperationLocationsBuilder;
28private readonly PooledDictionary<IOperation, ImmutableHashSet<AbstractLocation>.Builder> _escapedReturnValueLocationsBuilder;
41_escapedOperationLocationsBuilder = PooledDictionary<IOperation, ImmutableHashSet<AbstractLocation>.Builder>.GetInstance();
42_escapedReturnValueLocationsBuilder = PooledDictionary<IOperation, ImmutableHashSet<AbstractLocation>.Builder>.GetInstance();
50public ImmutableDictionary<IOperation, ImmutableHashSet<AbstractLocation>> GetEscapedLocationsThroughOperationsMap()
53public ImmutableDictionary<IOperation, ImmutableHashSet<AbstractLocation>> GetEscapedLocationsThroughReturnValuesMap()
96public override PointsToAnalysisData Flow(IOperation statement, BasicBlock block, PointsToAnalysisData input)
166protected override PointsToAbstractValue GetPointsToAbstractValue(IOperation operation) => base.GetCachedAbstractValue(operation);
192protected override CopyAbstractValue GetCopyAbstractValue(IOperation operation)
209protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, PointsToAbstractValue assignedValue)
270protected override PointsToAbstractValue ComputeAnalysisValueForReferenceOperation(IOperation operation, PointsToAbstractValue defaultValue)
329protected override void ProcessReturnValue(IOperation? returnValue)
341private protected override PointsToAbstractValue GetAbstractValueForImplicitWrappingTaskCreation(IOperation returnValueOperation, PointsToAbstractValue returnValue, PointsToAbstractValue implicitTaskPointsToValue)
358IOperation leftOperand,
359IOperation rightOperand,
377protected override PredicateValueKind SetValueForIsNullComparisonOperator(IOperation leftOperand, bool equals, PointsToAnalysisData targetAnalysisData)
385IOperation target,
386IOperation assignedValueOperation,
396IOperation target,
624private void HandleEscapingOperation(IOperation escapingOperation, IOperation escapedInstance)
629private void HandleEscapingOperation(IOperation escapingOperation, IOperation escapedInstance, PooledDictionary<IOperation, ImmutableHashSet<AbstractLocation>.Builder> builder)
634foreach (var capturedOperation in escapedInstancePointsToValue.LValueCapturedOperations)
715private void HandlePossibleEscapingForAssignment(IOperation target, IOperation value, IOperation operation)
727protected override void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, PointsToAbstractValue assignedValue, bool mayBeAssignment = false)
737protected override void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, PointsToAbstractValue value)
748public override PointsToAbstractValue DefaultVisit(IOperation operation, object? argument)
784IOperation? currentInstanceOperation = operation.GetInstance(IsInsideAnonymousObjectInitializer);
796where TOperation : IOperation
918private PointsToAbstractValue VisitInvocationCommon(IOperation operation, IOperation? instance)
939IOperation? visitedInstance,
942IOperation originalOperation,
1026IOperation originalOperation,
1036IOperation originalOperation,
1049private NullAbstractValue GetNullStateBasedOnInstanceOrReferenceValue(IOperation? referenceOrInstance, ITypeSymbol? operationType, NullAbstractValue defaultValue)
1065private PointsToAbstractValue GetValueBasedOnInstanceOrReferenceValue(IOperation? referenceOrInstance, IOperation operation, PointsToAbstractValue defaultValue)
1206IOperation operation,
src\sdk\src\Microsoft.CodeAnalysis.NetAnalyzers\src\Utilities\Compiler\Extensions\IOperationExtensions.cs (78)
62public static bool HasNullConstantValue(this IOperation operation)
67public static bool TryGetBoolConstantValue(this IOperation operation, out bool constantValue)
79public static bool HasConstantValue(this IOperation operation, long comparand)
84public static bool HasConstantValue(this IOperation operation, ulong comparand)
131public static ImmutableArray<IOperation> WithoutFullyImplicitOperations(this ImmutableArray<IOperation> operations)
133ImmutableArray<IOperation>.Builder? builder = null;
136var operation = operations[i];
143builder = ImmutableArray.CreateBuilder<IOperation>();
161public static ImmutableArray<IOperation> GetTopmostExplicitDescendants(this IOperation operation)
168var builder = ImmutableArray.CreateBuilder<IOperation>();
169var operationsToProcess = new Queue<IOperation>();
181foreach (var child in operation.Children)
196public static bool IsOperationNoneRoot(this IOperation operation)
204public static IBlockOperation? GetTopmostParentBlock(this IOperation? operation)
206IOperation? currentOperation = operation;
224public static IBlockOperation? GetFirstParentBlock(this IOperation? operation)
226IOperation? currentOperation = operation;
246public static TOperation? GetAncestor<TOperation>(this IOperation root, OperationKind ancestorKind, Func<TOperation, bool>? predicate = null)
247where TOperation : class, IOperation
254var ancestor = root;
281public static IOperation? GetAncestor(this IOperation root, ImmutableArray<OperationKind> ancestorKinds, Func<IOperation, bool>? predicate = null)
288var ancestor = root;
323public static IOperation? GetInstance(this IInstanceReferenceOperation operation, bool isInsideAnonymousObjectInitializer)
330for (IOperation? current = operation; current != null && current.Kind != OperationKind.Block; current = current.Parent)
354public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
356foreach (var operationBlock in operationBlocks)
367public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
372public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(returnValue: true)] out IOperation? foundOperation)
374foreach (var descendant in operationBlock.DescendantsAndSelf())
387public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
430public static IOperation GetRoot(this IOperation operation)
445private static readonly BoundedCache<Compilation, ConcurrentDictionary<IOperation, ControlFlowGraph?>> s_operationToCfgCache
448public static bool TryGetEnclosingControlFlowGraph(this IOperation operation, [NotNullWhen(returnValue: true)] out ControlFlowGraph? cfg)
465private static ControlFlowGraph? CreateControlFlowGraph(IOperation operation)
502public static PooledHashSet<ISymbol> GetCaptures(this IOperation operation, IMethodSymbol lambdaOrLocalFunction)
513foreach (var child in operation.Descendants())
555public static bool IsWithinLambdaOrLocalFunction(this IOperation operation, [NotNullWhen(true)] out IOperation? containingLambdaOrLocalFunctionOperation)
561public static bool IsWithinExpressionTree(this IOperation operation, [NotNullWhen(true)] INamedTypeSymbol? linqExpressionTreeType)
597[NotNullWhen(returnValue: true)] out IOperation? elementOfParentTupleContainingTuple)
602IOperation previousOperation = tupleOperation;
603var currentOperation = tupleOperation.Parent;
635public static IOperation? GetInstance(this IInvocationOperation invocationOperation)
641public static ITypeSymbol? GetInstanceType(this IOperation operation)
643IOperation? instance = operation switch
655public static ISymbol? GetReferencedMemberOrLocalOrParameter(this IOperation? operation)
678public static IOperation WalkDownParentheses(this IOperation operation)
689public static IOperation? WalkUpParentheses(this IOperation? operation)
707public static IOperation WalkDownConversion(this IOperation operation)
724public static IOperation WalkDownConversion(this IOperation operation, Func<IConversionOperation, bool> predicate)
735public static IOperation? WalkUpConversion(this IOperation? operation)
748public static IOperation? GetThrownException(this IThrowOperation operation)
750var thrownObject = operation.Exception;
782where TOperation : class, IOperation
798public static bool HasAnyExplicitDescendant(this IOperation operation, Func<IOperation, bool>? descendIntoOperation = null)
800using var stack = ArrayBuilder<IEnumerator<IOperation>>.GetInstance();
809var current = enumerator.Current;
838IOperation potentialLeftSide = operation;
911public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
1086public static bool IsInLeftOfDeconstructionAssignment([DisallowNull] this IOperation? operation, out IDeconstructionAssignmentOperation? deconstructionAssignment)
1090var previousOperation = operation;
1122public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
1148public static bool IsAnyCompoundAssignment(this IOperation operation)
src\sdk\src\Microsoft.CodeAnalysis.NetAnalyzers\src\Utilities\Compiler\Lightup\IFunctionPointerInvocationOperationWrapper.cs (15)
22private static readonly Func<IOperation, ImmutableArray<IArgumentOperation>> ArgumentsAccessor = LightupHelpers.CreateOperationPropertyAccessor<IOperation, ImmutableArray<IArgumentOperation>>(WrappedType, nameof(Arguments), fallbackResult: ImmutableArray<IArgumentOperation>.Empty);
23private static readonly Func<IOperation, IOperation> TargetAccessor = LightupHelpers.CreateOperationPropertyAccessor<IOperation, IOperation>(WrappedType, nameof(Target), fallbackResult: null!);
25private static readonly Func<IOperation, IMethodSymbol> GetFunctionPointerSignatureAccessor = CreateFunctionPointerSignatureAccessor(WrappedType);
27private static Func<IOperation, IMethodSymbol> CreateFunctionPointerSignatureAccessor(Type? wrappedType)
41var operation = Expression.Variable(typeof(IOperation));
43return Expression.Lambda<Func<IOperation, IMethodSymbol>>(Expression.Call(targetMethod, Expression.Convert(operation, wrappedType)), operation).Compile();
46private IFunctionPointerInvocationOperationWrapper(IOperation operation)
51public IOperation WrappedOperation { get; }
54public IOperation Target => TargetAccessor(WrappedOperation);
58public static IFunctionPointerInvocationOperationWrapper FromOperation(IOperation operation)
73public static bool IsInstance(IOperation operation)
src\sdk\src\Microsoft.CodeAnalysis.NetAnalyzers\src\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\AbstractLocation.cs (23)
21/// 1. An allocation or an object creation operation (<see cref="CreateAllocationLocation(IOperation, ITypeSymbol, PointsToAnalysisContext)"/>).
22/// 2. Location for the implicit 'this' or 'Me' instance being analyzed (<see cref="CreateThisOrMeLocation(INamedTypeSymbol, ImmutableStack{IOperation})"/>).
23/// 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})"/>/>).
25/// See <see cref="CreateFlowCaptureLocation(InterproceduralCaptureId, ITypeSymbol, ImmutableStack{IOperation})"/>
34private AbstractLocation(IOperation? creation, ImmutableStack<IOperation>? creationCallStack, AnalysisEntity? analysisEntity, ISymbol? symbol, InterproceduralCaptureId? captureId, ITypeSymbol? locationType, bool isSpecialSingleton)
39CreationCallStack = creationCallStack ?? ImmutableStack<IOperation>.Empty;
47private static AbstractLocation Create(IOperation? creation, ImmutableStack<IOperation>? creationCallStack, AnalysisEntity? analysisEntity, ISymbol? symbol, InterproceduralCaptureId? captureId, ITypeSymbol? locationType)
55public static AbstractLocation CreateAllocationLocation(IOperation creation, ITypeSymbol locationType, PointsToAnalysisContext analysisContext)
57internal static AbstractLocation CreateAllocationLocation(IOperation creation, ITypeSymbol locationType, ImmutableStack<IOperation>? callStack)
61public static AbstractLocation CreateThisOrMeLocation(INamedTypeSymbol namedTypeSymbol, ImmutableStack<IOperation>? creationCallStack)
63public static AbstractLocation CreateSymbolLocation(ISymbol symbol, ImmutableStack<IOperation>? creationCallStack)
65public static AbstractLocation CreateFlowCaptureLocation(InterproceduralCaptureId captureId, ITypeSymbol locationType, ImmutableStack<IOperation>? creationCallStack)
68public IOperation? Creation { get; }
69public ImmutableStack<IOperation> CreationCallStack { get; }
75public IOperation? GetTopOfCreationCallStackOrCreation()
133foreach (var creation in CreationCallStack)
153SyntaxNode? TryGetSyntaxNodeToReportDiagnostic(IOperation creation, PointsToAnalysisResult pointsToAnalysisResult)
176SyntaxNode? TryGetSyntaxNodeToReportDiagnosticCore(IOperation operation)
181SyntaxNode? TryGetSyntaxNodeToReportDiagnosticForPointsValue(PointsToAbstractValue pointsToValue, IOperation operation)
src\sdk\src\Microsoft.CodeAnalysis.NetAnalyzers\src\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\AnalysisEntityFactory.cs (21)
28private readonly Dictionary<IOperation, AnalysisEntity?> _analysisEntityMap;
33private readonly Func<IOperation, PointsToAbstractValue>? _getPointsToAbstractValue;
37private readonly ImmutableStack<IOperation>? _interproceduralCallStack;
38private readonly Func<IOperation, AnalysisEntity?>? _interproceduralGetAnalysisEntityForFlowCapture;
39private readonly Func<ISymbol, ImmutableStack<IOperation>?> _getInterproceduralCallStackForOwningSymbol;
44Func<IOperation, PointsToAbstractValue>? getPointsToAbstractValue,
50ImmutableStack<IOperation>? interproceduralCallStack,
52Func<IOperation, AnalysisEntity?>? interproceduralGetAnalysisEntityForFlowCapture,
53Func<ISymbol, ImmutableStack<IOperation>?> getInterproceduralCallStackForOwningSymbol)
65_analysisEntityMap = new Dictionary<IOperation, AnalysisEntity?>();
91where T : IOperation
107private static AbstractIndex CreateAbstractIndex(IOperation operation)
123public bool TryCreate(IOperation operation, [NotNullWhen(returnValue: true)] out AnalysisEntity? analysisEntity)
133IOperation? instance = null;
314IOperation? instance = null;
347if (tupleOperation.TryGetParentTupleOperation(out var parentTupleOperationOpt, out var elementOfParentTupleContainingTuple) &&
408public bool TryGetForInterproceduralAnalysis(IOperation operation, out AnalysisEntity? analysisEntity)
411private AnalysisEntity GetOrCreateForFlowCapture(CaptureId captureId, ITypeSymbol? type, IOperation flowCaptureOrReference, bool isLValueFlowCapture)
438ITypeSymbol type, IOperation? instance, [NotNullWhen(returnValue: true)] out AnalysisEntity? analysisEntity)
530ImmutableStack<IOperation>? interproceduralCallStackForSymbolDeclaration;
538interproceduralCallStackForSymbolDeclaration = ImmutableStack<IOperation>.Empty;
src\sdk\src\Microsoft.CodeAnalysis.NetAnalyzers\src\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\DataFlowAnalysisResult.cs (11)
25private readonly ImmutableDictionary<IOperation, TAbstractAnalysisValue> _operationStateMap;
26private readonly ImmutableDictionary<IOperation, PredicateValueKind> _predicateValueKindMap;
27private readonly ImmutableDictionary<IOperation, IDataFlowAnalysisResult<TAbstractAnalysisValue>> _interproceduralResultsMap;
34ImmutableDictionary<IOperation, TAbstractAnalysisValue> operationStateMap,
35ImmutableDictionary<IOperation, PredicateValueKind> predicateValueKindMap,
37ImmutableDictionary<IOperation, IDataFlowAnalysisResult<TAbstractAnalysisValue>> interproceduralResultsMap,
86internal DataFlowAnalysisResult<TBlockAnalysisResult, TAbstractAnalysisValue> With(ImmutableDictionary<IOperation, TAbstractAnalysisValue> operationStateMap)
97public TAbstractAnalysisValue this[IOperation operation]
146internal DataFlowAnalysisResult<TBlockAnalysisResult, TAbstractAnalysisValue>? TryGetInterproceduralResult(IOperation operation)
167internal IEnumerable<DataFlowAnalysisResult<TBlockAnalysisResult, TAbstractAnalysisValue>> TryGetLambdaOrLocalFunctionResults(IOperation lambdaOrLocalFunctionOperation)
221public PredicateValueKind GetPredicateKind(IOperation operation) => _predicateValueKindMap.TryGetValue(operation, out var valueKind) ? valueKind : PredicateValueKind.Unknown;
src\sdk\src\Microsoft.CodeAnalysis.NetAnalyzers\src\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\DataFlowOperationVisitor.cs (92)
44private readonly ImmutableDictionary<IOperation, TAbstractAnalysisValue>.Builder _valueCacheBuilder;
45private readonly ImmutableDictionary<IOperation, PredicateValueKind>.Builder _predicateValueKindCacheBuilder;
48private readonly HashSet<IOperation> _visitedFlowBranchConditions;
50private readonly HashSet<IOperation>? _returnValueOperations;
110private readonly Stack<IOperation> _interproceduralCallStack;
115private readonly ImmutableDictionary<IOperation, IDataFlowAnalysisResult<TAbstractAnalysisValue>>.Builder _interproceduralResultsBuilder;
149public ImmutableDictionary<IOperation, IDataFlowAnalysisResult<TAbstractAnalysisValue>> InterproceduralResultsMap => _interproceduralResultsBuilder.ToImmutable();
272_valueCacheBuilder = ImmutableDictionary.CreateBuilder<IOperation, TAbstractAnalysisValue>();
273_predicateValueKindCacheBuilder = ImmutableDictionary.CreateBuilder<IOperation, PredicateValueKind>();
276_visitedFlowBranchConditions = new HashSet<IOperation>();
278_returnValueOperations = OwningSymbol is IMethodSymbol method && !method.ReturnsVoid ? new HashSet<IOperation>() : null;
279_interproceduralResultsBuilder = ImmutableDictionary.CreateBuilder<IOperation, IDataFlowAnalysisResult<TAbstractAnalysisValue>>();
286_interproceduralCallStack = new Stack<IOperation>();
295foreach (var operation in analysisContext.InterproceduralAnalysisData.CallStack)
374foreach (var operation in _returnValueOperations)
416public virtual TAnalysisData Flow(IOperation statement, BasicBlock block, TAnalysisData input)
425private void AfterVisitRoot(IOperation operation)
431foreach (var descendant in operation.DescendantsAndSelf())
803IOperation returnValueOperation,
811protected virtual void ProcessReturnValue(IOperation? returnValue)
826private TAbstractAnalysisValue GetAbstractValueForReturnOperation(IOperation returnValueOperation, out PointsToAbstractValue? implicitTaskPointsToValue)
847protected virtual void HandlePossibleThrowingOperation(IOperation operation)
866IOperation? instance = null;
867IOperation? invocation = null;
927protected virtual TAnalysisData GetMergedAnalysisDataForPossibleThrowingOperation(TAnalysisData? existingData, IOperation operation)
1016internal ImmutableDictionary<IOperation, TAbstractAnalysisValue> GetStateMap() => _valueCacheBuilder.ToImmutable();
1018internal ImmutableDictionary<IOperation, PredicateValueKind> GetPredicateValueKindMap() => _predicateValueKindCacheBuilder.ToImmutable();
1042public TAbstractAnalysisValue GetCachedAbstractValue(IOperation operation)
1076protected void CacheAbstractValue(IOperation operation, TAbstractAnalysisValue value)
1086protected NullAbstractValue GetNullAbstractValue(IOperation operation) => GetPointsToAbstractValue(operation).NullState;
1088protected virtual CopyAbstractValue GetCopyAbstractValue(IOperation operation)
1100protected virtual PointsToAbstractValue GetPointsToAbstractValue(IOperation operation)
1112protected virtual ValueContentAbstractValue GetValueContentAbstractValue(IOperation operation)
1124protected ImmutableHashSet<AbstractLocation> GetEscapedLocations(IOperation operation)
1208protected virtual TAbstractAnalysisValue ComputeAnalysisValueForReferenceOperation(IOperation operation, TAbstractAnalysisValue defaultValue)
1244IOperation sourceOperand,
1247IOperation operation,
1383private void PerformPredicateAnalysis(IOperation operation)
1492var current = operation.Parent;
1512var current = operation.Parent;
1541private void PerformPredicateAnalysisCore(IOperation operation, TAnalysisData targetAnalysisData)
1712IOperation? leftOperand = null;
1713IOperation? rightOperand = null;
1785bool IsNotNullWhenFalse(IOperation operation)
1803bool IsNotNullWhenTrue(IOperation operation)
1822protected virtual void SetPredicateValueKind(IOperation operation, TAnalysisData analysisData, PredicateValueKind predicateValueKind)
1891protected virtual PredicateValueKind SetValueForEqualsOrNotEqualsComparisonOperator(IOperation leftOperand, IOperation rightOperand, bool equals, bool isReferenceEquality, TAnalysisData targetAnalysisData)
1897protected virtual PredicateValueKind SetValueForIsNullComparisonOperator(IOperation leftOperand, bool equals, TAnalysisData targetAnalysisData)
1936protected virtual void ProcessThrowValue(IOperation? thrownValue)
1943protected abstract void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, TAbstractAnalysisValue value);
1944protected abstract void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, TAbstractAnalysisValue assignedValue, bool mayBeAssignment = false);
1945protected abstract void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, TAbstractAnalysisValue assignedValue);
1946private void HandleFlowCaptureReferenceAssignment(IFlowCaptureReferenceOperation flowCaptureReference, IOperation assignedValueOperation, TAbstractAnalysisValue assignedValue)
1959var target = pointsToValue.LValueCapturedOperations.First();
1970foreach (var capturedOperation in pointsToValue.LValueCapturedOperations)
1981foreach (var capturedOperation in pointsToValue.LValueCapturedOperations)
2021private void ResetValueTypeInstanceAnalysisData(IOperation operation)
2040private void ResetReferenceTypeInstanceAnalysisData(IOperation operation)
2058private void ResetInstanceAnalysisData(IOperation? operation)
2186protected bool TryGetInterproceduralAnalysisResult(IOperation operation, [NotNullWhen(returnValue: true)] out TAnalysisResult? analysisResult)
2201IOperation? instanceReceiver,
2203IOperation originalOperation,
2344var popped = _interproceduralCallStack.Pop();
2571AnalysisEntity? GetAnalysisEntityForFlowCapture(IOperation operation)
2757protected TAbstractAnalysisValue VisitArray(IEnumerable<IOperation> operations, object? argument)
2759foreach (var operation in operations)
2767public override TAbstractAnalysisValue Visit(IOperation? operation, object? argument)
2802private TAbstractAnalysisValue VisitCore(IOperation operation, object? argument)
2821public override TAbstractAnalysisValue DefaultVisit(IOperation operation, object? argument)
2902IOperation elementInitializer = operation.ElementValues[index];
3284using var methodTargetsOptBuilder = PooledHashSet<(IMethodSymbol method, IOperation? instance)>.GetInstance();
3309PooledHashSet<(IMethodSymbol method, IOperation? instance)> methodTargetsOptBuilder,
3314IOperation operation,
3315PooledHashSet<(IMethodSymbol method, IOperation? instance)> methodTargetsOptBuilder,
3320IOperation? operation,
3322PooledHashSet<(IMethodSymbol method, IOperation? instance)> methodTargetsOptBuilder,
3328IOperation? instance;
3376void AddMethodTarget(IMethodSymbol method, IOperation? instance)
3390bool HandleCreationOpt(IOperation? creation)
3435out ImmutableHashSet<(IMethodSymbol method, IOperation? instance)>? resolvedMethodTargets)
3439using var methodTargetsOptBuilder = PooledHashSet<(IMethodSymbol method, IOperation? instance)>.GetInstance();
3532IOperation? visitedInstance,
3535IOperation originalOperation,
3563private ImmutableStack<IOperation>? GetInterproceduralCallStackForOwningSymbol(ISymbol forOwningSymbol)
3576IOperation originalOperation,
3594IOperation originalOperation,
3634public virtual void HandleEnterLockOperation(IOperation lockedObject)
3666foreach (var element in operation.Elements)
3684var assignedValueOperation = operation.Elements[i];
3692foreach (var element in operation.Elements)