예제 #1
0
        private static void AnalyzeOverloads(OverloadsInfo info, [NotNull] INamedTypeSymbol activeType)
        {
            IEnumerable <IMethodSymbol> overloadsInActiveType = info.MethodGroup.Where(method =>
                                                                                       !method.IsEqualTo(info.LongestOverload) && method.ContainingType.IsEqualTo(activeType));

            foreach (IMethodSymbol overload in overloadsInActiveType)
            {
                AnalyzeOverload(info, overload);
            }
        }
예제 #2
0
        private static void AnalyzeOverload(OverloadsInfo info, [NotNull] IMethodSymbol overload)
        {
            if (!overload.IsOverride && !overload.IsInterfaceImplementation() &&
                !overload.HidesBaseMember(info.Context.CancellationToken))
            {
                CompareOrderOfParameters(overload, info.LongestOverload, info.Context);
            }

            var invocationWalker = new MethodInvocationWalker(info.MethodGroup);

            if (!InvokesAnotherOverload(overload, invocationWalker, info.Context))
            {
                IMethodSymbol methodToReport = overload.PartialImplementationPart ?? overload;

                info.Context.ReportDiagnostic(Diagnostic.Create(InvokeRule, methodToReport.Locations[0],
                                                                methodToReport.ToDisplayString(SymbolDisplayFormat.CSharpShortErrorMessageFormat)));
            }
        }
예제 #3
0
        private static void AnalyzeMethodGroup([NotNull][ItemNotNull] IReadOnlyCollection <IMethodSymbol> methodGroup,
                                               [NotNull] INamedTypeSymbol activeType, SymbolAnalysisContext context)
        {
            IMethodSymbol longestOverload = TryGetSingleLongestOverload(methodGroup);

            if (longestOverload != null)
            {
                if (longestOverload.ContainingType.IsEqualTo(activeType) && CanBeMadeVirtual(longestOverload))
                {
                    IMethodSymbol methodToReport = longestOverload.PartialImplementationPart ?? longestOverload;
                    context.ReportDiagnostic(Diagnostic.Create(MakeVirtualRule, methodToReport.Locations[0]));
                }

                var info = new OverloadsInfo(methodGroup, longestOverload, context);

                AnalyzeOverloads(info, activeType);
            }
        }