From 010ffe612150d9a3f5b78f2ad3ffcee3aedef369 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Wed, 17 Jul 2019 13:20:57 -0700 Subject: [PATCH] Consolidate general-purpose analyzers We have some non-MVC analyzers hanging out in the Mvc.Analyzers package. Part of: #12288 --- .../src}/BuildServiceProviderAnalzyer.cs | 0 .../src/Microsoft.AspNetCore.Analyzers.csproj | 1 + .../Analyzers/src}/MiddlewareAnalysis.cs | 0 .../Analyzers/src}/MiddlewareAnalyzer.cs | 0 .../Analyzers/src}/MiddlewareItem.cs | 0 .../Analyzers/src}/OptionsAnalysis.cs | 0 .../Analyzers/src}/OptionsAnalyzer.cs | 0 .../Analyzers/src}/OptionsFacts.cs | 5 +- .../Analyzers/src}/OptionsItem.cs | 0 .../Analyzers/src}/ServicesAnalysis.cs | 0 .../Analyzers/src}/ServicesAnalyzer.cs | 0 .../Analyzers/src}/ServicesItem.cs | 0 .../Analyzers/src}/StartupAnalysis.cs | 0 .../Analyzers/src}/StartupAnalysisBuilder.cs | 0 .../src}/StartupAnalyzer.Diagnostics.cs | 0 .../Analyzers/src}/StartupAnalyzer.Events.cs | 0 .../Analyzers/src}/StartupAnalzyer.cs | 0 src/Analyzers/Analyzers/src/StartupSymbols.cs | 3 + src/Analyzers/Analyzers/src/SymbolNames.cs | 7 ++ .../Analyzers/src}/UseMvcAnalyzer.cs | 0 .../Analyzers/test/AnalyzerTestBase.cs | 5 + .../test/AnalyzersDiagnosticAnalyzerRunner.cs | 31 ++++++ .../Analyzers}/test/StartupAnalyzerTest.cs | 31 +++--- .../ConfigureServices_BuildServiceProvider.cs | 0 .../StartupAnalyzerTest/MvcOptions_UseMvc.cs | 0 .../MvcOptions_UseMvcAndConfiguredRoutes.cs | 0 .../MvcOptions_UseMvcMultiple.cs | 0 .../MvcOptions_UseMvcWithDefaultRoute.cs | 0 ...AndAddMvcOptionsEndpointRoutingDisabled.cs | 0 ...hDefaultRouteAndEndpointRoutingDisabled.cs | 0 .../MvcOptions_UseMvcWithOtherMiddleware.cs | 0 .../StartupSignatures_MoreVariety.cs | 0 .../StartupSignatures_Standard.cs | 0 .../Mvc.Analyzers/src/Startup/StartupFacts.cs | 99 ------------------- .../src/Startup/StartupSymbols.cs | 23 ----- 35 files changed, 61 insertions(+), 144 deletions(-) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/BuildServiceProviderAnalzyer.cs (100%) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/MiddlewareAnalysis.cs (100%) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/MiddlewareAnalyzer.cs (100%) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/MiddlewareItem.cs (100%) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/OptionsAnalysis.cs (100%) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/OptionsAnalyzer.cs (100%) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/OptionsFacts.cs (88%) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/OptionsItem.cs (100%) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/ServicesAnalysis.cs (100%) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/ServicesAnalyzer.cs (100%) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/ServicesItem.cs (100%) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/StartupAnalysis.cs (100%) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/StartupAnalysisBuilder.cs (100%) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/StartupAnalyzer.Diagnostics.cs (100%) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/StartupAnalyzer.Events.cs (100%) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/StartupAnalzyer.cs (100%) rename src/{Mvc/Mvc.Analyzers/src/Startup => Analyzers/Analyzers/src}/UseMvcAnalyzer.cs (100%) create mode 100644 src/Analyzers/Analyzers/test/AnalyzersDiagnosticAnalyzerRunner.cs rename src/{Mvc/Mvc.Analyzers => Analyzers/Analyzers}/test/StartupAnalyzerTest.cs (89%) rename src/{Mvc/Mvc.Analyzers => Analyzers/Analyzers}/test/TestFiles/StartupAnalyzerTest/ConfigureServices_BuildServiceProvider.cs (100%) rename src/{Mvc/Mvc.Analyzers => Analyzers/Analyzers}/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvc.cs (100%) rename src/{Mvc/Mvc.Analyzers => Analyzers/Analyzers}/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcAndConfiguredRoutes.cs (100%) rename src/{Mvc/Mvc.Analyzers => Analyzers/Analyzers}/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcMultiple.cs (100%) rename src/{Mvc/Mvc.Analyzers => Analyzers/Analyzers}/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithDefaultRoute.cs (100%) rename src/{Mvc/Mvc.Analyzers => Analyzers/Analyzers}/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithDefaultRouteAndAddMvcOptionsEndpointRoutingDisabled.cs (100%) rename src/{Mvc/Mvc.Analyzers => Analyzers/Analyzers}/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithDefaultRouteAndEndpointRoutingDisabled.cs (100%) rename src/{Mvc/Mvc.Analyzers => Analyzers/Analyzers}/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithOtherMiddleware.cs (100%) rename src/{Mvc/Mvc.Analyzers => Analyzers/Analyzers}/test/TestFiles/StartupAnalyzerTest/StartupSignatures_MoreVariety.cs (100%) rename src/{Mvc/Mvc.Analyzers => Analyzers/Analyzers}/test/TestFiles/StartupAnalyzerTest/StartupSignatures_Standard.cs (100%) delete mode 100644 src/Mvc/Mvc.Analyzers/src/Startup/StartupFacts.cs delete mode 100644 src/Mvc/Mvc.Analyzers/src/Startup/StartupSymbols.cs diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/BuildServiceProviderAnalzyer.cs b/src/Analyzers/Analyzers/src/BuildServiceProviderAnalzyer.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/src/Startup/BuildServiceProviderAnalzyer.cs rename to src/Analyzers/Analyzers/src/BuildServiceProviderAnalzyer.cs diff --git a/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.csproj b/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.csproj index 2a6daa68bd..feec3324be 100644 --- a/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.csproj +++ b/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.csproj @@ -15,6 +15,7 @@ false false $(MSBuildProjectName).nuspec + Enable diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/MiddlewareAnalysis.cs b/src/Analyzers/Analyzers/src/MiddlewareAnalysis.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/src/Startup/MiddlewareAnalysis.cs rename to src/Analyzers/Analyzers/src/MiddlewareAnalysis.cs diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/MiddlewareAnalyzer.cs b/src/Analyzers/Analyzers/src/MiddlewareAnalyzer.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/src/Startup/MiddlewareAnalyzer.cs rename to src/Analyzers/Analyzers/src/MiddlewareAnalyzer.cs diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/MiddlewareItem.cs b/src/Analyzers/Analyzers/src/MiddlewareItem.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/src/Startup/MiddlewareItem.cs rename to src/Analyzers/Analyzers/src/MiddlewareItem.cs diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/OptionsAnalysis.cs b/src/Analyzers/Analyzers/src/OptionsAnalysis.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/src/Startup/OptionsAnalysis.cs rename to src/Analyzers/Analyzers/src/OptionsAnalysis.cs diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/OptionsAnalyzer.cs b/src/Analyzers/Analyzers/src/OptionsAnalyzer.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/src/Startup/OptionsAnalyzer.cs rename to src/Analyzers/Analyzers/src/OptionsAnalyzer.cs diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/OptionsFacts.cs b/src/Analyzers/Analyzers/src/OptionsFacts.cs similarity index 88% rename from src/Mvc/Mvc.Analyzers/src/Startup/OptionsFacts.cs rename to src/Analyzers/Analyzers/src/OptionsFacts.cs index da95216f73..fb89a0224d 100644 --- a/src/Mvc/Mvc.Analyzers/src/Startup/OptionsFacts.cs +++ b/src/Analyzers/Analyzers/src/OptionsFacts.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNetCore.Mvc.Analyzers; using Microsoft.CodeAnalysis; namespace Microsoft.AspNetCore.Analyzers @@ -14,8 +13,8 @@ namespace Microsoft.AspNetCore.Analyzers for (var i = 0; i < analysis.Options.Length; i++) { var item = analysis.Options[i]; - if (string.Equals(item.OptionsType.ToDisplayString(SymbolDisplayFormat.CSharpErrorMessageFormat), SymbolNames.MvcOptions) && - string.Equals(item.Property.Name, SymbolNames.EnableEndpointRoutingProperty, StringComparison.Ordinal)) + if (string.Equals(item.OptionsType.ToDisplayString(SymbolDisplayFormat.CSharpErrorMessageFormat), SymbolNames.MvcOptions.MetadataName) && + string.Equals(item.Property.Name, SymbolNames.MvcOptions.EnableEndpointRoutingPropertyName, StringComparison.Ordinal)) { return item.ConstantValue as bool? == false; } diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/OptionsItem.cs b/src/Analyzers/Analyzers/src/OptionsItem.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/src/Startup/OptionsItem.cs rename to src/Analyzers/Analyzers/src/OptionsItem.cs diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/ServicesAnalysis.cs b/src/Analyzers/Analyzers/src/ServicesAnalysis.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/src/Startup/ServicesAnalysis.cs rename to src/Analyzers/Analyzers/src/ServicesAnalysis.cs diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/ServicesAnalyzer.cs b/src/Analyzers/Analyzers/src/ServicesAnalyzer.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/src/Startup/ServicesAnalyzer.cs rename to src/Analyzers/Analyzers/src/ServicesAnalyzer.cs diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/ServicesItem.cs b/src/Analyzers/Analyzers/src/ServicesItem.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/src/Startup/ServicesItem.cs rename to src/Analyzers/Analyzers/src/ServicesItem.cs diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalysis.cs b/src/Analyzers/Analyzers/src/StartupAnalysis.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalysis.cs rename to src/Analyzers/Analyzers/src/StartupAnalysis.cs diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalysisBuilder.cs b/src/Analyzers/Analyzers/src/StartupAnalysisBuilder.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalysisBuilder.cs rename to src/Analyzers/Analyzers/src/StartupAnalysisBuilder.cs diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalyzer.Diagnostics.cs b/src/Analyzers/Analyzers/src/StartupAnalyzer.Diagnostics.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalyzer.Diagnostics.cs rename to src/Analyzers/Analyzers/src/StartupAnalyzer.Diagnostics.cs diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalyzer.Events.cs b/src/Analyzers/Analyzers/src/StartupAnalyzer.Events.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalyzer.Events.cs rename to src/Analyzers/Analyzers/src/StartupAnalyzer.Events.cs diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalzyer.cs b/src/Analyzers/Analyzers/src/StartupAnalzyer.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalzyer.cs rename to src/Analyzers/Analyzers/src/StartupAnalzyer.cs diff --git a/src/Analyzers/Analyzers/src/StartupSymbols.cs b/src/Analyzers/Analyzers/src/StartupSymbols.cs index 9b98302b46..e1beb5a74d 100644 --- a/src/Analyzers/Analyzers/src/StartupSymbols.cs +++ b/src/Analyzers/Analyzers/src/StartupSymbols.cs @@ -11,6 +11,7 @@ namespace Microsoft.AspNetCore.Analyzers { IApplicationBuilder = compilation.GetTypeByMetadataName(SymbolNames.IApplicationBuilder.MetadataName); IServiceCollection = compilation.GetTypeByMetadataName(SymbolNames.IServiceCollection.MetadataName); + MvcOptions = compilation.GetTypeByMetadataName(SymbolNames.MvcOptions.MetadataName); } public bool HasRequiredSymbols => IApplicationBuilder != null && IServiceCollection != null; @@ -18,5 +19,7 @@ namespace Microsoft.AspNetCore.Analyzers public INamedTypeSymbol IApplicationBuilder { get; } public INamedTypeSymbol IServiceCollection { get; } + + public INamedTypeSymbol MvcOptions { get; } } } diff --git a/src/Analyzers/Analyzers/src/SymbolNames.cs b/src/Analyzers/Analyzers/src/SymbolNames.cs index 0442d96c75..eb544f1e67 100644 --- a/src/Analyzers/Analyzers/src/SymbolNames.cs +++ b/src/Analyzers/Analyzers/src/SymbolNames.cs @@ -41,5 +41,12 @@ namespace Microsoft.AspNetCore.Analyzers public const string UseSignalRMethodName = "UseSignalR"; } + + public static class MvcOptions + { + public const string MetadataName = "Microsoft.AspNetCore.Mvc.MvcOptions"; + + public const string EnableEndpointRoutingPropertyName = "EnableEndpointRouting"; + } } } diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/UseMvcAnalyzer.cs b/src/Analyzers/Analyzers/src/UseMvcAnalyzer.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/src/Startup/UseMvcAnalyzer.cs rename to src/Analyzers/Analyzers/src/UseMvcAnalyzer.cs diff --git a/src/Analyzers/Analyzers/test/AnalyzerTestBase.cs b/src/Analyzers/Analyzers/test/AnalyzerTestBase.cs index dee9dd3227..9ec94add87 100644 --- a/src/Analyzers/Analyzers/test/AnalyzerTestBase.cs +++ b/src/Analyzers/Analyzers/test/AnalyzerTestBase.cs @@ -17,6 +17,11 @@ namespace Microsoft.AspNetCore.Analyzers public TestSource Read(string source) { + if (!source.EndsWith(".cs")) + { + source = source + ".cs"; + } + var filePath = Path.Combine(ProjectDirectory, "TestFiles", GetType().Name, source); if (!File.Exists(filePath)) { diff --git a/src/Analyzers/Analyzers/test/AnalyzersDiagnosticAnalyzerRunner.cs b/src/Analyzers/Analyzers/test/AnalyzersDiagnosticAnalyzerRunner.cs new file mode 100644 index 0000000000..57a8ce8a69 --- /dev/null +++ b/src/Analyzers/Analyzers/test/AnalyzersDiagnosticAnalyzerRunner.cs @@ -0,0 +1,31 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Analyzer.Testing; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Diagnostics; + +namespace Microsoft.AspNetCore.Analyzers +{ + internal class AnalyzersDiagnosticAnalyzerRunner : DiagnosticAnalyzerRunner + { + public AnalyzersDiagnosticAnalyzerRunner(DiagnosticAnalyzer analyzer) + { + Analyzer = analyzer; + } + + public DiagnosticAnalyzer Analyzer { get; } + + public Task GetDiagnosticsAsync(string source) + { + return GetDiagnosticsAsync(sources: new[] { source }, Analyzer, Array.Empty()); + } + + public Task GetDiagnosticsAsync(Project project) + { + return GetDiagnosticsAsync(new[] { project }, Analyzer, Array.Empty()); + } + } +} diff --git a/src/Mvc/Mvc.Analyzers/test/StartupAnalyzerTest.cs b/src/Analyzers/Analyzers/test/StartupAnalyzerTest.cs similarity index 89% rename from src/Mvc/Mvc.Analyzers/test/StartupAnalyzerTest.cs rename to src/Analyzers/Analyzers/test/StartupAnalyzerTest.cs index ef76ab0ff0..c471b56a56 100644 --- a/src/Mvc/Mvc.Analyzers/test/StartupAnalyzerTest.cs +++ b/src/Analyzers/Analyzers/test/StartupAnalyzerTest.cs @@ -1,24 +1,22 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Concurrent; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Analyzer.Testing; -using Microsoft.AspNetCore.Mvc; using Microsoft.CodeAnalysis; using Xunit; namespace Microsoft.AspNetCore.Analyzers { - public class StartupAnalyzerTest + public class StartupAnalyzerTest : AnalyzerTestBase { public StartupAnalyzerTest() { StartupAnalyzer = new StartupAnalzyer(); - Runner = new MvcDiagnosticAnalyzerRunner(StartupAnalyzer); + Runner = new AnalyzersDiagnosticAnalyzerRunner(StartupAnalyzer); Analyses = new ConcurrentBag(); ConfigureServicesMethods = new ConcurrentBag(); @@ -32,7 +30,7 @@ namespace Microsoft.AspNetCore.Analyzers private StartupAnalzyer StartupAnalyzer { get; } - private MvcDiagnosticAnalyzerRunner Runner { get; } + private AnalyzersDiagnosticAnalyzerRunner Runner { get; } private ConcurrentBag Analyses { get; } @@ -44,7 +42,7 @@ namespace Microsoft.AspNetCore.Analyzers public async Task StartupAnalyzer_FindsStartupMethods_StartupSignatures_Standard() { // Arrange - var source = ReadSource("StartupSignatures_Standard"); + var source = Read("StartupSignatures_Standard"); // Act var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); @@ -60,7 +58,7 @@ namespace Microsoft.AspNetCore.Analyzers public async Task StartupAnalyzer_FindsStartupMethods_StartupSignatures_MoreVariety() { // Arrange - var source = ReadSource("StartupSignatures_MoreVariety"); + var source = Read("StartupSignatures_MoreVariety"); // Act var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); @@ -82,7 +80,7 @@ namespace Microsoft.AspNetCore.Analyzers public async Task StartupAnalyzer_MvcOptionsAnalysis_UseMvc_FindsEndpointRoutingDisabled() { // Arrange - var source = ReadSource("MvcOptions_UseMvcWithDefaultRouteAndEndpointRoutingDisabled"); + var source = Read("MvcOptions_UseMvcWithDefaultRouteAndEndpointRoutingDisabled"); // Act var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); @@ -102,7 +100,7 @@ namespace Microsoft.AspNetCore.Analyzers public async Task StartupAnalyzer_MvcOptionsAnalysis_AddMvcOptions_FindsEndpointRoutingDisabled() { // Arrange - var source = ReadSource("MvcOptions_UseMvcWithDefaultRouteAndAddMvcOptionsEndpointRoutingDisabled"); + var source = Read("MvcOptions_UseMvcWithDefaultRouteAndAddMvcOptionsEndpointRoutingDisabled"); // Act var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); @@ -125,7 +123,7 @@ namespace Microsoft.AspNetCore.Analyzers public async Task StartupAnalyzer_MvcOptionsAnalysis_FindsEndpointRoutingEnabled(string sourceFileName, string mvcMiddlewareName) { // Arrange - var source = ReadSource(sourceFileName); + var source = Read(sourceFileName); // Act var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); @@ -151,7 +149,7 @@ namespace Microsoft.AspNetCore.Analyzers public async Task StartupAnalyzer_MvcOptionsAnalysis_MultipleMiddleware() { // Arrange - var source = ReadSource("MvcOptions_UseMvcWithOtherMiddleware"); + var source = Read("MvcOptions_UseMvcWithOtherMiddleware"); // Act var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); @@ -183,7 +181,7 @@ namespace Microsoft.AspNetCore.Analyzers public async Task StartupAnalyzer_MvcOptionsAnalysis_MultipleUseMvc() { // Arrange - var source = ReadSource("MvcOptions_UseMvcMultiple"); + var source = Read("MvcOptions_UseMvcMultiple"); // Act var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); @@ -215,7 +213,7 @@ namespace Microsoft.AspNetCore.Analyzers public async Task StartupAnalyzer_ServicesAnalysis_CallBuildServiceProvider() { // Arrange - var source = ReadSource("ConfigureServices_BuildServiceProvider"); + var source = Read("ConfigureServices_BuildServiceProvider"); // Act var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); @@ -230,10 +228,5 @@ namespace Microsoft.AspNetCore.Analyzers AnalyzerAssert.DiagnosticLocation(source.MarkerLocations["MM1"], diagnostic.Location); }); } - - private TestSource ReadSource(string fileName) - { - return MvcTestSource.Read(nameof(StartupAnalyzerTest), fileName); - } } } diff --git a/src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/ConfigureServices_BuildServiceProvider.cs b/src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/ConfigureServices_BuildServiceProvider.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/ConfigureServices_BuildServiceProvider.cs rename to src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/ConfigureServices_BuildServiceProvider.cs diff --git a/src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvc.cs b/src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvc.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvc.cs rename to src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvc.cs diff --git a/src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcAndConfiguredRoutes.cs b/src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcAndConfiguredRoutes.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcAndConfiguredRoutes.cs rename to src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcAndConfiguredRoutes.cs diff --git a/src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcMultiple.cs b/src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcMultiple.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcMultiple.cs rename to src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcMultiple.cs diff --git a/src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithDefaultRoute.cs b/src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithDefaultRoute.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithDefaultRoute.cs rename to src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithDefaultRoute.cs diff --git a/src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithDefaultRouteAndAddMvcOptionsEndpointRoutingDisabled.cs b/src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithDefaultRouteAndAddMvcOptionsEndpointRoutingDisabled.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithDefaultRouteAndAddMvcOptionsEndpointRoutingDisabled.cs rename to src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithDefaultRouteAndAddMvcOptionsEndpointRoutingDisabled.cs diff --git a/src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithDefaultRouteAndEndpointRoutingDisabled.cs b/src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithDefaultRouteAndEndpointRoutingDisabled.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithDefaultRouteAndEndpointRoutingDisabled.cs rename to src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithDefaultRouteAndEndpointRoutingDisabled.cs diff --git a/src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithOtherMiddleware.cs b/src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithOtherMiddleware.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithOtherMiddleware.cs rename to src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/MvcOptions_UseMvcWithOtherMiddleware.cs diff --git a/src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/StartupSignatures_MoreVariety.cs b/src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/StartupSignatures_MoreVariety.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/StartupSignatures_MoreVariety.cs rename to src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/StartupSignatures_MoreVariety.cs diff --git a/src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/StartupSignatures_Standard.cs b/src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/StartupSignatures_Standard.cs similarity index 100% rename from src/Mvc/Mvc.Analyzers/test/TestFiles/StartupAnalyzerTest/StartupSignatures_Standard.cs rename to src/Analyzers/Analyzers/test/TestFiles/StartupAnalyzerTest/StartupSignatures_Standard.cs diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/StartupFacts.cs b/src/Mvc/Mvc.Analyzers/src/Startup/StartupFacts.cs deleted file mode 100644 index ba13dc63be..0000000000 --- a/src/Mvc/Mvc.Analyzers/src/Startup/StartupFacts.cs +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.CodeAnalysis; - -namespace Microsoft.AspNetCore.Analyzers -{ - internal static class StartupFacts - { - public static bool IsStartupClass(StartupSymbols symbols, INamedTypeSymbol type) - { - if (symbols == null) - { - throw new ArgumentNullException(nameof(symbols)); - } - - if (type == null) - { - throw new ArgumentNullException(nameof(type)); - } - - // It's not good enough to just look for ConfigureServices or Configure as a hueristic. - // ConfigureServices might not appear in trivial cases, and Configure might be named ConfigureDevelopment - // or something similar. - // - // Since we already are analyzing the symbol it should be cheap to do a quick pass over the members. - var members = type.GetMembers(); - for (var i = 0; i < members.Length; i++) - { - if (members[i] is IMethodSymbol method && (IsConfigureServices(symbols, method) || IsConfigure(symbols, method))) - { - return true; - } - } - - return false; - } - - public static bool IsConfigureServices(StartupSymbols symbols, IMethodSymbol symbol) - { - if (symbol == null) - { - throw new ArgumentNullException(nameof(symbol)); - } - - if (symbol.DeclaredAccessibility != Accessibility.Public) - { - return false; - } - - if (!string.Equals(symbol.Name, "ConfigureServices", StringComparison.Ordinal)) - { - return false; - } - - if (symbol.Parameters.Length != 1) - { - return false; - } - - if (symbol.Parameters[0].Type != symbols.IServiceCollection) - { - return false; - } - - return true; - } - - public static bool IsConfigure(StartupSymbols symbols, IMethodSymbol symbol) - { - if (symbol == null) - { - throw new ArgumentNullException(nameof(symbol)); - } - - if (symbol.DeclaredAccessibility != Accessibility.Public) - { - return false; - } - - if (symbol.Name == null || !symbol.Name.StartsWith("Configure", StringComparison.Ordinal)) - { - return false; - } - - // IApplicationBuilder can appear in any parameter - for (var i = 0; i < symbol.Parameters.Length; i++) - { - if (symbol.Parameters[i].Type == symbols.IApplicationBuilder) - { - return true; - } - } - - return false; - } - } -} diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/StartupSymbols.cs b/src/Mvc/Mvc.Analyzers/src/Startup/StartupSymbols.cs deleted file mode 100644 index f528c9fa48..0000000000 --- a/src/Mvc/Mvc.Analyzers/src/Startup/StartupSymbols.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.CodeAnalysis; - -namespace Microsoft.AspNetCore.Analyzers -{ - internal class StartupSymbols - { - public StartupSymbols(Compilation compilation) - { - IApplicationBuilder = compilation.GetTypeByMetadataName("Microsoft.AspNetCore.Builder.IApplicationBuilder"); - IServiceCollection = compilation.GetTypeByMetadataName("Microsoft.Extensions.DependencyInjection.IServiceCollection"); - MvcOptions = compilation.GetTypeByMetadataName("Microsoft.AspNetCore.Mvc.MvcOptions"); - } - - public bool HasRequiredSymbols => IApplicationBuilder != null && IServiceCollection != null; - - public INamedTypeSymbol IApplicationBuilder { get; } - public INamedTypeSymbol IServiceCollection { get; } - public INamedTypeSymbol MvcOptions { get; } - } -}