Beispiel #1
0
        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,
            });
Beispiel #2
0
        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);
 }
Beispiel #4
0
 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));
                }
            });
        });
Beispiel #6
0
 public virtual void VisitMethodBodyOperation(IMethodBodyOperation operation)
 {
     DefaultVisit(operation);
 }