private static IMethodSymbol?FindOwningSymbol(IBlockOperation block, ISymbol containingSymbol) { return(block.Parent switch { ILocalFunctionOperation localFunction => localFunction.Symbol, IAnonymousFunctionOperation anonymousFunction => anonymousFunction.Symbol, // Block parent is the method declaration, for vbnet this means a null parent but for C# it's a IMethodBodyOperation null => containingSymbol as IMethodSymbol, IMethodBodyOperation _ => containingSymbol as IMethodSymbol, _ => null, });
public override void VisitMethodBodyOperation(IMethodBodyOperation operation) { Assert.Equal(OperationKind.MethodBodyOperation, operation.Kind); if (operation.BlockBody != null) { if (operation.ExpressionBody != null) { AssertEx.Equal(new[] { operation.BlockBody, operation.ExpressionBody }, operation.Children); } else { Assert.Same(operation.BlockBody, operation.Children.Single()); } } else if (operation.ExpressionBody != null) { Assert.Same(operation.ExpressionBody, operation.Children.Single()); } else { Assert.Empty(operation.Children); } }
override public void VisitMethodBodyOperation(IMethodBodyOperation operation) { Graph = ControlFlowGraph.Create(operation); }
public override IOperation VisitMethodBodyOperation(IMethodBodyOperation operation, object argument) { return(new MethodBodyOperation(((Operation)operation).SemanticModel, operation.Syntax, Visit(operation.BlockBody), Visit(operation.ExpressionBody))); }
private void InitializeWorker(CompilationStartAnalysisContext context, SymbolCache symbolCache) { context.RegisterOperationBlockStartAction(startBlockContext => { var capturedDiagnosticLocations = new HashSet <Location>(); startBlockContext.RegisterOperationAction(context => { var awaitOperation = (IAwaitOperation)context.Operation; if (awaitOperation.Operation.Kind != OperationKind.Invocation) { return; } var invocationOperation = (IInvocationOperation)awaitOperation.Operation; if (!IsTagHelperRunnerRunAsync(invocationOperation.TargetMethod, symbolCache)) { return; } var parent = context.Operation.Parent; while (parent != null && !IsParentMethod(parent)) { parent = parent.Parent; } if (parent == null) { return; } var methodSymbol = (IMethodSymbol?)(parent switch { ILocalFunctionOperation localFunctionOperation => localFunctionOperation.Symbol, IAnonymousFunctionOperation anonymousFunctionOperation => anonymousFunctionOperation.Symbol, IMethodBodyOperation methodBodyOperation => startBlockContext.OwningSymbol, _ => null, }); if (methodSymbol == null) { // Unsupported operation type. return; } if (!methodSymbol.IsAsync || !symbolCache.TaskType.IsAssignableFrom(methodSymbol.ReturnType)) { capturedDiagnosticLocations.Add(parent.Syntax.GetLocation()); } }, OperationKind.Await); startBlockContext.RegisterOperationBlockEndAction(context => { foreach (var location in capturedDiagnosticLocations) { context.ReportDiagnostic( Diagnostic.Create(TagHelperInCodeBlockDiagnostic, location)); } }); });
public virtual void VisitMethodBodyOperation(IMethodBodyOperation operation) { DefaultVisit(operation); }