private static void ReportParameterCount(ParameterCountInfo <ISymbol> info, [NotNull] string name, int parameterCount)
 {
     if (!info.Context.Target.IsSynthesized())
     {
         Diagnostic diagnostic = Diagnostic.Create(ParameterCountRule, info.Context.Target.Locations[0], name,
                                                   parameterCount, info.MaxParameterCount);
         info.Context.ReportDiagnostic(diagnostic);
     }
 }
        private static void AnalyzeProperty(SymbolAnalysisContext context, int maxParameterCount)
        {
            var property = (IPropertySymbol)context.Symbol;

            if (property.IsIndexer && MemberRequiresAnalysis(property, context.CancellationToken))
            {
                var info = new ParameterCountInfo <ImmutableArray <IParameterSymbol> >(context.Wrap(property.Parameters),
                                                                                       maxParameterCount);
                AnalyzeParameters(info, property, "Indexer");
            }
        }
        private static void AnalyzeLocalFunction(OperationAnalysisContext context, int maxParameterCount)
        {
            var operation = (ILocalFunctionOperation)context.Operation;

            string memberName = GetMemberName(operation.Symbol);

            var info = new ParameterCountInfo <ImmutableArray <IParameterSymbol> >(context.Wrap(operation.Symbol.Parameters),
                                                                                   maxParameterCount);

            AnalyzeParameters(info, operation.Symbol, memberName);

            AnalyzeReturnType(context.Wrap(operation.Symbol.ReturnType), operation.Symbol, memberName);
        }
        private static void AnalyzeDelegate([NotNull] INamedTypeSymbol type, SymbolAnalysisContext context, int maxParameterCount)
        {
            IMethodSymbol method = type.DelegateInvokeMethod;

            if (method != null)
            {
                string typeName = $"Delegate '{type.Name}'";

                var info = new ParameterCountInfo <ImmutableArray <IParameterSymbol> >(context.Wrap(method.Parameters),
                                                                                       maxParameterCount);
                AnalyzeParameters(info, type, typeName);

                AnalyzeReturnType(context.Wrap(method.ReturnType), type, typeName);
            }
        }
        private static void AnalyzeMethod(SymbolAnalysisContext context, int maxParameterCount)
        {
            var method = (IMethodSymbol)context.Symbol;

            if (!method.IsPropertyOrEventAccessor() && MemberRequiresAnalysis(method, context.CancellationToken))
            {
                string memberName = GetMemberName(method);

                var info = new ParameterCountInfo <ImmutableArray <IParameterSymbol> >(context.Wrap(method.Parameters),
                                                                                       maxParameterCount);
                AnalyzeParameters(info, method, memberName);

                if (MethodCanReturnValue(method))
                {
                    AnalyzeReturnType(context.Wrap(method.ReturnType), method, memberName);
                }
            }
        }
        private static void AnalyzeParameters(ParameterCountInfo <ImmutableArray <IParameterSymbol> > info, [NotNull] ISymbol member,
                                              [NotNull] string memberName)
        {
            ImmutableArray <IParameterSymbol> parameters = info.Context.Target;

            if (parameters.Length > info.MaxParameterCount)
            {
                var memberInfo = new ParameterCountInfo <ISymbol>(info.Context.WithTarget(member), info.MaxParameterCount);
                ReportParameterCount(memberInfo, memberName, parameters.Length);
            }

            foreach (IParameterSymbol parameter in parameters)
            {
                if (parameter.Type.IsTupleType || TryGetSystemTupleElementCount(parameter.Type) != null)
                {
                    ReportTupleParameter(info.Context.WithTarget(parameter), memberName, parameter.Name);
                }
            }
        }