//  This is called extremely frequently
        // Analyze the method signature to validate binding attributes + types on the parameters.
        private void AnalyzeMethodDeclarationNode(SyntaxNodeAnalysisContext context)
        {
            if (_tooling == null) // Not yet initialized
            {
                return;
            }
            var methodDecl = (MethodDeclarationSyntax)context.Node;
            var methodName = methodDecl.Identifier.ValueText;

            if (!HasFunctionNameAttribute(context, methodDecl))
            {
                return;
            }

            // Go through
            var parameterList = methodDecl.ParameterList;

            foreach (ParameterSyntax parameterSyntax in parameterList.Parameters)
            {
                // No symbol for the parameter; just the parameter's type
                // Lazily do this - only do this if we're actually looking at a webjobs parameter.
                Type parameterType = null;

                // Now validate each parameter in the method.
                foreach (var attrListSyntax in parameterSyntax.AttributeLists)
                {
                    foreach (AttributeSyntax attributeSyntax in attrListSyntax.Attributes)
                    {
                        var sym = context.SemanticModel.GetSymbolInfo(attributeSyntax);

                        var sym2 = sym.Symbol;
                        if (sym2 == null)
                        {
                            return; // compilation error
                        }

                        try
                        {
                            // Major call to instantiate a reflection Binding attribute from a symbol.
                            // Need this so we can pass the attribute to the WebJob's binding engine.
                            // throws if fails to instantiate
                            Attribute attribute = Helpers.MakeAttr(_tooling, context.SemanticModel, attributeSyntax);
                            if (attribute == null)
                            {
                                continue;
                            }

                            // At this point, we know we're looking at a webjobs parameter.
                            if (parameterType == null)
                            {
                                parameterType = Helpers.GetParameterType(context, parameterSyntax);
                                if (parameterType == null)
                                {
                                    return; // errors in signature
                                }
                            }

                            // Report errors from invalid attribute properties.
                            ValidateAttribute(context, attribute, attributeSyntax);

                            // This is the major call into the WebJobs' binding engine to check for binding errors.
                            // Returns null if success, else a list of possible fixes.
                            var diagnosticHelper      = new DiagnosticHelper(_tooling);
                            ErrorSuggestions[] errors = diagnosticHelper.CheckBindingErrors(attribute, parameterType);

                            if (errors != null && errors.Length > 0)
                            {
                                var diagnostic = ErrorList.IllegalBindingType(
                                    parameterSyntax,
                                    attribute,
                                    parameterType,
                                    errors);

                                context.ReportDiagnostic(diagnostic);
                            }
                        }
                        catch (Exception e)
                        {
                            return;
                        }
                    }
                }
            }
        }