105 interfaces inheriting from IOperation
Microsoft.CodeAnalysis (105)
1 implementation of IOperation
Microsoft.CodeAnalysis (1)
6039 references to IOperation
Analyzer.Utilities.UnitTests (3)
ConfigurationSchemaGenerator (1)
GenerateDocumentationAndConfigFiles (202)
src\RoslynAnalyzers\Utilities\Compiler\Extensions\IOperationExtensions.cs (33)
62public static bool HasNullConstantValue(this IOperation operation)
67public static bool TryGetBoolConstantValue(this IOperation operation, out bool constantValue)
84public static ImmutableArray<IOperation> GetTopmostExplicitDescendants(this IOperation operation)
91var builder = ImmutableArray.CreateBuilder<IOperation>();
92var operationsToProcess = new Queue<IOperation>();
105foreach (var child in operation.Children)
121public static bool IsOperationNoneRoot(this IOperation operation)
132public static TOperation? GetAncestor<TOperation>(this IOperation root, OperationKind ancestorKind, Func<TOperation, bool>? predicate = null)
133where TOperation : class, IOperation
140var ancestor = root;
167public static IOperation? GetAncestor(this IOperation root, ImmutableArray<OperationKind> ancestorKinds, Func<IOperation, bool>? predicate = null)
174var ancestor = root;
209public static IOperation? GetInstance(this IInstanceReferenceOperation operation, bool isInsideAnonymousObjectInitializer)
216for (IOperation? current = operation; current != null && current.Kind != OperationKind.Block; current = current.Parent)
259public static IOperation GetRoot(this IOperation operation)
274private static readonly BoundedCache<Compilation, ConcurrentDictionary<IOperation, ControlFlowGraph?>> s_operationToCfgCache
277public static bool TryGetEnclosingControlFlowGraph(this IOperation operation, [NotNullWhen(returnValue: true)] out ControlFlowGraph? cfg)
294private static ControlFlowGraph? CreateControlFlowGraph(IOperation operation)
332this IOperation operation, IMethodSymbol lambdaOrLocalFunction, out PooledHashSet<ISymbol> builder)
343foreach (var child in operation.Descendants())
385public static bool IsWithinLambdaOrLocalFunction(this IOperation operation, [NotNullWhen(true)] out IOperation? containingLambdaOrLocalFunctionOperation)
422[NotNullWhen(returnValue: true)] out IOperation? elementOfParentTupleContainingTuple)
427IOperation previousOperation = tupleOperation;
428var currentOperation = tupleOperation.Parent;
460public static IOperation? GetInstance(this IInvocationOperation invocationOperation)
463public static IOperation? GetThrownException(this IThrowOperation operation)
465var thrownObject = operation.Exception;
489IOperation potentialLeftSide = operation;
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\OperationExtensions.cs (32)
18public static bool IsTargetOfObjectMemberInitializer(this IOperation operation)
34public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
239public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
259public static bool IsInLeftOfDeconstructionAssignment(this IOperation operation, [NotNullWhen(true)] out IDeconstructionAssignmentOperation? deconstructionAssignment)
263var previousOperation = operation;
264var current = operation.Parent;
295public static bool IsAnyCompoundAssignment(this IOperation operation)
308public static bool IsInsideCatchRegion(this IOperation operation, ControlFlowGraph cfg)
328foreach (var descendant in block.DescendantOperations())
341public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
343foreach (var operationBlock in operationBlocks)
354public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
357public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(true)] out IOperation? foundOperation)
361foreach (var descendant in operationBlock.DescendantsAndSelf())
374public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
377public static bool IsNumericLiteral(this IOperation operation)
380public static bool IsNullLiteral(this IOperation operand)
389public static IOperation? WalkDownConversion(this IOperation? operation)
399public static bool IsSingleThrowNotImplementedOperation([NotNullWhen(true)] this IOperation? firstBlock)
415var firstOp = block.Operations.Length == 1
437static IOperation? TryGetSingleExplicitStatement(ImmutableArray<IOperation> operations)
439IOperation? firstOp = null;
440foreach (var operation in operations)
454static bool IsThrowNotImplementedOperation(INamedTypeSymbol notImplementedExceptionType, IOperation? operation)
461public static IOperation? UnwrapImplicitConversion(this IOperation? value)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.AnalysisData.cs (14)
61protected abstract PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
132public abstract void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId);
137public abstract void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol);
138public abstract void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget);
139public abstract void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget);
140public abstract void SetEmptyInvocationTargetsForDelegate(IOperation write);
141public abstract bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets);
143protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> CreateSymbolsWriteMap(
146var symbolsWriteMap = PooledDictionary<(ISymbol Symbol, IOperation Write), bool>.GetInstance();
150protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> UpdateSymbolsWriteMap(
151PooledDictionary<(ISymbol Symbol, IOperation Write), bool> symbolsWriteMap,
158(ISymbol, IOperation) key = (parameter, null);
201public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten, bool isRef)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.BasicBlockAnalysisData.cs (9)
28private readonly Dictionary<ISymbol, PooledHashSet<IOperation>> _reachingWrites;
74public void ForEachCurrentWrite<TArg>(ISymbol symbol, Action<IOperation, TArg> action, TArg arg)
86public bool ForEachCurrentWrite<TArg>(ISymbol symbol, Func<IOperation, TArg, bool> action, TArg arg)
90foreach (var value in values)
104public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten)
108values = PooledHashSet<IOperation>.GetInstance();
223private static void AddEntries(Dictionary<ISymbol, PooledHashSet<IOperation>> result, BasicBlockAnalysisData source)
231values = PooledHashSet<IOperation>.GetInstance();
240foreach (var operation in operations)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (33)
41private readonly PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>> _lValueFlowCapturesMap;
48private readonly PooledDictionary<IOperation, PooledHashSet<IOperation>> _reachingDelegateCreationTargets;
69private readonly PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>> _symbolWritesInsideBlockRangeMap;
77PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
81PooledDictionary<IOperation, PooledHashSet<IOperation>> reachingDelegateCreationTargets,
99_lValueFlowCapturesMap = PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
103_symbolWritesInsideBlockRangeMap = PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
110protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
134reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
189foreach (var operation in cfg.OriginalOperation.Descendants())
215private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
220var operations = PooledHashSet<IOperation>.GetInstance();
224writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
241PooledHashSet<IOperation> operationsBuilder,
248foreach (var operation in cfg.Blocks[i].DescendantOperations())
273void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
275foreach (var target in targets)
462public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
466captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
514public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
522var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
544foreach (var target in targetsBuilderForSymbolWrite)
561public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
571public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
583public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
586private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
588var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
597public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.OperationTreeAnalysisData.cs (9)
21PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
34protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
63public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
69public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
71public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
73public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
75public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
77public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.Walker.cs (20)
27private IOperation _currentRootOperation;
29private PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>> _pendingWritesMap;
36IEnumerable<IOperation> operations,
51private void Visit(ISymbol containingSymbol, IEnumerable<IOperation> operations, AnalysisData analysisData, CancellationToken cancellationToken)
58_pendingWritesMap = PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
65foreach (var operation in operations)
93private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo)
101private void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
107private void OnReferenceFound(ISymbol symbol, IOperation operation)
159private bool MakePendingWrite(IOperation operation, ISymbol symbolOpt)
166var set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
175set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
407private void ProcessPossibleDelegateCreationAssignment(ISymbol symbol, IOperation write)
415IOperation initializerValue = null;
431private void ProcessPossibleDelegateCreation(IOperation creation, IOperation write)
433var currentOperation = creation;
497private void AnalyzePossibleDelegateInvocation(IOperation operation)
534foreach (var target in targets)
549void AnalyzeDelegateInvocation(IOperation target)
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\LanguageServices\InitializeParameter\InitializeParameterHelpersCore.cs (11)
38public static bool IsParameterReference(IOperation? operation, IParameterSymbol parameter)
43IOperation? value, IParameterSymbol parameter)
76public static IOperation? TryFindFieldOrPropertyAssignmentStatement(IParameterSymbol parameter, IBlockOperation? blockStatement)
79private static IOperation? TryFindFieldOrPropertyAssignmentStatement(
85foreach (var statement in blockStatement.Operations)
99var target = targetTuple.Elements[i];
100var value = valueTuple.Elements[i];
117IOperation operation,
146IOperation? operation, INamedTypeSymbol containingType,
163public static bool IsFieldOrPropertyAssignment(IOperation statement, INamedTypeSymbol containingType, [NotNullWhen(true)] out IAssignmentOperation? assignmentExpression)
167IOperation statement, INamedTypeSymbol containingType,
ILLink.RoslynAnalyzer (89)
DataFlow\LocalDataFlowVisitor.cs (16)
82foreach (IOperation operation in block.Block.Operations)
86IOperation? branchValueOperation = block.Block.BranchValue;
129IOperation branchValueOperation,
141IOperation operation,
144public abstract TValue HandleArrayElementRead(TValue arrayValue, TValue indexValue, IOperation operation);
146public abstract void HandleArrayElementWrite(TValue arrayValue, TValue indexValue, TValue valueToWrite, IOperation operation, bool merge);
152IOperation operation,
157IOperation branchValueOperation);
169IOperation operation,
177private TValue ProcessBinderCall(IOperation operation, string methodName, LocalDataFlowState<TValue, TContext, TValueLattice, TContextLattice> state)
242private TValue ProcessSingleTargetAssignment(IOperation targetOperation, IAssignmentOperation operation, LocalDataFlowState<TValue, TContext, TValueLattice, TContextLattice> state, bool merge)
411var targetOperation = operation.Target;
638public abstract TValue HandleDelegateCreation(IMethodSymbol methodReference, IOperation operation, in TContext context);
774IOperation operation,
851IOperation operation,
853IOperation? instance,
TrimAnalysis\TrimAnalysisPatternStore.cs (14)
15private readonly Dictionary<IOperation, TrimAnalysisAssignmentPattern> AssignmentPatterns;
16private readonly Dictionary<IOperation, TrimAnalysisFieldAccessPattern> FieldAccessPatterns;
17private readonly Dictionary<IOperation, TrimAnalysisBackingFieldAccessPattern> BackingFieldAccessPatterns;
18private readonly Dictionary<IOperation, TrimAnalysisGenericInstantiationPattern> GenericInstantiationPatterns;
19private readonly Dictionary<IOperation, TrimAnalysisMethodCallPattern> MethodCallPatterns;
20private readonly Dictionary<IOperation, TrimAnalysisReflectionAccessPattern> ReflectionAccessPatterns;
21private readonly Dictionary<IOperation, FeatureCheckReturnValuePattern> FeatureCheckReturnValuePatterns;
29AssignmentPatterns = new Dictionary<IOperation, TrimAnalysisAssignmentPattern>();
30FieldAccessPatterns = new Dictionary<IOperation, TrimAnalysisFieldAccessPattern>();
31BackingFieldAccessPatterns = new Dictionary<IOperation, TrimAnalysisBackingFieldAccessPattern>();
32GenericInstantiationPatterns = new Dictionary<IOperation, TrimAnalysisGenericInstantiationPattern>();
33MethodCallPatterns = new Dictionary<IOperation, TrimAnalysisMethodCallPattern>();
34ReflectionAccessPatterns = new Dictionary<IOperation, TrimAnalysisReflectionAccessPattern>();
35FeatureCheckReturnValuePatterns = new Dictionary<IOperation, FeatureCheckReturnValuePattern>();
TrimAnalysis\TrimAnalysisVisitor.cs (14)
62public override FeatureChecksValue GetConditionValue(IOperation branchValueOperation, StateValue state)
78public override MultiValue DefaultVisit(IOperation operation, StateValue argument)
257public override void HandleAssignment(MultiValue source, MultiValue target, IOperation operation, in FeatureContext featureContext)
269public override MultiValue HandleArrayElementRead(MultiValue arrayValue, MultiValue indexValue, IOperation operation)
290public override void HandleArrayElementWrite(MultiValue arrayValue, MultiValue indexValue, MultiValue valueToWrite, IOperation operation, bool merge)
321IOperation operation,
362IOperation operation,
384public override void HandleReturnValue(MultiValue returnValue, IOperation operation, in FeatureContext featureContext)
400public override void HandleReturnConditionValue(FeatureChecksValue returnConditionValue, IOperation operation)
423public override MultiValue HandleDelegateCreation(IMethodSymbol method, IOperation operation, in FeatureContext featureContext)
437private void ProcessGenericArgumentDataFlow(IMethodSymbol method, IOperation operation, in FeatureContext featureContext)
455private void ProcessGenericArgumentDataFlow(IFieldSymbol field, IOperation operation, in FeatureContext featureContext)
472private void ProcessGenericArgumentDataFlow(IPropertySymbol property, IOperation operation, in FeatureContext featureContext)
487private static bool TryGetConstantValue(IOperation operation, out MultiValue constValue)
Metrics (184)
src\RoslynAnalyzers\Utilities\Compiler\Extensions\IOperationExtensions.cs (33)
62public static bool HasNullConstantValue(this IOperation operation)
67public static bool TryGetBoolConstantValue(this IOperation operation, out bool constantValue)
84public static ImmutableArray<IOperation> GetTopmostExplicitDescendants(this IOperation operation)
91var builder = ImmutableArray.CreateBuilder<IOperation>();
92var operationsToProcess = new Queue<IOperation>();
105foreach (var child in operation.Children)
121public static bool IsOperationNoneRoot(this IOperation operation)
132public static TOperation? GetAncestor<TOperation>(this IOperation root, OperationKind ancestorKind, Func<TOperation, bool>? predicate = null)
133where TOperation : class, IOperation
140var ancestor = root;
167public static IOperation? GetAncestor(this IOperation root, ImmutableArray<OperationKind> ancestorKinds, Func<IOperation, bool>? predicate = null)
174var ancestor = root;
209public static IOperation? GetInstance(this IInstanceReferenceOperation operation, bool isInsideAnonymousObjectInitializer)
216for (IOperation? current = operation; current != null && current.Kind != OperationKind.Block; current = current.Parent)
259public static IOperation GetRoot(this IOperation operation)
274private static readonly BoundedCache<Compilation, ConcurrentDictionary<IOperation, ControlFlowGraph?>> s_operationToCfgCache
277public static bool TryGetEnclosingControlFlowGraph(this IOperation operation, [NotNullWhen(returnValue: true)] out ControlFlowGraph? cfg)
294private static ControlFlowGraph? CreateControlFlowGraph(IOperation operation)
332this IOperation operation, IMethodSymbol lambdaOrLocalFunction, out PooledHashSet<ISymbol> builder)
343foreach (var child in operation.Descendants())
385public static bool IsWithinLambdaOrLocalFunction(this IOperation operation, [NotNullWhen(true)] out IOperation? containingLambdaOrLocalFunctionOperation)
422[NotNullWhen(returnValue: true)] out IOperation? elementOfParentTupleContainingTuple)
427IOperation previousOperation = tupleOperation;
428var currentOperation = tupleOperation.Parent;
460public static IOperation? GetInstance(this IInvocationOperation invocationOperation)
463public static IOperation? GetThrownException(this IThrowOperation operation)
465var thrownObject = operation.Exception;
489IOperation potentialLeftSide = operation;
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\OperationExtensions.cs (32)
18public static bool IsTargetOfObjectMemberInitializer(this IOperation operation)
34public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
239public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
259public static bool IsInLeftOfDeconstructionAssignment(this IOperation operation, [NotNullWhen(true)] out IDeconstructionAssignmentOperation? deconstructionAssignment)
263var previousOperation = operation;
264var current = operation.Parent;
295public static bool IsAnyCompoundAssignment(this IOperation operation)
308public static bool IsInsideCatchRegion(this IOperation operation, ControlFlowGraph cfg)
328foreach (var descendant in block.DescendantOperations())
341public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
343foreach (var operationBlock in operationBlocks)
354public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
357public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(true)] out IOperation? foundOperation)
361foreach (var descendant in operationBlock.DescendantsAndSelf())
374public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
377public static bool IsNumericLiteral(this IOperation operation)
380public static bool IsNullLiteral(this IOperation operand)
389public static IOperation? WalkDownConversion(this IOperation? operation)
399public static bool IsSingleThrowNotImplementedOperation([NotNullWhen(true)] this IOperation? firstBlock)
415var firstOp = block.Operations.Length == 1
437static IOperation? TryGetSingleExplicitStatement(ImmutableArray<IOperation> operations)
439IOperation? firstOp = null;
440foreach (var operation in operations)
454static bool IsThrowNotImplementedOperation(INamedTypeSymbol notImplementedExceptionType, IOperation? operation)
461public static IOperation? UnwrapImplicitConversion(this IOperation? value)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.AnalysisData.cs (14)
61protected abstract PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
132public abstract void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId);
137public abstract void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol);
138public abstract void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget);
139public abstract void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget);
140public abstract void SetEmptyInvocationTargetsForDelegate(IOperation write);
141public abstract bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets);
143protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> CreateSymbolsWriteMap(
146var symbolsWriteMap = PooledDictionary<(ISymbol Symbol, IOperation Write), bool>.GetInstance();
150protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> UpdateSymbolsWriteMap(
151PooledDictionary<(ISymbol Symbol, IOperation Write), bool> symbolsWriteMap,
158(ISymbol, IOperation) key = (parameter, null);
201public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten, bool isRef)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.BasicBlockAnalysisData.cs (9)
28private readonly Dictionary<ISymbol, PooledHashSet<IOperation>> _reachingWrites;
74public void ForEachCurrentWrite<TArg>(ISymbol symbol, Action<IOperation, TArg> action, TArg arg)
86public bool ForEachCurrentWrite<TArg>(ISymbol symbol, Func<IOperation, TArg, bool> action, TArg arg)
90foreach (var value in values)
104public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten)
108values = PooledHashSet<IOperation>.GetInstance();
223private static void AddEntries(Dictionary<ISymbol, PooledHashSet<IOperation>> result, BasicBlockAnalysisData source)
231values = PooledHashSet<IOperation>.GetInstance();
240foreach (var operation in operations)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (33)
41private readonly PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>> _lValueFlowCapturesMap;
48private readonly PooledDictionary<IOperation, PooledHashSet<IOperation>> _reachingDelegateCreationTargets;
69private readonly PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>> _symbolWritesInsideBlockRangeMap;
77PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
81PooledDictionary<IOperation, PooledHashSet<IOperation>> reachingDelegateCreationTargets,
99_lValueFlowCapturesMap = PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
103_symbolWritesInsideBlockRangeMap = PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
110protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
134reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
189foreach (var operation in cfg.OriginalOperation.Descendants())
215private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
220var operations = PooledHashSet<IOperation>.GetInstance();
224writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
241PooledHashSet<IOperation> operationsBuilder,
248foreach (var operation in cfg.Blocks[i].DescendantOperations())
273void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
275foreach (var target in targets)
462public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
466captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
514public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
522var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
544foreach (var target in targetsBuilderForSymbolWrite)
561public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
571public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
583public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
586private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
588var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
597public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.OperationTreeAnalysisData.cs (9)
21PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
34protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
63public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
69public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
71public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
73public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
75public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
77public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.Walker.cs (20)
27private IOperation _currentRootOperation;
29private PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>> _pendingWritesMap;
36IEnumerable<IOperation> operations,
51private void Visit(ISymbol containingSymbol, IEnumerable<IOperation> operations, AnalysisData analysisData, CancellationToken cancellationToken)
58_pendingWritesMap = PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
65foreach (var operation in operations)
93private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo)
101private void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
107private void OnReferenceFound(ISymbol symbol, IOperation operation)
159private bool MakePendingWrite(IOperation operation, ISymbol symbolOpt)
166var set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
175set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
407private void ProcessPossibleDelegateCreationAssignment(ISymbol symbol, IOperation write)
415IOperation initializerValue = null;
431private void ProcessPossibleDelegateCreation(IOperation creation, IOperation write)
433var currentOperation = creation;
497private void AnalyzePossibleDelegateInvocation(IOperation operation)
534foreach (var target in targets)
549void AnalyzeDelegateInvocation(IOperation target)
Metrics.Legacy (184)
src\RoslynAnalyzers\Utilities\Compiler\Extensions\IOperationExtensions.cs (33)
62public static bool HasNullConstantValue(this IOperation operation)
67public static bool TryGetBoolConstantValue(this IOperation operation, out bool constantValue)
84public static ImmutableArray<IOperation> GetTopmostExplicitDescendants(this IOperation operation)
91var builder = ImmutableArray.CreateBuilder<IOperation>();
92var operationsToProcess = new Queue<IOperation>();
105foreach (var child in operation.Children)
121public static bool IsOperationNoneRoot(this IOperation operation)
132public static TOperation? GetAncestor<TOperation>(this IOperation root, OperationKind ancestorKind, Func<TOperation, bool>? predicate = null)
133where TOperation : class, IOperation
140var ancestor = root;
167public static IOperation? GetAncestor(this IOperation root, ImmutableArray<OperationKind> ancestorKinds, Func<IOperation, bool>? predicate = null)
174var ancestor = root;
209public static IOperation? GetInstance(this IInstanceReferenceOperation operation, bool isInsideAnonymousObjectInitializer)
216for (IOperation? current = operation; current != null && current.Kind != OperationKind.Block; current = current.Parent)
259public static IOperation GetRoot(this IOperation operation)
274private static readonly BoundedCache<Compilation, ConcurrentDictionary<IOperation, ControlFlowGraph?>> s_operationToCfgCache
277public static bool TryGetEnclosingControlFlowGraph(this IOperation operation, [NotNullWhen(returnValue: true)] out ControlFlowGraph? cfg)
294private static ControlFlowGraph? CreateControlFlowGraph(IOperation operation)
332this IOperation operation, IMethodSymbol lambdaOrLocalFunction, out PooledHashSet<ISymbol> builder)
343foreach (var child in operation.Descendants())
385public static bool IsWithinLambdaOrLocalFunction(this IOperation operation, [NotNullWhen(true)] out IOperation? containingLambdaOrLocalFunctionOperation)
422[NotNullWhen(returnValue: true)] out IOperation? elementOfParentTupleContainingTuple)
427IOperation previousOperation = tupleOperation;
428var currentOperation = tupleOperation.Parent;
460public static IOperation? GetInstance(this IInvocationOperation invocationOperation)
463public static IOperation? GetThrownException(this IThrowOperation operation)
465var thrownObject = operation.Exception;
489IOperation potentialLeftSide = operation;
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\OperationExtensions.cs (32)
18public static bool IsTargetOfObjectMemberInitializer(this IOperation operation)
34public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
239public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
259public static bool IsInLeftOfDeconstructionAssignment(this IOperation operation, [NotNullWhen(true)] out IDeconstructionAssignmentOperation? deconstructionAssignment)
263var previousOperation = operation;
264var current = operation.Parent;
295public static bool IsAnyCompoundAssignment(this IOperation operation)
308public static bool IsInsideCatchRegion(this IOperation operation, ControlFlowGraph cfg)
328foreach (var descendant in block.DescendantOperations())
341public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
343foreach (var operationBlock in operationBlocks)
354public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
357public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(true)] out IOperation? foundOperation)
361foreach (var descendant in operationBlock.DescendantsAndSelf())
374public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
377public static bool IsNumericLiteral(this IOperation operation)
380public static bool IsNullLiteral(this IOperation operand)
389public static IOperation? WalkDownConversion(this IOperation? operation)
399public static bool IsSingleThrowNotImplementedOperation([NotNullWhen(true)] this IOperation? firstBlock)
415var firstOp = block.Operations.Length == 1
437static IOperation? TryGetSingleExplicitStatement(ImmutableArray<IOperation> operations)
439IOperation? firstOp = null;
440foreach (var operation in operations)
454static bool IsThrowNotImplementedOperation(INamedTypeSymbol notImplementedExceptionType, IOperation? operation)
461public static IOperation? UnwrapImplicitConversion(this IOperation? value)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.AnalysisData.cs (14)
61protected abstract PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
132public abstract void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId);
137public abstract void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol);
138public abstract void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget);
139public abstract void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget);
140public abstract void SetEmptyInvocationTargetsForDelegate(IOperation write);
141public abstract bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets);
143protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> CreateSymbolsWriteMap(
146var symbolsWriteMap = PooledDictionary<(ISymbol Symbol, IOperation Write), bool>.GetInstance();
150protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> UpdateSymbolsWriteMap(
151PooledDictionary<(ISymbol Symbol, IOperation Write), bool> symbolsWriteMap,
158(ISymbol, IOperation) key = (parameter, null);
201public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten, bool isRef)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.BasicBlockAnalysisData.cs (9)
28private readonly Dictionary<ISymbol, PooledHashSet<IOperation>> _reachingWrites;
74public void ForEachCurrentWrite<TArg>(ISymbol symbol, Action<IOperation, TArg> action, TArg arg)
86public bool ForEachCurrentWrite<TArg>(ISymbol symbol, Func<IOperation, TArg, bool> action, TArg arg)
90foreach (var value in values)
104public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten)
108values = PooledHashSet<IOperation>.GetInstance();
223private static void AddEntries(Dictionary<ISymbol, PooledHashSet<IOperation>> result, BasicBlockAnalysisData source)
231values = PooledHashSet<IOperation>.GetInstance();
240foreach (var operation in operations)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (33)
41private readonly PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>> _lValueFlowCapturesMap;
48private readonly PooledDictionary<IOperation, PooledHashSet<IOperation>> _reachingDelegateCreationTargets;
69private readonly PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>> _symbolWritesInsideBlockRangeMap;
77PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
81PooledDictionary<IOperation, PooledHashSet<IOperation>> reachingDelegateCreationTargets,
99_lValueFlowCapturesMap = PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
103_symbolWritesInsideBlockRangeMap = PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
110protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
134reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
189foreach (var operation in cfg.OriginalOperation.Descendants())
215private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
220var operations = PooledHashSet<IOperation>.GetInstance();
224writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
241PooledHashSet<IOperation> operationsBuilder,
248foreach (var operation in cfg.Blocks[i].DescendantOperations())
273void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
275foreach (var target in targets)
462public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
466captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
514public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
522var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
544foreach (var target in targetsBuilderForSymbolWrite)
561public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
571public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
583public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
586private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
588var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
597public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.OperationTreeAnalysisData.cs (9)
21PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
34protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
63public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
69public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
71public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
73public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
75public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
77public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.Walker.cs (20)
27private IOperation _currentRootOperation;
29private PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>> _pendingWritesMap;
36IEnumerable<IOperation> operations,
51private void Visit(ISymbol containingSymbol, IEnumerable<IOperation> operations, AnalysisData analysisData, CancellationToken cancellationToken)
58_pendingWritesMap = PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
65foreach (var operation in operations)
93private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo)
101private void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
107private void OnReferenceFound(ISymbol symbol, IOperation operation)
159private bool MakePendingWrite(IOperation operation, ISymbol symbolOpt)
166var set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
175set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
407private void ProcessPossibleDelegateCreationAssignment(ISymbol symbol, IOperation write)
415IOperation initializerValue = null;
431private void ProcessPossibleDelegateCreation(IOperation creation, IOperation write)
433var currentOperation = creation;
497private void AnalyzePossibleDelegateInvocation(IOperation operation)
534foreach (var target in targets)
549void AnalyzeDelegateInvocation(IOperation target)
Microsoft.Analyzers.Extra (19)
Microsoft.AspNetCore.Analyzers (1)
Microsoft.AspNetCore.App.Analyzers (30)
Microsoft.AspNetCore.Components.Analyzers (1)
Microsoft.AspNetCore.Components.SdkAnalyzers (1)
Microsoft.AspNetCore.Http.RequestDelegateGenerator (7)
Microsoft.AspNetCore.Mvc.Analyzers (2)
Microsoft.AspNetCore.Mvc.Api.Analyzers (15)
Microsoft.CodeAnalysis (1404)
DiagnosticAnalyzer\AnalyzerExecutor.cs (15)
54private Func<IOperation, ControlFlowGraph>? _lazyGetControlFlowGraph;
56private ConcurrentDictionary<IOperation, ControlFlowGraph>? _lazyControlFlowGraphMap;
58private Func<IOperation, ControlFlowGraph> GetControlFlowGraph
693IOperation operation,
842ImmutableArray<IOperation> operationBlocks,
843ImmutableArray<IOperation> operations,
1097ImmutableArray<IOperation> operationsToAnalyze,
1130ImmutableArray<IOperation> operationsToAnalyze,
1143foreach (var operation in operationsToAnalyze)
1523private bool ShouldExecuteOperation(IOperation operation, DiagnosticAnalyzer analyzer, CancellationToken cancellationToken)
1546private ControlFlowGraph GetControlFlowGraphImpl(IOperation operation)
1552Interlocked.CompareExchange(ref _lazyControlFlowGraphMap, new ConcurrentDictionary<IOperation, ControlFlowGraph>(), null);
1572public void OnOperationBlockActionsExecuted(ImmutableArray<IOperation> operationBlocks)
1581foreach (var operationBlock in operationBlocks)
1583var root = operationBlock.GetRootOperation();
DiagnosticAnalyzer\DiagnosticAnalysisContext.cs (54)
177/// Register an action to be executed at completion of semantic analysis of an <see cref="IOperation"/> with an appropriate Kind.
178/// An operation action can report <see cref="Diagnostic"/>s about <see cref="IOperation"/>s, and can also collect
181/// <param name="action">Action to be executed at completion of semantic analysis of an <see cref="IOperation"/>.</param>
182/// <param name="operationKinds">Action will be executed only if an <see cref="IOperation"/>'s Kind matches one of the operation kind values.</param>
189/// Register an action to be executed at completion of semantic analysis of an <see cref="IOperation"/> with an appropriate Kind.
190/// An operation action can report <see cref="Diagnostic"/>s about <see cref="IOperation"/>s, and can also collect
193/// <param name="action">Action to be executed at completion of semantic analysis of an <see cref="IOperation"/>.</param>
194/// <param name="operationKinds">Action will be executed only if an <see cref="IOperation"/>'s Kind matches one of the operation kind values.</param>
472/// Register an action to be executed at completion of semantic analysis of an <see cref="IOperation"/> with an appropriate Kind.
473/// An operation action can report <see cref="Diagnostic"/>s about <see cref="IOperation"/>s, and can also collect
476/// <param name="action">Action to be executed at completion of semantic analysis of an <see cref="IOperation"/>.</param>
477/// <param name="operationKinds">Action will be executed only if an <see cref="IOperation"/>'s Kind matches one of the operation kind values.</param>
484/// Register an action to be executed at completion of semantic analysis of an <see cref="IOperation"/> with an appropriate Kind.
485/// An operation action can report <see cref="Diagnostic"/>s about <see cref="IOperation"/>s, and can also collect
488/// <param name="action">Action to be executed at completion of semantic analysis of an <see cref="IOperation"/>.</param>
489/// <param name="operationKinds">Action will be executed only if an <see cref="IOperation"/>'s Kind matches one of the operation kind values.</param>
984/// Register an action to be executed at completion of semantic analysis of an <see cref="IOperation"/> with an appropriate Kind.
985/// An operation action can report <see cref="Diagnostic"/>s about <see cref="IOperation"/>s, and can also collect
988/// <param name="action">Action to be executed at completion of semantic analysis of an <see cref="IOperation"/>.</param>
989/// <param name="operationKinds">Action will be executed only if an <see cref="IOperation"/>'s Kind matches one of the operation kind values.</param>
996/// Register an action to be executed at completion of semantic analysis of an <see cref="IOperation"/> with an appropriate Kind.
997/// An operation action can report <see cref="Diagnostic"/>s about <see cref="IOperation"/>s, and can also collect
1000/// <param name="action">Action to be executed at completion of semantic analysis of an <see cref="IOperation"/>.</param>
1001/// <param name="operationKinds">Action will be executed only if an <see cref="IOperation"/>'s Kind matches one of the operation kind values.</param>
1236private readonly ImmutableArray<IOperation> _operationBlocks;
1240private readonly Func<IOperation, ControlFlowGraph>? _getControlFlowGraph;
1249public ImmutableArray<IOperation> OperationBlocks => _operationBlocks;
1290ImmutableArray<IOperation> operationBlocks,
1301ImmutableArray<IOperation> operationBlocks,
1305Func<IOperation, ControlFlowGraph>? getControlFlowGraph,
1331/// An operation action can report <see cref="Diagnostic"/>s about <see cref="IOperation"/>s, and can also collect
1334/// <param name="action">Action to be executed at completion of semantic analysis of an <see cref="IOperation"/>.</param>
1335/// <param name="operationKinds">Action will be executed only if an <see cref="IOperation"/>'s Kind matches one of the operation kind values.</param>
1342/// Register an action to be executed at completion of semantic analysis of an <see cref="IOperation"/> with an appropriate Kind.
1343/// An operation action can report <see cref="Diagnostic"/>s about <see cref="IOperation"/>s, and can also collect
1346/// <param name="action">Action to be executed at completion of semantic analysis of an <see cref="IOperation"/>.</param>
1347/// <param name="operationKinds">Action will be executed only if an <see cref="IOperation"/>'s Kind matches one of the operation kind values.</param>
1354public ControlFlowGraph GetControlFlowGraph(IOperation operationBlock)
1376private readonly ImmutableArray<IOperation> _operationBlocks;
1382private readonly Func<IOperation, ControlFlowGraph>? _getControlFlowGraph;
1391public ImmutableArray<IOperation> OperationBlocks => _operationBlocks;
1432ImmutableArray<IOperation> operationBlocks,
1445ImmutableArray<IOperation> operationBlocks,
1451Func<IOperation, ControlFlowGraph>? getControlFlowGraph,
1487public ControlFlowGraph GetControlFlowGraph(IOperation operationBlock)
1766/// An operation action can use an <see cref="OperationAnalysisContext"/> to report <see cref="Diagnostic"/>s for an <see cref="IOperation"/>.
1770private readonly IOperation _operation;
1776private readonly Func<IOperation, ControlFlowGraph>? _getControlFlowGraph;
1780/// <see cref="IOperation"/> that is the subject of the analysis.
1782public IOperation Operation => _operation;
1790/// <see cref="CodeAnalysis.Compilation"/> containing the <see cref="IOperation"/>.
1823IOperation operation,
1835IOperation operation,
1841Func<IOperation, ControlFlowGraph>? getControlFlowGraph,
Generated\Operations.Generated.cs (618)
62ImmutableArray<IOperation> Operations { get; }
127IOperation Value { get; }
160IOperation Body { get; }
193IOperation LoopControlVariable { get; }
197IOperation Collection { get; }
202ImmutableArray<IOperation> NextVariables { get; }
227ImmutableArray<IOperation> Before { get; }
237IOperation? Condition { get; }
241ImmutableArray<IOperation> AtLoopBottom { get; }
261IOperation LoopControlVariable { get; }
265IOperation InitialValue { get; }
269IOperation LimitValue { get; }
274IOperation StepValue { get; }
282ImmutableArray<IOperation> NextVariables { get; }
303IOperation? Condition { get; }
319IOperation? IgnoredCondition { get; }
348IOperation? Operation { get; }
424IOperation? ReturnedValue { get; }
449IOperation LockedValue { get; }
453IOperation Body { get; }
515IOperation Resources { get; }
519IOperation Body { get; }
553IOperation Operation { get; }
709IOperation Operand { get; }
785IOperation? Instance { get; }
822IOperation ArrayReference { get; }
826ImmutableArray<IOperation> Indices { get; }
902IOperation? Instance { get; }
1061IOperation Operand { get; }
1111IOperation LeftOperand { get; }
1115IOperation RightOperand { get; }
1170IOperation Condition { get; }
1174IOperation WhenTrue { get; }
1178IOperation? WhenFalse { get; }
1214IOperation Value { get; }
1218IOperation WhenNull { get; }
1341ImmutableArray<IOperation> DimensionSizes { get; }
1397IOperation ValueOperand { get; }
1432IOperation Operation { get; }
1453IOperation Target { get; }
1457IOperation Value { get; }
1557IOperation Operand { get; }
1582IOperation EventReference { get; }
1586IOperation HandlerValue { get; }
1616IOperation Operation { get; }
1620IOperation WhenNotNull { get; }
1693ImmutableArray<IOperation> Initializers { get; }
1724ImmutableArray<IOperation> Initializers { get; }
1755IOperation InitializedMember { get; }
1781ImmutableArray<IOperation> Arguments { get; }
1807IOperation Argument { get; }
1832ImmutableArray<IOperation> Elements { get; }
1835/// Natural type can be different from <see cref="IOperation.Type" /> depending on the
1867ImmutableArray<IOperation> Arguments { get; }
1892IOperation? Instance { get; }
1944IOperation Operation { get; }
1948ImmutableArray<IOperation> Arguments { get; }
1972IOperation Operation { get; }
1976ImmutableArray<IOperation> Arguments { get; }
2006IOperation Operation { get; }
2031IOperation Target { get; }
2124IOperation Reference { get; }
2148IOperation Value { get; }
2194IOperation Target { get; }
2229IOperation? Exception { get; }
2282IOperation Expression { get; }
2327IOperation Value { get; }
2448ImmutableArray<IOperation> ElementValues { get; }
2491ImmutableArray<IOperation> IgnoredArguments { get; }
2538ImmutableArray<IOperation> IgnoredDimensions { get; }
2571IOperation Value { get; }
2608IOperation? ExceptionDeclarationOrExpression { get; }
2620IOperation? Filter { get; }
2653ImmutableArray<IOperation> Body { get; }
2725IOperation? Guard { get; }
2745IOperation MinimumValue { get; }
2749IOperation MaximumValue { get; }
2769IOperation Value { get; }
2794IOperation Value { get; }
2836IOperation Text { get; }
2861IOperation Expression { get; }
2865IOperation? Alignment { get; }
2869IOperation? FormatString { get; }
2917IOperation Value { get; }
2980IOperation LeftOperand { get; }
2984IOperation RightOperand { get; }
3058IOperation? Initializer { get; }
3131IOperation? LeftOperand { get; }
3135IOperation? RightOperand { get; }
3199IOperation Operand { get; }
3203ImmutableArray<IOperation> DimensionSizes { get; }
3283IOperation Value { get; }
3313IOperation? Guard { get; }
3317IOperation Value { get; }
3341IOperation Member { get; }
3356IOperation Group { get; }
3357IOperation Aggregation { get; }
3379IOperation Body { get; }
3432IOperation Pointer { get; }
3452IOperation Body { get; }
3456IOperation Value { get; }
3593IOperation Value { get; }
3617IOperation Operand { get; }
3644IOperation HandlerCreation { get; }
3666IOperation Content { get; }
3685IOperation Left { get; }
3690IOperation Right { get; }
3711IOperation AppendCall { get; }
3752IOperation Target { get; }
3834IOperation Instance { get; }
3838IOperation Argument { get; }
3895IOperation Operation { get; }
3919IOperation Instance { get; }
3923IOperation Argument { get; }
3961ImmutableArray<IOperation> Elements { get; }
3985IOperation Operand { get; }
4001internal BlockOperation(ImmutableArray<IOperation> operations, ImmutableArray<ILocalSymbol> locals, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
4007public ImmutableArray<IOperation> Operations { get; }
4011internal override IOperation GetCurrent(int slot, int index)
4066internal override IOperation GetCurrent(int slot, int index)
4113internal SwitchOperation(ImmutableArray<ILocalSymbol> locals, IOperation value, ImmutableArray<ISwitchCaseOperation> cases, ILabelSymbol exitLabel, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
4122public IOperation Value { get; }
4128internal override IOperation GetCurrent(int slot, int index)
4183protected BaseLoopOperation(IOperation body, ImmutableArray<ILocalSymbol> locals, ILabelSymbol continueLabel, ILabelSymbol exitLabel, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
4192public IOperation Body { get; }
4199internal ForEachLoopOperation(IOperation loopControlVariable, IOperation collection, ImmutableArray<IOperation> nextVariables, ForEachLoopOperationInfo? info, bool isAsynchronous, IOperation body, ImmutableArray<ILocalSymbol> locals, ILabelSymbol continueLabel, ILabelSymbol exitLabel, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
4208public IOperation LoopControlVariable { get; }
4209public IOperation Collection { get; }
4210public ImmutableArray<IOperation> NextVariables { get; }
4218internal override IOperation GetCurrent(int slot, int index)
4289internal ForLoopOperation(ImmutableArray<IOperation> before, ImmutableArray<ILocalSymbol> conditionLocals, IOperation? condition, ImmutableArray<IOperation> atLoopBottom, IOperation body, ImmutableArray<ILocalSymbol> locals, ILabelSymbol continueLabel, ILabelSymbol exitLabel, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
4297public ImmutableArray<IOperation> Before { get; }
4299public IOperation? Condition { get; }
4300public ImmutableArray<IOperation> AtLoopBottom { get; }
4306internal override IOperation GetCurrent(int slot, int index)
4381internal ForToLoopOperation(IOperation loopControlVariable, IOperation initialValue, IOperation limitValue, IOperation stepValue, bool isChecked, ImmutableArray<IOperation> nextVariables, (ILocalSymbol LoopObject, ForToLoopOperationUserDefinedInfo UserDefinedInfo) info, IOperation body, ImmutableArray<ILocalSymbol> locals, ILabelSymbol continueLabel, ILabelSymbol exitLabel, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
4392public IOperation LoopControlVariable { get; }
4393public IOperation InitialValue { get; }
4394public IOperation LimitValue { get; }
4395public IOperation StepValue { get; }
4397public ImmutableArray<IOperation> NextVariables { get; }
4406internal override IOperation GetCurrent(int slot, int index)
4493internal WhileLoopOperation(IOperation? condition, bool conditionIsTop, bool conditionIsUntil, IOperation? ignoredCondition, IOperation body, ImmutableArray<ILocalSymbol> locals, ILabelSymbol continueLabel, ILabelSymbol exitLabel, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
4501public IOperation? Condition { get; }
4504public IOperation? IgnoredCondition { get; }
4517internal LabeledOperation(ILabelSymbol label, IOperation? operation, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
4524public IOperation? Operation { get; }
4527internal override IOperation GetCurrent(int slot, int index)
4579internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
4593internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
4604internal ReturnOperation(IOperation? returnedValue, OperationKind kind, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
4610public IOperation? ReturnedValue { get; }
4613internal override IOperation GetCurrent(int slot, int index)
4656internal LockOperation(IOperation lockedValue, IOperation body, ILocalSymbol? lockTakenSymbol, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
4663public IOperation LockedValue { get; }
4664public IOperation Body { get; }
4669internal override IOperation GetCurrent(int slot, int index)
4736internal override IOperation GetCurrent(int slot, int index)
4799internal UsingOperation(IOperation resources, IOperation body, ImmutableArray<ILocalSymbol> locals, bool isAsynchronous, DisposeOperationInfo disposeInfo, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
4808public IOperation Resources { get; }
4809public IOperation Body { get; }
4816internal override IOperation GetCurrent(int slot, int index)
4867internal ExpressionStatementOperation(IOperation operation, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
4872public IOperation Operation { get; }
4875internal override IOperation GetCurrent(int slot, int index)
4931internal override IOperation GetCurrent(int slot, int index)
4985internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
4999internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
5021internal override IOperation GetCurrent(int slot, int index)
5083internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
5094internal ConversionOperation(IOperation operand, IConvertibleConversion conversion, bool isTryCast, bool isChecked, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, ConstantValue? constantValue, bool isImplicit)
5104public IOperation Operand { get; }
5111internal override IOperation GetCurrent(int slot, int index)
5154internal InvocationOperation(IMethodSymbol targetMethod, ITypeSymbol? constrainedToType, IOperation? instance, bool isVirtual, ImmutableArray<IArgumentOperation> arguments, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
5166public IOperation? Instance { get; }
5172internal override IOperation GetCurrent(int slot, int index)
5227internal ArrayElementReferenceOperation(IOperation arrayReference, ImmutableArray<IOperation> indices, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
5234public IOperation ArrayReference { get; }
5235public ImmutableArray<IOperation> Indices { get; }
5239internal override IOperation GetCurrent(int slot, int index)
5305internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
5324internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
5335protected BaseMemberReferenceOperation(IOperation? instance, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
5340public IOperation? Instance { get; }
5345internal FieldReferenceOperation(IFieldSymbol field, bool isDeclaration, IOperation? instance, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, ConstantValue? constantValue, bool isImplicit)
5357internal override IOperation GetCurrent(int slot, int index)
5400internal MethodReferenceOperation(IMethodSymbol method, ITypeSymbol? constrainedToType, bool isVirtual, IOperation? instance, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
5413internal override IOperation GetCurrent(int slot, int index)
5456internal PropertyReferenceOperation(IPropertySymbol property, ITypeSymbol? constrainedToType, ImmutableArray<IArgumentOperation> arguments, IOperation? instance, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
5470internal override IOperation GetCurrent(int slot, int index)
5525internal EventReferenceOperation(IEventSymbol @event, ITypeSymbol? constrainedToType, IOperation? instance, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
5536internal override IOperation GetCurrent(int slot, int index)
5579internal UnaryOperation(UnaryOperatorKind operatorKind, IOperation operand, bool isLifted, bool isChecked, IMethodSymbol? operatorMethod, ITypeSymbol? constrainedToType, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, ConstantValue? constantValue, bool isImplicit)
5592public IOperation Operand { get; }
5599internal override IOperation GetCurrent(int slot, int index)
5642internal BinaryOperation(BinaryOperatorKind operatorKind, IOperation leftOperand, IOperation rightOperand, bool isLifted, bool isChecked, bool isCompareText, IMethodSymbol? operatorMethod, ITypeSymbol? constrainedToType, IMethodSymbol? unaryOperatorMethod, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, ConstantValue? constantValue, bool isImplicit)
5658public IOperation LeftOperand { get; }
5659public IOperation RightOperand { get; }
5669internal override IOperation GetCurrent(int slot, int index)
5720internal ConditionalOperation(IOperation condition, IOperation whenTrue, IOperation? whenFalse, bool isRef, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, ConstantValue? constantValue, bool isImplicit)
5730public IOperation Condition { get; }
5731public IOperation WhenTrue { get; }
5732public IOperation? WhenFalse { get; }
5738internal override IOperation GetCurrent(int slot, int index)
5797internal CoalesceOperation(IOperation value, IOperation whenNull, IConvertibleConversion valueConversion, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, ConstantValue? constantValue, bool isImplicit)
5806public IOperation Value { get; }
5807public IOperation WhenNull { get; }
5813internal override IOperation GetCurrent(int slot, int index)
5874internal override IOperation GetCurrent(int slot, int index)
5932internal override IOperation GetCurrent(int slot, int index)
5996internal override IOperation GetCurrent(int slot, int index)
6039internal ArrayCreationOperation(ImmutableArray<IOperation> dimensionSizes, IArrayInitializerOperation? initializer, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
6046public ImmutableArray<IOperation> DimensionSizes { get; }
6051internal override IOperation GetCurrent(int slot, int index)
6114internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
6125internal IsTypeOperation(IOperation valueOperand, ITypeSymbol typeOperand, bool isNegated, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
6133public IOperation ValueOperand { get; }
6138internal override IOperation GetCurrent(int slot, int index)
6181internal AwaitOperation(IOperation operation, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
6187public IOperation Operation { get; }
6190internal override IOperation GetCurrent(int slot, int index)
6233protected BaseAssignmentOperation(IOperation target, IOperation value, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
6239public IOperation Target { get; }
6240public IOperation Value { get; }
6244internal SimpleAssignmentOperation(bool isRef, IOperation target, IOperation value, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, ConstantValue? constantValue, bool isImplicit)
6255internal override IOperation GetCurrent(int slot, int index)
6306internal CompoundAssignmentOperation(IConvertibleConversion inConversion, IConvertibleConversion outConversion, BinaryOperatorKind operatorKind, bool isLifted, bool isChecked, IMethodSymbol? operatorMethod, ITypeSymbol? constrainedToType, IOperation target, IOperation value, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
6330internal override IOperation GetCurrent(int slot, int index)
6381internal ParenthesizedOperation(IOperation operand, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, ConstantValue? constantValue, bool isImplicit)
6388public IOperation Operand { get; }
6391internal override IOperation GetCurrent(int slot, int index)
6434internal EventAssignmentOperation(IOperation eventReference, IOperation handlerValue, bool adds, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
6442public IOperation EventReference { get; }
6443public IOperation HandlerValue { get; }
6448internal override IOperation GetCurrent(int slot, int index)
6499internal ConditionalAccessOperation(IOperation operation, IOperation whenNotNull, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
6506public IOperation Operation { get; }
6507public IOperation WhenNotNull { get; }
6511internal override IOperation GetCurrent(int slot, int index)
6568internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
6589internal override IOperation GetCurrent(int slot, int index)
6636internal AnonymousObjectCreationOperation(ImmutableArray<IOperation> initializers, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
6642public ImmutableArray<IOperation> Initializers { get; }
6645internal override IOperation GetCurrent(int slot, int index)
6692internal ObjectOrCollectionInitializerOperation(ImmutableArray<IOperation> initializers, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
6698public ImmutableArray<IOperation> Initializers { get; }
6701internal override IOperation GetCurrent(int slot, int index)
6748internal MemberInitializerOperation(IOperation initializedMember, IObjectOrCollectionInitializerOperation initializer, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
6755public IOperation InitializedMember { get; }
6760internal override IOperation GetCurrent(int slot, int index)
6811internal NameOfOperation(IOperation argument, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, ConstantValue? constantValue, bool isImplicit)
6818public IOperation Argument { get; }
6821internal override IOperation GetCurrent(int slot, int index)
6864internal TupleOperation(ImmutableArray<IOperation> elements, ITypeSymbol? naturalType, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
6871public ImmutableArray<IOperation> Elements { get; }
6875internal override IOperation GetCurrent(int slot, int index)
6922internal DynamicMemberReferenceOperation(IOperation? instance, string memberName, ImmutableArray<ITypeSymbol> typeArguments, ITypeSymbol? containingType, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
6931public IOperation? Instance { get; }
6937internal override IOperation GetCurrent(int slot, int index)
6980internal TranslatedQueryOperation(IOperation operation, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
6986public IOperation Operation { get; }
6989internal override IOperation GetCurrent(int slot, int index)
7032internal DelegateCreationOperation(IOperation target, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
7038public IOperation Target { get; }
7041internal override IOperation GetCurrent(int slot, int index)
7091internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
7110internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
7130internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
7141internal AddressOfOperation(IOperation reference, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
7147public IOperation Reference { get; }
7150internal override IOperation GetCurrent(int slot, int index)
7193internal IsPatternOperation(IOperation value, IPatternOperation pattern, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
7200public IOperation Value { get; }
7205internal override IOperation GetCurrent(int slot, int index)
7256internal IncrementOrDecrementOperation(bool isPostfix, bool isLifted, bool isChecked, IOperation target, IMethodSymbol? operatorMethod, ITypeSymbol? constrainedToType, OperationKind kind, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
7271public IOperation Target { get; }
7276internal override IOperation GetCurrent(int slot, int index)
7319internal ThrowOperation(IOperation? exception, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
7325public IOperation? Exception { get; }
7328internal override IOperation GetCurrent(int slot, int index)
7371internal DeconstructionAssignmentOperation(IOperation target, IOperation value, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
7379internal override IOperation GetCurrent(int slot, int index)
7430internal DeclarationExpressionOperation(IOperation expression, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
7436public IOperation Expression { get; }
7439internal override IOperation GetCurrent(int slot, int index)
7488internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
7499protected BaseSymbolInitializerOperation(ImmutableArray<ILocalSymbol> locals, IOperation value, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
7506public IOperation Value { get; }
7510internal FieldInitializerOperation(ImmutableArray<IFieldSymbol> initializedFields, ImmutableArray<ILocalSymbol> locals, IOperation value, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
7518internal override IOperation GetCurrent(int slot, int index)
7561internal VariableInitializerOperation(ImmutableArray<ILocalSymbol> locals, IOperation value, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
7565internal override IOperation GetCurrent(int slot, int index)
7608internal PropertyInitializerOperation(ImmutableArray<IPropertySymbol> initializedProperties, ImmutableArray<ILocalSymbol> locals, IOperation value, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
7616internal override IOperation GetCurrent(int slot, int index)
7659internal ParameterInitializerOperation(IParameterSymbol parameter, ImmutableArray<ILocalSymbol> locals, IOperation value, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
7667internal override IOperation GetCurrent(int slot, int index)
7710internal ArrayInitializerOperation(ImmutableArray<IOperation> elementValues, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
7715public ImmutableArray<IOperation> ElementValues { get; }
7718internal override IOperation GetCurrent(int slot, int index)
7765internal VariableDeclaratorOperation(ILocalSymbol symbol, IVariableInitializerOperation? initializer, ImmutableArray<IOperation> ignoredArguments, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
7774public ImmutableArray<IOperation> IgnoredArguments { get; }
7778internal override IOperation GetCurrent(int slot, int index)
7833internal VariableDeclarationOperation(ImmutableArray<IVariableDeclaratorOperation> declarators, IVariableInitializerOperation? initializer, ImmutableArray<IOperation> ignoredDimensions, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
7842public ImmutableArray<IOperation> IgnoredDimensions { get; }
7847internal override IOperation GetCurrent(int slot, int index)
7914internal ArgumentOperation(ArgumentKind argumentKind, IParameterSymbol? parameter, IOperation value, IConvertibleConversion inConversion, IConvertibleConversion outConversion, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
7925public IOperation Value { get; }
7932internal override IOperation GetCurrent(int slot, int index)
7975internal CatchClauseOperation(IOperation? exceptionDeclarationOrExpression, ITypeSymbol exceptionType, ImmutableArray<ILocalSymbol> locals, IOperation? filter, IBlockOperation handler, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
7984public IOperation? ExceptionDeclarationOrExpression { get; }
7987public IOperation? Filter { get; }
7993internal override IOperation GetCurrent(int slot, int index)
8052internal SwitchCaseOperation(ImmutableArray<ICaseClauseOperation> clauses, ImmutableArray<IOperation> body, ImmutableArray<ILocalSymbol> locals, IOperation? condition, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
8061public ImmutableArray<IOperation> Body { get; }
8063public IOperation? Condition { get; }
8067internal override IOperation GetCurrent(int slot, int index)
8139internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
8150internal PatternCaseClauseOperation(ILabelSymbol label, IPatternOperation pattern, IOperation? guard, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
8158public IOperation? Guard { get; }
8162internal override IOperation GetCurrent(int slot, int index)
8213internal RangeCaseClauseOperation(IOperation minimumValue, IOperation maximumValue, ILabelSymbol? label, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
8219public IOperation MinimumValue { get; }
8220public IOperation MaximumValue { get; }
8224internal override IOperation GetCurrent(int slot, int index)
8275internal RelationalCaseClauseOperation(IOperation value, BinaryOperatorKind relation, ILabelSymbol? label, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
8281public IOperation Value { get; }
8285internal override IOperation GetCurrent(int slot, int index)
8328internal SingleValueCaseClauseOperation(IOperation value, ILabelSymbol? label, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
8333public IOperation Value { get; }
8336internal override IOperation GetCurrent(int slot, int index)
8384internal InterpolatedStringTextOperation(IOperation text, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
8389public IOperation Text { get; }
8392internal override IOperation GetCurrent(int slot, int index)
8435internal InterpolationOperation(IOperation expression, IOperation? alignment, IOperation? formatString, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
8442public IOperation Expression { get; }
8443public IOperation? Alignment { get; }
8444public IOperation? FormatString { get; }
8449internal override IOperation GetCurrent(int slot, int index)
8519internal ConstantPatternOperation(IOperation value, ITypeSymbol inputType, ITypeSymbol narrowedType, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
8524public IOperation Value { get; }
8527internal override IOperation GetCurrent(int slot, int index)
8581internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
8592internal TupleBinaryOperation(BinaryOperatorKind operatorKind, IOperation leftOperand, IOperation rightOperand, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
8601public IOperation LeftOperand { get; }
8602public IOperation RightOperand { get; }
8606internal override IOperation GetCurrent(int slot, int index)
8673internal override IOperation GetCurrent(int slot, int index)
8724internal ConstructorBodyOperation(ImmutableArray<ILocalSymbol> locals, IOperation? initializer, IBlockOperation? blockBody, IBlockOperation? expressionBody, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
8731public IOperation? Initializer { get; }
8736internal override IOperation GetCurrent(int slot, int index)
8803internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
8814internal FlowCaptureOperation(CaptureId id, IOperation value, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
8821public IOperation Value { get; }
8824internal override IOperation GetCurrent(int slot, int index)
8878internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
8889internal IsNullOperation(IOperation operand, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, ConstantValue? constantValue, bool isImplicit)
8896public IOperation Operand { get; }
8899internal override IOperation GetCurrent(int slot, int index)
8948internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
8967internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
8978internal CoalesceAssignmentOperation(IOperation target, IOperation value, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
8986internal override IOperation GetCurrent(int slot, int index)
9037internal RangeOperation(IOperation? leftOperand, IOperation? rightOperand, bool isLifted, IMethodSymbol? method, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
9046public IOperation? LeftOperand { get; }
9047public IOperation? RightOperand { get; }
9053internal override IOperation GetCurrent(int slot, int index)
9114internal override IOperation GetCurrent(int slot, int index)
9161internal ReDimClauseOperation(IOperation operand, ImmutableArray<IOperation> dimensionSizes, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
9167public IOperation Operand { get; }
9168public ImmutableArray<IOperation> DimensionSizes { get; }
9172internal override IOperation GetCurrent(int slot, int index)
9244internal override IOperation GetCurrent(int slot, int index)
9306internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
9317internal SwitchExpressionOperation(IOperation value, ImmutableArray<ISwitchExpressionArmOperation> arms, bool isExhaustive, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
9325public IOperation Value { get; }
9331internal override IOperation GetCurrent(int slot, int index)
9386internal SwitchExpressionArmOperation(IPatternOperation pattern, IOperation? guard, IOperation value, ImmutableArray<ILocalSymbol> locals, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
9395public IOperation? Guard { get; }
9396public IOperation Value { get; }
9402internal override IOperation GetCurrent(int slot, int index)
9461internal PropertySubpatternOperation(IOperation member, IPatternOperation pattern, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
9467public IOperation Member { get; }
9472internal override IOperation GetCurrent(int slot, int index)
9523internal AggregateQueryOperation(IOperation group, IOperation aggregation, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
9530public IOperation Group { get; }
9531public IOperation Aggregation { get; }
9535internal override IOperation GetCurrent(int slot, int index)
9586internal FixedOperation(ImmutableArray<ILocalSymbol> locals, IVariableDeclarationGroupOperation variables, IOperation body, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
9595public IOperation Body { get; }
9599internal override IOperation GetCurrent(int slot, int index)
9659internal override IOperation GetCurrent(int slot, int index)
9710internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
9721internal WithStatementOperation(IOperation body, IOperation value, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
9727public IOperation Body { get; }
9728public IOperation Value { get; }
9732internal override IOperation GetCurrent(int slot, int index)
9795internal override IOperation GetCurrent(int slot, int index)
9846internal override IOperation GetCurrent(int slot, int index)
9902internal override IOperation GetCurrent(int slot, int index)
9960internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
9971internal RelationalPatternOperation(BinaryOperatorKind operatorKind, IOperation value, ITypeSymbol inputType, ITypeSymbol narrowedType, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
9978public IOperation Value { get; }
9981internal override IOperation GetCurrent(int slot, int index)
10024internal WithOperation(IOperation operand, IMethodSymbol? cloneMethod, IObjectOrCollectionInitializerOperation initializer, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
10032public IOperation Operand { get; }
10038internal override IOperation GetCurrent(int slot, int index)
10089internal InterpolatedStringHandlerCreationOperation(IOperation handlerCreation, bool handlerCreationHasSuccessParameter, bool handlerAppendCallsReturnBool, IOperation content, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
10098public IOperation HandlerCreation { get; }
10101public IOperation Content { get; }
10105internal override IOperation GetCurrent(int slot, int index)
10156internal InterpolatedStringAdditionOperation(IOperation left, IOperation right, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
10162public IOperation Left { get; }
10163public IOperation Right { get; }
10167internal override IOperation GetCurrent(int slot, int index)
10218internal InterpolatedStringAppendOperation(IOperation appendCall, OperationKind kind, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
10224public IOperation AppendCall { get; }
10227internal override IOperation GetCurrent(int slot, int index)
10279internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
10290internal FunctionPointerInvocationOperation(IOperation target, ImmutableArray<IArgumentOperation> arguments, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
10297public IOperation Target { get; }
10302internal override IOperation GetCurrent(int slot, int index)
10371internal override IOperation GetCurrent(int slot, int index)
10428internal override IOperation GetCurrent(int slot, int index)
10471internal ImplicitIndexerReferenceOperation(IOperation instance, IOperation argument, ISymbol lengthSymbol, ISymbol indexerSymbol, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
10480public IOperation Instance { get; }
10481public IOperation Argument { get; }
10487internal override IOperation GetCurrent(int slot, int index)
10546internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
10557internal AttributeOperation(IOperation operation, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
10562public IOperation Operation { get; }
10565internal override IOperation GetCurrent(int slot, int index)
10608internal InlineArrayAccessOperation(IOperation instance, IOperation argument, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
10615public IOperation Instance { get; }
10616public IOperation Argument { get; }
10620internal override IOperation GetCurrent(int slot, int index)
10671internal CollectionExpressionOperation(IMethodSymbol? constructMethod, ImmutableArray<IOperation> elements, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit)
10679public ImmutableArray<IOperation> Elements { get; }
10682internal override IOperation GetCurrent(int slot, int index)
10729internal SpreadOperation(IOperation operand, ITypeSymbol? elementType, IConvertibleConversion elementConversion, SemanticModel? semanticModel, SyntaxNode syntax, bool isImplicit)
10736public IOperation Operand { get; }
10742internal override IOperation GetCurrent(int slot, int index)
10785internal sealed partial class OperationCloner : OperationVisitor<object?, IOperation>
10789public static T CloneOperation<T>(T operation) where T : IOperation => s_instance.Visit(operation);
10792private T? Visit<T>(T? node) where T : IOperation? => (T?)Visit(node, argument: null);
10793public override IOperation DefaultVisit(IOperation operation, object? argument) => throw ExceptionUtilities.Unreachable();
10794private ImmutableArray<T> VisitArray<T>(ImmutableArray<T> nodes) where T : IOperation => nodes.SelectAsArray((n, @this) => @this.Visit(n), this)!;
10795private ImmutableArray<(ISymbol, T)> VisitArray<T>(ImmutableArray<(ISymbol, T)> nodes) where T : IOperation => nodes.SelectAsArray((n, @this) => (n.Item1, @this.Visit(n.Item2)), this)!;
10796public override IOperation VisitBlock(IBlockOperation operation, object? argument)
10801public override IOperation VisitVariableDeclarationGroup(IVariableDeclarationGroupOperation operation, object? argument)
10806public override IOperation VisitSwitch(ISwitchOperation operation, object? argument)
10811public override IOperation VisitForEachLoop(IForEachLoopOperation operation, object? argument)
10816public override IOperation VisitForLoop(IForLoopOperation operation, object? argument)
10821public override IOperation VisitForToLoop(IForToLoopOperation operation, object? argument)
10826public override IOperation VisitWhileLoop(IWhileLoopOperation operation, object? argument)
10831public override IOperation VisitLabeled(ILabeledOperation operation, object? argument)
10836public override IOperation VisitBranch(IBranchOperation operation, object? argument)
10841public override IOperation VisitEmpty(IEmptyOperation operation, object? argument)
10846public override IOperation VisitReturn(IReturnOperation operation, object? argument)
10851public override IOperation VisitLock(ILockOperation operation, object? argument)
10856public override IOperation VisitTry(ITryOperation operation, object? argument)
10861public override IOperation VisitUsing(IUsingOperation operation, object? argument)
10866public override IOperation VisitExpressionStatement(IExpressionStatementOperation operation, object? argument)
10871public override IOperation VisitLocalFunction(ILocalFunctionOperation operation, object? argument)
10876public override IOperation VisitStop(IStopOperation operation, object? argument)
10881public override IOperation VisitEnd(IEndOperation operation, object? argument)
10886public override IOperation VisitRaiseEvent(IRaiseEventOperation operation, object? argument)
10891public override IOperation VisitLiteral(ILiteralOperation operation, object? argument)
10896public override IOperation VisitConversion(IConversionOperation operation, object? argument)
10901public override IOperation VisitInvocation(IInvocationOperation operation, object? argument)
10906public override IOperation VisitArrayElementReference(IArrayElementReferenceOperation operation, object? argument)
10911public override IOperation VisitLocalReference(ILocalReferenceOperation operation, object? argument)
10916public override IOperation VisitParameterReference(IParameterReferenceOperation operation, object? argument)
10921public override IOperation VisitFieldReference(IFieldReferenceOperation operation, object? argument)
10926public override IOperation VisitMethodReference(IMethodReferenceOperation operation, object? argument)
10931public override IOperation VisitPropertyReference(IPropertyReferenceOperation operation, object? argument)
10936public override IOperation VisitEventReference(IEventReferenceOperation operation, object? argument)
10941public override IOperation VisitUnaryOperator(IUnaryOperation operation, object? argument)
10946public override IOperation VisitBinaryOperator(IBinaryOperation operation, object? argument)
10951public override IOperation VisitConditional(IConditionalOperation operation, object? argument)
10956public override IOperation VisitCoalesce(ICoalesceOperation operation, object? argument)
10961public override IOperation VisitAnonymousFunction(IAnonymousFunctionOperation operation, object? argument)
10966public override IOperation VisitObjectCreation(IObjectCreationOperation operation, object? argument)
10971public override IOperation VisitTypeParameterObjectCreation(ITypeParameterObjectCreationOperation operation, object? argument)
10976public override IOperation VisitArrayCreation(IArrayCreationOperation operation, object? argument)
10981public override IOperation VisitInstanceReference(IInstanceReferenceOperation operation, object? argument)
10986public override IOperation VisitIsType(IIsTypeOperation operation, object? argument)
10991public override IOperation VisitAwait(IAwaitOperation operation, object? argument)
10996public override IOperation VisitSimpleAssignment(ISimpleAssignmentOperation operation, object? argument)
11001public override IOperation VisitCompoundAssignment(ICompoundAssignmentOperation operation, object? argument)
11006public override IOperation VisitParenthesized(IParenthesizedOperation operation, object? argument)
11011public override IOperation VisitEventAssignment(IEventAssignmentOperation operation, object? argument)
11016public override IOperation VisitConditionalAccess(IConditionalAccessOperation operation, object? argument)
11021public override IOperation VisitConditionalAccessInstance(IConditionalAccessInstanceOperation operation, object? argument)
11026public override IOperation VisitInterpolatedString(IInterpolatedStringOperation operation, object? argument)
11031public override IOperation VisitAnonymousObjectCreation(IAnonymousObjectCreationOperation operation, object? argument)
11036public override IOperation VisitObjectOrCollectionInitializer(IObjectOrCollectionInitializerOperation operation, object? argument)
11041public override IOperation VisitMemberInitializer(IMemberInitializerOperation operation, object? argument)
11046public override IOperation VisitNameOf(INameOfOperation operation, object? argument)
11051public override IOperation VisitTuple(ITupleOperation operation, object? argument)
11056public override IOperation VisitDynamicMemberReference(IDynamicMemberReferenceOperation operation, object? argument)
11061public override IOperation VisitTranslatedQuery(ITranslatedQueryOperation operation, object? argument)
11066public override IOperation VisitDelegateCreation(IDelegateCreationOperation operation, object? argument)
11071public override IOperation VisitDefaultValue(IDefaultValueOperation operation, object? argument)
11076public override IOperation VisitTypeOf(ITypeOfOperation operation, object? argument)
11081public override IOperation VisitSizeOf(ISizeOfOperation operation, object? argument)
11086public override IOperation VisitAddressOf(IAddressOfOperation operation, object? argument)
11091public override IOperation VisitIsPattern(IIsPatternOperation operation, object? argument)
11096public override IOperation VisitIncrementOrDecrement(IIncrementOrDecrementOperation operation, object? argument)
11101public override IOperation VisitThrow(IThrowOperation operation, object? argument)
11106public override IOperation VisitDeconstructionAssignment(IDeconstructionAssignmentOperation operation, object? argument)
11111public override IOperation VisitDeclarationExpression(IDeclarationExpressionOperation operation, object? argument)
11116public override IOperation VisitOmittedArgument(IOmittedArgumentOperation operation, object? argument)
11121public override IOperation VisitFieldInitializer(IFieldInitializerOperation operation, object? argument)
11126public override IOperation VisitVariableInitializer(IVariableInitializerOperation operation, object? argument)
11131public override IOperation VisitPropertyInitializer(IPropertyInitializerOperation operation, object? argument)
11136public override IOperation VisitParameterInitializer(IParameterInitializerOperation operation, object? argument)
11141public override IOperation VisitArrayInitializer(IArrayInitializerOperation operation, object? argument)
11146public override IOperation VisitVariableDeclarator(IVariableDeclaratorOperation operation, object? argument)
11151public override IOperation VisitVariableDeclaration(IVariableDeclarationOperation operation, object? argument)
11156public override IOperation VisitArgument(IArgumentOperation operation, object? argument)
11161public override IOperation VisitCatchClause(ICatchClauseOperation operation, object? argument)
11166public override IOperation VisitSwitchCase(ISwitchCaseOperation operation, object? argument)
11171public override IOperation VisitDefaultCaseClause(IDefaultCaseClauseOperation operation, object? argument)
11176public override IOperation VisitPatternCaseClause(IPatternCaseClauseOperation operation, object? argument)
11181public override IOperation VisitRangeCaseClause(IRangeCaseClauseOperation operation, object? argument)
11186public override IOperation VisitRelationalCaseClause(IRelationalCaseClauseOperation operation, object? argument)
11191public override IOperation VisitSingleValueCaseClause(ISingleValueCaseClauseOperation operation, object? argument)
11196public override IOperation VisitInterpolatedStringText(IInterpolatedStringTextOperation operation, object? argument)
11201public override IOperation VisitInterpolation(IInterpolationOperation operation, object? argument)
11206public override IOperation VisitConstantPattern(IConstantPatternOperation operation, object? argument)
11211public override IOperation VisitDeclarationPattern(IDeclarationPatternOperation operation, object? argument)
11216public override IOperation VisitTupleBinaryOperator(ITupleBinaryOperation operation, object? argument)
11221public override IOperation VisitMethodBodyOperation(IMethodBodyOperation operation, object? argument)
11226public override IOperation VisitConstructorBodyOperation(IConstructorBodyOperation operation, object? argument)
11231public override IOperation VisitDiscardOperation(IDiscardOperation operation, object? argument)
11236public override IOperation VisitFlowCaptureReference(IFlowCaptureReferenceOperation operation, object? argument)
11241public override IOperation VisitCoalesceAssignment(ICoalesceAssignmentOperation operation, object? argument)
11246public override IOperation VisitRangeOperation(IRangeOperation operation, object? argument)
11251public override IOperation VisitReDim(IReDimOperation operation, object? argument)
11256public override IOperation VisitReDimClause(IReDimClauseOperation operation, object? argument)
11261public override IOperation VisitRecursivePattern(IRecursivePatternOperation operation, object? argument)
11266public override IOperation VisitDiscardPattern(IDiscardPatternOperation operation, object? argument)
11271public override IOperation VisitSwitchExpression(ISwitchExpressionOperation operation, object? argument)
11276public override IOperation VisitSwitchExpressionArm(ISwitchExpressionArmOperation operation, object? argument)
11281public override IOperation VisitPropertySubpattern(IPropertySubpatternOperation operation, object? argument)
11286internal override IOperation VisitAggregateQuery(IAggregateQueryOperation operation, object? argument)
11291internal override IOperation VisitFixed(IFixedOperation operation, object? argument)
11296internal override IOperation VisitNoPiaObjectCreation(INoPiaObjectCreationOperation operation, object? argument)
11301internal override IOperation VisitPlaceholder(IPlaceholderOperation operation, object? argument)
11306internal override IOperation VisitWithStatement(IWithStatementOperation operation, object? argument)
11311public override IOperation VisitUsingDeclaration(IUsingDeclarationOperation operation, object? argument)
11316public override IOperation VisitNegatedPattern(INegatedPatternOperation operation, object? argument)
11321public override IOperation VisitBinaryPattern(IBinaryPatternOperation operation, object? argument)
11326public override IOperation VisitTypePattern(ITypePatternOperation operation, object? argument)
11331public override IOperation VisitRelationalPattern(IRelationalPatternOperation operation, object? argument)
11336public override IOperation VisitWith(IWithOperation operation, object? argument)
11341public override IOperation VisitInterpolatedStringHandlerCreation(IInterpolatedStringHandlerCreationOperation operation, object? argument)
11346public override IOperation VisitInterpolatedStringAddition(IInterpolatedStringAdditionOperation operation, object? argument)
11351public override IOperation VisitInterpolatedStringAppend(IInterpolatedStringAppendOperation operation, object? argument)
11356public override IOperation VisitInterpolatedStringHandlerArgumentPlaceholder(IInterpolatedStringHandlerArgumentPlaceholderOperation operation, object? argument)
11361public override IOperation VisitFunctionPointerInvocation(IFunctionPointerInvocationOperation operation, object? argument)
11366public override IOperation VisitListPattern(IListPatternOperation operation, object? argument)
11371public override IOperation VisitSlicePattern(ISlicePatternOperation operation, object? argument)
11376public override IOperation VisitImplicitIndexerReference(IImplicitIndexerReferenceOperation operation, object? argument)
11381public override IOperation VisitUtf8String(IUtf8StringOperation operation, object? argument)
11386public override IOperation VisitAttribute(IAttributeOperation operation, object? argument)
11391public override IOperation VisitInlineArrayAccess(IInlineArrayAccessOperation operation, object? argument)
11396public override IOperation VisitCollectionExpression(ICollectionExpressionOperation operation, object? argument)
11401public override IOperation VisitSpread(ISpreadOperation operation, object? argument)
11412public virtual void Visit(IOperation? operation) => operation?.Accept(this);
11413public virtual void DefaultVisit(IOperation operation) { /* no-op */ }
11414internal virtual void VisitNoneOperation(IOperation operation) { /* no-op */ }
11551public virtual TResult? Visit(IOperation? operation, TArgument argument) => operation is null ? default(TResult) : operation.Accept(this, argument);
11552public virtual TResult? DefaultVisit(IOperation operation, TArgument argument) => default(TResult);
11553internal virtual TResult? VisitNoneOperation(IOperation operation, TArgument argument) => default(TResult);
Operations\ControlFlowGraphBuilder.cs (512)
27internal sealed partial class ControlFlowGraphBuilder : OperationVisitor<int?, IOperation>
40private IOperation? _currentStatement;
41private readonly ArrayBuilder<(EvalStackFrame? frameOpt, IOperation? operationOpt)> _evalStack;
46private IOperation? _currentSwitchOperationExpression;
47private IOperation? _forToLoopBinaryOperatorLeftOperand;
48private IOperation? _forToLoopBinaryOperatorRightOperand;
49private IOperation? _currentAggregationGroup;
70_evalStack = ArrayBuilder<(EvalStackFrame? frameOpt, IOperation? operationOpt)>.GetInstance();
82private bool IsImplicit(IOperation operation)
87public static ControlFlowGraph Create(IOperation body, ControlFlowGraph? parent = null, ControlFlowRegion? enclosing = null, CaptureIdDispenser? captureIdDispenser = null, in Context context = default)
836IOperation? value = block.BranchValue;
1233private void VisitStatement(IOperation? operation)
1244IOperation? saveCurrentStatement = _currentStatement;
1271IOperation? statement
1352foreach ((EvalStackFrame? frameOpt, IOperation? operationOpt) in _evalStack)
1383public override IOperation? VisitBlock(IBlockOperation operation, int? captureIdForResult)
1393private void StartVisitingStatement(IOperation operation)
1401private IOperation? FinishVisitingStatement(IOperation originalOperation, IOperation? result = null)
1412return result ?? MakeInvalidOperation(originalOperation.Syntax, originalOperation.Type, ImmutableArray<IOperation>.Empty);
1415private void VisitStatements(ImmutableArray<IOperation> statements)
1438private bool VisitStatementsOneOrAll(IOperation? operation, ImmutableArray<IOperation> statements, int startIndex)
1454var savedCurrentStatement = _currentStatement;
1467internal override IOperation? VisitWithStatement(IWithStatementOperation operation, int? captureIdForResult)
1480public override IOperation? VisitConstructorBodyOperation(IConstructorBodyOperation operation, int? captureIdForResult)
1497public override IOperation? VisitMethodBodyOperation(IMethodBodyOperation operation, int? captureIdForResult)
1535public override IOperation? VisitConditional(IConditionalOperation operation, int? captureIdForResult)
1615IOperation result;
1621IOperation? rewrittenThrow = BaseVisitRequired(whenTrueConversion.Operand, null);
1639IOperation rewrittenThrow = BaseVisitRequired(whenFalseConversion.Operand, null);
1667private void VisitAndCapture(IOperation operation, int captureId)
1670IOperation result = BaseVisitRequired(operation, captureId);
1676private IOperation VisitAndCapture(IOperation operation)
1684private void CaptureResultIfNotAlready(SyntaxNode syntax, int captureId, IOperation result)
1740(EvalStackFrame? frameOpt, IOperation? operationOpt) = _evalStack.Pop();
1834(EvalStackFrame? frameOpt, IOperation? operationOpt) = _evalStack[i];
1872IOperation? operation = _evalStack[j].operationOpt;
1936(EvalStackFrame? frameOpt, IOperation? operationOpt) = _evalStack[i];
1950private void PushOperand(IOperation operation)
1960private IOperation PopOperand()
1970(EvalStackFrame? frameOpt, IOperation? operationOpt) = _evalStack.Pop();
1977private IOperation PeekOperand()
1981(EvalStackFrame? frameOpt, IOperation? operationOpt) = _evalStack.Peek();
1988private void VisitAndPushArray<T>(ImmutableArray<T> array, Func<T, IOperation>? unwrapper = null) where T : IOperation
1990Debug.Assert(unwrapper != null || typeof(T) == typeof(IOperation));
1997private ImmutableArray<T> PopArray<T>(ImmutableArray<T> originalArray, Func<IOperation, int, ImmutableArray<T>, T>? wrapper = null) where T : IOperation
1999Debug.Assert(wrapper != null || typeof(T) == typeof(IOperation));
2011IOperation visitedElement = PopOperand();
2019private ImmutableArray<T> VisitArray<T>(ImmutableArray<T> originalArray, Func<T, IOperation>? unwrapper = null, Func<IOperation, int, ImmutableArray<T>, T>? wrapper = null) where T : IOperation
2078var argument = arguments[i].Value switch
2090private IArgumentOperation RewriteArgumentFromArray(IOperation visitedArgument, int index, ImmutableArray<IArgumentOperation> args)
2099public override IOperation VisitSimpleAssignment(ISimpleAssignmentOperation operation, int? captureIdForResult)
2103IOperation value = VisitRequired(operation.Value);
2107public override IOperation VisitCompoundAssignment(ICompoundAssignmentOperation operation, int? captureIdForResult)
2112IOperation value = VisitRequired(compoundAssignment.Value);
2119public override IOperation VisitArrayElementReference(IArrayElementReferenceOperation operation, int? captureIdForResult)
2123ImmutableArray<IOperation> visitedIndices = VisitArray(operation.Indices);
2124IOperation visitedArrayReference = PopOperand();
2130public override IOperation VisitImplicitIndexerReference(IImplicitIndexerReferenceOperation operation, int? captureIdForResult)
2134IOperation argument = VisitRequired(operation.Argument);
2135IOperation instance = PopOperand();
2141public override IOperation? VisitInlineArrayAccess(IInlineArrayAccessOperation operation, int? captureIdForResult)
2145IOperation argument = VisitRequired(operation.Argument);
2146IOperation instance = PopOperand();
2164public override IOperation VisitBinaryOperator(IBinaryOperation operation, int? captureIdForResult)
2205IOperation leftOperand;
2228IOperation rightOperand = VisitRequired(operation.RightOperand);
2242public override IOperation VisitTupleBinaryOperator(ITupleBinaryOperation operation, int? captureIdForResult)
2244(IOperation visitedLeft, IOperation visitedRight) = VisitPreservingTupleOperations(operation.LeftOperand, operation.RightOperand);
2249public override IOperation VisitUnaryOperator(IUnaryOperation operation, int? captureIdForResult)
2285private IOperation VisitBinaryConditionalOperator(IBinaryOperation binOp, bool sense, int? captureIdForResult,
2301private IOperation VisitNullableBinaryConditionalOperator(IBinaryOperation binOp, int? captureIdForResult)
2305IOperation left = binOp.LeftOperand;
2306IOperation right = binOp.RightOperand;
2307IOperation condition;
2353IOperation capturedLeft = VisitAndCapture(left);
2371IOperation capturedRight = VisitAndCapture(right);
2398IOperation negateNullable(IOperation operand)
2407private IOperation VisitObjectBinaryConditionalOperator(IBinaryOperation binOp)
2412IOperation left = binOp.LeftOperand;
2413IOperation right = binOp.RightOperand;
2414IOperation condition;
2456private IOperation CreateConversion(IOperation operand, ITypeSymbol type)
2462private IOperation VisitDynamicBinaryConditionalOperator(IBinaryOperation binOp, int? captureIdForResult)
2470IOperation left = binOp.LeftOperand;
2471IOperation right = binOp.RightOperand;
2475IOperation condition;
2484IOperation capturedLeft = VisitAndCapture(left);
2523IOperation resultFromLeft = OperationCloner.CloneOperation(capturedLeft);
2537IOperation visitedRight = VisitRequired(right);
2562private IOperation VisitUserDefinedBinaryConditionalOperator(IBinaryOperation binOp, int? captureIdForResult)
2572IOperation left = binOp.LeftOperand;
2573IOperation right = binOp.RightOperand;
2576IOperation condition;
2581IOperation capturedLeft = VisitAndCapture(left);
2626IOperation visitedRight = VisitRequired(right);
2651private IOperation VisitShortCircuitingOperator(IBinaryOperation condition, bool sense, bool stopSense, bool stopValue,
2679IOperation resultFromRight = VisitConditionalExpression(condition.RightOperand, sense, captureId, fallToTrueOpt, fallToFalseOpt);
2702private IOperation VisitConditionalExpression(IOperation condition, bool sense, int? captureIdForResult, BasicBlockBuilder? fallToTrueOpt, BasicBlockBuilder? fallToFalseOpt)
2758private void VisitConditionalBranch(IOperation condition, [NotNull] ref BasicBlockBuilder? dest, bool jumpIfTrue)
2773private void VisitConditionalBranchCore(IOperation condition, [NotNull] ref BasicBlockBuilder? dest, bool jumpIfTrue)
2780void visitConditionalBranchCore(IOperation condition, [NotNull] ref BasicBlockBuilder? dest, bool jumpIfTrue)
2794var stack = ArrayBuilder<(IOperation? condition, BasicBlockBuilder dest, bool jumpIfTrue)>.GetInstance();
2799(IOperation? condition, BasicBlockBuilder dest, bool jumpIfTrue) top = stack.Pop();
2901IOperation convertedTestExpression = NullCheckAndConvertCoalesceValue(coalesce, whenNull);
2927IOperation? rewrittenThrow = BaseVisitRequired(conversion.Operand, null);
2950static IOperation skipParenthesized(IOperation condition)
2962private void ConditionalBranch(IOperation condition, bool jumpIfTrue, BasicBlockBuilder destination)
2981private IOperation NullCheckAndConvertCoalesceValue(ICoalesceOperation operation, BasicBlockBuilder whenNull)
2986IOperation operationValue = operation.Value;
2992IOperation testExpression = PopOperand();
3000IOperation capturedValue = OperationCloner.CloneOperation(testExpression);
3001IOperation? convertedTestExpression = null;
3005IOperation? possiblyUnwrappedValue;
3040public override IOperation VisitCoalesce(ICoalesceOperation operation, int? captureIdForResult)
3052IOperation convertedTestExpression = NullCheckAndConvertCoalesceValue(operation, whenNull);
3054IOperation result;
3069IOperation? rewrittenThrow = BaseVisitRequired(conversion.Operand, null);
3097public override IOperation? VisitCoalesceAssignment(ICoalesceAssignmentOperation operation, int? captureIdForResult)
3113IOperation locationCapture = PopOperand();
3122IOperation valueCapture = GetCaptureReference(valueCaptureId, locationCapture);
3214IOperation whenNullValue = VisitRequired(operation.Value);
3266IOperation whenNullValue = VisitRequired(operation.Value);
3267IOperation whenNullAssignment = new SimpleAssignmentOperation(isRef: false, OperationCloner.CloneOperation(locationCapture), whenNullValue, semanticModel: null,
3288private static IOperation MakeInvalidOperation(ITypeSymbol? type, IOperation child)
3290return new InvalidOperation(ImmutableArray.Create<IOperation>(child),
3295private static IOperation MakeInvalidOperation(SyntaxNode syntax, ITypeSymbol? type, IOperation child1, IOperation child2)
3297return MakeInvalidOperation(syntax, type, ImmutableArray.Create<IOperation>(child1, child2));
3300private static IOperation MakeInvalidOperation(SyntaxNode syntax, ITypeSymbol? type, ImmutableArray<IOperation> children)
3307private IsNullOperation MakeIsNullOperation(IOperation operand)
3312private static IsNullOperation MakeIsNullOperation(IOperation operand, ITypeSymbol booleanType)
3323private IOperation? TryCallNullableMember(IOperation value, SpecialMember nullableMember)
3353private IOperation CallNullableMember(IOperation value, SpecialMember nullableMember)
3360public override IOperation? VisitConditionalAccess(IConditionalAccessOperation operation, int? captureIdForResult)
3369var operations = ArrayBuilder<IOperation>.GetInstance();
3377IOperation testExpression;
3410IOperation result = VisitRequired(currentConditionalAccess.WhenNotNull);
3432IOperation access = VisitRequired(currentConditionalAccess.WhenNotNull);
3476static bool isConditionalAccessInstancePresentInChildren(IOperation operation)
3507foreach (var child in operation.ChildOperations)
3519public override IOperation VisitConditionalAccessInstance(IConditionalAccessInstanceOperation operation, int? captureIdForResult)
3523IOperation testExpression = _currentConditionalAccessTracker.Operations.Pop();
3527private IOperation VisitConditionalAccessTestExpression(IOperation testExpression)
3536IOperation spilledTestExpression = PopOperand();
3544IOperation receiver = OperationCloner.CloneOperation(spilledTestExpression);
3554public override IOperation? VisitExpressionStatement(IExpressionStatementOperation operation, int? captureIdForResult)
3558IOperation? underlying = Visit(operation.Operation);
3573public override IOperation? VisitWhileLoop(IWhileLoopOperation operation, int? captureIdForResult)
3646public override IOperation? VisitTry(ITryOperation operation, int? captureIdForResult)
3690IOperation? exceptionDeclarationOrExpression = catchClause.ExceptionDeclarationOrExpression;
3691IOperation? filter = catchClause.Filter;
3785private void AddExceptionStore(ITypeSymbol exceptionType, IOperation? exceptionDeclarationOrExpression)
3789IOperation exceptionTarget;
3822public override IOperation VisitCatchClause(ICatchClauseOperation operation, int? captureIdForResult)
3827public override IOperation? VisitReturn(IReturnOperation operation, int? captureIdForResult)
3830IOperation? returnedValue = Visit(operation.ReturnedValue);
3855public override IOperation? VisitLabeled(ILabeledOperation operation, int? captureIdForResult)
3899public override IOperation? VisitBranch(IBranchOperation operation, int? captureIdForResult)
3906public override IOperation? VisitEmpty(IEmptyOperation operation, int? captureIdForResult)
3912public override IOperation? VisitThrow(IThrowOperation operation, int? captureIdForResult)
3932return new NoneOperation(children: ImmutableArray<IOperation>.Empty, semanticModel: null, operation.Syntax, constantValue: null, isImplicit: true, type: null);
3936private void LinkThrowStatement(IOperation? exception)
3947public override IOperation? VisitUsing(IUsingOperation operation, int? captureIdForResult)
3955private void HandleUsingOperationParts(IOperation resources, IOperation body, IMethodSymbol? disposeMethod, ImmutableArray<IArgumentOperation> disposeArguments, ImmutableArray<ILocalSymbol> locals, bool isAsynchronous,
3956Func<IOperation, IOperation>? visitResource = null)
3989IOperation resource = visitResource != null ? visitResource(resources) : VisitRequired(resources);
4025bool shouldConvertToIDisposableBeforeTry(IOperation resource)
4030void processResource(IOperation resource, ArrayBuilder<(IVariableDeclarationOperation, IVariableDeclaratorOperation)>? resourceQueueOpt)
4112private void AddDisposingFinally(IOperation resource, bool requiresRuntimeConversion, ITypeSymbol iDisposable, IMethodSymbol? disposeMethod, ImmutableArray<IArgumentOperation> disposeArguments, bool isAsynchronous)
4136IOperation condition = MakeIsNullOperation(OperationCloner.CloneOperation(resource));
4166IOperation? tryDispose(IOperation value)
4210private IOperation ConvertToIDisposable(IOperation operand, ITypeSymbol iDisposable, bool isTryCast = false)
4218public override IOperation? VisitLock(ILockOperation operation, int? captureIdForResult)
4236var lockObject = VisitRequired(resource);
4256IOperation? underlying = Visit(operation.LockedValue);
4315IOperation lockedValue = VisitRequired(operation.LockedValue);
4362IOperation? lockTaken = null;
4409IOperation condition = new LocalReferenceOperation(lockStatement.LockTakenSymbol, isDeclaration: false, semanticModel: null, lockedValue.Syntax,
4453public override IOperation? VisitForEachLoop(IForEachLoopOperation operation, int? captureIdForResult)
4478foreach (IOperation op in operation.Collection.DescendantsAndSelf())
4489IOperation enumerator = getEnumerator();
4559IOperation applyConversion(IConvertibleConversion? conversionOpt, IOperation operand, ITypeSymbol? targetType)
4570IOperation getEnumerator()
4572IOperation result;
4577IOperation? collection = info.GetEnumeratorMethod.IsStatic ? null : Visit(operation.Collection);
4593IOperation invocation = makeInvocation(operation.Collection.Syntax,
4607result = new InvalidOperation(ImmutableArray<IOperation>.Empty, semanticModel: null, operation.Collection.Syntax,
4615IOperation getCondition(IOperation enumeratorRef)
4633IOperation getCurrent(IOperation enumeratorRef)
4637var instance = info.CurrentProperty.IsStatic ? null : enumeratorRef;
4654IOperation getLoopControlVariableAssignment(IOperation current)
4695InvocationOperation makeInvocationDroppingInstanceForStaticMethods(IMethodSymbol method, IOperation instance, ImmutableArray<IArgumentOperation> arguments)
4700InvocationOperation makeInvocation(SyntaxNode syntax, IMethodSymbol method, IOperation? instanceOpt, ImmutableArray<IArgumentOperation> arguments)
4710ImmutableArray<IArgumentOperation> makeArguments(ImmutableArray<IArgumentOperation> arguments, ref IOperation? instance)
4729public override IOperation? VisitForToLoop(IForToLoopOperation operation, int? captureIdForResult)
4778IOperation tryCallObjectForLoopControlHelper(SyntaxNode syntax, WellKnownMember helper)
4793var builder = ArrayBuilder<IOperation>.GetInstance(--parametersCount, fillWithValue: null!);
4822IOperation value = PopOperand();
4873IOperation condition = tryCallObjectForLoopControlHelper(operation.LoopControlVariable.Syntax,
4890IOperation stepValue = GetCaptureReference(stepValueId, operation.StepValue);
4901IOperation subtraction = VisitRequired(userDefinedInfo.Subtraction);
4918IOperation? stepValueIsNull = null;
4936IOperation isUp;
4956IOperation literal = new LiteralOperation(semanticModel: null, stepValue.Syntax, stepValue.Type,
4988IOperation initialValue = PopOperand();
5028IOperation condition = tryCallObjectForLoopControlHelper(operation.LimitValue.Syntax,
5047IOperation controlVariableReferenceForCondition = PopOperand();
5079IOperation limitReference = GetCaptureReference(limitValueId, operation.LimitValue);
5110IOperation condition;
5147IOperation? eitherLimitOrControlVariableIsNull = null;
5186IOperation controlVariableReferenceforCondition = PopOperand();
5239IOperation negateIfStepNegative(IOperation operand)
5290IOperation controlVariableReferenceForAssignment = visitLoopControlVariableReference(forceImplicit: true); // Yes we are going to evaluate it again
5299IOperation increment = VisitRequired(userDefinedInfo.Addition);
5319IOperation controlVariableReferenceForAssignment;
5333IOperation condition = new BinaryOperation(BinaryOperatorKind.Or,
5375IOperation controlVariableReferenceForIncrement = visitLoopControlVariableReference(forceImplicit: true); // Yes we are going to evaluate it again
5376IOperation stepValueForIncrement = GetCaptureReference(stepValueId, operation.StepValue);
5385IOperation increment = new BinaryOperation(BinaryOperatorKind.Add,
5423IOperation visitLoopControlVariableReference(bool forceImplicit)
5437IOperation result = VisitRequired(operation.LoopControlVariable);
5444private static FlowCaptureReferenceOperation GetCaptureReference(int id, IOperation underlying)
5449internal override IOperation VisitAggregateQuery(IAggregateQueryOperation operation, int? captureIdForResult)
5453IOperation? previousAggregationGroup = _currentAggregationGroup;
5456IOperation result = VisitRequired(operation.Aggregation);
5462public override IOperation? VisitSwitch(ISwitchOperation operation, int? captureIdForResult)
5467IOperation switchValue = VisitAndCapture(operation.Value);
5509IOperation? condition = ((SwitchCaseOperation)section).Condition;
5541IOperation condition;
5551void handleEqualityCheck(IOperation compareWith)
5559IOperation rightOperand = VisitRequired(compareWith);
5560IOperation leftOperand = PopOperand();
5662private IOperation MakeNullable(IOperation operand, ITypeSymbol type)
5670public override IOperation VisitSwitchCase(ISwitchCaseOperation operation, int? captureIdForResult)
5675public override IOperation VisitSingleValueCaseClause(ISingleValueCaseClauseOperation operation, int? captureIdForResult)
5680public override IOperation VisitDefaultCaseClause(IDefaultCaseClauseOperation operation, int? captureIdForResult)
5685public override IOperation VisitRelationalCaseClause(IRelationalCaseClauseOperation operation, int? captureIdForResult)
5690public override IOperation VisitRangeCaseClause(IRangeCaseClauseOperation operation, int? captureIdForResult)
5695public override IOperation VisitPatternCaseClause(IPatternCaseClauseOperation operation, int? captureIdForResult)
5700public override IOperation? VisitEnd(IEndOperation operation, int? captureIdForResult)
5713public override IOperation? VisitForLoop(IForLoopOperation operation, int? captureIdForResult)
5737ImmutableArray<IOperation> initialization = operation.Before;
5776internal override IOperation? VisitFixed(IFixedOperation operation, int? captureIdForResult)
5789public override IOperation? VisitVariableDeclarationGroup(IVariableDeclarationGroupOperation operation, int? captureIdForResult)
5842IOperation? initializer = null;
5852IOperation operationInitializer = VisitRequired(declaration.Initializer.Value);
5889public override IOperation VisitVariableDeclaration(IVariableDeclarationOperation operation, int? captureIdForResult)
5895public override IOperation VisitVariableDeclarator(IVariableDeclaratorOperation operation, int? captureIdForResult)
5901public override IOperation VisitVariableInitializer(IVariableInitializerOperation operation, int? captureIdForResult)
5907public override IOperation VisitFlowCapture(IFlowCaptureOperation operation, int? captureIdForResult)
5912public override IOperation VisitFlowCaptureReference(IFlowCaptureReferenceOperation operation, int? captureIdForResult)
5917public override IOperation VisitIsNull(IIsNullOperation operation, int? captureIdForResult)
5922public override IOperation VisitCaughtException(ICaughtExceptionOperation operation, int? captureIdForResult)
5927public override IOperation VisitInvocation(IInvocationOperation operation, int? captureIdForResult)
5930IOperation? instance = operation.TargetMethod.IsStatic ? null : operation.Instance;
5931(IOperation? visitedInstance, ImmutableArray<IArgumentOperation> visitedArguments) = VisitInstanceWithArguments(instance, operation.Arguments);
5937public override IOperation? VisitFunctionPointerInvocation(IFunctionPointerInvocationOperation operation, int? argument)
5940var target = operation.Target;
5946(IOperation visitedInstance, ImmutableArray<IArgumentOperation> visitedArguments) handlePointerAndArguments(
5947IOperation targetPointer, ImmutableArray<IArgumentOperation> arguments)
5952IOperation visitedInstance = PopOperand();
5958private (IOperation? visitedInstance, ImmutableArray<IArgumentOperation> visitedArguments) VisitInstanceWithArguments(IOperation? instance, ImmutableArray<IArgumentOperation> arguments)
5967IOperation? visitedInstance = hasInstance ? PopOperand() : null;
5972internal override IOperation VisitNoPiaObjectCreation(INoPiaObjectCreationOperation operation, int? argument)
5976IOperation initializedInstance = new NoPiaObjectCreationOperation(initializer: null, semanticModel: null, operation.Syntax, operation.Type, IsImplicit(operation));
5980public override IOperation VisitObjectCreation(IObjectCreationOperation operation, int? captureIdForResult)
5987IOperation initializedInstance = new ObjectCreationOperation(operation.Constructor, initializer: null, visitedArgs, semanticModel: null,
5993public override IOperation VisitTypeParameterObjectCreation(ITypeParameterObjectCreationOperation operation, int? captureIdForResult)
6000public override IOperation VisitDynamicObjectCreation(IDynamicObjectCreationOperation operation, int? captureIdForResult)
6004ImmutableArray<IOperation> visitedArguments = VisitArray(operation.Arguments);
6008IOperation initializedInstance = new DynamicObjectCreationOperation(initializer: null, visitedArguments, hasDynamicArguments.ArgumentNames,
6015private IOperation HandleObjectOrCollectionInitializer(IObjectOrCollectionInitializerOperation? initializer, IOperation objectCreation)
6032void visitInitializer(IObjectOrCollectionInitializerOperation initializerOperation, IOperation initializedInstance)
6037foreach (IOperation innerInitializer in initializerOperation.Initializers)
6045void handleInitializer(IOperation innerInitializer)
6080IOperation result;
6093IOperation right = VisitRequired(assignmentOperation.Value);
6094IOperation left = popTarget(assignmentOperation.Target);
6153IOperation instance = pushSuccess ? popTarget(memberInitializer.InitializedMember) : VisitRequired(memberInitializer.InitializedMember);
6158bool tryPushTarget(IOperation instance)
6225IOperation popTarget(IOperation originalTarget)
6227IOperation? instance;
6249ImmutableArray<IOperation> indices = PopArray(arrayElementReference.Indices);
6255IOperation index = PopOperand();
6262ImmutableArray<IOperation> arguments = PopArray(dynamicAccess.Arguments);
6299var lhs = memberInitializer.InitializedMember;
6309foreach (var element in array.Initializer.ElementValues)
6326foreach (var index in arrayAccess.Indices)
6333foreach (var argument in dynamicIndexerAccess.Arguments)
6350foreach (var initializer in memberInitializer.Initializer.Initializers)
6357public override IOperation VisitObjectOrCollectionInitializer(IObjectOrCollectionInitializerOperation operation, int? captureIdForResult)
6360return MakeInvalidOperation(operation.Syntax, operation.Type, ImmutableArray<IOperation>.Empty);
6363public override IOperation VisitMemberInitializer(IMemberInitializerOperation operation, int? captureIdForResult)
6366return MakeInvalidOperation(operation.Syntax, operation.Type, ImmutableArray<IOperation>.Empty);
6369public override IOperation VisitAnonymousObjectCreation(IAnonymousObjectCreationOperation operation, int? captureIdForResult)
6373return new AnonymousObjectCreationOperation(initializers: ImmutableArray<IOperation>.Empty, semanticModel: null,
6386var initializerBuilder = ArrayBuilder<IOperation>.GetInstance(operation.Initializers.Length);
6400IOperation visitedTarget = new PropertyReferenceOperation(propertyReference.Property, propertyReference.ConstrainedToType, ImmutableArray<IArgumentOperation>.Empty, visitedPropertyInstance,
6402IOperation visitedValue = visitAndCaptureInitializer(propertyReference.Property, simpleAssignment.Value);
6420IOperation visitAndCaptureInitializer(IPropertySymbol initializedProperty, IOperation initializer)
6424IOperation captured = PeekOperand(); // Keep it on the stack so that we know it is still used.
6436public override IOperation? VisitLocalFunction(ILocalFunctionOperation operation, int? captureIdForResult)
6452private IOperation? VisitLocalFunctionAsRoot(ILocalFunctionOperation operation)
6459public override IOperation VisitAnonymousFunction(IAnonymousFunctionOperation operation, int? captureIdForResult)
6465public override IOperation VisitFlowAnonymousFunction(IFlowAnonymousFunctionOperation operation, int? captureIdForResult)
6470public override IOperation VisitArrayCreation(IArrayCreationOperation operation, int? captureIdForResult)
6489ImmutableArray<IOperation> visitedDimensions = PopArray(operation.DimensionSizes);
6495public override IOperation VisitArrayInitializer(IArrayInitializerOperation operation, int? captureIdForResult)
6503foreach (IOperation elementValue in initializer.ElementValues)
6519var builder = ArrayBuilder<IOperation>.GetInstance(initializer.ElementValues.Length);
6522IOperation elementValue = initializer.ElementValues[i];
6524IOperation visitedElementValue;
6542public override IOperation? VisitCollectionExpression(ICollectionExpressionOperation operation, int? argument)
6547unwrapper: static (IOperation element) =>
6553wrapper: (IOperation operation, int index, ImmutableArray<IOperation> elements) =>
6575public override IOperation? VisitSpread(ISpreadOperation operation, int? argument)
6580public override IOperation VisitInstanceReference(IInstanceReferenceOperation operation, int? captureIdForResult)
6596return MakeInvalidOperation(operation.Syntax, operation.Type, ImmutableArray<IOperation>.Empty);
6608public override IOperation VisitDynamicInvocation(IDynamicInvocationOperation operation, int? captureIdForResult)
6614var instance = ((IDynamicMemberReferenceOperation)operation.Operation).Instance;
6625ImmutableArray<IOperation> rewrittenArguments = VisitArray(operation.Arguments);
6627IOperation rewrittenOperation;
6631IOperation? rewrittenInstance = dynamicMemberReference.Instance != null ? PopOperand() : null;
6645public override IOperation VisitDynamicIndexerAccess(IDynamicIndexerAccessOperation operation, int? captureIdForResult)
6649ImmutableArray<IOperation> rewrittenArguments = VisitArray(operation.Arguments);
6650IOperation rewrittenOperation = PopOperand();
6656public override IOperation VisitDynamicMemberReference(IDynamicMemberReferenceOperation operation, int? captureIdForResult)
6662public override IOperation VisitDeconstructionAssignment(IDeconstructionAssignmentOperation operation, int? captureIdForResult)
6664(IOperation visitedTarget, IOperation visitedValue) = VisitPreservingTupleOperations(operation.Target, operation.Value);
6671private void PushTargetAndUnwrapTupleIfNecessary(IOperation value)
6677foreach (IOperation element in tuple.Elements)
6691private IOperation PopTargetAndWrapTupleIfNecessary(IOperation value)
6697var elementBuilder = ArrayBuilder<IOperation>.GetInstance(numElements);
6711public override IOperation VisitDeclarationExpression(IDeclarationExpressionOperation operation, int? captureIdForResult)
6716private IOperation VisitPreservingTupleOperations(IOperation operation)
6723private (IOperation visitedLeft, IOperation visitedRight) VisitPreservingTupleOperations(IOperation left, IOperation right)
6734IOperation visitedRight = VisitRequired(right);
6735IOperation visitedLeft = PopTargetAndWrapTupleIfNecessary(left);
6740public override IOperation VisitTuple(ITupleOperation operation, int? captureIdForResult)
6745internal override IOperation VisitNoneOperation(IOperation operation, int? captureIdForResult)
6757private IOperation VisitNoneOperationStatement(IOperation operation)
6761return new NoneOperation(ImmutableArray<IOperation>.Empty, semanticModel: null, operation.Syntax, operation.Type, operation.GetConstantValue(), IsImplicit(operation));
6764private IOperation VisitNoneOperationExpression(IOperation operation)
6770public override IOperation? VisitInterpolatedStringHandlerCreation(IInterpolatedStringHandlerCreationOperation operation, int? captureIdForResult)
6857IOperation visitedAppendCall = VisitRequired(appendCall.AppendCall);
6954public override IOperation? VisitInterpolatedStringAddition(IInterpolatedStringAdditionOperation operation, int? captureIdForResult)
6959public override IOperation? VisitInterpolatedStringAppend(IInterpolatedStringAppendOperation operation, int? captureIdForResult)
6964public override IOperation? VisitInterpolatedStringHandlerArgumentPlaceholder(IInterpolatedStringHandlerArgumentPlaceholderOperation operation, int? captureIdForResult)
6976if (_currentInterpolatedStringHandlerArgumentContext.HasReceiver && tryGetArgumentOrReceiver(-1) is IOperation receiverCapture)
6983return new InvalidOperation(ImmutableArray<IOperation>.Empty, semanticModel: null, operation.Syntax, operation.Type, operation.GetConstantValue(), isImplicit: true);
6989if (tryGetArgumentOrReceiver(operation.ArgumentIndex) is IOperation argumentCapture)
6996return new InvalidOperation(ImmutableArray<IOperation>.Empty, semanticModel: null, operation.Syntax, operation.Type, operation.GetConstantValue(), isImplicit: true);
7003IOperation? tryGetArgumentOrReceiver(int argumentIndex)
7025public override IOperation VisitInterpolatedString(IInterpolatedStringOperation operation, int? captureIdForResult)
7053IOperation? rewrittenFormatString;
7064var rewrittenAlignment = interpolation.Alignment != null ? PopOperand() : null;
7065var rewrittenExpression = PopOperand();
7070var rewrittenInterpolationText = VisitRequired(interpolatedStringText.Text, argument: null);
7086public override IOperation VisitInterpolatedStringText(IInterpolatedStringTextOperation operation, int? captureIdForResult)
7091public override IOperation VisitInterpolation(IInterpolationOperation operation, int? captureIdForResult)
7096public override IOperation VisitNameOf(INameOfOperation operation, int? captureIdForResult)
7102public override IOperation VisitLiteral(ILiteralOperation operation, int? captureIdForResult)
7107public override IOperation? VisitUtf8String(IUtf8StringOperation operation, int? captureIdForResult)
7112public override IOperation VisitLocalReference(ILocalReferenceOperation operation, int? captureIdForResult)
7118public override IOperation VisitParameterReference(IParameterReferenceOperation operation, int? captureIdForResult)
7124public override IOperation VisitFieldReference(IFieldReferenceOperation operation, int? captureIdForResult)
7126IOperation? visitedInstance = operation.Field.IsStatic ? null : Visit(operation.Instance);
7131public override IOperation VisitMethodReference(IMethodReferenceOperation operation, int? captureIdForResult)
7133IOperation? visitedInstance = operation.Method.IsStatic ? null : Visit(operation.Instance);
7138public override IOperation VisitPropertyReference(IPropertyReferenceOperation operation, int? captureIdForResult)
7147if (_currentImplicitInstance.AnonymousTypePropertyValues.TryGetValue(operation.Property, out IOperation? captured))
7155return MakeInvalidOperation(operation.Syntax, operation.Type, ImmutableArray<IOperation>.Empty);
7160IOperation? instance = operation.Property.IsStatic ? null : operation.Instance;
7161(IOperation? visitedInstance, ImmutableArray<IArgumentOperation> visitedArguments) = VisitInstanceWithArguments(instance, operation.Arguments);
7167public override IOperation VisitEventReference(IEventReferenceOperation operation, int? captureIdForResult)
7169IOperation? visitedInstance = operation.Event.IsStatic ? null : Visit(operation.Instance);
7174public override IOperation VisitTypeOf(ITypeOfOperation operation, int? captureIdForResult)
7179public override IOperation VisitParenthesized(IParenthesizedOperation operation, int? captureIdForResult)
7184public override IOperation VisitAwait(IAwaitOperation operation, int? captureIdForResult)
7189public override IOperation VisitSizeOf(ISizeOfOperation operation, int? captureIdForResult)
7194public override IOperation VisitStop(IStopOperation operation, int? captureIdForResult)
7199public override IOperation VisitIsType(IIsTypeOperation operation, int? captureIdForResult)
7204public override IOperation? VisitParameterInitializer(IParameterInitializerOperation operation, int? captureIdForResult)
7214public override IOperation? VisitFieldInitializer(IFieldInitializerOperation operation, int? captureIdForResult)
7232public override IOperation? VisitPropertyInitializer(IPropertyInitializerOperation operation, int? captureIdForResult)
7250var value = new InvalidOperation(ImmutableArray<IOperation>.Empty, semanticModel: null,
7266IOperation propertyRef = new PropertyReferenceOperation(propertySymbol, constrainedToType: null, arguments, instance,
7274private void VisitInitializer(IOperation rewrittenTarget, ISymbolInitializerOperation initializer)
7287public override IOperation VisitEventAssignment(IEventAssignmentOperation operation, int? captureIdForResult)
7290IOperation visitedEventReference, visitedHandler;
7298var eventReferenceInstance = eventReference.Event.IsStatic ? null : eventReference.Instance;
7306IOperation? visitedInstance = eventReferenceInstance == null ? null : PopOperand();
7325IOperation current = operation.EventReference;
7345public override IOperation VisitRaiseEvent(IRaiseEventOperation operation, int? captureIdForResult)
7351(IOperation? visitedInstance, ImmutableArray<IArgumentOperation> visitedArguments) =
7361public override IOperation VisitAddressOf(IAddressOfOperation operation, int? captureIdForResult)
7366public override IOperation VisitIncrementOrDecrement(IIncrementOrDecrementOperation operation, int? captureIdForResult)
7373public override IOperation VisitDiscardOperation(IDiscardOperation operation, int? captureIdForResult)
7378public override IOperation VisitDiscardPattern(IDiscardPatternOperation pat, int? captureIdForResult)
7383public override IOperation VisitOmittedArgument(IOmittedArgumentOperation operation, int? captureIdForResult)
7388internal override IOperation VisitPlaceholder(IPlaceholderOperation operation, int? captureIdForResult)
7422public override IOperation VisitConversion(IConversionOperation operation, int? captureIdForResult)
7427public override IOperation VisitDefaultValue(IDefaultValueOperation operation, int? captureIdForResult)
7432public override IOperation VisitIsPattern(IIsPatternOperation operation, int? captureIdForResult)
7437IOperation visitedValue = PopOperand();
7443public override IOperation VisitInvalid(IInvalidOperation operation, int? captureIdForResult)
7445var children = ArrayBuilder<IOperation>.GetInstance();
7460foreach (var argument in children)
7472IOperation initializedInstance = new InvalidOperation(children.ToImmutableAndFree(), semanticModel: null, operation.Syntax, operation.Type,
7480IOperation result;
7492IOperation visitInvalidOperationStatement(IInvalidOperation invalidOperation)
7496return new InvalidOperation(ImmutableArray<IOperation>.Empty, semanticModel: null, invalidOperation.Syntax, invalidOperation.Type, invalidOperation.GetConstantValue(), IsImplicit(invalidOperation));
7499IOperation visitInvalidOperationExpression(IInvalidOperation invalidOperation)
7507public override IOperation? VisitReDim(IReDimOperation operation, int? argument)
7533var visitedOperand = PopOperand();
7538public override IOperation VisitReDimClause(IReDimClauseOperation operation, int? argument)
7543public override IOperation VisitTranslatedQuery(ITranslatedQueryOperation operation, int? captureIdForResult)
7548public override IOperation VisitConstantPattern(IConstantPatternOperation operation, int? captureIdForResult)
7554public override IOperation VisitRelationalPattern(IRelationalPatternOperation operation, int? argument)
7566public override IOperation VisitBinaryPattern(IBinaryPatternOperation operation, int? argument)
7607public override IOperation VisitNegatedPattern(INegatedPatternOperation operation, int? argument)
7618public override IOperation VisitTypePattern(ITypePatternOperation operation, int? argument)
7629public override IOperation VisitDeclarationPattern(IDeclarationPatternOperation operation, int? captureIdForResult)
7642public override IOperation VisitSlicePattern(ISlicePatternOperation operation, int? argument)
7654public override IOperation VisitListPattern(IListPatternOperation operation, int? argument)
7668public override IOperation VisitRecursivePattern(IRecursivePatternOperation operation, int? argument)
7683public override IOperation VisitPropertySubpattern(IPropertySubpatternOperation operation, int? argument)
7693public override IOperation VisitDelegateCreation(IDelegateCreationOperation operation, int? captureIdForResult)
7699public override IOperation VisitRangeOperation(IRangeOperation operation, int? argument)
7706IOperation? visitedRightOperand = null;
7712IOperation? visitedLeftOperand = operation.LeftOperand is null ? null : PopOperand();
7717public override IOperation VisitSwitchExpression(ISwitchExpressionOperation operation, int? captureIdForResult)
7744var capturedInput = VisitAndCapture(operation.Value);
7794var makeException = (matchFailureCtor is null)
7795? MakeInvalidOperation(operation.Syntax, type: _compilation.GetSpecialType(SpecialType.System_Object), ImmutableArray<IOperation>.Empty)
7809private void VisitUsingVariableDeclarationOperation(IUsingDeclarationOperation operation, ReadOnlySpan<IOperation> statements)
7811IOperation? saveCurrentStatement = _currentStatement;
7818ArrayBuilder<IOperation> statementsBuilder = ArrayBuilder<IOperation>.GetInstance(statements.Length);
7819ArrayBuilder<IOperation>? localFunctionsBuilder = null;
7821foreach (var statement in statements)
7825(localFunctionsBuilder ??= ArrayBuilder<IOperation>.GetInstance()).Add(statement);
7854public IOperation? Visit(IOperation? operation)
7863public IOperation? VisitRequired(IOperation? operation, int? argument = null)
7866var result = Visit(operation, argument);
7873public IOperation? BaseVisitRequired(IOperation? operation, int? argument)
7877var result = base.Visit(operation, argument);
7884public override IOperation? Visit(IOperation? operation, int? argument)
7893var result = PopStackFrame(PushStackFrame(), base.Visit(operation, argument));
7899public override IOperation DefaultVisit(IOperation operation, int? captureIdForResult)
7905public override IOperation VisitArgument(IArgumentOperation operation, int? captureIdForResult)
7910public override IOperation VisitUsingDeclaration(IUsingDeclarationOperation operation, int? captureIdForResult)
7915public override IOperation VisitWith(IWithOperation operation, int? captureIdForResult)
7924IOperation visitedInstance = VisitRequired(operation.Operand);
7925IOperation cloned;
7942IOperation handleAnonymousTypeWithExpression(WithOperation operation, int? captureIdForResult)
7975var explicitProperties = new Dictionary<IPropertySymbol, IOperation>(SymbolEqualityComparer.IgnoreAll);
7976var initializerBuilder = ArrayBuilder<IOperation>.GetInstance(initializers.Length);
7979foreach (IOperation initializer in initializers)
8024if (explicitProperties.TryGetValue(property, out var assignment))
8056SimpleAssignmentOperation makeAssignment(IPropertySymbol property, IOperation capturedValue, WithOperation operation)
8071static bool setsAllProperties(ImmutableArray<IOperation> initializers, IEnumerable<IPropertySymbol> properties)
8074foreach (var initializer in initializers)
8095public override IOperation VisitAttribute(IAttributeOperation operation, int? captureIdForResult)
Operations\ControlFlowGraphBuilder.RegionBuilder.cs (9)
311foreach ((IMethodSymbol method, IOperation _) in LocalFunctions)
387foreach (IOperation o in block.StatementsOpt)
399OperationVisitor<(ImmutableDictionary<IFlowAnonymousFunctionOperation, (ControlFlowRegion region, int ordinal)>.Builder map, ControlFlowRegion region), IOperation>
403public override IOperation? VisitFlowAnonymousFunction(
411internal override IOperation? VisitNoneOperation(IOperation operation, (ImmutableDictionary<IFlowAnonymousFunctionOperation, (ControlFlowRegion region, int ordinal)>.Builder map, ControlFlowRegion region) argument)
416public override IOperation? DefaultVisit(
417IOperation operation,
420foreach (IOperation child in ((Operation)operation).ChildOperations)
Operations\OperationCloner.cs (14)
11internal sealed partial class OperationCloner : OperationVisitor<object?, IOperation>
14public IOperation? Visit(IOperation? operation)
19internal override IOperation VisitNoneOperation(IOperation operation, object? argument)
24public override IOperation VisitFlowAnonymousFunction(IFlowAnonymousFunctionOperation operation, object? argument)
30public override IOperation VisitDynamicObjectCreation(IDynamicObjectCreationOperation operation, object? argument)
35public override IOperation VisitDynamicInvocation(IDynamicInvocationOperation operation, object? argument)
40public override IOperation VisitDynamicIndexerAccess(IDynamicIndexerAccessOperation operation, object? argument)
45public override IOperation VisitInvalid(IInvalidOperation operation, object? argument)
50public override IOperation VisitFlowCapture(IFlowCaptureOperation operation, object? argument)
55public override IOperation VisitIsNull(IIsNullOperation operation, object? argument)
60public override IOperation VisitCaughtException(ICaughtExceptionOperation operation, object? argument)
65public override IOperation VisitStaticLocalInitializationSemaphore(IStaticLocalInitializationSemaphoreOperation operation, object? argument)
Operations\OperationMapBuilder.cs (13)
19internal static void AddToMap(IOperation root, Dictionary<SyntaxNode, IOperation> dictionary)
25private sealed class Walker : OperationWalker<Dictionary<SyntaxNode, IOperation>>
29public override object? DefaultVisit(IOperation operation, Dictionary<SyntaxNode, IOperation> argument)
35public override object? VisitBinaryOperator([DisallowNull] IBinaryOperation? operation, Dictionary<SyntaxNode, IOperation> argument)
57public override object? VisitConditional(IConditionalOperation operation, Dictionary<SyntaxNode, IOperation> argument)
78public override object? VisitBinaryPattern(IBinaryPatternOperation operation, Dictionary<SyntaxNode, IOperation> argument)
100internal override object? VisitNoneOperation(IOperation operation, Dictionary<SyntaxNode, IOperation> argument)
107private static void RecordOperation(IOperation operation, Dictionary<SyntaxNode, IOperation> argument)
114$"Duplicate operation node for {operation.Syntax}. Existing node is {(argument.TryGetValue(operation.Syntax, out var original) ? (OperationKind?)original.Kind : null)}, new node is {operation.Kind}.");
Operations\OperationNodes.cs (26)
18public NoneOperation(ImmutableArray<IOperation> children, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, ConstantValue? constantValue, bool isImplicit) :
26internal ImmutableArray<IOperation> Children { get; }
28internal override IOperation GetCurrent(int slot, int index)
87public InvalidOperation(ImmutableArray<IOperation> children, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, ConstantValue? constantValue, bool isImplicit) :
97internal ImmutableArray<IOperation> Children { get; }
99internal override IOperation GetCurrent(int slot, int index)
163internal override IOperation GetCurrent(int slot, int index) => throw ExceptionUtilities.UnexpectedValue((slot, index));
235protected HasDynamicArgumentsExpression(ImmutableArray<IOperation> arguments, ImmutableArray<string?> argumentNames, ImmutableArray<RefKind> argumentRefKinds, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit) :
246public ImmutableArray<IOperation> Arguments { get; }
252public DynamicObjectCreationOperation(IObjectOrCollectionInitializerOperation? initializer, ImmutableArray<IOperation> arguments, ImmutableArray<string?> argumentNames, ImmutableArray<RefKind> argumentRefKinds, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit) :
264internal override IOperation GetCurrent(int slot, int index)
334public DynamicInvocationOperation(IOperation operation, ImmutableArray<IOperation> arguments, ImmutableArray<string?> argumentNames, ImmutableArray<RefKind> argumentRefKinds, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit) :
342internal override IOperation GetCurrent(int slot, int index)
400public IOperation Operation { get; }
416public DynamicIndexerAccessOperation(IOperation operation, ImmutableArray<IOperation> arguments, ImmutableArray<string?> argumentNames, ImmutableArray<RefKind> argumentRefKinds, SemanticModel? semanticModel, SyntaxNode syntax, ITypeSymbol? type, bool isImplicit) :
422public IOperation Operation { get; }
428internal override IOperation GetCurrent(int slot, int index)
513internal override IOperation GetCurrent(int slot, int index)
517IOperation getCurrentSwitchTop()
529IOperation getCurrentSwitchBottom()
649public FlowCaptureOperation(int id, SyntaxNode syntax, IOperation value) :
658public IsNullOperation(SyntaxNode syntax, IOperation operand, ITypeSymbol type, ConstantValue? constantValue) :
688public static BlockOperation CreateTemporaryBlock(ImmutableArray<IOperation> statements, SemanticModel semanticModel, SyntaxNode syntax)
691private BlockOperation(ImmutableArray<IOperation> statements, SemanticModel semanticModel, SyntaxNode syntax)
Microsoft.CodeAnalysis.Analyzers (230)
src\RoslynAnalyzers\Utilities\Compiler\Extensions\IOperationExtensions.cs (33)
62public static bool HasNullConstantValue(this IOperation operation)
67public static bool TryGetBoolConstantValue(this IOperation operation, out bool constantValue)
84public static ImmutableArray<IOperation> GetTopmostExplicitDescendants(this IOperation operation)
91var builder = ImmutableArray.CreateBuilder<IOperation>();
92var operationsToProcess = new Queue<IOperation>();
105foreach (var child in operation.Children)
121public static bool IsOperationNoneRoot(this IOperation operation)
132public static TOperation? GetAncestor<TOperation>(this IOperation root, OperationKind ancestorKind, Func<TOperation, bool>? predicate = null)
133where TOperation : class, IOperation
140var ancestor = root;
167public static IOperation? GetAncestor(this IOperation root, ImmutableArray<OperationKind> ancestorKinds, Func<IOperation, bool>? predicate = null)
174var ancestor = root;
209public static IOperation? GetInstance(this IInstanceReferenceOperation operation, bool isInsideAnonymousObjectInitializer)
216for (IOperation? current = operation; current != null && current.Kind != OperationKind.Block; current = current.Parent)
259public static IOperation GetRoot(this IOperation operation)
274private static readonly BoundedCache<Compilation, ConcurrentDictionary<IOperation, ControlFlowGraph?>> s_operationToCfgCache
277public static bool TryGetEnclosingControlFlowGraph(this IOperation operation, [NotNullWhen(returnValue: true)] out ControlFlowGraph? cfg)
294private static ControlFlowGraph? CreateControlFlowGraph(IOperation operation)
332this IOperation operation, IMethodSymbol lambdaOrLocalFunction, out PooledHashSet<ISymbol> builder)
343foreach (var child in operation.Descendants())
385public static bool IsWithinLambdaOrLocalFunction(this IOperation operation, [NotNullWhen(true)] out IOperation? containingLambdaOrLocalFunctionOperation)
422[NotNullWhen(returnValue: true)] out IOperation? elementOfParentTupleContainingTuple)
427IOperation previousOperation = tupleOperation;
428var currentOperation = tupleOperation.Parent;
460public static IOperation? GetInstance(this IInvocationOperation invocationOperation)
463public static IOperation? GetThrownException(this IThrowOperation operation)
465var thrownObject = operation.Exception;
489IOperation potentialLeftSide = operation;
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\OperationExtensions.cs (32)
18public static bool IsTargetOfObjectMemberInitializer(this IOperation operation)
34public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
239public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
259public static bool IsInLeftOfDeconstructionAssignment(this IOperation operation, [NotNullWhen(true)] out IDeconstructionAssignmentOperation? deconstructionAssignment)
263var previousOperation = operation;
264var current = operation.Parent;
295public static bool IsAnyCompoundAssignment(this IOperation operation)
308public static bool IsInsideCatchRegion(this IOperation operation, ControlFlowGraph cfg)
328foreach (var descendant in block.DescendantOperations())
341public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
343foreach (var operationBlock in operationBlocks)
354public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
357public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(true)] out IOperation? foundOperation)
361foreach (var descendant in operationBlock.DescendantsAndSelf())
374public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
377public static bool IsNumericLiteral(this IOperation operation)
380public static bool IsNullLiteral(this IOperation operand)
389public static IOperation? WalkDownConversion(this IOperation? operation)
399public static bool IsSingleThrowNotImplementedOperation([NotNullWhen(true)] this IOperation? firstBlock)
415var firstOp = block.Operations.Length == 1
437static IOperation? TryGetSingleExplicitStatement(ImmutableArray<IOperation> operations)
439IOperation? firstOp = null;
440foreach (var operation in operations)
454static bool IsThrowNotImplementedOperation(INamedTypeSymbol notImplementedExceptionType, IOperation? operation)
461public static IOperation? UnwrapImplicitConversion(this IOperation? value)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.AnalysisData.cs (14)
61protected abstract PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
132public abstract void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId);
137public abstract void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol);
138public abstract void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget);
139public abstract void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget);
140public abstract void SetEmptyInvocationTargetsForDelegate(IOperation write);
141public abstract bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets);
143protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> CreateSymbolsWriteMap(
146var symbolsWriteMap = PooledDictionary<(ISymbol Symbol, IOperation Write), bool>.GetInstance();
150protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> UpdateSymbolsWriteMap(
151PooledDictionary<(ISymbol Symbol, IOperation Write), bool> symbolsWriteMap,
158(ISymbol, IOperation) key = (parameter, null);
201public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten, bool isRef)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.BasicBlockAnalysisData.cs (9)
28private readonly Dictionary<ISymbol, PooledHashSet<IOperation>> _reachingWrites;
74public void ForEachCurrentWrite<TArg>(ISymbol symbol, Action<IOperation, TArg> action, TArg arg)
86public bool ForEachCurrentWrite<TArg>(ISymbol symbol, Func<IOperation, TArg, bool> action, TArg arg)
90foreach (var value in values)
104public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten)
108values = PooledHashSet<IOperation>.GetInstance();
223private static void AddEntries(Dictionary<ISymbol, PooledHashSet<IOperation>> result, BasicBlockAnalysisData source)
231values = PooledHashSet<IOperation>.GetInstance();
240foreach (var operation in operations)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (33)
41private readonly PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>> _lValueFlowCapturesMap;
48private readonly PooledDictionary<IOperation, PooledHashSet<IOperation>> _reachingDelegateCreationTargets;
69private readonly PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>> _symbolWritesInsideBlockRangeMap;
77PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
81PooledDictionary<IOperation, PooledHashSet<IOperation>> reachingDelegateCreationTargets,
99_lValueFlowCapturesMap = PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
103_symbolWritesInsideBlockRangeMap = PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
110protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
134reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
189foreach (var operation in cfg.OriginalOperation.Descendants())
215private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
220var operations = PooledHashSet<IOperation>.GetInstance();
224writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
241PooledHashSet<IOperation> operationsBuilder,
248foreach (var operation in cfg.Blocks[i].DescendantOperations())
273void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
275foreach (var target in targets)
462public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
466captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
514public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
522var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
544foreach (var target in targetsBuilderForSymbolWrite)
561public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
571public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
583public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
586private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
588var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
597public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.OperationTreeAnalysisData.cs (9)
21PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
34protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
63public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
69public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
71public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
73public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
75public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
77public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.Walker.cs (20)
27private IOperation _currentRootOperation;
29private PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>> _pendingWritesMap;
36IEnumerable<IOperation> operations,
51private void Visit(ISymbol containingSymbol, IEnumerable<IOperation> operations, AnalysisData analysisData, CancellationToken cancellationToken)
58_pendingWritesMap = PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
65foreach (var operation in operations)
93private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo)
101private void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
107private void OnReferenceFound(ISymbol symbol, IOperation operation)
159private bool MakePendingWrite(IOperation operation, ISymbol symbolOpt)
166var set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
175set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
407private void ProcessPossibleDelegateCreationAssignment(ISymbol symbol, IOperation write)
415IOperation initializerValue = null;
431private void ProcessPossibleDelegateCreation(IOperation creation, IOperation write)
433var currentOperation = creation;
497private void AnalyzePossibleDelegateInvocation(IOperation operation)
534foreach (var target in targets)
549void AnalyzeDelegateInvocation(IOperation target)
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\LanguageServices\InitializeParameter\InitializeParameterHelpersCore.cs (11)
38public static bool IsParameterReference(IOperation? operation, IParameterSymbol parameter)
43IOperation? value, IParameterSymbol parameter)
76public static IOperation? TryFindFieldOrPropertyAssignmentStatement(IParameterSymbol parameter, IBlockOperation? blockStatement)
79private static IOperation? TryFindFieldOrPropertyAssignmentStatement(
85foreach (var statement in blockStatement.Operations)
99var target = targetTuple.Elements[i];
100var value = valueTuple.Elements[i];
117IOperation operation,
146IOperation? operation, INamedTypeSymbol containingType,
163public static bool IsFieldOrPropertyAssignment(IOperation statement, INamedTypeSymbol containingType, [NotNullWhen(true)] out IAssignmentOperation? assignmentExpression)
167IOperation statement, INamedTypeSymbol containingType,
Microsoft.CodeAnalysis.Analyzers.UnitTests (2)
Microsoft.CodeAnalysis.AnalyzerUtilities (555)
src\RoslynAnalyzers\Utilities\Compiler\Extensions\IOperationExtensions.cs (33)
62public static bool HasNullConstantValue(this IOperation operation)
67public static bool TryGetBoolConstantValue(this IOperation operation, out bool constantValue)
84public static ImmutableArray<IOperation> GetTopmostExplicitDescendants(this IOperation operation)
91var builder = ImmutableArray.CreateBuilder<IOperation>();
92var operationsToProcess = new Queue<IOperation>();
105foreach (var child in operation.Children)
121public static bool IsOperationNoneRoot(this IOperation operation)
132public static TOperation? GetAncestor<TOperation>(this IOperation root, OperationKind ancestorKind, Func<TOperation, bool>? predicate = null)
133where TOperation : class, IOperation
140var ancestor = root;
167public static IOperation? GetAncestor(this IOperation root, ImmutableArray<OperationKind> ancestorKinds, Func<IOperation, bool>? predicate = null)
174var ancestor = root;
209public static IOperation? GetInstance(this IInstanceReferenceOperation operation, bool isInsideAnonymousObjectInitializer)
216for (IOperation? current = operation; current != null && current.Kind != OperationKind.Block; current = current.Parent)
259public static IOperation GetRoot(this IOperation operation)
274private static readonly BoundedCache<Compilation, ConcurrentDictionary<IOperation, ControlFlowGraph?>> s_operationToCfgCache
277public static bool TryGetEnclosingControlFlowGraph(this IOperation operation, [NotNullWhen(returnValue: true)] out ControlFlowGraph? cfg)
294private static ControlFlowGraph? CreateControlFlowGraph(IOperation operation)
332this IOperation operation, IMethodSymbol lambdaOrLocalFunction, out PooledHashSet<ISymbol> builder)
343foreach (var child in operation.Descendants())
385public static bool IsWithinLambdaOrLocalFunction(this IOperation operation, [NotNullWhen(true)] out IOperation? containingLambdaOrLocalFunctionOperation)
422[NotNullWhen(returnValue: true)] out IOperation? elementOfParentTupleContainingTuple)
427IOperation previousOperation = tupleOperation;
428var currentOperation = tupleOperation.Parent;
460public static IOperation? GetInstance(this IInvocationOperation invocationOperation)
463public static IOperation? GetThrownException(this IThrowOperation operation)
465var thrownObject = operation.Exception;
489IOperation potentialLeftSide = operation;
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\CopyAnalysis\CopyAnalysis.CopyDataFlowOperationVisitor.cs (9)
39public override CopyAnalysisData Flow(IOperation statement, BasicBlock block, CopyAnalysisData input)
94protected override CopyAbstractValue GetCopyAbstractValue(IOperation operation) => base.GetCachedAbstractValue(operation);
106protected override void SetAbstractValueForAssignment(AnalysisEntity targetAnalysisEntity, IOperation? assignedValueOperation, CopyAbstractValue assignedValue)
118protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, CopyAbstractValue assignedValue)
305protected override CopyAbstractValue ComputeAnalysisValueForReferenceOperation(IOperation operation, CopyAbstractValue defaultValue)
327IOperation leftOperand,
328IOperation rightOperand,
380protected override PredicateValueKind SetValueForIsNullComparisonOperator(IOperation leftOperand, bool equals, CopyAnalysisData targetAnalysisData) => PredicateValueKind.Unknown;
594public override CopyAbstractValue DefaultVisit(IOperation operation, object? argument)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\DisposeAnalysis\DisposeAnalysis.DisposeDataFlowOperationVisitor.cs (14)
81protected override DisposeAbstractValue HandleInstanceCreation(IOperation creation, PointsToAbstractValue instanceLocation, DisposeAbstractValue defaultValue)
108private void HandleDisposingOperation(IOperation disposingOperation, IOperation? disposedInstance)
126private void HandlePossibleInvalidatingOperation(IOperation invalidatedInstance)
139private void HandlePossibleEscapingOperation(IOperation escapingOperation, ImmutableHashSet<AbstractLocation> escapedLocations)
152protected override void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, DisposeAbstractValue value)
158protected override void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, DisposeAbstractValue assignedValue, bool mayBeAssignment = false)
164protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, DisposeAbstractValue assignedValue)
220public override DisposeAbstractValue DefaultVisit(IOperation operation, object? argument)
226public override DisposeAbstractValue Visit(IOperation? operation, object? argument)
236protected override void HandlePossibleThrowingOperation(IOperation operation)
259IOperation? visitedInstance,
262IOperation originalOperation,
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\ParameterValidationAnalysis\ParameterValidationAnalysis.ParameterValidationDataFlowOperationVisitor.cs (15)
97protected override void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, ParameterValidationAbstractValue assignedValue, bool mayBeAssignment = false)
106protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, ParameterValidationAbstractValue assignedValue)
111protected override void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, ParameterValidationAbstractValue value)
146private void MarkValidatedLocations(IOperation operation)
149private IEnumerable<AbstractLocation> GetNotValidatedLocations(IOperation operation)
155private static bool IsHazardousIfNull(IOperation operation)
174private void HandlePotentiallyHazardousOperation(IOperation operation, IEnumerable<AbstractLocation> nonValidatedLocations)
220public override ParameterValidationAbstractValue Visit(IOperation? operation, object? argument)
252IOperation? visitedInstance,
255IOperation originalOperation,
266IOperation originalOperation,
277IOperation originalOperation,
285private void ProcessRegularInvocationOrCreation(IMethodSymbol? targetMethod, ImmutableArray<IArgumentOperation> arguments, IOperation operation)
356private void ProcessLambdaOrLocalFunctionInvocation(IMethodSymbol targetMethod, IOperation invocation)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\PointsToAnalysis\PointsToAnalysis.PointsToDataFlowOperationVisitor.cs (44)
30private readonly PooledDictionary<IOperation, ImmutableHashSet<AbstractLocation>.Builder> _escapedOperationLocationsBuilder;
31private readonly PooledDictionary<IOperation, ImmutableHashSet<AbstractLocation>.Builder> _escapedReturnValueLocationsBuilder;
44_escapedOperationLocationsBuilder = PooledDictionary<IOperation, ImmutableHashSet<AbstractLocation>.Builder>.GetInstance();
45_escapedReturnValueLocationsBuilder = PooledDictionary<IOperation, ImmutableHashSet<AbstractLocation>.Builder>.GetInstance();
53public ImmutableDictionary<IOperation, ImmutableHashSet<AbstractLocation>> GetEscapedLocationsThroughOperationsMap()
56public ImmutableDictionary<IOperation, ImmutableHashSet<AbstractLocation>> GetEscapedLocationsThroughReturnValuesMap()
99public override PointsToAnalysisData Flow(IOperation statement, BasicBlock block, PointsToAnalysisData input)
169protected override PointsToAbstractValue GetPointsToAbstractValue(IOperation operation) => base.GetCachedAbstractValue(operation);
195protected override CopyAbstractValue GetCopyAbstractValue(IOperation operation)
212protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, PointsToAbstractValue assignedValue)
273protected override PointsToAbstractValue ComputeAnalysisValueForReferenceOperation(IOperation operation, PointsToAbstractValue defaultValue)
332protected override void ProcessReturnValue(IOperation? returnValue)
344private protected override PointsToAbstractValue GetAbstractValueForImplicitWrappingTaskCreation(IOperation returnValueOperation, PointsToAbstractValue returnValue, PointsToAbstractValue implicitTaskPointsToValue)
361IOperation leftOperand,
362IOperation rightOperand,
380protected override PredicateValueKind SetValueForIsNullComparisonOperator(IOperation leftOperand, bool equals, PointsToAnalysisData targetAnalysisData)
388IOperation target,
389IOperation assignedValueOperation,
399IOperation target,
627private void HandleEscapingOperation(IOperation escapingOperation, IOperation escapedInstance)
632private void HandleEscapingOperation(IOperation escapingOperation, IOperation escapedInstance, PooledDictionary<IOperation, ImmutableHashSet<AbstractLocation>.Builder> builder)
637foreach (var capturedOperation in escapedInstancePointsToValue.LValueCapturedOperations)
718private void HandlePossibleEscapingForAssignment(IOperation target, IOperation value, IOperation operation)
730protected override void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, PointsToAbstractValue assignedValue, bool mayBeAssignment = false)
740protected override void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, PointsToAbstractValue value)
751public override PointsToAbstractValue DefaultVisit(IOperation operation, object? argument)
787IOperation? currentInstanceOperation = operation.GetInstance(IsInsideAnonymousObjectInitializer);
799where TOperation : IOperation
921private PointsToAbstractValue VisitInvocationCommon(IOperation operation, IOperation? instance)
942IOperation? visitedInstance,
945IOperation originalOperation,
1029IOperation originalOperation,
1039IOperation originalOperation,
1052private NullAbstractValue GetNullStateBasedOnInstanceOrReferenceValue(IOperation? referenceOrInstance, ITypeSymbol? operationType, NullAbstractValue defaultValue)
1068private PointsToAbstractValue GetValueBasedOnInstanceOrReferenceValue(IOperation? referenceOrInstance, IOperation operation, PointsToAbstractValue defaultValue)
1209IOperation operation,
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\PropertySetAnalysis\PropertySetAnalysis.PropertySetDataFlowOperationVisitor.cs (20)
135protected override void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, PropertySetAbstractValue value)
139protected override void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, PropertySetAbstractValue assignedValue, bool mayBeAssignment = false)
143protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, PropertySetAbstractValue assignedValue)
200out IOperation? propertySetInstance))
232if (this.TryUnwrapFlowCaptureReference(operation.Target, out IOperation? lValueOperation, OperationKind.PropertyReference, OperationKind.FieldReference))
279this.TryUnwrapFlowCaptureReference(operation.Target, out IOperation? lValue, OperationKind.PropertyReference);
456public override PropertySetAbstractValue VisitInvocation_NonLambdaOrDelegateOrLocalFunction(IMethodSymbol method, IOperation? visitedInstance, ImmutableArray<IArgumentOperation> visitedArguments, bool invokedAsDelegate, IOperation originalOperation, PropertySetAbstractValue defaultValue)
478IOperation? propertySetInstance = visitedInstance;
516[NotNullWhen(returnValue: true)] out IOperation? instance)
532IOperation value = argumentOperation.Value;
597IOperation propertySetInstance,
635public override PropertySetAbstractValue VisitInvocation_LocalFunction(IMethodSymbol localFunction, ImmutableArray<IArgumentOperation> visitedArguments, IOperation originalOperation, PropertySetAbstractValue defaultValue)
643public override PropertySetAbstractValue VisitInvocation_Lambda(IFlowAnonymousFunctionOperation lambda, ImmutableArray<IArgumentOperation> visitedArguments, IOperation originalOperation, PropertySetAbstractValue defaultValue)
651protected override void ProcessReturnValue(IOperation? returnValue)
668private void MergeInterproceduralResults(IOperation originalOperation)
705private bool TryUnwrapFlowCaptureReference(IOperation flowCaptureReferenceOperation, [NotNullWhen(returnValue: true)] out IOperation? unwrappedOperation, params OperationKind[] kinds)
713IOperation lValueOperation = lValuePointsToAbstractValue.LValueCapturedOperations.First();
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\TaintedDataAnalysis\TaintedDataAnalysis.TaintedDataOperationVisitor.cs (12)
176public override TaintedDataAbstractValue DefaultVisit(IOperation operation, object? argument)
185foreach (IOperation childOperation in operation.ChildOperations)
231protected override TaintedDataAbstractValue ComputeAnalysisValueForReferenceOperation(IOperation operation, TaintedDataAbstractValue defaultValue)
263IOperation? visitedInstance,
266IOperation originalOperation,
352IOperation? thenTaintedTargetOperation = visitedInstance != null && thenTaintedTarget == TaintedTargetValue.This
357var operation = visitedInstance != null && ifTaintedParameter == TaintedTargetValue.This
423public override TaintedDataAbstractValue VisitInvocation_LocalFunction(IMethodSymbol localFunction, ImmutableArray<IArgumentOperation> visitedArguments, IOperation originalOperation, TaintedDataAbstractValue defaultValue)
437public override TaintedDataAbstractValue VisitInvocation_Lambda(IFlowAnonymousFunctionOperation lambda, ImmutableArray<IArgumentOperation> visitedArguments, IOperation originalOperation, TaintedDataAbstractValue defaultValue)
491.Select<IOperation, TaintedDataAbstractValue>(this.GetCachedAbstractValue)
561IOperation originalOperation)
763private void SetTaintedForEntity(IOperation operation, TaintedDataAbstractValue value)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Analysis\ValueContentAnalysis\ValueContentAnalysis.ValueContentDataFlowOperationVisitor.cs (9)
78protected override CopyAbstractValue GetCopyAbstractValue(IOperation operation)
93protected override PredicateValueKind SetValueForIsNullComparisonOperator(IOperation leftOperand, bool equals, ValueContentAnalysisData targetAnalysisData)
97IOperation leftOperand,
98IOperation rightOperand,
114private void SetValueForComparisonOperator(IOperation target, IOperation assignedValue, bool equals, ref PredicateValueKind predicateValueKind, ValueContentAnalysisData targetAnalysisData)
184public override ValueContentAbstractValue DefaultVisit(IOperation operation, object? argument)
272IOperation? visitedInstance,
275IOperation originalOperation,
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\AbstractLocation.cs (23)
22/// 1. An allocation or an object creation operation (<see cref="CreateAllocationLocation(IOperation, ITypeSymbol, PointsToAnalysisContext)"/>).
23/// 2. Location for the implicit 'this' or 'Me' instance being analyzed (<see cref="CreateThisOrMeLocation(INamedTypeSymbol, ImmutableStack{IOperation})"/>).
24/// 3. Location created for certain symbols which do not have a declaration in executable code, i.e. no <see cref="IOperation"/> for declaration (such as parameter symbols, member symbols, etc. - <see cref="CreateSymbolLocation(ISymbol, ImmutableStack{IOperation})"/>/>).
26/// See <see cref="CreateFlowCaptureLocation(InterproceduralCaptureId, ITypeSymbol, ImmutableStack{IOperation})"/>
35private AbstractLocation(IOperation? creation, ImmutableStack<IOperation>? creationCallStack, AnalysisEntity? analysisEntity, ISymbol? symbol, InterproceduralCaptureId? captureId, ITypeSymbol? locationType, bool isSpecialSingleton)
40CreationCallStack = creationCallStack ?? ImmutableStack<IOperation>.Empty;
48private static AbstractLocation Create(IOperation? creation, ImmutableStack<IOperation>? creationCallStack, AnalysisEntity? analysisEntity, ISymbol? symbol, InterproceduralCaptureId? captureId, ITypeSymbol? locationType)
56public static AbstractLocation CreateAllocationLocation(IOperation creation, ITypeSymbol locationType, PointsToAnalysisContext analysisContext)
58internal static AbstractLocation CreateAllocationLocation(IOperation creation, ITypeSymbol locationType, ImmutableStack<IOperation>? callStack)
62public static AbstractLocation CreateThisOrMeLocation(INamedTypeSymbol namedTypeSymbol, ImmutableStack<IOperation>? creationCallStack)
64public static AbstractLocation CreateSymbolLocation(ISymbol symbol, ImmutableStack<IOperation>? creationCallStack)
66public static AbstractLocation CreateFlowCaptureLocation(InterproceduralCaptureId captureId, ITypeSymbol locationType, ImmutableStack<IOperation>? creationCallStack)
69public IOperation? Creation { get; }
70public ImmutableStack<IOperation> CreationCallStack { get; }
76public IOperation? GetTopOfCreationCallStackOrCreation()
134foreach (var creation in CreationCallStack)
154SyntaxNode? TryGetSyntaxNodeToReportDiagnostic(IOperation creation, PointsToAnalysisResult pointsToAnalysisResult)
177SyntaxNode? TryGetSyntaxNodeToReportDiagnosticCore(IOperation operation)
182SyntaxNode? TryGetSyntaxNodeToReportDiagnosticForPointsValue(PointsToAbstractValue pointsToValue, IOperation operation)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\AnalysisEntityDataFlowOperationVisitor.cs (11)
47protected override TAbstractAnalysisValue ComputeAnalysisValueForReferenceOperation(IOperation operation, TAbstractAnalysisValue defaultValue)
191protected override TAnalysisData GetMergedAnalysisDataForPossibleThrowingOperation(TAnalysisData? existingData, IOperation operation)
210protected override void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, TAbstractAnalysisValue value)
218protected override void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, TAbstractAnalysisValue assignedValue, bool mayBeAssignment = false)
238protected override void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, TAbstractAnalysisValue assignedValue)
252protected virtual void SetAbstractValueForAssignment(AnalysisEntity targetAnalysisEntity, IOperation? assignedValueOperation, TAbstractAnalysisValue assignedValue)
264private void SetAbstractValueForAssignment(AnalysisEntity targetAnalysisEntity, AnalysisEntity? assignedValueEntity, IOperation? assignedValueOperation, TAbstractAnalysisValue assignedValue)
360private void TransferValueTypeInstanceAnalysisDataForAssignment(AnalysisEntity targetAnalysisEntity, AnalysisEntity? valueAnalysisEntity, IOperation? assignedValueOperation)
759private void HandleDeconstructionAssignment(IOperation target, ImmutableHashSet<AnalysisEntity> childEntities)
772var element = tupleOperation.Elements[i];
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\AnalysisEntityFactory.cs (20)
30private readonly Dictionary<IOperation, AnalysisEntity?> _analysisEntityMap;
35private readonly Func<IOperation, PointsToAbstractValue>? _getPointsToAbstractValue;
39private readonly ImmutableStack<IOperation>? _interproceduralCallStack;
40private readonly Func<IOperation, AnalysisEntity?>? _interproceduralGetAnalysisEntityForFlowCapture;
41private readonly Func<ISymbol, ImmutableStack<IOperation>?> _getInterproceduralCallStackForOwningSymbol;
46Func<IOperation, PointsToAbstractValue>? getPointsToAbstractValue,
52ImmutableStack<IOperation>? interproceduralCallStack,
54Func<IOperation, AnalysisEntity?>? interproceduralGetAnalysisEntityForFlowCapture,
55Func<ISymbol, ImmutableStack<IOperation>?> getInterproceduralCallStackForOwningSymbol)
93where T : IOperation
109private static AbstractIndex CreateAbstractIndex(IOperation operation)
125public bool TryCreate(IOperation operation, [NotNullWhen(returnValue: true)] out AnalysisEntity? analysisEntity)
135IOperation? instance = null;
316IOperation? instance = null;
349if (tupleOperation.TryGetParentTupleOperation(out var parentTupleOperationOpt, out var elementOfParentTupleContainingTuple) &&
410public bool TryGetForInterproceduralAnalysis(IOperation operation, out AnalysisEntity? analysisEntity)
413private AnalysisEntity GetOrCreateForFlowCapture(CaptureId captureId, ITypeSymbol? type, IOperation flowCaptureOrReference, bool isLValueFlowCapture)
440ITypeSymbol type, IOperation? instance, [NotNullWhen(returnValue: true)] out AnalysisEntity? analysisEntity)
532ImmutableStack<IOperation>? interproceduralCallStackForSymbolDeclaration;
540interproceduralCallStackForSymbolDeclaration = ImmutableStack<IOperation>.Empty;
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\DataFlowAnalysisResult.cs (11)
26private readonly ImmutableDictionary<IOperation, TAbstractAnalysisValue> _operationStateMap;
27private readonly ImmutableDictionary<IOperation, PredicateValueKind> _predicateValueKindMap;
28private readonly ImmutableDictionary<IOperation, IDataFlowAnalysisResult<TAbstractAnalysisValue>> _interproceduralResultsMap;
35ImmutableDictionary<IOperation, TAbstractAnalysisValue> operationStateMap,
36ImmutableDictionary<IOperation, PredicateValueKind> predicateValueKindMap,
38ImmutableDictionary<IOperation, IDataFlowAnalysisResult<TAbstractAnalysisValue>> interproceduralResultsMap,
87internal DataFlowAnalysisResult<TBlockAnalysisResult, TAbstractAnalysisValue> With(ImmutableDictionary<IOperation, TAbstractAnalysisValue> operationStateMap)
98public TAbstractAnalysisValue this[IOperation operation]
147internal DataFlowAnalysisResult<TBlockAnalysisResult, TAbstractAnalysisValue>? TryGetInterproceduralResult(IOperation operation)
168internal IEnumerable<DataFlowAnalysisResult<TBlockAnalysisResult, TAbstractAnalysisValue>> TryGetLambdaOrLocalFunctionResults(IOperation lambdaOrLocalFunctionOperation)
222public PredicateValueKind GetPredicateKind(IOperation operation) => _predicateValueKindMap.TryGetValue(operation, out var valueKind) ? valueKind : PredicateValueKind.Unknown;
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\DataFlowOperationVisitor.cs (91)
47private readonly ImmutableDictionary<IOperation, TAbstractAnalysisValue>.Builder _valueCacheBuilder;
48private readonly ImmutableDictionary<IOperation, PredicateValueKind>.Builder _predicateValueKindCacheBuilder;
51private readonly HashSet<IOperation> _visitedFlowBranchConditions;
53private readonly HashSet<IOperation>? _returnValueOperations;
113private readonly Stack<IOperation> _interproceduralCallStack;
118private readonly ImmutableDictionary<IOperation, IDataFlowAnalysisResult<TAbstractAnalysisValue>>.Builder _interproceduralResultsBuilder;
152public ImmutableDictionary<IOperation, IDataFlowAnalysisResult<TAbstractAnalysisValue>> InterproceduralResultsMap => _interproceduralResultsBuilder.ToImmutable();
275_valueCacheBuilder = ImmutableDictionary.CreateBuilder<IOperation, TAbstractAnalysisValue>();
276_predicateValueKindCacheBuilder = ImmutableDictionary.CreateBuilder<IOperation, PredicateValueKind>();
281_returnValueOperations = OwningSymbol is IMethodSymbol method && !method.ReturnsVoid ? new HashSet<IOperation>() : null;
282_interproceduralResultsBuilder = ImmutableDictionary.CreateBuilder<IOperation, IDataFlowAnalysisResult<TAbstractAnalysisValue>>();
289_interproceduralCallStack = new Stack<IOperation>();
298foreach (var operation in analysisContext.InterproceduralAnalysisData.CallStack)
377foreach (var operation in _returnValueOperations)
419public virtual TAnalysisData Flow(IOperation statement, BasicBlock block, TAnalysisData input)
428private void AfterVisitRoot(IOperation operation)
434foreach (var descendant in operation.DescendantsAndSelf())
806IOperation returnValueOperation,
814protected virtual void ProcessReturnValue(IOperation? returnValue)
829private TAbstractAnalysisValue GetAbstractValueForReturnOperation(IOperation returnValueOperation, out PointsToAbstractValue? implicitTaskPointsToValue)
850protected virtual void HandlePossibleThrowingOperation(IOperation operation)
869IOperation? instance = null;
870IOperation? invocation = null;
930protected virtual TAnalysisData GetMergedAnalysisDataForPossibleThrowingOperation(TAnalysisData? existingData, IOperation operation)
1019internal ImmutableDictionary<IOperation, TAbstractAnalysisValue> GetStateMap() => _valueCacheBuilder.ToImmutable();
1021internal ImmutableDictionary<IOperation, PredicateValueKind> GetPredicateValueKindMap() => _predicateValueKindCacheBuilder.ToImmutable();
1045public TAbstractAnalysisValue GetCachedAbstractValue(IOperation operation)
1079protected void CacheAbstractValue(IOperation operation, TAbstractAnalysisValue value)
1089protected NullAbstractValue GetNullAbstractValue(IOperation operation) => GetPointsToAbstractValue(operation).NullState;
1091protected virtual CopyAbstractValue GetCopyAbstractValue(IOperation operation)
1103protected virtual PointsToAbstractValue GetPointsToAbstractValue(IOperation operation)
1115protected virtual ValueContentAbstractValue GetValueContentAbstractValue(IOperation operation)
1127protected ImmutableHashSet<AbstractLocation> GetEscapedLocations(IOperation operation)
1211protected virtual TAbstractAnalysisValue ComputeAnalysisValueForReferenceOperation(IOperation operation, TAbstractAnalysisValue defaultValue)
1247IOperation sourceOperand,
1250IOperation operation,
1386private void PerformPredicateAnalysis(IOperation operation)
1495var current = operation.Parent;
1515var current = operation.Parent;
1544private void PerformPredicateAnalysisCore(IOperation operation, TAnalysisData targetAnalysisData)
1715IOperation? leftOperand = null;
1716IOperation? rightOperand = null;
1788bool IsNotNullWhenFalse(IOperation operation)
1806bool IsNotNullWhenTrue(IOperation operation)
1825protected virtual void SetPredicateValueKind(IOperation operation, TAnalysisData analysisData, PredicateValueKind predicateValueKind)
1894protected virtual PredicateValueKind SetValueForEqualsOrNotEqualsComparisonOperator(IOperation leftOperand, IOperation rightOperand, bool equals, bool isReferenceEquality, TAnalysisData targetAnalysisData)
1900protected virtual PredicateValueKind SetValueForIsNullComparisonOperator(IOperation leftOperand, bool equals, TAnalysisData targetAnalysisData)
1939protected virtual void ProcessThrowValue(IOperation? thrownValue)
1946protected abstract void SetAbstractValueForArrayElementInitializer(IArrayCreationOperation arrayCreation, ImmutableArray<AbstractIndex> indices, ITypeSymbol elementType, IOperation initializer, TAbstractAnalysisValue value);
1947protected abstract void SetAbstractValueForAssignment(IOperation target, IOperation? assignedValueOperation, TAbstractAnalysisValue assignedValue, bool mayBeAssignment = false);
1948protected abstract void SetAbstractValueForTupleElementAssignment(AnalysisEntity tupleElementEntity, IOperation assignedValueOperation, TAbstractAnalysisValue assignedValue);
1949private void HandleFlowCaptureReferenceAssignment(IFlowCaptureReferenceOperation flowCaptureReference, IOperation assignedValueOperation, TAbstractAnalysisValue assignedValue)
1962var target = pointsToValue.LValueCapturedOperations.First();
1973foreach (var capturedOperation in pointsToValue.LValueCapturedOperations)
1984foreach (var capturedOperation in pointsToValue.LValueCapturedOperations)
2024private void ResetValueTypeInstanceAnalysisData(IOperation operation)
2043private void ResetReferenceTypeInstanceAnalysisData(IOperation operation)
2061private void ResetInstanceAnalysisData(IOperation? operation)
2189protected bool TryGetInterproceduralAnalysisResult(IOperation operation, [NotNullWhen(returnValue: true)] out TAnalysisResult? analysisResult)
2204IOperation? instanceReceiver,
2206IOperation originalOperation,
2347var popped = _interproceduralCallStack.Pop();
2574AnalysisEntity? GetAnalysisEntityForFlowCapture(IOperation operation)
2760protected TAbstractAnalysisValue VisitArray(IEnumerable<IOperation> operations, object? argument)
2762foreach (var operation in operations)
2770public override TAbstractAnalysisValue Visit(IOperation? operation, object? argument)
2805private TAbstractAnalysisValue VisitCore(IOperation operation, object? argument)
2824public override TAbstractAnalysisValue DefaultVisit(IOperation operation, object? argument)
2905IOperation elementInitializer = operation.ElementValues[index];
3287using var _1 = PooledHashSet<(IMethodSymbol method, IOperation? instance)>.GetInstance(out var methodTargetsOptBuilder);
3312PooledHashSet<(IMethodSymbol method, IOperation? instance)> methodTargetsOptBuilder,
3317IOperation operation,
3318PooledHashSet<(IMethodSymbol method, IOperation? instance)> methodTargetsOptBuilder,
3323IOperation? operation,
3325PooledHashSet<(IMethodSymbol method, IOperation? instance)> methodTargetsOptBuilder,
3331IOperation? instance;
3379void AddMethodTarget(IMethodSymbol method, IOperation? instance)
3393bool HandleCreationOpt(IOperation? creation)
3438out ImmutableHashSet<(IMethodSymbol method, IOperation? instance)>? resolvedMethodTargets)
3442using var _1 = PooledHashSet<(IMethodSymbol method, IOperation? instance)>.GetInstance(out var methodTargetsOptBuilder);
3535IOperation? visitedInstance,
3538IOperation originalOperation,
3566private ImmutableStack<IOperation>? GetInterproceduralCallStackForOwningSymbol(ISymbol forOwningSymbol)
3579IOperation originalOperation,
3597IOperation originalOperation,
3637public virtual void HandleEnterLockOperation(IOperation lockedObject)
3669foreach (var element in operation.Elements)
3687var assignedValueOperation = operation.Elements[i];
3695foreach (var element in operation.Elements)
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\InterproceduralAnalysisConfiguration.cs (1)
95IOperation operation,
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\OperationExtensions.cs (32)
18public static bool IsTargetOfObjectMemberInitializer(this IOperation operation)
34public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
239public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
259public static bool IsInLeftOfDeconstructionAssignment(this IOperation operation, [NotNullWhen(true)] out IDeconstructionAssignmentOperation? deconstructionAssignment)
263var previousOperation = operation;
264var current = operation.Parent;
295public static bool IsAnyCompoundAssignment(this IOperation operation)
308public static bool IsInsideCatchRegion(this IOperation operation, ControlFlowGraph cfg)
328foreach (var descendant in block.DescendantOperations())
341public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
343foreach (var operationBlock in operationBlocks)
354public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
357public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(true)] out IOperation? foundOperation)
361foreach (var descendant in operationBlock.DescendantsAndSelf())
374public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
377public static bool IsNumericLiteral(this IOperation operation)
380public static bool IsNullLiteral(this IOperation operand)
389public static IOperation? WalkDownConversion(this IOperation? operation)
399public static bool IsSingleThrowNotImplementedOperation([NotNullWhen(true)] this IOperation? firstBlock)
415var firstOp = block.Operations.Length == 1
437static IOperation? TryGetSingleExplicitStatement(ImmutableArray<IOperation> operations)
439IOperation? firstOp = null;
440foreach (var operation in operations)
454static bool IsThrowNotImplementedOperation(INamedTypeSymbol notImplementedExceptionType, IOperation? operation)
461public static IOperation? UnwrapImplicitConversion(this IOperation? value)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.AnalysisData.cs (14)
61protected abstract PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
132public abstract void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId);
137public abstract void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol);
138public abstract void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget);
139public abstract void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget);
140public abstract void SetEmptyInvocationTargetsForDelegate(IOperation write);
141public abstract bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets);
143protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> CreateSymbolsWriteMap(
146var symbolsWriteMap = PooledDictionary<(ISymbol Symbol, IOperation Write), bool>.GetInstance();
150protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> UpdateSymbolsWriteMap(
151PooledDictionary<(ISymbol Symbol, IOperation Write), bool> symbolsWriteMap,
158(ISymbol, IOperation) key = (parameter, null);
201public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten, bool isRef)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.BasicBlockAnalysisData.cs (9)
28private readonly Dictionary<ISymbol, PooledHashSet<IOperation>> _reachingWrites;
74public void ForEachCurrentWrite<TArg>(ISymbol symbol, Action<IOperation, TArg> action, TArg arg)
86public bool ForEachCurrentWrite<TArg>(ISymbol symbol, Func<IOperation, TArg, bool> action, TArg arg)
90foreach (var value in values)
104public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten)
108values = PooledHashSet<IOperation>.GetInstance();
223private static void AddEntries(Dictionary<ISymbol, PooledHashSet<IOperation>> result, BasicBlockAnalysisData source)
231values = PooledHashSet<IOperation>.GetInstance();
240foreach (var operation in operations)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (33)
41private readonly PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>> _lValueFlowCapturesMap;
48private readonly PooledDictionary<IOperation, PooledHashSet<IOperation>> _reachingDelegateCreationTargets;
69private readonly PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>> _symbolWritesInsideBlockRangeMap;
77PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
81PooledDictionary<IOperation, PooledHashSet<IOperation>> reachingDelegateCreationTargets,
99_lValueFlowCapturesMap = PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
103_symbolWritesInsideBlockRangeMap = PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
110protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
134reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
189foreach (var operation in cfg.OriginalOperation.Descendants())
215private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
220var operations = PooledHashSet<IOperation>.GetInstance();
224writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
241PooledHashSet<IOperation> operationsBuilder,
248foreach (var operation in cfg.Blocks[i].DescendantOperations())
273void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
275foreach (var target in targets)
462public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
466captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
514public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
522var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
544foreach (var target in targetsBuilderForSymbolWrite)
561public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
571public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
583public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
586private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
588var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
597public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.OperationTreeAnalysisData.cs (9)
21PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
34protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
63public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
69public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
71public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
73public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
75public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
77public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.Walker.cs (20)
27private IOperation _currentRootOperation;
29private PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>> _pendingWritesMap;
36IEnumerable<IOperation> operations,
51private void Visit(ISymbol containingSymbol, IEnumerable<IOperation> operations, AnalysisData analysisData, CancellationToken cancellationToken)
58_pendingWritesMap = PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
65foreach (var operation in operations)
93private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo)
101private void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
107private void OnReferenceFound(ISymbol symbol, IOperation operation)
159private bool MakePendingWrite(IOperation operation, ISymbol symbolOpt)
166var set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
175set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
407private void ProcessPossibleDelegateCreationAssignment(ISymbol symbol, IOperation write)
415IOperation initializerValue = null;
431private void ProcessPossibleDelegateCreation(IOperation creation, IOperation write)
433var currentOperation = creation;
497private void AnalyzePossibleDelegateInvocation(IOperation operation)
534foreach (var target in targets)
549void AnalyzeDelegateInvocation(IOperation target)
Microsoft.CodeAnalysis.BannedApiAnalyzers (213)
src\RoslynAnalyzers\Utilities\Compiler\Extensions\IOperationExtensions.cs (33)
62public static bool HasNullConstantValue(this IOperation operation)
67public static bool TryGetBoolConstantValue(this IOperation operation, out bool constantValue)
84public static ImmutableArray<IOperation> GetTopmostExplicitDescendants(this IOperation operation)
91var builder = ImmutableArray.CreateBuilder<IOperation>();
92var operationsToProcess = new Queue<IOperation>();
105foreach (var child in operation.Children)
121public static bool IsOperationNoneRoot(this IOperation operation)
132public static TOperation? GetAncestor<TOperation>(this IOperation root, OperationKind ancestorKind, Func<TOperation, bool>? predicate = null)
133where TOperation : class, IOperation
140var ancestor = root;
167public static IOperation? GetAncestor(this IOperation root, ImmutableArray<OperationKind> ancestorKinds, Func<IOperation, bool>? predicate = null)
174var ancestor = root;
209public static IOperation? GetInstance(this IInstanceReferenceOperation operation, bool isInsideAnonymousObjectInitializer)
216for (IOperation? current = operation; current != null && current.Kind != OperationKind.Block; current = current.Parent)
259public static IOperation GetRoot(this IOperation operation)
274private static readonly BoundedCache<Compilation, ConcurrentDictionary<IOperation, ControlFlowGraph?>> s_operationToCfgCache
277public static bool TryGetEnclosingControlFlowGraph(this IOperation operation, [NotNullWhen(returnValue: true)] out ControlFlowGraph? cfg)
294private static ControlFlowGraph? CreateControlFlowGraph(IOperation operation)
332this IOperation operation, IMethodSymbol lambdaOrLocalFunction, out PooledHashSet<ISymbol> builder)
343foreach (var child in operation.Descendants())
385public static bool IsWithinLambdaOrLocalFunction(this IOperation operation, [NotNullWhen(true)] out IOperation? containingLambdaOrLocalFunctionOperation)
422[NotNullWhen(returnValue: true)] out IOperation? elementOfParentTupleContainingTuple)
427IOperation previousOperation = tupleOperation;
428var currentOperation = tupleOperation.Parent;
460public static IOperation? GetInstance(this IInvocationOperation invocationOperation)
463public static IOperation? GetThrownException(this IThrowOperation operation)
465var thrownObject = operation.Exception;
489IOperation potentialLeftSide = operation;
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\OperationExtensions.cs (32)
18public static bool IsTargetOfObjectMemberInitializer(this IOperation operation)
34public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
239public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
259public static bool IsInLeftOfDeconstructionAssignment(this IOperation operation, [NotNullWhen(true)] out IDeconstructionAssignmentOperation? deconstructionAssignment)
263var previousOperation = operation;
264var current = operation.Parent;
295public static bool IsAnyCompoundAssignment(this IOperation operation)
308public static bool IsInsideCatchRegion(this IOperation operation, ControlFlowGraph cfg)
328foreach (var descendant in block.DescendantOperations())
341public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
343foreach (var operationBlock in operationBlocks)
354public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
357public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(true)] out IOperation? foundOperation)
361foreach (var descendant in operationBlock.DescendantsAndSelf())
374public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
377public static bool IsNumericLiteral(this IOperation operation)
380public static bool IsNullLiteral(this IOperation operand)
389public static IOperation? WalkDownConversion(this IOperation? operation)
399public static bool IsSingleThrowNotImplementedOperation([NotNullWhen(true)] this IOperation? firstBlock)
415var firstOp = block.Operations.Length == 1
437static IOperation? TryGetSingleExplicitStatement(ImmutableArray<IOperation> operations)
439IOperation? firstOp = null;
440foreach (var operation in operations)
454static bool IsThrowNotImplementedOperation(INamedTypeSymbol notImplementedExceptionType, IOperation? operation)
461public static IOperation? UnwrapImplicitConversion(this IOperation? value)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.AnalysisData.cs (14)
61protected abstract PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
132public abstract void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId);
137public abstract void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol);
138public abstract void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget);
139public abstract void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget);
140public abstract void SetEmptyInvocationTargetsForDelegate(IOperation write);
141public abstract bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets);
143protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> CreateSymbolsWriteMap(
146var symbolsWriteMap = PooledDictionary<(ISymbol Symbol, IOperation Write), bool>.GetInstance();
150protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> UpdateSymbolsWriteMap(
151PooledDictionary<(ISymbol Symbol, IOperation Write), bool> symbolsWriteMap,
158(ISymbol, IOperation) key = (parameter, null);
201public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten, bool isRef)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.BasicBlockAnalysisData.cs (9)
28private readonly Dictionary<ISymbol, PooledHashSet<IOperation>> _reachingWrites;
74public void ForEachCurrentWrite<TArg>(ISymbol symbol, Action<IOperation, TArg> action, TArg arg)
86public bool ForEachCurrentWrite<TArg>(ISymbol symbol, Func<IOperation, TArg, bool> action, TArg arg)
90foreach (var value in values)
104public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten)
108values = PooledHashSet<IOperation>.GetInstance();
223private static void AddEntries(Dictionary<ISymbol, PooledHashSet<IOperation>> result, BasicBlockAnalysisData source)
231values = PooledHashSet<IOperation>.GetInstance();
240foreach (var operation in operations)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (33)
41private readonly PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>> _lValueFlowCapturesMap;
48private readonly PooledDictionary<IOperation, PooledHashSet<IOperation>> _reachingDelegateCreationTargets;
69private readonly PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>> _symbolWritesInsideBlockRangeMap;
77PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
81PooledDictionary<IOperation, PooledHashSet<IOperation>> reachingDelegateCreationTargets,
99_lValueFlowCapturesMap = PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
103_symbolWritesInsideBlockRangeMap = PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
110protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
134reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
189foreach (var operation in cfg.OriginalOperation.Descendants())
215private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
220var operations = PooledHashSet<IOperation>.GetInstance();
224writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
241PooledHashSet<IOperation> operationsBuilder,
248foreach (var operation in cfg.Blocks[i].DescendantOperations())
273void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
275foreach (var target in targets)
462public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
466captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
514public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
522var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
544foreach (var target in targetsBuilderForSymbolWrite)
561public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
571public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
583public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
586private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
588var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
597public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.OperationTreeAnalysisData.cs (9)
21PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
34protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
63public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
69public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
71public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
73public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
75public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
77public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.Walker.cs (20)
27private IOperation _currentRootOperation;
29private PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>> _pendingWritesMap;
36IEnumerable<IOperation> operations,
51private void Visit(ISymbol containingSymbol, IEnumerable<IOperation> operations, AnalysisData analysisData, CancellationToken cancellationToken)
58_pendingWritesMap = PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
65foreach (var operation in operations)
93private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo)
101private void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
107private void OnReferenceFound(ISymbol symbol, IOperation operation)
159private bool MakePendingWrite(IOperation operation, ISymbol symbolOpt)
166var set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
175set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
407private void ProcessPossibleDelegateCreationAssignment(ISymbol symbol, IOperation write)
415IOperation initializerValue = null;
431private void ProcessPossibleDelegateCreation(IOperation creation, IOperation write)
433var currentOperation = creation;
497private void AnalyzePossibleDelegateInvocation(IOperation operation)
534foreach (var target in targets)
549void AnalyzeDelegateInvocation(IOperation target)
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\LanguageServices\InitializeParameter\InitializeParameterHelpersCore.cs (11)
38public static bool IsParameterReference(IOperation? operation, IParameterSymbol parameter)
43IOperation? value, IParameterSymbol parameter)
76public static IOperation? TryFindFieldOrPropertyAssignmentStatement(IParameterSymbol parameter, IBlockOperation? blockStatement)
79private static IOperation? TryFindFieldOrPropertyAssignmentStatement(
85foreach (var statement in blockStatement.Operations)
99var target = targetTuple.Elements[i];
100var value = valueTuple.Elements[i];
117IOperation operation,
146IOperation? operation, INamedTypeSymbol containingType,
163public static bool IsFieldOrPropertyAssignment(IOperation statement, INamedTypeSymbol containingType, [NotNullWhen(true)] out IAssignmentOperation? assignmentExpression)
167IOperation statement, INamedTypeSymbol containingType,
Microsoft.CodeAnalysis.CodeStyle (250)
src\Analyzers\Core\Analyzers\RemoveUnnecessarySuppressions\SuppressMessageAttributeState.cs (9)
48out ImmutableArray<(string name, IOperation value)> namedAttributeArguments)
50var operation = (model.GetOperation(attributeSyntax, cancellationToken) as IAttributeOperation)?.Operation;
57using var _ = ArrayBuilder<(string name, IOperation value)>.GetInstance(out var builder);
58foreach (var initializer in initializerOperation.Initializers)
72public static bool HasValidScope(ImmutableArray<(string name, IOperation value)> namedAttributeArguments, out TargetScope targetScope)
90ImmutableArray<(string name, IOperation value)> namedAttributeArguments,
94out IOperation? targetValueOperation,
130ImmutableArray<(string name, IOperation value)> namedAttributeArguments,
133[NotNullWhen(returnValue: true)] out IOperation? argumentValueOperation)
src\Analyzers\Core\Analyzers\RemoveUnusedParametersAndValues\AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.BlockAnalyzer.cs (17)
32/// We use this value in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/> to determine whether to bail from analysis or not.
45/// We use this value in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/> to determine whether to bail from analysis or not.
51/// We use this value in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/> to determine whether to bail from analysis or not.
98var firstBlock = context.OperationBlocks[0];
138foreach (var operationBlock in context.OperationBlocks)
149foreach (var operationBlock in context.OperationBlocks)
170var value = expressionStatement.Operation;
253/// delegate escape, and corresponding bail out from flow analysis in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/>.
257private static bool IsHandledDelegateCreationOrAnonymousFunctionTreeShape(IOperation operation)
301/// delegate escape, and corresponding bail out from flow analysis in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/>.
306private static bool IsHandledLocalOrParameterReferenceTreeShape(IOperation operation)
366private bool ShouldAnalyze(IOperation operationBlock, ISymbol owningSymbol, ref bool hasUnknownOperationNoneDescendant)
377foreach (var operation in operationBlock.Descendants())
490foreach (var operationBlock in context.OperationBlocks)
590IOperation unreadWriteOperation,
633bool IsRemovableAssignmentWithoutSideEffects(IOperation unusedSymbolWriteOperation)
657static bool IsRemovableAssignmentValueWithoutSideEffects(IOperation assignmentValue)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\OperationExtensions.cs (32)
18public static bool IsTargetOfObjectMemberInitializer(this IOperation operation)
34public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
239public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
259public static bool IsInLeftOfDeconstructionAssignment(this IOperation operation, [NotNullWhen(true)] out IDeconstructionAssignmentOperation? deconstructionAssignment)
263var previousOperation = operation;
264var current = operation.Parent;
295public static bool IsAnyCompoundAssignment(this IOperation operation)
308public static bool IsInsideCatchRegion(this IOperation operation, ControlFlowGraph cfg)
328foreach (var descendant in block.DescendantOperations())
341public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
343foreach (var operationBlock in operationBlocks)
354public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
357public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(true)] out IOperation? foundOperation)
361foreach (var descendant in operationBlock.DescendantsAndSelf())
374public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
377public static bool IsNumericLiteral(this IOperation operation)
380public static bool IsNullLiteral(this IOperation operand)
389public static IOperation? WalkDownConversion(this IOperation? operation)
399public static bool IsSingleThrowNotImplementedOperation([NotNullWhen(true)] this IOperation? firstBlock)
415var firstOp = block.Operations.Length == 1
437static IOperation? TryGetSingleExplicitStatement(ImmutableArray<IOperation> operations)
439IOperation? firstOp = null;
440foreach (var operation in operations)
454static bool IsThrowNotImplementedOperation(INamedTypeSymbol notImplementedExceptionType, IOperation? operation)
461public static IOperation? UnwrapImplicitConversion(this IOperation? value)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.AnalysisData.cs (14)
61protected abstract PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
132public abstract void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId);
137public abstract void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol);
138public abstract void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget);
139public abstract void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget);
140public abstract void SetEmptyInvocationTargetsForDelegate(IOperation write);
141public abstract bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets);
143protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> CreateSymbolsWriteMap(
146var symbolsWriteMap = PooledDictionary<(ISymbol Symbol, IOperation Write), bool>.GetInstance();
150protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> UpdateSymbolsWriteMap(
151PooledDictionary<(ISymbol Symbol, IOperation Write), bool> symbolsWriteMap,
158(ISymbol, IOperation) key = (parameter, null);
201public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten, bool isRef)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.BasicBlockAnalysisData.cs (9)
28private readonly Dictionary<ISymbol, PooledHashSet<IOperation>> _reachingWrites;
74public void ForEachCurrentWrite<TArg>(ISymbol symbol, Action<IOperation, TArg> action, TArg arg)
86public bool ForEachCurrentWrite<TArg>(ISymbol symbol, Func<IOperation, TArg, bool> action, TArg arg)
90foreach (var value in values)
104public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten)
108values = PooledHashSet<IOperation>.GetInstance();
223private static void AddEntries(Dictionary<ISymbol, PooledHashSet<IOperation>> result, BasicBlockAnalysisData source)
231values = PooledHashSet<IOperation>.GetInstance();
240foreach (var operation in operations)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (33)
41private readonly PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>> _lValueFlowCapturesMap;
48private readonly PooledDictionary<IOperation, PooledHashSet<IOperation>> _reachingDelegateCreationTargets;
69private readonly PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>> _symbolWritesInsideBlockRangeMap;
77PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
81PooledDictionary<IOperation, PooledHashSet<IOperation>> reachingDelegateCreationTargets,
99_lValueFlowCapturesMap = PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
103_symbolWritesInsideBlockRangeMap = PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
110protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
134reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
189foreach (var operation in cfg.OriginalOperation.Descendants())
215private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
220var operations = PooledHashSet<IOperation>.GetInstance();
224writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
241PooledHashSet<IOperation> operationsBuilder,
248foreach (var operation in cfg.Blocks[i].DescendantOperations())
273void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
275foreach (var target in targets)
462public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
466captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
514public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
522var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
544foreach (var target in targetsBuilderForSymbolWrite)
561public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
571public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
583public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
586private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
588var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
597public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.OperationTreeAnalysisData.cs (9)
21PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
34protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
63public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
69public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
71public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
73public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
75public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
77public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.Walker.cs (20)
27private IOperation _currentRootOperation;
29private PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>> _pendingWritesMap;
36IEnumerable<IOperation> operations,
51private void Visit(ISymbol containingSymbol, IEnumerable<IOperation> operations, AnalysisData analysisData, CancellationToken cancellationToken)
58_pendingWritesMap = PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
65foreach (var operation in operations)
93private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo)
101private void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
107private void OnReferenceFound(ISymbol symbol, IOperation operation)
159private bool MakePendingWrite(IOperation operation, ISymbol symbolOpt)
166var set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
175set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
407private void ProcessPossibleDelegateCreationAssignment(ISymbol symbol, IOperation write)
415IOperation initializerValue = null;
431private void ProcessPossibleDelegateCreation(IOperation creation, IOperation write)
433var currentOperation = creation;
497private void AnalyzePossibleDelegateInvocation(IOperation operation)
534foreach (var target in targets)
549void AnalyzeDelegateInvocation(IOperation target)
Microsoft.CodeAnalysis.CodeStyle.Fixes (40)
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\LanguageServices\InitializeParameter\InitializeParameterHelpersCore.cs (11)
38public static bool IsParameterReference(IOperation? operation, IParameterSymbol parameter)
43IOperation? value, IParameterSymbol parameter)
76public static IOperation? TryFindFieldOrPropertyAssignmentStatement(IParameterSymbol parameter, IBlockOperation? blockStatement)
79private static IOperation? TryFindFieldOrPropertyAssignmentStatement(
85foreach (var statement in blockStatement.Operations)
99var target = targetTuple.Elements[i];
100var value = valueTuple.Elements[i];
117IOperation operation,
146IOperation? operation, INamedTypeSymbol containingType,
163public static bool IsFieldOrPropertyAssignment(IOperation statement, INamedTypeSymbol containingType, [NotNullWhen(true)] out IAssignmentOperation? assignmentExpression)
167IOperation statement, INamedTypeSymbol containingType,
Microsoft.CodeAnalysis.CSharp (253)
Operations\CSharpOperationFactory.cs (227)
28public IOperation? Create(BoundNode? boundNode)
319ImmutableArray<IOperation> children = GetIOperationChildren(boundNode);
337public ImmutableArray<TOperation> CreateFromArray<TBoundNode, TOperation>(ImmutableArray<TBoundNode> boundNodes) where TBoundNode : BoundNode where TOperation : class, IOperation
373internal ImmutableArray<IOperation> GetIOperationChildren(IBoundNodeWithIOperationChildren boundNodeWithChildren)
378return ImmutableArray<IOperation>.Empty;
381var builder = ArrayBuilder<IOperation>.GetInstance(children.Length);
389IOperation operation = Create(childNode);
430IOperation target = Create(boundDeconstructionAssignmentOperator.Left);
433IOperation value = Create(boundDeconstructionAssignmentOperator.Right.Operand);
440private IOperation CreateBoundCallOperation(BoundCall boundCall)
450ImmutableArray<IOperation> children = CreateFromArray<BoundNode, IOperation>(((IBoundInvalidNode)boundCall).InvalidNodeChildren);
456IOperation? receiver = CreateReceiverOperation(boundCall.ReceiverOpt, targetMethod);
472private IOperation CreateBoundFunctionPointerInvocationOperation(BoundFunctionPointerInvocation boundFunctionPointerInvocation)
480ImmutableArray<IOperation> children = CreateFromArray<BoundNode, IOperation>(((IBoundInvalidNode)boundFunctionPointerInvocation).InvalidNodeChildren);
484var pointer = Create(boundFunctionPointerInvocation.InvokedExpression);
489private IOperation CreateBoundUnconvertedAddressOfOperatorOperation(BoundUnconvertedAddressOfOperator boundUnconvertedAddressOf)
499private IOperation CreateBoundAttributeOperation(BoundAttribute boundAttribute)
511var namedArguments = CreateFromArray<BoundAssignmentOperator, IOperation>(boundAttribute.NamedArguments);
520internal ImmutableArray<IOperation> CreateIgnoredDimensions(BoundNode declaration)
528return CreateFromArray<BoundExpression, IOperation>(declaredTypeOpt.BoundDimensionsOpt);
545return CreateFromArray<BoundExpression, IOperation>(dimensions);
552internal IOperation CreateBoundLocalOperation(BoundLocal boundLocal, bool createDeclaration = true)
565IOperation localReference = CreateBoundLocalOperation(boundLocal, createDeclaration: false);
572internal IOperation CreateBoundFieldAccessOperation(BoundFieldAccess boundFieldAccess, bool createDeclaration = true)
586IOperation fieldAccess = CreateBoundFieldAccessOperation(boundFieldAccess, createDeclaration: false);
591IOperation? instance = CreateReceiverOperation(boundFieldAccess.ReceiverOpt, boundFieldAccess.FieldSymbol);
595internal IOperation? CreateBoundPropertyReferenceInstance(BoundNode boundNode)
614IOperation? instance = CreateReceiverOperation(boundPropertyAccess.ReceiverOpt, boundPropertyAccess.PropertySymbol);
624private IOperation CreateBoundIndexerAccessOperation(BoundIndexerAccess boundIndexerAccess)
633var children = CreateFromArray<BoundNode, IOperation>(((IBoundInvalidNode)boundIndexerAccess).InvalidNodeChildren);
638IOperation? instance = CreateReceiverOperation(boundIndexerAccess.ReceiverOpt, boundIndexerAccess.ExpressionSymbol);
646IOperation? instance = CreateReceiverOperation(boundEventAccess.ReceiverOpt, boundEventAccess.EventSymbol);
656IOperation eventReference = CreateBoundEventAccessOperation(boundEventAssignmentOperator);
657IOperation handlerValue = Create(boundEventAssignmentOperator.Argument);
697ImmutableArray<IOperation> initializers = GetAnonymousObjectCreationInitializers(boundAnonymousObjectCreationExpression.Arguments, boundAnonymousObjectCreationExpression.Declarations, syntax, type, isImplicit);
701private IOperation CreateBoundObjectCreationExpressionOperation(BoundObjectCreationExpression boundObjectCreationExpression)
713var children = CreateFromArray<BoundNode, IOperation>(((IBoundInvalidNode)boundObjectCreationExpression).InvalidNodeChildren);
721ImmutableArray<IOperation> initializers = GetAnonymousObjectCreationInitializers(
736private IOperation CreateBoundWithExpressionOperation(BoundWithExpression boundWithExpression)
738IOperation operand = Create(boundWithExpression.Receiver);
750ImmutableArray<IOperation> arguments = CreateFromArray<BoundExpression, IOperation>(boundDynamicObjectCreationExpression.Arguments);
759internal IOperation CreateBoundDynamicInvocationExpressionReceiver(BoundNode receiver)
778IOperation operation = CreateBoundDynamicInvocationExpressionReceiver(boundDynamicInvocation.Expression);
779ImmutableArray<IOperation> arguments = CreateFromArray<BoundExpression, IOperation>(boundDynamicInvocation.Arguments);
788internal IOperation CreateBoundDynamicIndexerAccessExpressionReceiver(BoundExpression indexer)
803internal ImmutableArray<IOperation> CreateBoundDynamicIndexerAccessArguments(BoundExpression indexer)
808return CreateFromArray<BoundExpression, IOperation>(boundDynamicAccess.Arguments);
812return CreateFromArray<BoundExpression, IOperation>(boundObjectInitializerMember.Arguments);
821IOperation operation = CreateBoundDynamicIndexerAccessExpressionReceiver(boundDynamicIndexerAccess);
822ImmutableArray<IOperation> arguments = CreateBoundDynamicIndexerAccessArguments(boundDynamicIndexerAccess);
833ImmutableArray<IOperation> initializers = CreateFromArray<BoundExpression, IOperation>(BoundObjectCreationExpression.GetChildInitializers(boundObjectInitializerExpression));
842ImmutableArray<IOperation> initializers = CreateFromArray<BoundExpression, IOperation>(BoundObjectCreationExpression.GetChildInitializers(boundCollectionInitializerExpression));
849private IOperation CreateBoundObjectInitializerMemberOperation(BoundObjectInitializerMember boundObjectInitializerMember, bool isObjectOrCollectionInitializer = false)
860IOperation operation = CreateBoundDynamicIndexerAccessExpressionReceiver(boundObjectInitializerMember);
861ImmutableArray<IOperation> arguments = CreateBoundDynamicIndexerAccessArguments(boundObjectInitializerMember);
889var children = CreateFromArray<BoundNode, IOperation>(((IBoundInvalidNode)boundObjectInitializerMember).InvalidNodeChildren);
905IOperation? createReceiver() => memberSymbol?.IsStatic == true ?
910private IOperation CreateBoundDynamicObjectInitializerMemberOperation(BoundDynamicObjectInitializerMember boundDynamicObjectInitializerMember)
912IOperation instanceReceiver = CreateImplicitReceiver(boundDynamicObjectInitializerMember.Syntax, boundDynamicObjectInitializerMember.ReceiverType);
923private IOperation CreateBoundCollectionElementInitializerOperation(BoundCollectionElementInitializer boundCollectionElementInitializer)
926IOperation? receiver = CreateReceiverOperation(boundCollectionElementInitializer.ImplicitReceiverOpt, addMethod);
935var children = CreateFromArray<BoundNode, IOperation>(((IBoundInvalidNode)boundCollectionElementInitializer).InvalidNodeChildren);
970IOperation? instance = Create(receiver);
976IOperation operation = CreateBoundDynamicInvocationExpressionReceiver(boundCollectionElementInitializer.Expression);
977ImmutableArray<IOperation> arguments = CreateFromArray<BoundExpression, IOperation>(boundCollectionElementInitializer.Arguments);
984private IOperation CreateUnboundLambdaOperation(UnboundLambda unboundLambda)
1015private IOperation CreateBoundConversionOperation(BoundConversion boundConversion, bool forceOperandImplicitLiteral = false)
1045IOperation target = CreateDelegateTargetOperation(boundConversion);
1123IOperation target = CreateDelegateTargetOperation(correctedConversionNode);
1131IOperation operand = forceOperandImplicitLiteral
1141IOperation operand = Create(boundAsOperator.Operand);
1153IOperation target = CreateDelegateTargetOperation(boundDelegateCreationExpression);
1164IOperation? instance = CreateReceiverOperation(boundMethodGroup.ReceiverOpt, methodSymbol);
1173IOperation value = Create(boundIsOperator.Operand);
1206ImmutableArray<IOperation> dimensionSizes = CreateFromArray<BoundExpression, IOperation>(boundArrayCreation.Bounds);
1217ImmutableArray<IOperation> elementValues = CreateFromArray<BoundExpression, IOperation>(boundArrayInitialization.Initializers);
1229ImmutableArray<IOperation> elements = expr.Elements.SelectAsArray((element, expr) => CreateBoundCollectionExpressionElement(expr, element), expr);
1258private IOperation CreateBoundCollectionExpressionElement(BoundCollectionExpression expr, BoundNode element)
1270var collection = Create(element.Expression);
1319private IOperation CreateBoundAssignmentOperatorOrMemberInitializerOperation(BoundAssignmentOperator boundAssignmentOperator)
1322(IOperation)CreateBoundMemberInitializerOperation(boundAssignmentOperator) :
1334IOperation target = Create(boundAssignmentOperator.Left);
1335IOperation value = Create(boundAssignmentOperator.Right);
1347IOperation initializedMember = CreateMemberInitializerInitializedMember(boundAssignmentOperator.Left);
1357IOperation target = Create(boundCompoundAssignmentOperator.Left);
1358IOperation value = Create(boundCompoundAssignmentOperator.Right);
1391IOperation target = Create(boundIncrementOperator.Operand);
1409var children = CreateFromArray<BoundExpression, IOperation>(boundBadExpression.ChildBoundNodes);
1434IOperation operand = Create(boundUnaryOperator.Operand);
1446private IOperation CreateBoundBinaryOperatorBase(BoundBinaryOperatorBase boundBinaryOperatorBase)
1465IOperation? left = null;
1470IOperation right = Create(currentBinary.Right);
1483IBinaryOperation createBoundUserDefinedConditionalLogicalOperator(BoundUserDefinedConditionalLogicalOperator boundBinaryOperator, IOperation left, IOperation right)
1507private IBinaryOperation CreateBoundBinaryOperatorOperation(BoundBinaryOperator boundBinaryOperator, IOperation left, IOperation right)
1536private IOperation CreateBoundInterpolatedStringBinaryOperator(BoundBinaryOperator boundBinaryOperator)
1539Func<BoundInterpolatedString, int, (CSharpOperationFactory, InterpolatedStringHandlerData), IOperation> createInterpolatedString
1542Func<BoundBinaryOperator, IOperation, IOperation, (CSharpOperationFactory, InterpolatedStringHandlerData), IOperation> createBinaryOperator
1555IOperation left,
1556IOperation right,
1563IOperation left = Create(boundTupleBinaryOperator.Left);
1564IOperation right = Create(boundTupleBinaryOperator.Right);
1574IOperation condition = Create(boundConditionalOperator.Condition);
1575IOperation whenTrue = Create(boundConditionalOperator.Consequence);
1576IOperation whenFalse = Create(boundConditionalOperator.Alternative);
1587IOperation value = Create(boundNullCoalescingOperator.LeftOperand);
1588IOperation whenNull = Create(boundNullCoalescingOperator.RightOperand);
1604private IOperation CreateBoundNullCoalescingAssignmentOperatorOperation(BoundNullCoalescingAssignmentOperator boundNode)
1606IOperation target = Create(boundNode.LeftOperand);
1607IOperation value = Create(boundNode.RightOperand);
1617IOperation awaitedValue = Create(boundAwaitExpression.Expression);
1626IOperation arrayReference = Create(boundArrayAccess.Expression);
1627ImmutableArray<IOperation> indices = CreateFromArray<BoundExpression, IOperation>(boundArrayAccess.Indices);
1635private IOperation CreateBoundImplicitIndexerAccessOperation(BoundImplicitIndexerAccess boundIndexerAccess)
1637IOperation instance = Create(boundIndexerAccess.Receiver);
1638IOperation argument = Create(boundIndexerAccess.Argument);
1659IOperation arrayReference = Create(boundInlineArrayAccess.Expression);
1660IOperation argument = Create(boundInlineArrayAccess.Argument);
1670IOperation argument = Create(boundNameOfOperator.Argument);
1680IOperation expression = Create(boundThrowExpression.Expression);
1689IOperation reference = Create(boundAddressOfOperator.Operand);
1707IOperation operation = Create(boundConditionalAccess.Receiver);
1708IOperation whenNotNull = Create(boundConditionalAccess.AccessExpression);
1727IOperation value = Create(boundFieldEqualsValue.Value);
1736IOperation value = Create(boundPropertyEqualsValue.Value);
1745IOperation value = Create(boundParameterEqualsValue.Value);
1753ImmutableArray<IOperation> operations = CreateFromArray<BoundStatement, IOperation>(boundBlock.Statements);
1780IOperation? returnedValue = null;
1806IOperation? whenFalse;
1828IOperation condition = Create(boundIfStatement.Condition);
1829IOperation whenTrue = Create(boundIfStatement.Consequence);
1846IOperation condition = Create(boundWhileStatement.Condition);
1847IOperation body = Create(boundWhileStatement.Body);
1860IOperation condition = Create(boundDoStatement.Condition);
1861IOperation body = Create(boundDoStatement.Body);
1874ImmutableArray<IOperation> before = CreateFromArray<BoundStatement, IOperation>(ToStatements(boundForStatement.Initializer));
1875IOperation? condition = Create(boundForStatement.Condition);
1876ImmutableArray<IOperation> atLoopBottom = CreateFromArray<BoundStatement, IOperation>(ToStatements(boundForStatement.Increment));
1877IOperation body = Create(boundForStatement.Body);
1953internal IOperation CreateBoundForEachStatementLoopControlVariable(BoundForEachStatement boundForEachStatement)
1969return new VariableDeclaratorOperation(local.GetPublicSymbol(), initializer: null, ignoredArguments: ImmutableArray<IOperation>.Empty, semanticModel: _semanticModel, syntax: declaratorSyntax, isImplicit: false);
1975IOperation loopControlVariable = CreateBoundForEachStatementLoopControlVariable(boundForEachStatement);
1977IOperation collection = Create(boundForEachStatement.EnumeratorInfoOpt?.InlineArraySpanType is null or WellKnownType.Unknown ||
1981var nextVariables = ImmutableArray<IOperation>.Empty;
1982IOperation body = Create(boundForEachStatement.Body);
2007IOperation? exceptionDeclarationOrExpression = CreateVariableDeclarator((BoundLocal?)boundCatchBlock.ExceptionSourceOpt);
2010IOperation? filter = Create(boundCatchBlock.ExceptionFilterOpt);
2022IOperation body = Create(boundFixedStatement.Body);
2033IOperation resources = Create(boundUsingStatement.DeclarationsOpt ?? (BoundNode)boundUsingStatement.ExpressionOpt!);
2034IOperation body = Create(boundUsingStatement.Body);
2049IOperation? thrownObject = Create(boundThrowStatement.ExpressionOpt);
2058IOperation? returnedValue = Create(boundReturnStatement.ExpressionOpt);
2066IOperation returnedValue = Create(boundYieldReturnStatement.Expression);
2081IOperation lockedValue = Create(boundLockStatement.Argument);
2082IOperation body = Create(boundLockStatement.Body);
2095var children = CreateFromArray<BoundNode, IOperation>(boundBadStatement.ChildBoundNodes);
2099private IOperation CreateBoundLocalDeclarationOperation(BoundLocalDeclaration boundLocalDeclaration)
2142ImmutableArray<IOperation> ignoredDimensions = CreateIgnoredDimensions(boundLocalDeclaration);
2150private IOperation CreateBoundMultipleLocalDeclarationsBaseOperation(BoundMultipleLocalDeclarationsBase boundMultipleLocalDeclarations)
2162ImmutableArray<IOperation> ignoredDimensions = CreateIgnoredDimensions(boundMultipleLocalDeclarations);
2200IOperation labeledStatement = Create(boundLabeledStatement.Body);
2216IOperation expression = Create(boundExpressionStatement.Expression);
2226internal IOperation CreateBoundTupleOperation(BoundTupleExpression boundTupleExpression, bool createDeclaration = true)
2237var tupleOperation = CreateBoundTupleOperation(boundTupleExpression, createDeclaration: false);
2250ImmutableArray<IOperation> elements = CreateFromArray<BoundExpression, IOperation>(boundTupleExpression.Arguments);
2352IOperation valueOperation = value switch
2365IOperation valueOperation = Create(value);
2366IOperation? alignmentOperation = Create(alignment);
2367IOperation? formatOperation = Create(format);
2401IOperation expression = Create(boundStringInsert.Value);
2402IOperation? alignment = Create(boundStringInsert.Alignment);
2403IOperation? formatString = Create(boundStringInsert.Format);
2411IOperation text = CreateBoundLiteralOperation(boundNode, @implicit: true);
2422var construction = Create(interpolationData.Construction);
2423var content = createContent(conversion.Operand);
2435IOperation createContent(BoundExpression current)
2440var left = createContent(binaryOperator.Left);
2441var right = createContent(binaryOperator.Right);
2481private IOperation CreateBoundInterpolatedStringArgumentPlaceholder(BoundInterpolatedStringArgumentPlaceholder placeholder)
2489return new InvalidOperation(ImmutableArray<IOperation>.Empty, _semanticModel, syntax, type, placeholder.ConstantValueOpt, isImplicit);
2505private IOperation CreateBoundInterpolatedStringHandlerPlaceholder(BoundInterpolatedStringHandlerPlaceholder placeholder)
2517IOperation value = Create(boundConstantPattern.Value);
2525private IOperation CreateBoundRelationalPatternOperation(BoundRelationalPattern boundRelationalPattern)
2528IOperation value = Create(boundRelationalPattern.Value);
2594private IOperation CreateBoundTypePatternOperation(BoundTypePattern boundTypePattern)
2605private IOperation CreateBoundSlicePatternOperation(BoundSlicePattern boundNode)
2618private IOperation CreateBoundListPatternOperation(BoundListPattern boundNode)
2632private IOperation CreateBoundNegatedPatternOperation(BoundNegatedPattern boundNegatedPattern)
2643private IOperation CreateBoundBinaryPatternOperation(BoundBinaryPattern boundBinaryPattern)
2686IOperation value = Create(boundSwitchStatement.Expression);
2698ImmutableArray<IOperation> body = CreateFromArray<BoundStatement, IOperation>(boundSwitchSection.Statements);
2706IOperation value = Create(boundSwitchExpression.Expression);
2733IOperation? guard = Create(boundSwitchExpressionArm.WhenClause);
2734IOperation value = Create(boundSwitchExpressionArm.Value);
2766IOperation? guard = Create(boundSwitchLabel.WhenClause);
2773IOperation value = Create(boundIsPatternExpression.Expression);
2781private IOperation CreateBoundQueryClauseOperation(BoundQueryClause boundQueryClause)
2789IOperation operation = Create(boundQueryClause.Value);
2796private IOperation CreateBoundRangeVariableOperation(BoundRangeVariable boundRangeVariable)
2802private IOperation CreateBoundDiscardExpressionOperation(BoundDiscardExpression boundNode)
2812private IOperation CreateFromEndIndexExpressionOperation(BoundFromEndIndexExpression boundIndex)
2828private IOperation CreateRangeExpressionOperation(BoundRangeExpression boundRange)
2830IOperation? left = Create(boundRange.LeftOperandOpt);
2831IOperation? right = Create(boundRange.RightOperandOpt);
2842private IOperation CreateBoundDiscardPatternOperation(BoundDiscardPattern boundNode)
2861var reference = OperationFactory.CreateInvalidOperation(_semanticModel, subpatternSyntax, ImmutableArray<IOperation>.Empty, isImplicit: true);
2895IOperation reference;
2915reference = OperationFactory.CreateInvalidOperation(_semanticModel, nameSyntax, ImmutableArray<IOperation>.Empty, isImplicit: false);
2923IOperation? createReceiver()
Microsoft.CodeAnalysis.CSharp.CodeStyle (66)
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)
Microsoft.CodeAnalysis.CSharp.CodeStyle.Fixes (51)
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))
Microsoft.CodeAnalysis.CSharp.Emit.UnitTests (1)
Microsoft.CodeAnalysis.CSharp.Emit3.UnitTests (48)
Microsoft.CodeAnalysis.CSharp.EndToEnd.UnitTests (1)
Microsoft.CodeAnalysis.CSharp.Features (124)
src\Analyzers\CSharp\Analyzers\UsePatternCombinators\AnalyzedPattern.cs (12)
19public readonly IOperation Target;
21private AnalyzedPattern(IOperation target)
77private Type(TypeSyntax type, IOperation target) : base(target)
84internal sealed class Source(PatternSyntax patternSyntax, IOperation target) : AnalyzedPattern(target)
92internal sealed class Constant(ExpressionSyntax expression, IOperation target) : AnalyzedPattern(target)
100internal sealed class Relational(BinaryOperatorKind operatorKind, ExpressionSyntax value, IOperation target) : AnalyzedPattern(target)
116private Binary(AnalyzedPattern leftPattern, AnalyzedPattern rightPattern, bool isDisjunctive, SyntaxToken token, IOperation target) : base(target)
126var leftTarget = leftPattern.Target;
127var rightTarget = rightPattern.Target;
132var target = (leftConv, rightConv) switch
153var compareTarget = target == leftTarget ? rightTarget : leftTarget;
181private Not(AnalyzedPattern pattern, IOperation target) : base(target)
src\Analyzers\CSharp\CodeFixes\ConvertToRecord\ConvertToRecordHelpers.cs (44)
46Arguments: [IArgumentOperation { Value: IOperation arg }]
117Operations: [IReturnOperation { ReturnedValue: IOperation returnedValue }]
140Operand: IOperation operand
159LeftOperand: IOperation leftOperand,
160RightOperand: IOperation rightOperand,
380foreach (var assignment in initializer.Initializers)
385Value: IOperation { Syntax: ExpressionSyntax syntax }
421Func<IOperation, T?> captureAssignedSymbol)
433foreach (var operation in body.Operations)
439Target: IOperation assignee,
440Value: IOperation assignment
476private static bool IsSafeAssignment(IOperation operation)
507IEnumerable<IOperation>? statementsToCheck = null;
530if (bodyOps is [IReturnOperation { ReturnedValue: IOperation value }] &&
567IOperation? operation,
606private static IParameterSymbol? GetParamFromArgument(IOperation operation)
609private static ISymbol? GetReferencedSymbolObject(IOperation reference)
625private static bool IsDotEqualsInvocation(IOperation operation)
631Instance: IOperation instance,
632Arguments: [IArgumentOperation { Value: IOperation arg }]
655IOperation operation,
699private static bool ReturnsFalseImmediately(IEnumerable<IOperation> operation)
724IOperation condition,
734(_, IUnaryOperation { OperatorKind: UnaryOperatorKind.Not, Operand: IOperation newCondition })
783IOperation condition,
788IEnumerable<IOperation>? additionalConditions = null)
794(_, IUnaryOperation { OperatorKind: UnaryOperatorKind.Not, Operand: IOperation newCondition })
805LeftOperand: IOperation leftOperation,
806RightOperand: IOperation rightOperation,
817LeftOperand: IOperation leftOperation,
818RightOperand: IOperation rightOperation,
879IEnumerable<IOperation> statementsToCheck,
895IReturnOperation { ReturnedValue: IOperation value } => TryAddEqualizedFieldsForCondition(
899Condition: IOperation condition,
900WhenTrue: IOperation whenTrue,
956ImmutableArray<IOperation> bodyOps,
961[NotNullWhen(true)] out IEnumerable<IOperation>? statementsToCheck)
969Condition: IOperation condition,
970WhenTrue: IOperation whenTrue,
1050IOperation whenTrue,
1051IOperation? whenFalse,
1052IEnumerable<IOperation> otherOps,
1054out IEnumerable<IOperation> remainingStatements)
1069: ImmutableArray<IOperation>.Empty))
Microsoft.CodeAnalysis.CSharp.IOperation.UnitTests (48)
Microsoft.CodeAnalysis.CSharp.Semantic.UnitTests (19)
Microsoft.CodeAnalysis.CSharp.Symbol.UnitTests (2)
Microsoft.CodeAnalysis.CSharp.Test.Utilities (14)
CSharpTestBase.cs (11)
2531protected static (IOperation? operation, SyntaxNode? node) GetOperationAndSyntaxForTest<TSyntaxNode>(CSharpCompilation compilation)
2542var operation = model.GetOperation(syntaxNode);
2557protected static string? GetOperationTreeForTest(CSharpCompilation compilation, IOperation? operation)
2574protected static IOperation? VerifyOperationTreeForTest<TSyntaxNode>(CSharpCompilation compilation, string expectedOperationTree, Action<IOperation?, Compilation, SyntaxNode?>? additionalOperationTreeVerifier = null)
2590protected static void VerifyOperationTree(CSharpCompilation compilation, IOperation? operation, string expectedOperationTree)
2629Action<IOperation?, Compilation, SyntaxNode?>? additionalOperationTreeVerifier = null)
2655Action<IOperation?, Compilation, SyntaxNode?>? additionalOperationTreeVerifier = null,
2676Action<IOperation?, Compilation, SyntaxNode?>? additionalOperationTreeVerifier = null)
2694Action<IOperation?, Compilation, SyntaxNode?>? additionalOperationTreeVerifier = null,
2752Action<IOperation?, Compilation, SyntaxNode?>? additionalOperationTreeVerifier = null,
Microsoft.CodeAnalysis.CSharp.Workspaces (11)
Microsoft.CodeAnalysis.EditorFeatures2.UnitTests (4)
Microsoft.CodeAnalysis.Features (210)
ConvertIfToSwitch\AbstractConvertIfToSwitchCodeRefactoringProvider.Analyzer.cs (20)
50public abstract bool HasUnreachableEndPoint(IOperation operation);
72public (ImmutableArray<AnalyzedSwitchSection>, TExpressionSyntax TargetExpression) AnalyzeIfStatementSequence(ReadOnlySpan<IOperation> operations)
75if (!ParseIfStatementSequence(operations, sections, topLevel: true, out var defaultBodyOpt))
97ReadOnlySpan<IOperation> operations,
100out IOperation? defaultBodyOpt)
133var nextStatement = operations[current];
153private bool ParseIfStatement(IOperation operation, ArrayBuilder<AnalyzedSwitchSection> sections, out IOperation? defaultBodyOpt)
182private bool ParseIfStatementOrBlock(IOperation op, ArrayBuilder<AnalyzedSwitchSection> sections, out IOperation? defaultBodyOpt)
206private bool ParseSwitchLabels(IOperation operation, ArrayBuilder<AnalyzedSwitchLabel> labels)
228private AnalyzedSwitchLabel? ParseSwitchLabel(IOperation operation)
277private AnalyzedPattern? ParsePattern(IOperation operation, ArrayBuilder<TExpressionSyntax> guards)
392bool CheckTargetExpression(IOperation left, IOperation right)
396private static (BoundKind Kind, IOperation Expression, IOperation Value) GetRangeBound(IBinaryOperation op)
442private static bool IsConstant(IOperation operation)
450private bool CheckTargetExpression(IOperation operation)
471private bool CheckConstantType(IOperation operation)
InitializeParameter\AbstractAddParameterCheckCodeRefactoringProvider.cs (23)
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)
331static bool IsNumericCheckOperands(IOperation operand1, IOperation operand2, IParameterSymbol parameter)
371foreach (var statement in blockStatement.Operations)
407foreach (var statement in blockStatement.Operations)
453foreach (var statement in blockStatement.Operations)
463private static bool IsEnumIsDefinedCheck(IOperation statement, IParameterSymbol parameter, IMethodSymbol? enumIsDefinedGenericMethod, IMethodSymbol? enumIsDefinedNonGenericMethod)
467var condition = ifStatement.Condition;
491private static bool IsAnyThrowInvocation(IOperation statement, IParameterSymbol? parameter, ReadOnlySpan<string> possibleTypeNames, Func<string, bool> methodNamePredicate)
515private static bool IsAnyThrowIfNullInvocation(IOperation statement, IParameterSymbol? parameter)
520private static bool IsAnyThrowIfNumericCheckInvocation(IOperation statement, IParameterSymbol? parameter)
525private static bool IsStringCheck(IOperation condition, IParameterSymbol parameter)
538private static bool IsNullCheck(IOperation operand1, IOperation operand2, IParameterSymbol parameter)
807var checkStatement = TryFindParameterCheckStatement(
817var checkStatement = TryFindParameterCheckStatement(
837private static IOperation? TryFindParameterCheckStatement(
847foreach (var statement in blockStatement.Operations)
911foreach (var statement in blockStatement.Operations)
src\Analyzers\Core\Analyzers\RemoveUnnecessarySuppressions\SuppressMessageAttributeState.cs (9)
48out ImmutableArray<(string name, IOperation value)> namedAttributeArguments)
50var operation = (model.GetOperation(attributeSyntax, cancellationToken) as IAttributeOperation)?.Operation;
57using var _ = ArrayBuilder<(string name, IOperation value)>.GetInstance(out var builder);
58foreach (var initializer in initializerOperation.Initializers)
72public static bool HasValidScope(ImmutableArray<(string name, IOperation value)> namedAttributeArguments, out TargetScope targetScope)
90ImmutableArray<(string name, IOperation value)> namedAttributeArguments,
94out IOperation? targetValueOperation,
130ImmutableArray<(string name, IOperation value)> namedAttributeArguments,
133[NotNullWhen(returnValue: true)] out IOperation? argumentValueOperation)
src\Analyzers\Core\Analyzers\RemoveUnusedParametersAndValues\AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer.SymbolStartAnalyzer.BlockAnalyzer.cs (17)
32/// We use this value in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/> to determine whether to bail from analysis or not.
45/// We use this value in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/> to determine whether to bail from analysis or not.
51/// We use this value in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/> to determine whether to bail from analysis or not.
98var firstBlock = context.OperationBlocks[0];
138foreach (var operationBlock in context.OperationBlocks)
149foreach (var operationBlock in context.OperationBlocks)
170var value = expressionStatement.Operation;
253/// delegate escape, and corresponding bail out from flow analysis in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/>.
257private static bool IsHandledDelegateCreationOrAnonymousFunctionTreeShape(IOperation operation)
301/// delegate escape, and corresponding bail out from flow analysis in <see cref="ShouldAnalyze(IOperation, ISymbol, ref bool)"/>.
306private static bool IsHandledLocalOrParameterReferenceTreeShape(IOperation operation)
366private bool ShouldAnalyze(IOperation operationBlock, ISymbol owningSymbol, ref bool hasUnknownOperationNoneDescendant)
377foreach (var operation in operationBlock.Descendants())
490foreach (var operationBlock in context.OperationBlocks)
590IOperation unreadWriteOperation,
633bool IsRemovableAssignmentWithoutSideEffects(IOperation unusedSymbolWriteOperation)
657static bool IsRemovableAssignmentValueWithoutSideEffects(IOperation assignmentValue)
ValueTracking\ValueTracker.OperationCollector.cs (13)
24public Task VisitAsync(IOperation operation, CancellationToken cancellationToken)
45private async Task VisitReturnDescendentsAsync(IOperation operation, bool allowImplicit, CancellationToken cancellationToken)
48foreach (var returnOperation in returnOperations)
55private async Task VisitDefaultAsync(IOperation operation, CancellationToken cancellationToken)
88private async Task<bool> TryVisitChildrenAsync(IOperation operation, CancellationToken cancellationToken)
90foreach (var child in operation.ChildOperations)
110private Task VisitReferenceAsync(IOperation operation, CancellationToken cancellationToken)
141Task AddReferenceAsync(IOperation operation, CancellationToken cancellationToken)
172private async Task AddOperationAsync(IOperation operation, ISymbol symbol, CancellationToken cancellationToken)
276private static bool IsContainedIn<TContainingOperation>(IOperation? operation) where TContainingOperation : IOperation
279private static bool IsContainedIn<TContainingOperation>(IOperation? operation, [NotNullWhen(returnValue: true)] out TContainingOperation? containingOperation) where TContainingOperation : IOperation
Microsoft.CodeAnalysis.PerformanceSensitiveAnalyzers (213)
Microsoft.CodeAnalysis.PublicApiAnalyzers (184)
src\RoslynAnalyzers\Utilities\Compiler\Extensions\IOperationExtensions.cs (33)
62public static bool HasNullConstantValue(this IOperation operation)
67public static bool TryGetBoolConstantValue(this IOperation operation, out bool constantValue)
84public static ImmutableArray<IOperation> GetTopmostExplicitDescendants(this IOperation operation)
91var builder = ImmutableArray.CreateBuilder<IOperation>();
92var operationsToProcess = new Queue<IOperation>();
105foreach (var child in operation.Children)
121public static bool IsOperationNoneRoot(this IOperation operation)
132public static TOperation? GetAncestor<TOperation>(this IOperation root, OperationKind ancestorKind, Func<TOperation, bool>? predicate = null)
133where TOperation : class, IOperation
140var ancestor = root;
167public static IOperation? GetAncestor(this IOperation root, ImmutableArray<OperationKind> ancestorKinds, Func<IOperation, bool>? predicate = null)
174var ancestor = root;
209public static IOperation? GetInstance(this IInstanceReferenceOperation operation, bool isInsideAnonymousObjectInitializer)
216for (IOperation? current = operation; current != null && current.Kind != OperationKind.Block; current = current.Parent)
259public static IOperation GetRoot(this IOperation operation)
274private static readonly BoundedCache<Compilation, ConcurrentDictionary<IOperation, ControlFlowGraph?>> s_operationToCfgCache
277public static bool TryGetEnclosingControlFlowGraph(this IOperation operation, [NotNullWhen(returnValue: true)] out ControlFlowGraph? cfg)
294private static ControlFlowGraph? CreateControlFlowGraph(IOperation operation)
332this IOperation operation, IMethodSymbol lambdaOrLocalFunction, out PooledHashSet<ISymbol> builder)
343foreach (var child in operation.Descendants())
385public static bool IsWithinLambdaOrLocalFunction(this IOperation operation, [NotNullWhen(true)] out IOperation? containingLambdaOrLocalFunctionOperation)
422[NotNullWhen(returnValue: true)] out IOperation? elementOfParentTupleContainingTuple)
427IOperation previousOperation = tupleOperation;
428var currentOperation = tupleOperation.Parent;
460public static IOperation? GetInstance(this IInvocationOperation invocationOperation)
463public static IOperation? GetThrownException(this IThrowOperation operation)
465var thrownObject = operation.Exception;
489IOperation potentialLeftSide = operation;
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\OperationExtensions.cs (32)
18public static bool IsTargetOfObjectMemberInitializer(this IOperation operation)
34public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
239public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
259public static bool IsInLeftOfDeconstructionAssignment(this IOperation operation, [NotNullWhen(true)] out IDeconstructionAssignmentOperation? deconstructionAssignment)
263var previousOperation = operation;
264var current = operation.Parent;
295public static bool IsAnyCompoundAssignment(this IOperation operation)
308public static bool IsInsideCatchRegion(this IOperation operation, ControlFlowGraph cfg)
328foreach (var descendant in block.DescendantOperations())
341public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
343foreach (var operationBlock in operationBlocks)
354public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
357public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(true)] out IOperation? foundOperation)
361foreach (var descendant in operationBlock.DescendantsAndSelf())
374public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
377public static bool IsNumericLiteral(this IOperation operation)
380public static bool IsNullLiteral(this IOperation operand)
389public static IOperation? WalkDownConversion(this IOperation? operation)
399public static bool IsSingleThrowNotImplementedOperation([NotNullWhen(true)] this IOperation? firstBlock)
415var firstOp = block.Operations.Length == 1
437static IOperation? TryGetSingleExplicitStatement(ImmutableArray<IOperation> operations)
439IOperation? firstOp = null;
440foreach (var operation in operations)
454static bool IsThrowNotImplementedOperation(INamedTypeSymbol notImplementedExceptionType, IOperation? operation)
461public static IOperation? UnwrapImplicitConversion(this IOperation? value)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.AnalysisData.cs (14)
61protected abstract PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
132public abstract void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId);
137public abstract void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol);
138public abstract void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget);
139public abstract void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget);
140public abstract void SetEmptyInvocationTargetsForDelegate(IOperation write);
141public abstract bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets);
143protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> CreateSymbolsWriteMap(
146var symbolsWriteMap = PooledDictionary<(ISymbol Symbol, IOperation Write), bool>.GetInstance();
150protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> UpdateSymbolsWriteMap(
151PooledDictionary<(ISymbol Symbol, IOperation Write), bool> symbolsWriteMap,
158(ISymbol, IOperation) key = (parameter, null);
201public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten, bool isRef)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.BasicBlockAnalysisData.cs (9)
28private readonly Dictionary<ISymbol, PooledHashSet<IOperation>> _reachingWrites;
74public void ForEachCurrentWrite<TArg>(ISymbol symbol, Action<IOperation, TArg> action, TArg arg)
86public bool ForEachCurrentWrite<TArg>(ISymbol symbol, Func<IOperation, TArg, bool> action, TArg arg)
90foreach (var value in values)
104public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten)
108values = PooledHashSet<IOperation>.GetInstance();
223private static void AddEntries(Dictionary<ISymbol, PooledHashSet<IOperation>> result, BasicBlockAnalysisData source)
231values = PooledHashSet<IOperation>.GetInstance();
240foreach (var operation in operations)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (33)
41private readonly PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>> _lValueFlowCapturesMap;
48private readonly PooledDictionary<IOperation, PooledHashSet<IOperation>> _reachingDelegateCreationTargets;
69private readonly PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>> _symbolWritesInsideBlockRangeMap;
77PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
81PooledDictionary<IOperation, PooledHashSet<IOperation>> reachingDelegateCreationTargets,
99_lValueFlowCapturesMap = PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
103_symbolWritesInsideBlockRangeMap = PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
110protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
134reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
189foreach (var operation in cfg.OriginalOperation.Descendants())
215private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
220var operations = PooledHashSet<IOperation>.GetInstance();
224writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
241PooledHashSet<IOperation> operationsBuilder,
248foreach (var operation in cfg.Blocks[i].DescendantOperations())
273void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
275foreach (var target in targets)
462public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
466captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
514public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
522var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
544foreach (var target in targetsBuilderForSymbolWrite)
561public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
571public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
583public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
586private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
588var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
597public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.OperationTreeAnalysisData.cs (9)
21PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
34protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
63public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
69public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
71public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
73public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
75public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
77public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.Walker.cs (20)
27private IOperation _currentRootOperation;
29private PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>> _pendingWritesMap;
36IEnumerable<IOperation> operations,
51private void Visit(ISymbol containingSymbol, IEnumerable<IOperation> operations, AnalysisData analysisData, CancellationToken cancellationToken)
58_pendingWritesMap = PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
65foreach (var operation in operations)
93private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo)
101private void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
107private void OnReferenceFound(ISymbol symbol, IOperation operation)
159private bool MakePendingWrite(IOperation operation, ISymbol symbolOpt)
166var set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
175set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
407private void ProcessPossibleDelegateCreationAssignment(ISymbol symbol, IOperation write)
415IOperation initializerValue = null;
431private void ProcessPossibleDelegateCreation(IOperation creation, IOperation write)
433var currentOperation = creation;
497private void AnalyzePossibleDelegateInvocation(IOperation operation)
534foreach (var target in targets)
549void AnalyzeDelegateInvocation(IOperation target)
Microsoft.CodeAnalysis.ResxSourceGenerator (184)
src\RoslynAnalyzers\Utilities\Compiler\Extensions\IOperationExtensions.cs (33)
62public static bool HasNullConstantValue(this IOperation operation)
67public static bool TryGetBoolConstantValue(this IOperation operation, out bool constantValue)
84public static ImmutableArray<IOperation> GetTopmostExplicitDescendants(this IOperation operation)
91var builder = ImmutableArray.CreateBuilder<IOperation>();
92var operationsToProcess = new Queue<IOperation>();
105foreach (var child in operation.Children)
121public static bool IsOperationNoneRoot(this IOperation operation)
132public static TOperation? GetAncestor<TOperation>(this IOperation root, OperationKind ancestorKind, Func<TOperation, bool>? predicate = null)
133where TOperation : class, IOperation
140var ancestor = root;
167public static IOperation? GetAncestor(this IOperation root, ImmutableArray<OperationKind> ancestorKinds, Func<IOperation, bool>? predicate = null)
174var ancestor = root;
209public static IOperation? GetInstance(this IInstanceReferenceOperation operation, bool isInsideAnonymousObjectInitializer)
216for (IOperation? current = operation; current != null && current.Kind != OperationKind.Block; current = current.Parent)
259public static IOperation GetRoot(this IOperation operation)
274private static readonly BoundedCache<Compilation, ConcurrentDictionary<IOperation, ControlFlowGraph?>> s_operationToCfgCache
277public static bool TryGetEnclosingControlFlowGraph(this IOperation operation, [NotNullWhen(returnValue: true)] out ControlFlowGraph? cfg)
294private static ControlFlowGraph? CreateControlFlowGraph(IOperation operation)
332this IOperation operation, IMethodSymbol lambdaOrLocalFunction, out PooledHashSet<ISymbol> builder)
343foreach (var child in operation.Descendants())
385public static bool IsWithinLambdaOrLocalFunction(this IOperation operation, [NotNullWhen(true)] out IOperation? containingLambdaOrLocalFunctionOperation)
422[NotNullWhen(returnValue: true)] out IOperation? elementOfParentTupleContainingTuple)
427IOperation previousOperation = tupleOperation;
428var currentOperation = tupleOperation.Parent;
460public static IOperation? GetInstance(this IInvocationOperation invocationOperation)
463public static IOperation? GetThrownException(this IThrowOperation operation)
465var thrownObject = operation.Exception;
489IOperation potentialLeftSide = operation;
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\OperationExtensions.cs (32)
18public static bool IsTargetOfObjectMemberInitializer(this IOperation operation)
34public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
239public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
259public static bool IsInLeftOfDeconstructionAssignment(this IOperation operation, [NotNullWhen(true)] out IDeconstructionAssignmentOperation? deconstructionAssignment)
263var previousOperation = operation;
264var current = operation.Parent;
295public static bool IsAnyCompoundAssignment(this IOperation operation)
308public static bool IsInsideCatchRegion(this IOperation operation, ControlFlowGraph cfg)
328foreach (var descendant in block.DescendantOperations())
341public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
343foreach (var operationBlock in operationBlocks)
354public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
357public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(true)] out IOperation? foundOperation)
361foreach (var descendant in operationBlock.DescendantsAndSelf())
374public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
377public static bool IsNumericLiteral(this IOperation operation)
380public static bool IsNullLiteral(this IOperation operand)
389public static IOperation? WalkDownConversion(this IOperation? operation)
399public static bool IsSingleThrowNotImplementedOperation([NotNullWhen(true)] this IOperation? firstBlock)
415var firstOp = block.Operations.Length == 1
437static IOperation? TryGetSingleExplicitStatement(ImmutableArray<IOperation> operations)
439IOperation? firstOp = null;
440foreach (var operation in operations)
454static bool IsThrowNotImplementedOperation(INamedTypeSymbol notImplementedExceptionType, IOperation? operation)
461public static IOperation? UnwrapImplicitConversion(this IOperation? value)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.AnalysisData.cs (14)
61protected abstract PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
132public abstract void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId);
137public abstract void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol);
138public abstract void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget);
139public abstract void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget);
140public abstract void SetEmptyInvocationTargetsForDelegate(IOperation write);
141public abstract bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets);
143protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> CreateSymbolsWriteMap(
146var symbolsWriteMap = PooledDictionary<(ISymbol Symbol, IOperation Write), bool>.GetInstance();
150protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> UpdateSymbolsWriteMap(
151PooledDictionary<(ISymbol Symbol, IOperation Write), bool> symbolsWriteMap,
158(ISymbol, IOperation) key = (parameter, null);
201public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten, bool isRef)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.BasicBlockAnalysisData.cs (9)
28private readonly Dictionary<ISymbol, PooledHashSet<IOperation>> _reachingWrites;
74public void ForEachCurrentWrite<TArg>(ISymbol symbol, Action<IOperation, TArg> action, TArg arg)
86public bool ForEachCurrentWrite<TArg>(ISymbol symbol, Func<IOperation, TArg, bool> action, TArg arg)
90foreach (var value in values)
104public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten)
108values = PooledHashSet<IOperation>.GetInstance();
223private static void AddEntries(Dictionary<ISymbol, PooledHashSet<IOperation>> result, BasicBlockAnalysisData source)
231values = PooledHashSet<IOperation>.GetInstance();
240foreach (var operation in operations)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (33)
41private readonly PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>> _lValueFlowCapturesMap;
48private readonly PooledDictionary<IOperation, PooledHashSet<IOperation>> _reachingDelegateCreationTargets;
69private readonly PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>> _symbolWritesInsideBlockRangeMap;
77PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
81PooledDictionary<IOperation, PooledHashSet<IOperation>> reachingDelegateCreationTargets,
99_lValueFlowCapturesMap = PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
103_symbolWritesInsideBlockRangeMap = PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
110protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
134reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
189foreach (var operation in cfg.OriginalOperation.Descendants())
215private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
220var operations = PooledHashSet<IOperation>.GetInstance();
224writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
241PooledHashSet<IOperation> operationsBuilder,
248foreach (var operation in cfg.Blocks[i].DescendantOperations())
273void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
275foreach (var target in targets)
462public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
466captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
514public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
522var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
544foreach (var target in targetsBuilderForSymbolWrite)
561public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
571public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
583public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
586private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
588var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
597public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.OperationTreeAnalysisData.cs (9)
21PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
34protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
63public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
69public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
71public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
73public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
75public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
77public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.Walker.cs (20)
27private IOperation _currentRootOperation;
29private PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>> _pendingWritesMap;
36IEnumerable<IOperation> operations,
51private void Visit(ISymbol containingSymbol, IEnumerable<IOperation> operations, AnalysisData analysisData, CancellationToken cancellationToken)
58_pendingWritesMap = PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
65foreach (var operation in operations)
93private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo)
101private void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
107private void OnReferenceFound(ISymbol symbol, IOperation operation)
159private bool MakePendingWrite(IOperation operation, ISymbol symbolOpt)
166var set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
175set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
407private void ProcessPossibleDelegateCreationAssignment(ISymbol symbol, IOperation write)
415IOperation initializerValue = null;
431private void ProcessPossibleDelegateCreation(IOperation creation, IOperation write)
433var currentOperation = creation;
497private void AnalyzePossibleDelegateInvocation(IOperation operation)
534foreach (var target in targets)
549void AnalyzeDelegateInvocation(IOperation target)
Microsoft.CodeAnalysis.Test.Utilities (150)
Compilation\ControlFlowGraphVerifier.cs (19)
30IOperation operationRoot = model.GetOperation(syntaxNode);
235foreach (var statement in statements)
262IOperation value = block.BranchValue;
301IOperation value = block.ConditionKind == ControlFlowConditionKind.None ? block.BranchValue : null;
412var operation = block.Operations[j];
485IOperation lastOperation = null;
681bool isAggregateGroupCapture(IOperation operation, ControlFlowRegion region, BasicBlock block, CaptureId id)
770PooledHashSet<CaptureId> state, IOperation operation, BasicBlock block, int operationIndex,
896IOperation containingArgument = reference;
1038bool isConditionalAccessCaptureUsedAfterNullCheck(IOperation operation, ControlFlowRegion region, BasicBlock block, CaptureId id)
1324foreach (IOperation operation in block.Operations)
1628void validateRoot(IOperation root)
1636foreach (var operation in root.Descendants())
1651foreach (IOperation operation in block.Operations)
1695void recordReferences(IOperation operation)
1697foreach (IOperation node in operation.DescendantsAndSelf())
1779string getOperationTree(IOperation operation)
1805Compilation compilation, IOperation root, int initialIndent, ISymbol associatedSymbol) :
1833private static bool CanBeInControlFlowGraph(IOperation n)
Diagnostics\CouldHaveMoreSpecificTypeAnalyzer.cs (5)
232private static void AssignTo(IOperation target, Dictionary<ILocalSymbol, HashSet<INamedTypeSymbol>> localsSourceTypes, Dictionary<IFieldSymbol, HashSet<INamedTypeSymbol>> fieldsSourceTypes, IOperation sourceValue)
237private static void AssignTo(IOperation target, Dictionary<ILocalSymbol, HashSet<INamedTypeSymbol>> localsSourceTypes, Dictionary<IFieldSymbol, HashSet<INamedTypeSymbol>> fieldsSourceTypes, ITypeSymbol sourceType)
252private static void AssignTo<SymbolType>(SymbolType target, ITypeSymbol targetType, Dictionary<SymbolType, HashSet<INamedTypeSymbol>> sourceTypes, IOperation sourceValue)
279private static ITypeSymbol OriginalType(IOperation value)
Microsoft.CodeAnalysis.UnitTests (13)
Diagnostics\OperationTests.cs (13)
26private static void TestCore(Func<ImmutableArray<IOperation>, ImmutableArray<string>, ImmutableArray<RefKind>, HasDynamicArgumentsExpression> createDynamicExpression)
29ImmutableArray<IOperation> arguments = ImmutableArray<IOperation>.Empty;
37arguments = ImmutableArray.Create((IOperation)null);
45arguments = ImmutableArray.Create((IOperation)null);
55arguments = ImmutableArray.Create((IOperation)null);
80Func<ImmutableArray<IOperation>, ImmutableArray<string>, ImmutableArray<RefKind>, HasDynamicArgumentsExpression> createDynamicExpression =
95Func<ImmutableArray<IOperation>, ImmutableArray<string>, ImmutableArray<RefKind>, HasDynamicArgumentsExpression> createDynamicExpression =
110Func<ImmutableArray<IOperation>, ImmutableArray<string>, ImmutableArray<RefKind>, HasDynamicArgumentsExpression> createDynamicExpression =
132IOperation parent = new BlockOperation(ImmutableArray<IOperation>.Empty, ImmutableArray<ILocalSymbol>.Empty,
145private void TestGetFlowGraphInvalidArgumentCore(string argumentExceptionMessage, IOperation parent)
151ImmutableArray<IOperation>.Empty, ImmutableArray<ILocalSymbol>.Empty,
Microsoft.CodeAnalysis.VisualBasic (172)
Operations\VisualBasicOperationFactory.vb (141)
55Public Function Create(boundNode As BoundNode) As IOperation
321Dim children As ImmutableArray(Of IOperation) = GetIOperationChildren(boundNode)
331Public Function CreateFromArray(Of TBoundNode As BoundNode, TOperation As {Class, IOperation})(nodeArray As ImmutableArray(Of TBoundNode)) As ImmutableArray(Of TOperation)
340Friend Function GetIOperationChildren(boundNode As BoundNode) As ImmutableArray(Of IOperation)
343Return ImmutableArray(Of IOperation).Empty
346Dim builder = ArrayBuilder(Of IOperation).GetInstance(boundNodeWithChildren.Children.Length)
359Private Function CreateBoundAssignmentOperatorOperation(boundAssignmentOperator As BoundAssignmentOperator) As IOperation
365Dim children As ImmutableArray(Of IOperation) = GetIOperationChildren(boundAssignmentOperator)
370Dim target As IOperation = Create(boundAssignmentOperator.Left)
371Dim value As IOperation = Create(boundAssignmentOperator.Right)
414Dim awaitedValue As IOperation = Create(boundAwaitOperator.Operand)
422Dim argument As IOperation = Create(boundNameOfOperator.Argument)
448Dim receiver As IOperation = CreateReceiverOperation(boundReceiver, targetMethod)
465Dim operand As IOperation = Create(boundParenthesized.Expression)
474Dim arrayReference As IOperation = Create(boundArrayAccess.Expression)
475Dim indices = CreateFromArray(Of BoundExpression, IOperation)(boundArrayAccess.Indices)
482Friend Function CreateBoundUnaryOperatorChild(boundOperator As BoundExpression) As IOperation
499Dim operand As IOperation = CreateBoundUnaryOperatorChild(boundUnaryOperator)
512Dim operand As IOperation = CreateBoundUnaryOperatorChild(boundUserDefinedUnaryOperator)
528Friend Function CreateBoundBinaryOperatorChild(binaryOperator As BoundExpression, isLeft As Boolean) As IOperation
549Private Function CreateBoundBinaryOperatorOperation(boundBinaryOperator As BoundBinaryOperator) As IOperation
561Dim left As IOperation = Nothing
565Dim right As IOperation = Create(currentBinary.Right)
584Dim left As IOperation = CreateBoundBinaryOperatorChild(boundUserDefinedBinaryOperator, isLeft:=True)
585Dim right As IOperation = CreateBoundBinaryOperatorChild(boundUserDefinedBinaryOperator, isLeft:=False)
597Dim value As IOperation = Create(boundBinaryConditionalExpression.TestExpression)
598Dim whenFalse As IOperation = Create(boundBinaryConditionalExpression.ElseExpression)
622Dim left As IOperation = CreateBoundBinaryOperatorChild(boundUserDefinedShortCircuitingOperator, isLeft:=True)
623Dim right As IOperation = CreateBoundBinaryOperatorChild(boundUserDefinedShortCircuitingOperator, isLeft:=False)
656Dim children = CreateFromArray(Of BoundExpression, IOperation)(boundBadExpression.ChildBoundNodes)
671Dim children As ImmutableArray(Of IOperation) = ImmutableArray(Of IOperation).Empty
685Dim namedArguments = CreateFromArray(Of BoundExpression, IOperation)(boundAttribute.NamedArguments)
693Private Function CreateBoundTryCastOperation(boundTryCast As BoundTryCast) As IOperation
697Private Function CreateBoundDirectCastOperation(boundDirectCast As BoundDirectCast) As IOperation
701Private Function CreateBoundConversionOperation(boundConversion As BoundConversion) As IOperation
719Private Function CreateBoundConversionOrCastOperation(boundConversionOrCast As BoundConversionOrCast, isTryCast As Boolean) As IOperation
749Dim target As IOperation = CreateBoundDelegateCreationExpressionChildOperation(boundDelegateCreationExpression)
765Dim receiverOpt As IOperation = CreateReceiverOperation(
778Dim condition As IOperation = Create(boundTernaryConditionalExpression.Condition)
779Dim whenTrue As IOperation = Create(boundTernaryConditionalExpression.WhenTrue)
780Dim whenFalse As IOperation = Create(boundTernaryConditionalExpression.WhenFalse)
807Private Function CreateBoundLateInvocationOperation(boundLateInvocation As BoundLateInvocation) As IOperation
808Dim operation As IOperation = Create(boundLateInvocation.Member)
809Dim arguments As ImmutableArray(Of IOperation) = CreateFromArray(Of BoundExpression, IOperation)(boundLateInvocation.ArgumentsOpt)
832Dim initializers As ImmutableArray(Of IOperation) = CreateFromArray(Of BoundExpression, IOperation)(boundObjectInitializerExpression.Initializers)
840Dim initializers As ImmutableArray(Of IOperation) = CreateFromArray(Of BoundExpression, IOperation)(boundCollectionInitializerExpression.Initializers)
864Dim dimensionSizes As ImmutableArray(Of IOperation) = CreateFromArray(Of BoundExpression, IOperation)(boundArrayCreation.Bounds)
873Dim elementValues As ImmutableArray(Of IOperation) = CreateFromArray(Of BoundExpression, IOperation)(boundArrayInitialization.Initializers)
881Dim instance As IOperation = CreateReceiverOperation(
910Dim instance As IOperation = CreateReceiverOperation(boundEventAccess.ReceiverOpt, [event])
921Dim instance As IOperation = CreateReceiverOperation(boundFieldAccess.ReceiverOpt, field)
932Dim operation As IOperation = Create(boundConditionalAccess.Receiver)
933Dim whenNotNull As IOperation = Create(boundConditionalAccess.AccessExpression)
955Private Function CreateBoundLocalOperation(boundLocal As BoundLocal) As IOperation
968Dim instance As IOperation = Create(boundLateMemberAccess.ReceiverOpt)
992Dim value As IOperation = Create(boundFieldInitializer.InitialValue)
1000Dim value As IOperation = Create(boundPropertyInitializer.InitialValue)
1008Dim value As IOperation = Create(boundParameterEqualsValue.Value)
1014Private Function CreateBoundLValueToRValueWrapper(boundNode As BoundLValueToRValueWrapper) As IOperation
1021Private Function CreateBoundRValuePlaceholderOperation(boundRValuePlaceholder As BoundRValuePlaceholder) As IOperation
1061Dim condition As IOperation = Create(boundIfStatement.Condition)
1062Dim whenTrue As IOperation = Create(boundIfStatement.Consequence)
1063Dim whenFalse As IOperation = Create(boundIfStatement.AlternativeOpt)
1074Dim value As IOperation = Create(boundSelectStatement.ExpressionStatement.Expression)
1098Friend Function CreateBoundCaseBlockBody(boundCaseBlock As BoundCaseBlock) As ImmutableArray(Of IOperation)
1102Friend Function CreateBoundCaseBlockCondition(boundCaseBlock As BoundCaseBlock) As IOperation
1108Dim body As ImmutableArray(Of IOperation) = ImmutableArray.Create(Create(boundCaseBlock.Body))
1109Dim condition As IOperation = CreateBoundCaseBlockCondition(boundCaseBlock)
1117Dim clauseValue As IOperation = Create(GetSingleValueCaseClauseValue(boundSimpleCaseClause))
1124Dim minimumValue As IOperation = Create(GetCaseClauseValue(boundRangeCaseClause.LowerBoundOpt, boundRangeCaseClause.LowerBoundConditionOpt))
1125Dim maximumValue As IOperation = Create(GetCaseClauseValue(boundRangeCaseClause.UpperBoundOpt, boundRangeCaseClause.UpperBoundConditionOpt))
1133Dim valueExpression As IOperation = Create(GetSingleValueCaseClauseValue(boundRelationalCaseClause))
1141Dim condition As IOperation = Create(boundDoLoopStatement.ConditionOpt)
1142Dim body As IOperation = Create(boundDoLoopStatement.Body)
1143Dim ignoredCondition As IOperation = If(boundDoLoopStatement.TopConditionOpt IsNot Nothing AndAlso boundDoLoopStatement.BottomConditionOpt IsNot Nothing,
1156Dim loopControlVariable As IOperation = CreateBoundControlVariableOperation(boundForToStatement)
1157Dim initialValue As IOperation = Create(boundForToStatement.InitialValue)
1158Dim limitValue As IOperation = Create(boundForToStatement.LimitValue)
1159Dim stepValue As IOperation = Create(boundForToStatement.StepValue)
1160Dim body As IOperation = Create(boundForToStatement.Body)
1161Dim nextVariables As ImmutableArray(Of IOperation) = If(boundForToStatement.NextVariablesOpt.IsDefault,
1162ImmutableArray(Of IOperation).Empty,
1163CreateFromArray(Of BoundExpression, IOperation)(boundForToStatement.NextVariablesOpt))
1239Dim controlVariable As IOperation = CreateBoundControlVariableOperation(boundForEachStatement)
1240Dim collection As IOperation = Create(boundForEachStatement.Collection)
1242ImmutableArray(Of IOperation).Empty,
1243CreateFromArray(Of BoundExpression, IOperation)(boundForEachStatement.NextVariablesOpt))
1244Dim body As IOperation = Create(boundForEachStatement.Body)
1255Friend Function CreateBoundControlVariableOperation(boundForStatement As BoundForStatement) As IOperation
1259New VariableDeclaratorOperation(localOpt, initializer:=Nothing, ignoredArguments:=ImmutableArray(Of IOperation).Empty, semanticModel:=_semanticModel, syntax:=controlVariable.Syntax, isImplicit:=boundForStatement.WasCompilerGenerated),
1273Friend Function CreateBoundCatchBlockExceptionDeclarationOrExpression(boundCatchBlock As BoundCatchBlock) As IOperation
1277Return New VariableDeclaratorOperation(boundCatchBlock.LocalOpt, initializer:=Nothing, ignoredArguments:=ImmutableArray(Of IOperation).Empty, semanticModel:=_semanticModel, syntax:=boundCatchBlock.ExceptionSourceOpt.Syntax, isImplicit:=False)
1284Dim exceptionDeclarationOrExpression As IOperation = CreateBoundCatchBlockExceptionDeclarationOrExpression(boundCatchBlock)
1285Dim filter As IOperation = Create(boundCatchBlock.ExceptionFilterOpt)
1297Dim operations As ImmutableArray(Of IOperation) = CreateFromArray(Of BoundStatement, IOperation)(boundBlock.Statements)
1318Dim children = CreateFromArray(Of BoundNode, IOperation)(boundBadStatement.ChildBoundNodes)
1324Dim returnedValue As IOperation = Create(boundReturnStatement.ExpressionOpt)
1336Dim thrownObject As IOperation = Create(boundThrowStatement.ExpressionOpt)
1344Dim condition As IOperation = Create(boundWhileStatement.Condition)
1345Dim body As IOperation = Create(boundWhileStatement.Body)
1346Dim ignoredCondition As IOperation = Nothing
1374Dim returnedValue As IOperation = Create(boundYieldStatement.Expression)
1382Dim statement As IOperation = Nothing
1420Dim lockedValue As IOperation = Create(boundSyncLockStatement.LockExpression)
1421Dim body As IOperation = Create(boundSyncLockStatement.Body)
1448Dim value As IOperation = Create(boundWithStatement.OriginalExpression)
1449Dim body As IOperation = Create(boundWithStatement.Body)
1455Friend Function CreateBoundUsingStatementResources(boundUsingStatement As BoundUsingStatement) As IOperation
1464Dim resources As IOperation = CreateBoundUsingStatementResources(boundUsingStatement)
1465Dim body As IOperation = Create(boundUsingStatement.Body)
1473Dim expression As IOperation = Create(boundExpressionStatement.Expression)
1508Private Function CreateBoundRaiseEventStatementOperation(boundRaiseEventStatement As BoundRaiseEventStatement) As IOperation
1518Dim children = CreateFromArray(Of BoundNode, IOperation)(DirectCast(boundRaiseEventStatement, IBoundInvalidNode).InvalidNodeChildren)
1529Dim expression As IOperation = GetAddRemoveHandlerStatementExpression(boundAddHandlerStatement)
1536Dim expression As IOperation = GetAddRemoveHandlerStatementExpression(boundRemoveHandlerStatement)
1553Dim elements As ImmutableArray(Of IOperation) = CreateFromArray(Of BoundExpression, IOperation)(boundTupleExpression.Arguments)
1582Dim expression As IOperation = Create(boundInterpolation.Expression)
1583Dim alignment As IOperation = Create(boundInterpolation.AlignmentOpt)
1584Dim formatString As IOperation = Create(boundInterpolation.FormatStringOpt)
1591Dim text As IOperation = CreateBoundLiteralOperation(boundLiteral, implicit:=True)
1598Dim initializers As ImmutableArray(Of IOperation) = GetAnonymousTypeCreationInitializers(boundAnonymousTypeCreationExpression)
1611Dim instance As IOperation = CreateAnonymousTypePropertyAccessImplicitReceiverOperation([property], boundAnonymousTypePropertyAccess.Syntax.FirstAncestorOrSelf(Of AnonymousObjectCreationExpressionSyntax))
1630Private Function CreateBoundQueryExpressionOperation(boundQueryExpression As BoundQueryExpression) As IOperation
1631Dim operation As IOperation = Create(boundQueryExpression.LastOperator)
1638Private Function CreateBoundAggregateClauseOperation(boundAggregateClause As BoundAggregateClause) As IOperation
1647Dim group As IOperation = Create(boundAggregateClause.CapturedGroupOpt)
1648Dim aggregation As IOperation = Create(boundAggregateClause.UnderlyingExpression)
1655Private Function CreateBoundNullableIsTrueOperator(boundNullableIsTrueOperator As BoundNullableIsTrueOperator) As IOperation
1667Dim receiver As IOperation = CreateReceiverOperation(boundNullableIsTrueOperator.Operand, method)
1677Dim children = CreateFromArray(Of BoundNode, IOperation)(DirectCast(boundNullableIsTrueOperator, IBoundInvalidNode).InvalidNodeChildren)
1696Dim operand As IOperation = Create(boundRedimClause.Operand)
1697Dim dimensionSizes As ImmutableArray(Of IOperation) = CreateFromArray(Of BoundExpression, IOperation)(boundRedimClause.Indices)
Operations\VisualBasicOperationFactory_Methods.vb (22)
26Friend Function CreateCompoundAssignmentRightOperand(boundAssignment As BoundAssignmentOperator) As IOperation
88Dim target As IOperation = Create(boundAssignment.Left)
89Dim value As IOperation = CreateCompoundAssignmentRightOperand(boundAssignment)
147Private Function GetUserDefinedBinaryOperatorChild([operator] As BoundUserDefinedBinaryOperator, child As BoundExpression) As IOperation
152Return OperationFactory.CreateInvalidOperation(_semanticModel, [operator].UnderlyingExpression.Syntax, ImmutableArray(Of IOperation).Empty, isImplicit)
275Friend Function CreateReceiverOperation(node As BoundNode, symbol As ISymbol) As IOperation
292Private Function GetChildOfBadExpression(parent As BoundNode, index As Integer) As IOperation
298Return OperationFactory.CreateInvalidOperation(_semanticModel, parent.Syntax, ImmutableArray(Of IOperation).Empty, isImplicit)
310Friend Function GetAnonymousTypeCreationInitializers(expression As BoundAnonymousTypeCreationExpression) As ImmutableArray(Of IOperation)
317Dim builder = ArrayBuilder(Of IOperation).GetInstance(expression.Arguments.Length)
321Dim value As IOperation = Create(expression.Arguments(i))
323Dim target As IOperation
438Dim initializerValue As IOperation = Create(asNewDeclarations.Initializer)
446ImmutableArray(Of IOperation).Empty,
459Dim initializerValue As IOperation = Create(boundLocalDeclaration.IdentifierInitializerOpt)
463Dim ignoredArguments = ImmutableArray(Of IOperation).Empty
476Friend Function GetAddRemoveHandlerStatementExpression(statement As BoundAddRemoveHandlerStatement) As IOperation
477Dim eventReference As IOperation = Create(statement.EventAccess)
478Dim handlerValue As IOperation = Create(statement.Handler)
490) As (Operation As IOperation, Conversion As Conversion, IsDelegateCreation As Boolean)
510) As (Operation As IOperation, Conversion As Conversion, IsDelegateCreation As Boolean)
560Private Function CreateDelegateCreationConversionOperand(operand As BoundExpression) As IOperation
Microsoft.CodeAnalysis.VisualBasic.CodeStyle (3)
Microsoft.CodeAnalysis.VisualBasic.Features (5)
Microsoft.CodeAnalysis.VisualBasic.Semantic.UnitTests (1)
Microsoft.CodeAnalysis.VisualBasic.Test.Utilities (7)
BasicTestBase.vb (7)
794Friend Shared Function GetOperationTreeForTest(Of TSyntaxNode As SyntaxNode)(compilation As VisualBasicCompilation, fileName As String, Optional which As Integer = 0) As (tree As String, syntax As SyntaxNode, operation As IOperation)
816Optional useLatestFrameworkReferences As Boolean = False) As (tree As String, syntax As SyntaxNode, operation As IOperation, compilation As Compilation)
827Friend Shared Sub VerifyOperationTreeForTest(Of TSyntaxNode As SyntaxNode)(compilation As VisualBasicCompilation, fileName As String, expectedOperationTree As String, Optional which As Integer = 0, Optional additionalOperationTreeVerifier As Action(Of IOperation, Compilation, SyntaxNode) = Nothing)
853Optional additionalOperationTreeVerifier As Action(Of IOperation, Compilation, SyntaxNode) = Nothing,
874Friend Shared Sub VerifyOperationTreeAndDiagnosticsForTest(Of TSyntaxNode As SyntaxNode)(compilation As VisualBasicCompilation, fileName As String, expectedOperationTree As String, expectedDiagnostics As String, Optional which As Integer = 0, Optional additionalOperationTreeVerifier As Action(Of IOperation, Compilation, SyntaxNode) = Nothing)
892Optional additionalOperationTreeVerifier As Action(Of IOperation, Compilation, SyntaxNode) = Nothing,
928Friend Shared Function GetOperationAndSyntaxForTest(Of TSyntaxNode As SyntaxNode)(compilation As Compilation, fileName As String, Optional which As Integer = 0) As (operation As IOperation, syntaxNode As SyntaxNode)
Microsoft.CodeAnalysis.Workspaces (164)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\OperationExtensions.cs (32)
18public static bool IsTargetOfObjectMemberInitializer(this IOperation operation)
34public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
239public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
259public static bool IsInLeftOfDeconstructionAssignment(this IOperation operation, [NotNullWhen(true)] out IDeconstructionAssignmentOperation? deconstructionAssignment)
263var previousOperation = operation;
264var current = operation.Parent;
295public static bool IsAnyCompoundAssignment(this IOperation operation)
308public static bool IsInsideCatchRegion(this IOperation operation, ControlFlowGraph cfg)
328foreach (var descendant in block.DescendantOperations())
341public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
343foreach (var operationBlock in operationBlocks)
354public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
357public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(true)] out IOperation? foundOperation)
361foreach (var descendant in operationBlock.DescendantsAndSelf())
374public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
377public static bool IsNumericLiteral(this IOperation operation)
380public static bool IsNullLiteral(this IOperation operand)
389public static IOperation? WalkDownConversion(this IOperation? operation)
399public static bool IsSingleThrowNotImplementedOperation([NotNullWhen(true)] this IOperation? firstBlock)
415var firstOp = block.Operations.Length == 1
437static IOperation? TryGetSingleExplicitStatement(ImmutableArray<IOperation> operations)
439IOperation? firstOp = null;
440foreach (var operation in operations)
454static bool IsThrowNotImplementedOperation(INamedTypeSymbol notImplementedExceptionType, IOperation? operation)
461public static IOperation? UnwrapImplicitConversion(this IOperation? value)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.AnalysisData.cs (14)
61protected abstract PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
132public abstract void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId);
137public abstract void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol);
138public abstract void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget);
139public abstract void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget);
140public abstract void SetEmptyInvocationTargetsForDelegate(IOperation write);
141public abstract bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets);
143protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> CreateSymbolsWriteMap(
146var symbolsWriteMap = PooledDictionary<(ISymbol Symbol, IOperation Write), bool>.GetInstance();
150protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> UpdateSymbolsWriteMap(
151PooledDictionary<(ISymbol Symbol, IOperation Write), bool> symbolsWriteMap,
158(ISymbol, IOperation) key = (parameter, null);
201public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten, bool isRef)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.BasicBlockAnalysisData.cs (9)
28private readonly Dictionary<ISymbol, PooledHashSet<IOperation>> _reachingWrites;
74public void ForEachCurrentWrite<TArg>(ISymbol symbol, Action<IOperation, TArg> action, TArg arg)
86public bool ForEachCurrentWrite<TArg>(ISymbol symbol, Func<IOperation, TArg, bool> action, TArg arg)
90foreach (var value in values)
104public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten)
108values = PooledHashSet<IOperation>.GetInstance();
223private static void AddEntries(Dictionary<ISymbol, PooledHashSet<IOperation>> result, BasicBlockAnalysisData source)
231values = PooledHashSet<IOperation>.GetInstance();
240foreach (var operation in operations)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (33)
41private readonly PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>> _lValueFlowCapturesMap;
48private readonly PooledDictionary<IOperation, PooledHashSet<IOperation>> _reachingDelegateCreationTargets;
69private readonly PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>> _symbolWritesInsideBlockRangeMap;
77PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
81PooledDictionary<IOperation, PooledHashSet<IOperation>> reachingDelegateCreationTargets,
99_lValueFlowCapturesMap = PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
103_symbolWritesInsideBlockRangeMap = PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
110protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
134reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
189foreach (var operation in cfg.OriginalOperation.Descendants())
215private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
220var operations = PooledHashSet<IOperation>.GetInstance();
224writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
241PooledHashSet<IOperation> operationsBuilder,
248foreach (var operation in cfg.Blocks[i].DescendantOperations())
273void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
275foreach (var target in targets)
462public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
466captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
514public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
522var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
544foreach (var target in targetsBuilderForSymbolWrite)
561public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
571public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
583public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
586private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
588var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
597public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.OperationTreeAnalysisData.cs (9)
21PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
34protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
63public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
69public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
71public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
73public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
75public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
77public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.Walker.cs (20)
27private IOperation _currentRootOperation;
29private PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>> _pendingWritesMap;
36IEnumerable<IOperation> operations,
51private void Visit(ISymbol containingSymbol, IEnumerable<IOperation> operations, AnalysisData analysisData, CancellationToken cancellationToken)
58_pendingWritesMap = PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
65foreach (var operation in operations)
93private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo)
101private void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
107private void OnReferenceFound(ISymbol symbol, IOperation operation)
159private bool MakePendingWrite(IOperation operation, ISymbol symbolOpt)
166var set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
175set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
407private void ProcessPossibleDelegateCreationAssignment(ISymbol symbol, IOperation write)
415IOperation initializerValue = null;
431private void ProcessPossibleDelegateCreation(IOperation creation, IOperation write)
433var currentOperation = creation;
497private void AnalyzePossibleDelegateInvocation(IOperation operation)
534foreach (var target in targets)
549void AnalyzeDelegateInvocation(IOperation target)
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\LanguageServices\InitializeParameter\InitializeParameterHelpersCore.cs (11)
38public static bool IsParameterReference(IOperation? operation, IParameterSymbol parameter)
43IOperation? value, IParameterSymbol parameter)
76public static IOperation? TryFindFieldOrPropertyAssignmentStatement(IParameterSymbol parameter, IBlockOperation? blockStatement)
79private static IOperation? TryFindFieldOrPropertyAssignmentStatement(
85foreach (var statement in blockStatement.Operations)
99var target = targetTuple.Elements[i];
100var value = valueTuple.Elements[i];
117IOperation operation,
146IOperation? operation, INamedTypeSymbol containingType,
163public static bool IsFieldOrPropertyAssignment(IOperation statement, INamedTypeSymbol containingType, [NotNullWhen(true)] out IAssignmentOperation? assignmentExpression)
167IOperation statement, INamedTypeSymbol containingType,
Microsoft.Extensions.Validation.ValidationsGenerator (6)
Microsoft.Interop.ComInterfaceGenerator (4)
Microsoft.Interop.LibraryImportGenerator (1)
Microsoft.Interop.LibraryImportGenerator.Downlevel (1)
Microsoft.VisualStudio.LanguageServices (1)
Roslyn.Diagnostics.Analyzers (241)
AbstractDoNotCopyValue.cs (25)
176foreach (var operation in context.OperationBlocks)
362private readonly HashSet<IOperation> _handledOperations = [];
372protected abstract bool CheckForEachGetEnumerator(IForEachLoopOperation operation, [DisallowNull] ref IConversionOperation? conversion, [DisallowNull] ref IOperation? instance);
399var value = operation.Value;
509var handledWhenTrue = currentIsHandled ? operation.WhenTrue : null;
510var handledWhenFalse = currentIsHandled ? operation.WhenFalse : null;
762var instance2 = (operation.Collection as IConversionOperation)?.Operand;
861var instance = operation.Instance;
1029var instance = operation.Instance;
1097var returnedValue = operation.ReturnedValue;
1122var target = operation.Target;
1123var value = operation.Value;
1265var resource = operation.Resources;
1362protected RefKind Acquire(IOperation? operation)
1464private void CheckEventSymbolInUnsupportedContext(IOperation operation, IEventSymbol? @event)
1475private void CheckFieldSymbolInUnsupportedContext(IOperation operation, IFieldSymbol? field)
1483private void CheckPropertySymbolInUnsupportedContext(IOperation operation, IPropertySymbol? property)
1498private void CheckSymbolInUnsupportedContext(IOperation operation, ISymbol? symbol)
1560private void CheckTypeSymbolInUnsupportedContext(IOperation operation, ITypeSymbol? type)
1578private void CheckParameterSymbolInUnsupportedContext(IOperation operation, IParameterSymbol? parameter)
1586private void CheckTypeParameterSymbolInUnsupportedContext(IOperation operation, ITypeParameterSymbol? typeParameter)
1597private void CheckConversionInUnsupportedContext(IOperation operation, CommonConversion conversion)
1602private void CheckLocalSymbolInUnsupportedContext(IOperation operation, ILocalSymbol? local)
1610protected void CheckMethodSymbolInUnsupportedContext(IOperation operation, IMethodSymbol? symbol)
1639private void CheckTypeInUnsupportedContext(IOperation operation)
src\RoslynAnalyzers\Utilities\Compiler\Extensions\IOperationExtensions.cs (33)
62public static bool HasNullConstantValue(this IOperation operation)
67public static bool TryGetBoolConstantValue(this IOperation operation, out bool constantValue)
84public static ImmutableArray<IOperation> GetTopmostExplicitDescendants(this IOperation operation)
91var builder = ImmutableArray.CreateBuilder<IOperation>();
92var operationsToProcess = new Queue<IOperation>();
105foreach (var child in operation.Children)
121public static bool IsOperationNoneRoot(this IOperation operation)
132public static TOperation? GetAncestor<TOperation>(this IOperation root, OperationKind ancestorKind, Func<TOperation, bool>? predicate = null)
133where TOperation : class, IOperation
140var ancestor = root;
167public static IOperation? GetAncestor(this IOperation root, ImmutableArray<OperationKind> ancestorKinds, Func<IOperation, bool>? predicate = null)
174var ancestor = root;
209public static IOperation? GetInstance(this IInstanceReferenceOperation operation, bool isInsideAnonymousObjectInitializer)
216for (IOperation? current = operation; current != null && current.Kind != OperationKind.Block; current = current.Parent)
259public static IOperation GetRoot(this IOperation operation)
274private static readonly BoundedCache<Compilation, ConcurrentDictionary<IOperation, ControlFlowGraph?>> s_operationToCfgCache
277public static bool TryGetEnclosingControlFlowGraph(this IOperation operation, [NotNullWhen(returnValue: true)] out ControlFlowGraph? cfg)
294private static ControlFlowGraph? CreateControlFlowGraph(IOperation operation)
332this IOperation operation, IMethodSymbol lambdaOrLocalFunction, out PooledHashSet<ISymbol> builder)
343foreach (var child in operation.Descendants())
385public static bool IsWithinLambdaOrLocalFunction(this IOperation operation, [NotNullWhen(true)] out IOperation? containingLambdaOrLocalFunctionOperation)
422[NotNullWhen(returnValue: true)] out IOperation? elementOfParentTupleContainingTuple)
427IOperation previousOperation = tupleOperation;
428var currentOperation = tupleOperation.Parent;
460public static IOperation? GetInstance(this IInvocationOperation invocationOperation)
463public static IOperation? GetThrownException(this IThrowOperation operation)
465var thrownObject = operation.Exception;
489IOperation potentialLeftSide = operation;
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\OperationExtensions.cs (32)
18public static bool IsTargetOfObjectMemberInitializer(this IOperation operation)
34public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
239public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
259public static bool IsInLeftOfDeconstructionAssignment(this IOperation operation, [NotNullWhen(true)] out IDeconstructionAssignmentOperation? deconstructionAssignment)
263var previousOperation = operation;
264var current = operation.Parent;
295public static bool IsAnyCompoundAssignment(this IOperation operation)
308public static bool IsInsideCatchRegion(this IOperation operation, ControlFlowGraph cfg)
328foreach (var descendant in block.DescendantOperations())
341public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
343foreach (var operationBlock in operationBlocks)
354public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
357public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(true)] out IOperation? foundOperation)
361foreach (var descendant in operationBlock.DescendantsAndSelf())
374public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
377public static bool IsNumericLiteral(this IOperation operation)
380public static bool IsNullLiteral(this IOperation operand)
389public static IOperation? WalkDownConversion(this IOperation? operation)
399public static bool IsSingleThrowNotImplementedOperation([NotNullWhen(true)] this IOperation? firstBlock)
415var firstOp = block.Operations.Length == 1
437static IOperation? TryGetSingleExplicitStatement(ImmutableArray<IOperation> operations)
439IOperation? firstOp = null;
440foreach (var operation in operations)
454static bool IsThrowNotImplementedOperation(INamedTypeSymbol notImplementedExceptionType, IOperation? operation)
461public static IOperation? UnwrapImplicitConversion(this IOperation? value)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.AnalysisData.cs (14)
61protected abstract PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
132public abstract void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId);
137public abstract void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol);
138public abstract void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget);
139public abstract void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget);
140public abstract void SetEmptyInvocationTargetsForDelegate(IOperation write);
141public abstract bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets);
143protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> CreateSymbolsWriteMap(
146var symbolsWriteMap = PooledDictionary<(ISymbol Symbol, IOperation Write), bool>.GetInstance();
150protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> UpdateSymbolsWriteMap(
151PooledDictionary<(ISymbol Symbol, IOperation Write), bool> symbolsWriteMap,
158(ISymbol, IOperation) key = (parameter, null);
201public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten, bool isRef)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.BasicBlockAnalysisData.cs (9)
28private readonly Dictionary<ISymbol, PooledHashSet<IOperation>> _reachingWrites;
74public void ForEachCurrentWrite<TArg>(ISymbol symbol, Action<IOperation, TArg> action, TArg arg)
86public bool ForEachCurrentWrite<TArg>(ISymbol symbol, Func<IOperation, TArg, bool> action, TArg arg)
90foreach (var value in values)
104public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten)
108values = PooledHashSet<IOperation>.GetInstance();
223private static void AddEntries(Dictionary<ISymbol, PooledHashSet<IOperation>> result, BasicBlockAnalysisData source)
231values = PooledHashSet<IOperation>.GetInstance();
240foreach (var operation in operations)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (33)
41private readonly PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>> _lValueFlowCapturesMap;
48private readonly PooledDictionary<IOperation, PooledHashSet<IOperation>> _reachingDelegateCreationTargets;
69private readonly PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>> _symbolWritesInsideBlockRangeMap;
77PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
81PooledDictionary<IOperation, PooledHashSet<IOperation>> reachingDelegateCreationTargets,
99_lValueFlowCapturesMap = PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
103_symbolWritesInsideBlockRangeMap = PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
110protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
134reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
189foreach (var operation in cfg.OriginalOperation.Descendants())
215private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
220var operations = PooledHashSet<IOperation>.GetInstance();
224writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
241PooledHashSet<IOperation> operationsBuilder,
248foreach (var operation in cfg.Blocks[i].DescendantOperations())
273void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
275foreach (var target in targets)
462public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
466captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
514public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
522var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
544foreach (var target in targetsBuilderForSymbolWrite)
561public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
571public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
583public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
586private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
588var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
597public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.OperationTreeAnalysisData.cs (9)
21PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
34protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
63public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
69public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
71public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
73public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
75public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
77public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.Walker.cs (20)
27private IOperation _currentRootOperation;
29private PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>> _pendingWritesMap;
36IEnumerable<IOperation> operations,
51private void Visit(ISymbol containingSymbol, IEnumerable<IOperation> operations, AnalysisData analysisData, CancellationToken cancellationToken)
58_pendingWritesMap = PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
65foreach (var operation in operations)
93private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo)
101private void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
107private void OnReferenceFound(ISymbol symbol, IOperation operation)
159private bool MakePendingWrite(IOperation operation, ISymbol symbolOpt)
166var set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
175set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
407private void ProcessPossibleDelegateCreationAssignment(ISymbol symbol, IOperation write)
415IOperation initializerValue = null;
431private void ProcessPossibleDelegateCreation(IOperation creation, IOperation write)
433var currentOperation = creation;
497private void AnalyzePossibleDelegateInvocation(IOperation operation)
534foreach (var target in targets)
549void AnalyzeDelegateInvocation(IOperation target)
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\LanguageServices\InitializeParameter\InitializeParameterHelpersCore.cs (11)
38public static bool IsParameterReference(IOperation? operation, IParameterSymbol parameter)
43IOperation? value, IParameterSymbol parameter)
76public static IOperation? TryFindFieldOrPropertyAssignmentStatement(IParameterSymbol parameter, IBlockOperation? blockStatement)
79private static IOperation? TryFindFieldOrPropertyAssignmentStatement(
85foreach (var statement in blockStatement.Operations)
99var target = targetTuple.Elements[i];
100var value = valueTuple.Elements[i];
117IOperation operation,
146IOperation? operation, INamedTypeSymbol containingType,
163public static bool IsFieldOrPropertyAssignment(IOperation statement, INamedTypeSymbol containingType, [NotNullWhen(true)] out IAssignmentOperation? assignmentExpression)
167IOperation statement, INamedTypeSymbol containingType,
Roslyn.Diagnostics.CSharp.Analyzers (13)
Roslyn.Diagnostics.VisualBasic.Analyzers (1)
System.Private.CoreLib.Generators (3)
System.Text.RegularExpressions.Generator (1)
Test.Utilities (173)
src\RoslynAnalyzers\Utilities\Compiler\Extensions\IOperationExtensions.cs (33)
62public static bool HasNullConstantValue(this IOperation operation)
67public static bool TryGetBoolConstantValue(this IOperation operation, out bool constantValue)
84public static ImmutableArray<IOperation> GetTopmostExplicitDescendants(this IOperation operation)
91var builder = ImmutableArray.CreateBuilder<IOperation>();
92var operationsToProcess = new Queue<IOperation>();
105foreach (var child in operation.Children)
121public static bool IsOperationNoneRoot(this IOperation operation)
132public static TOperation? GetAncestor<TOperation>(this IOperation root, OperationKind ancestorKind, Func<TOperation, bool>? predicate = null)
133where TOperation : class, IOperation
140var ancestor = root;
167public static IOperation? GetAncestor(this IOperation root, ImmutableArray<OperationKind> ancestorKinds, Func<IOperation, bool>? predicate = null)
174var ancestor = root;
209public static IOperation? GetInstance(this IInstanceReferenceOperation operation, bool isInsideAnonymousObjectInitializer)
216for (IOperation? current = operation; current != null && current.Kind != OperationKind.Block; current = current.Parent)
259public static IOperation GetRoot(this IOperation operation)
274private static readonly BoundedCache<Compilation, ConcurrentDictionary<IOperation, ControlFlowGraph?>> s_operationToCfgCache
277public static bool TryGetEnclosingControlFlowGraph(this IOperation operation, [NotNullWhen(returnValue: true)] out ControlFlowGraph? cfg)
294private static ControlFlowGraph? CreateControlFlowGraph(IOperation operation)
332this IOperation operation, IMethodSymbol lambdaOrLocalFunction, out PooledHashSet<ISymbol> builder)
343foreach (var child in operation.Descendants())
385public static bool IsWithinLambdaOrLocalFunction(this IOperation operation, [NotNullWhen(true)] out IOperation? containingLambdaOrLocalFunctionOperation)
422[NotNullWhen(returnValue: true)] out IOperation? elementOfParentTupleContainingTuple)
427IOperation previousOperation = tupleOperation;
428var currentOperation = tupleOperation.Parent;
460public static IOperation? GetInstance(this IInvocationOperation invocationOperation)
463public static IOperation? GetThrownException(this IThrowOperation operation)
465var thrownObject = operation.Exception;
489IOperation potentialLeftSide = operation;
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\OperationExtensions.cs (32)
18public static bool IsTargetOfObjectMemberInitializer(this IOperation operation)
34public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
239public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
259public static bool IsInLeftOfDeconstructionAssignment(this IOperation operation, [NotNullWhen(true)] out IDeconstructionAssignmentOperation? deconstructionAssignment)
263var previousOperation = operation;
264var current = operation.Parent;
295public static bool IsAnyCompoundAssignment(this IOperation operation)
308public static bool IsInsideCatchRegion(this IOperation operation, ControlFlowGraph cfg)
328foreach (var descendant in block.DescendantOperations())
341public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
343foreach (var operationBlock in operationBlocks)
354public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
357public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(true)] out IOperation? foundOperation)
361foreach (var descendant in operationBlock.DescendantsAndSelf())
374public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
377public static bool IsNumericLiteral(this IOperation operation)
380public static bool IsNullLiteral(this IOperation operand)
389public static IOperation? WalkDownConversion(this IOperation? operation)
399public static bool IsSingleThrowNotImplementedOperation([NotNullWhen(true)] this IOperation? firstBlock)
415var firstOp = block.Operations.Length == 1
437static IOperation? TryGetSingleExplicitStatement(ImmutableArray<IOperation> operations)
439IOperation? firstOp = null;
440foreach (var operation in operations)
454static bool IsThrowNotImplementedOperation(INamedTypeSymbol notImplementedExceptionType, IOperation? operation)
461public static IOperation? UnwrapImplicitConversion(this IOperation? value)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.AnalysisData.cs (14)
61protected abstract PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
132public abstract void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId);
137public abstract void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol);
138public abstract void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget);
139public abstract void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget);
140public abstract void SetEmptyInvocationTargetsForDelegate(IOperation write);
141public abstract bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets);
143protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> CreateSymbolsWriteMap(
146var symbolsWriteMap = PooledDictionary<(ISymbol Symbol, IOperation Write), bool>.GetInstance();
150protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> UpdateSymbolsWriteMap(
151PooledDictionary<(ISymbol Symbol, IOperation Write), bool> symbolsWriteMap,
158(ISymbol, IOperation) key = (parameter, null);
201public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten, bool isRef)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.BasicBlockAnalysisData.cs (9)
28private readonly Dictionary<ISymbol, PooledHashSet<IOperation>> _reachingWrites;
74public void ForEachCurrentWrite<TArg>(ISymbol symbol, Action<IOperation, TArg> action, TArg arg)
86public bool ForEachCurrentWrite<TArg>(ISymbol symbol, Func<IOperation, TArg, bool> action, TArg arg)
90foreach (var value in values)
104public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten)
108values = PooledHashSet<IOperation>.GetInstance();
223private static void AddEntries(Dictionary<ISymbol, PooledHashSet<IOperation>> result, BasicBlockAnalysisData source)
231values = PooledHashSet<IOperation>.GetInstance();
240foreach (var operation in operations)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (33)
41private readonly PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>> _lValueFlowCapturesMap;
48private readonly PooledDictionary<IOperation, PooledHashSet<IOperation>> _reachingDelegateCreationTargets;
69private readonly PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>> _symbolWritesInsideBlockRangeMap;
77PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
81PooledDictionary<IOperation, PooledHashSet<IOperation>> reachingDelegateCreationTargets,
99_lValueFlowCapturesMap = PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
103_symbolWritesInsideBlockRangeMap = PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
110protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
134reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
189foreach (var operation in cfg.OriginalOperation.Descendants())
215private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
220var operations = PooledHashSet<IOperation>.GetInstance();
224writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
241PooledHashSet<IOperation> operationsBuilder,
248foreach (var operation in cfg.Blocks[i].DescendantOperations())
273void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
275foreach (var target in targets)
462public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
466captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
514public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
522var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
544foreach (var target in targetsBuilderForSymbolWrite)
561public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
571public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
583public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
586private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
588var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
597public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.OperationTreeAnalysisData.cs (9)
21PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
34protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
63public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
69public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
71public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
73public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
75public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
77public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.Walker.cs (20)
27private IOperation _currentRootOperation;
29private PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>> _pendingWritesMap;
36IEnumerable<IOperation> operations,
51private void Visit(ISymbol containingSymbol, IEnumerable<IOperation> operations, AnalysisData analysisData, CancellationToken cancellationToken)
58_pendingWritesMap = PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
65foreach (var operation in operations)
93private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo)
101private void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
107private void OnReferenceFound(ISymbol symbol, IOperation operation)
159private bool MakePendingWrite(IOperation operation, ISymbol symbolOpt)
166var set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
175set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
407private void ProcessPossibleDelegateCreationAssignment(ISymbol symbol, IOperation write)
415IOperation initializerValue = null;
431private void ProcessPossibleDelegateCreation(IOperation creation, IOperation write)
433var currentOperation = creation;
497private void AnalyzePossibleDelegateInvocation(IOperation operation)
534foreach (var target in targets)
549void AnalyzeDelegateInvocation(IOperation target)
Text.Analyzers (213)
src\RoslynAnalyzers\Utilities\Compiler\Extensions\IOperationExtensions.cs (33)
62public static bool HasNullConstantValue(this IOperation operation)
67public static bool TryGetBoolConstantValue(this IOperation operation, out bool constantValue)
84public static ImmutableArray<IOperation> GetTopmostExplicitDescendants(this IOperation operation)
91var builder = ImmutableArray.CreateBuilder<IOperation>();
92var operationsToProcess = new Queue<IOperation>();
105foreach (var child in operation.Children)
121public static bool IsOperationNoneRoot(this IOperation operation)
132public static TOperation? GetAncestor<TOperation>(this IOperation root, OperationKind ancestorKind, Func<TOperation, bool>? predicate = null)
133where TOperation : class, IOperation
140var ancestor = root;
167public static IOperation? GetAncestor(this IOperation root, ImmutableArray<OperationKind> ancestorKinds, Func<IOperation, bool>? predicate = null)
174var ancestor = root;
209public static IOperation? GetInstance(this IInstanceReferenceOperation operation, bool isInsideAnonymousObjectInitializer)
216for (IOperation? current = operation; current != null && current.Kind != OperationKind.Block; current = current.Parent)
259public static IOperation GetRoot(this IOperation operation)
274private static readonly BoundedCache<Compilation, ConcurrentDictionary<IOperation, ControlFlowGraph?>> s_operationToCfgCache
277public static bool TryGetEnclosingControlFlowGraph(this IOperation operation, [NotNullWhen(returnValue: true)] out ControlFlowGraph? cfg)
294private static ControlFlowGraph? CreateControlFlowGraph(IOperation operation)
332this IOperation operation, IMethodSymbol lambdaOrLocalFunction, out PooledHashSet<ISymbol> builder)
343foreach (var child in operation.Descendants())
385public static bool IsWithinLambdaOrLocalFunction(this IOperation operation, [NotNullWhen(true)] out IOperation? containingLambdaOrLocalFunctionOperation)
422[NotNullWhen(returnValue: true)] out IOperation? elementOfParentTupleContainingTuple)
427IOperation previousOperation = tupleOperation;
428var currentOperation = tupleOperation.Parent;
460public static IOperation? GetInstance(this IInvocationOperation invocationOperation)
463public static IOperation? GetThrownException(this IThrowOperation operation)
465var thrownObject = operation.Exception;
489IOperation potentialLeftSide = operation;
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\Extensions\OperationExtensions.cs (32)
18public static bool IsTargetOfObjectMemberInitializer(this IOperation operation)
34public static ValueUsageInfo GetValueUsageInfo(this IOperation operation, ISymbol containingSymbol)
239public static IMethodSymbol? TryGetContainingAnonymousFunctionOrLocalFunction(this IOperation? operation)
259public static bool IsInLeftOfDeconstructionAssignment(this IOperation operation, [NotNullWhen(true)] out IDeconstructionAssignmentOperation? deconstructionAssignment)
263var previousOperation = operation;
264var current = operation.Parent;
295public static bool IsAnyCompoundAssignment(this IOperation operation)
308public static bool IsInsideCatchRegion(this IOperation operation, ControlFlowGraph cfg)
328foreach (var descendant in block.DescendantOperations())
341public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, Func<IOperation, bool> predicate)
343foreach (var operationBlock in operationBlocks)
354public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate)
357public static bool HasAnyOperationDescendant(this IOperation operationBlock, Func<IOperation, bool> predicate, [NotNullWhen(true)] out IOperation? foundOperation)
361foreach (var descendant in operationBlock.DescendantsAndSelf())
374public static bool HasAnyOperationDescendant(this ImmutableArray<IOperation> operationBlocks, OperationKind kind)
377public static bool IsNumericLiteral(this IOperation operation)
380public static bool IsNullLiteral(this IOperation operand)
389public static IOperation? WalkDownConversion(this IOperation? operation)
399public static bool IsSingleThrowNotImplementedOperation([NotNullWhen(true)] this IOperation? firstBlock)
415var firstOp = block.Operations.Length == 1
437static IOperation? TryGetSingleExplicitStatement(ImmutableArray<IOperation> operations)
439IOperation? firstOp = null;
440foreach (var operation in operations)
454static bool IsThrowNotImplementedOperation(INamedTypeSymbol notImplementedExceptionType, IOperation? operation)
461public static IOperation? UnwrapImplicitConversion(this IOperation? value)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.AnalysisData.cs (14)
61protected abstract PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
132public abstract void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId);
137public abstract void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol);
138public abstract void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget);
139public abstract void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget);
140public abstract void SetEmptyInvocationTargetsForDelegate(IOperation write);
141public abstract bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets);
143protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> CreateSymbolsWriteMap(
146var symbolsWriteMap = PooledDictionary<(ISymbol Symbol, IOperation Write), bool>.GetInstance();
150protected static PooledDictionary<(ISymbol Symbol, IOperation Write), bool> UpdateSymbolsWriteMap(
151PooledDictionary<(ISymbol Symbol, IOperation Write), bool> symbolsWriteMap,
158(ISymbol, IOperation) key = (parameter, null);
201public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten, bool isRef)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.BasicBlockAnalysisData.cs (9)
28private readonly Dictionary<ISymbol, PooledHashSet<IOperation>> _reachingWrites;
74public void ForEachCurrentWrite<TArg>(ISymbol symbol, Action<IOperation, TArg> action, TArg arg)
86public bool ForEachCurrentWrite<TArg>(ISymbol symbol, Func<IOperation, TArg, bool> action, TArg arg)
90foreach (var value in values)
104public void OnWriteReferenceFound(ISymbol symbol, IOperation operation, bool maybeWritten)
108values = PooledHashSet<IOperation>.GetInstance();
223private static void AddEntries(Dictionary<ISymbol, PooledHashSet<IOperation>> result, BasicBlockAnalysisData source)
231values = PooledHashSet<IOperation>.GetInstance();
240foreach (var operation in operations)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (33)
41private readonly PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>> _lValueFlowCapturesMap;
48private readonly PooledDictionary<IOperation, PooledHashSet<IOperation>> _reachingDelegateCreationTargets;
69private readonly PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>> _symbolWritesInsideBlockRangeMap;
77PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
81PooledDictionary<IOperation, PooledHashSet<IOperation>> reachingDelegateCreationTargets,
99_lValueFlowCapturesMap = PooledDictionary<CaptureId, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
103_symbolWritesInsideBlockRangeMap = PooledDictionary<(int firstBlockOrdinal, int lastBlockOrdinal), PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
110protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
134reachingDelegateCreationTargets: PooledDictionary<IOperation, PooledHashSet<IOperation>>.GetInstance(),
189foreach (var operation in cfg.OriginalOperation.Descendants())
215private PooledHashSet<(ISymbol, IOperation)> GetOrCreateSymbolWritesInBlockRange(int firstBlockOrdinal, int lastBlockOrdinal, CancellationToken cancellationToken)
220var operations = PooledHashSet<IOperation>.GetInstance();
224writesInBlockRange = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
241PooledHashSet<IOperation> operationsBuilder,
248foreach (var operation in cfg.Blocks[i].DescendantOperations())
273void AddDescendantOperationsFromDelegateCreationTargets(PooledHashSet<IOperation> targets)
275foreach (var target in targets)
462public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
466captures = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
514public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
522var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
544foreach (var target in targetsBuilderForSymbolWrite)
561public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
571public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
583public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
586private void SetReachingDelegateTargetCore(IOperation write, IOperation targetOpt)
588var targetsBuilder = PooledHashSet<IOperation>.GetInstance();
597public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.OperationTreeAnalysisData.cs (9)
21PooledDictionary<(ISymbol symbol, IOperation operation), bool> symbolsWriteMap,
34protected override PooledDictionary<(ISymbol symbol, IOperation operation), bool> SymbolsWriteBuilder { get; }
63public override void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
69public override void SetLambdaTargetForDelegate(IOperation write, IFlowAnonymousFunctionOperation lambdaTarget)
71public override void SetLocalFunctionTargetForDelegate(IOperation write, IMethodReferenceOperation localFunctionTarget)
73public override void SetEmptyInvocationTargetsForDelegate(IOperation write)
75public override void SetTargetsFromSymbolForDelegate(IOperation write, ISymbol symbol)
77public override bool TryGetDelegateInvocationTargets(IOperation write, out ImmutableHashSet<IOperation> targets)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.Walker.cs (20)
27private IOperation _currentRootOperation;
29private PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>> _pendingWritesMap;
36IEnumerable<IOperation> operations,
51private void Visit(ISymbol containingSymbol, IEnumerable<IOperation> operations, AnalysisData analysisData, CancellationToken cancellationToken)
58_pendingWritesMap = PooledDictionary<IAssignmentOperation, PooledHashSet<(ISymbol, IOperation)>>.GetInstance();
65foreach (var operation in operations)
93private void OnWriteReferenceFound(ISymbol symbol, IOperation operation, ValueUsageInfo valueUsageInfo)
101private void OnLValueCaptureFound(ISymbol symbol, IOperation operation, CaptureId captureId)
107private void OnReferenceFound(ISymbol symbol, IOperation operation)
159private bool MakePendingWrite(IOperation operation, ISymbol symbolOpt)
166var set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
175set = PooledHashSet<(ISymbol, IOperation)>.GetInstance();
407private void ProcessPossibleDelegateCreationAssignment(ISymbol symbol, IOperation write)
415IOperation initializerValue = null;
431private void ProcessPossibleDelegateCreation(IOperation creation, IOperation write)
433var currentOperation = creation;
497private void AnalyzePossibleDelegateInvocation(IOperation operation)
534foreach (var target in targets)
549void AnalyzeDelegateInvocation(IOperation target)
src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\LanguageServices\InitializeParameter\InitializeParameterHelpersCore.cs (11)
38public static bool IsParameterReference(IOperation? operation, IParameterSymbol parameter)
43IOperation? value, IParameterSymbol parameter)
76public static IOperation? TryFindFieldOrPropertyAssignmentStatement(IParameterSymbol parameter, IBlockOperation? blockStatement)
79private static IOperation? TryFindFieldOrPropertyAssignmentStatement(
85foreach (var statement in blockStatement.Operations)
99var target = targetTuple.Elements[i];
100var value = valueTuple.Elements[i];
117IOperation operation,
146IOperation? operation, INamedTypeSymbol containingType,
163public static bool IsFieldOrPropertyAssignment(IOperation statement, INamedTypeSymbol containingType, [NotNullWhen(true)] out IAssignmentOperation? assignmentExpression)
167IOperation statement, INamedTypeSymbol containingType,