Ejemplo n.º 1
0
    public static bool IsApiControllerAction(ApiControllerSymbolCache symbolCache, IMethodSymbol method)
    {
        if (method == null)
        {
            return(false);
        }

        if (method.ReturnsVoid || method.ReturnType.TypeKind == TypeKind.Error)
        {
            return(false);
        }

        if (!MvcFacts.IsController(method.ContainingType, symbolCache.ControllerAttribute, symbolCache.NonControllerAttribute))
        {
            return(false);
        }

        if (!method.ContainingType.HasAttribute(symbolCache.IApiBehaviorMetadata, inherit: true) &&
            !method.ContainingAssembly.HasAttribute(symbolCache.IApiBehaviorMetadata))
        {
            return(false);
        }

        if (!MvcFacts.IsControllerAction(method, symbolCache.NonActionAttribute, symbolCache.IDisposableDispose))
        {
            return(false);
        }

        return(true);
    }
Ejemplo n.º 2
0
        private void IsControllerReturnsTrue(Type type)
        {
            var compilation = GetIsControllerCompilation();
            var typeSymbol  = compilation.GetTypeByMetadataName(type.FullName);

            // Act
            var isController = MvcFacts.IsController(typeSymbol);

            // Assert
            Assert.True(isController);
        }
Ejemplo n.º 3
0
    private async Task IsControllerReturnsTrue(Type type)
    {
        var compilation = await GetIsControllerCompilation();

        var controllerAttribute    = compilation.GetTypeByMetadataName(ControllerAttribute);
        var nonControllerAttribute = compilation.GetTypeByMetadataName(NonControllerAttribute);
        var typeSymbol             = compilation.GetTypeByMetadataName(type.FullName);

        // Act
        var isController = MvcFacts.IsController(typeSymbol, controllerAttribute, nonControllerAttribute);

        // Assert
        Assert.True(isController);
    }
Ejemplo n.º 4
0
    private static void InitializeWorker(CompilationStartAnalysisContext compilationStartAnalysisContext, SymbolCache symbolCache)
    {
        compilationStartAnalysisContext.RegisterSymbolAction(symbolAnalysisContext =>
        {
            var method = (IMethodSymbol)symbolAnalysisContext.Symbol;
            if (method.MethodKind != MethodKind.Ordinary)
            {
                return;
            }

            if (method.Parameters.Length == 0)
            {
                return;
            }

            if (!MvcFacts.IsController(method.ContainingType, symbolCache.ControllerAttribute, symbolCache.NonControllerAttribute) ||
                !MvcFacts.IsControllerAction(method, symbolCache.NonActionAttribute, symbolCache.IDisposableDispose))
            {
                return;
            }

            if (method.ContainingType.HasAttribute(symbolCache.IApiBehaviorMetadata, inherit: true))
            {
                // The issue of parameter name collision with properties affects complex model-bound types
                // and not input formatting. Ignore ApiController instances since they default to formatting.
                return;
            }

            for (var i = 0; i < method.Parameters.Length; i++)
            {
                var parameter = method.Parameters[i];
                if (IsProblematicParameter(symbolCache, parameter))
                {
                    var location = parameter.Locations.Length != 0 ?
                                   parameter.Locations[0] :
                                   Location.None;

                    symbolAnalysisContext.ReportDiagnostic(
                        Diagnostic.Create(
                            DiagnosticDescriptors.MVC1004_ParameterNameCollidesWithTopLevelProperty,
                            location,
                            parameter.Type.Name,
                            parameter.Name));
                }
            }
        }, SymbolKind.Method);
    }