From c1902565ea2a99abd9905834053e32828e761252 Mon Sep 17 00:00:00 2001 From: Anh Thi Dao Date: Wed, 8 Jun 2022 15:18:03 -0700 Subject: [PATCH 1/7] modify the route to display username and date --- src/Http/samples/MinimalSample/Program.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Http/samples/MinimalSample/Program.cs b/src/Http/samples/MinimalSample/Program.cs index 1b100483c076..a15f67986088 100644 --- a/src/Http/samples/MinimalSample/Program.cs +++ b/src/Http/samples/MinimalSample/Program.cs @@ -16,13 +16,12 @@ string Plaintext() => "Hello, World!"; app.MapGet("/plaintext", Plaintext); -var message = - $""" +app.MapGet("/", () => $""" Operating System: {Environment.OSVersion} .NET version: {Environment.Version} - """; - -app.MapGet("/", () => message); + Username: {Environment.UserName} + Date and Time: {DateTime.Now} + """); var nestedGroup = app.MapGroup("/group/{groupName}") .MapGroup("/nested/{nestedName}") From 8cb31a447b2bbad511aeb068a6a629379b578f49 Mon Sep 17 00:00:00 2001 From: Anh Thi Dao Date: Wed, 15 Jun 2022 15:04:33 -0700 Subject: [PATCH 2/7] added my test file and add some implementation of my analyzer --- ...lowConfigureAppConfigureHostBuilderTest.cs | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs diff --git a/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs new file mode 100644 index 000000000000..cfaaa2b0e386 --- /dev/null +++ b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs @@ -0,0 +1,127 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.Testing; +using VerifyCS = Microsoft.AspNetCore.Analyzers.RouteHandlers.CSharpRouteHandlerCodeFixVerifier< + Microsoft.AspNetCore.Analyzers.RouteHandlers.RouteHandlerAnalyzer, + Microsoft.AspNetCore.Analyzers.RouteHandlers.Fixers.DetectMismatchedParameterOptionalityFixer>; + +namespace Microsoft.AspNetCore.Analyzers.WebApplicationBuilder; +public partial class DisallowConfigureAppConfigureHostBuilderTest +{ + private TestDiagnosticAnalyzerRunner Runner { get; } = new(new WebApplicationBuilderAnalyzer()); + /** + * Verify that the correct code produces no diagnostic + */ + [Fact] + public async Task ConfigurationBuilderRunsWithoutDiagnostic() + { + // Arrange + var source = @" +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Hosting; +var builder = WebApplication.CreateBuilder(args); +builder.Configuration.AddJSonFile(fileName, optional: true); +"; + // Act + var diagnostic = await Runner.GetDiagnosticsAsync(source); + + // Assert + Assert.Empty(diagnostic); + } + /** + * Verify the fixed code and the diagnostic for builder.Host.ConfigureAppConfiguration + */ + [Fact] + public async Task ConfigureAppHostBuilderProducesDiagnostic() + { + // Arrange + var source = @" +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Hosting; +var builder = WebApplication.CreateBuilder(args); +builder.Host.ConfigureAppConfiguration(builder => +{ + builder.AddJsonFile(fileName, optional: true); +}); +"; + var fixedSource = @" +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Hosting; +var builder = WebApplication.CreateBuilder(args); +builder.Configuration.AddJsonFile(fileName, optional: true); +"; + // Act + var expectedDiagnostic = new DiagnosticResult(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder); + + // Assert + await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource); + } + + /** + * Verify the fixed code and the diagnostic for builder.Host.ConfigureHostConfiguration + */ + [Fact] + public async Task ConfigureHostHostBuilderProducesDiagnostic() + { + // Arrange + var source = @" +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Hosting; +var builder = WebApplication.CreateBuilder(args); +builder.Host.ConfigureHostConfiguration(builder => +{ + builder.AddJsonFile(fileName, optional: true); +}); +"; + var fixedSource = @" +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Hosting; +var builder = WebApplication.CreateBuilder(args); +builder.Configuration.AddJsonFile(fileName, optional: true); +"; + // Act + var expectedDiagnostic = new DiagnosticResult(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder); + + // Assert + await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource); + } + + /** + * Verify the fixed code and the diagnostic for builder.WebHost.ConfigureAppConfiguration + */ + [Fact] + public async Task ConfigureAppWebHostBuilderProducesDiagnostic() + { + // Arrange + var source = @" +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Hosting; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; +var builder = WebApplication.CreateBuilder(args); +builder.WebHost.ConfigureAppConfiguration(builder => +{ + builder.AddJsonFile(fileName, optional: true); +}); +"; + var fixedSource = @" +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Hosting; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; +var builder = WebApplication.CreateBuilder(args); +builder.Configuration.AddJsonFile(fileName, optional: true); +"; + // Act + var expectedDiagnostic = new DiagnosticResult(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder); + + // Assert + await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource); + } +} From 46ed4b918579e64e232764090dd863f9030320ba Mon Sep 17 00:00:00 2001 From: Anh Thi Dao Date: Wed, 22 Jun 2022 11:02:41 -0700 Subject: [PATCH 3/7] added the code and tests for analyzer in issue #35815 --- .../src/Analyzers/DiagnosticDescriptors.cs | 10 + .../WebApplicationBuilderAnalyzer.cs | 57 +++++ .../WebApplicationBuilder/WellKnownTypes.cs | 8 + ...lowConfigureAppConfigureHostBuilderTest.cs | 205 ++++++++++++------ 4 files changed, 219 insertions(+), 61 deletions(-) diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs index c01db137deaa..0b93cf806712 100644 --- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs +++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs @@ -79,4 +79,14 @@ internal static class DiagnosticDescriptors DiagnosticSeverity.Error, isEnabledByDefault: true, helpLinkUri: "https://aka.ms/aspnet/analyzers"); + + internal static readonly DiagnosticDescriptor DisallowConfigureAppConfigureHostBuilder = new( + "ASP0013", + "Do not use builder.Host.ConfigureAppConfiguration or builder.Host.ConfigureHostConfiguration", + "Replace with builder.Configuration", + "Usage", + DiagnosticSeverity.Error, + isEnabledByDefault: true, + helpLinkUri: "https://aka.ms/aspnet/analyzers"); + } diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WebApplicationBuilderAnalyzer.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WebApplicationBuilderAnalyzer.cs index 01cfdc829a71..d777ef7fe2ba 100644 --- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WebApplicationBuilderAnalyzer.cs +++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WebApplicationBuilderAnalyzer.cs @@ -21,6 +21,7 @@ public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer DiagnosticDescriptors.DoNotUseConfigureWebHostWithConfigureHostBuilder, DiagnosticDescriptors.DoNotUseConfigureWithConfigureWebHostBuilder, DiagnosticDescriptors.DoNotUseUseStartupWithConfigureWebHostBuilder, + DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, }); public override void Initialize(AnalysisContext context) @@ -44,6 +45,14 @@ public override void Initialize(AnalysisContext context) wellKnownTypes.HostingAbstractionsWebHostBuilderExtensions, wellKnownTypes.WebHostBuilderExtensions, }; + INamedTypeSymbol[] configureAppTypes = + { + wellKnownTypes.ConfigureHostBuilder, + wellKnownTypes.ConfigureWebHostBuilder, + wellKnownTypes.WebHostBuilderExtensions, + wellKnownTypes.HostingHostBuilderExtensions, + }; + INamedTypeSymbol[] configureHostTypes = { wellKnownTypes.ConfigureHostBuilder }; compilationStartAnalysisContext.RegisterOperationAction(operationAnalysisContext => { @@ -98,6 +107,54 @@ public override void Initialize(AnalysisContext context) invocation)); } + // var builder = WebApplication.CreateBuilder(); + // builder.WebHost.ConfigureAppConfiguration(builder => {}); + if (IsDisallowedMethod( + operationAnalysisContext, + invocation, + targetMethod, + wellKnownTypes.ConfigureWebHostBuilder, + "ConfigureAppConfiguration", + configureAppTypes)) + { + operationAnalysisContext.ReportDiagnostic( + CreateDiagnostic( + DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, + invocation)); + } + + // var builder = WebApplication.CreateBuilder(); + // builder.Host.ConfigureAppConfiguration(builder => {}); + if (IsDisallowedMethod( + operationAnalysisContext, + invocation, + targetMethod, + wellKnownTypes.ConfigureHostBuilder, + "ConfigureAppConfiguration", + configureAppTypes)) + { + operationAnalysisContext.ReportDiagnostic( + CreateDiagnostic( + DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, + invocation)); + } + + // var builder = WebApplication.CreateBuilder(); + // builder.Host.ConfigureHostConfiguration(builder => {}); + if (IsDisallowedMethod( + operationAnalysisContext, + invocation, + targetMethod, + wellKnownTypes.ConfigureHostBuilder, + "ConfigureHostConfiguration", + configureHostTypes)) + { + operationAnalysisContext.ReportDiagnostic( + CreateDiagnostic( + DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, + invocation)); + } + static Diagnostic CreateDiagnostic(DiagnosticDescriptor descriptor, IInvocationOperation operation) { // Take the location for the whole invocation operation as a starting point. diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WellKnownTypes.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WellKnownTypes.cs index d4c43aa2a843..fb36c5301598 100644 --- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WellKnownTypes.cs +++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WellKnownTypes.cs @@ -42,6 +42,12 @@ public static bool TryCreate(Compilation compilation, [NotNullWhen(true)] out We return false; } + const string HostingHostBuilderExtensions = "Microsoft.Extensions.Hosting.HostingHostBuilderExtensions"; + if (compilation.GetTypeByMetadataName(HostingHostBuilderExtensions) is not { } hostingHostBuilderExtensions) + { + return false; + } + wellKnownTypes = new WellKnownTypes { ConfigureHostBuilder = configureHostBuilder, @@ -49,6 +55,7 @@ public static bool TryCreate(Compilation compilation, [NotNullWhen(true)] out We GenericHostWebHostBuilderExtensions = genericHostWebHostBuilderExtensions, HostingAbstractionsWebHostBuilderExtensions = hostingAbstractionsWebHostBuilderExtensions, WebHostBuilderExtensions = webHostBuilderExtensions, + HostingHostBuilderExtensions = hostingHostBuilderExtensions, }; return true; @@ -59,4 +66,5 @@ public static bool TryCreate(Compilation compilation, [NotNullWhen(true)] out We public INamedTypeSymbol GenericHostWebHostBuilderExtensions { get; private init; } public INamedTypeSymbol HostingAbstractionsWebHostBuilderExtensions { get; private init; } public INamedTypeSymbol WebHostBuilderExtensions { get; private init; } + public INamedTypeSymbol HostingHostBuilderExtensions { get; private init; } } diff --git a/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs index cfaaa2b0e386..a620540361c3 100644 --- a/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs +++ b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs @@ -1,32 +1,23 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis.Testing; -using VerifyCS = Microsoft.AspNetCore.Analyzers.RouteHandlers.CSharpRouteHandlerCodeFixVerifier< - Microsoft.AspNetCore.Analyzers.RouteHandlers.RouteHandlerAnalyzer, - Microsoft.AspNetCore.Analyzers.RouteHandlers.Fixers.DetectMismatchedParameterOptionalityFixer>; +using System.Globalization; +using Microsoft.AspNetCore.Analyzer.Testing; namespace Microsoft.AspNetCore.Analyzers.WebApplicationBuilder; public partial class DisallowConfigureAppConfigureHostBuilderTest { private TestDiagnosticAnalyzerRunner Runner { get; } = new(new WebApplicationBuilderAnalyzer()); - /** - * Verify that the correct code produces no diagnostic - */ + [Fact] public async Task ConfigurationBuilderRunsWithoutDiagnostic() { // Arrange var source = @" using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Configuration; var builder = WebApplication.CreateBuilder(args); -builder.Configuration.AddJSonFile(fileName, optional: true); +builder.Configuration.AddJsonFile(""foo.json"", optional: true); "; // Act var diagnostic = await Runner.GetDiagnosticsAsync(source); @@ -34,94 +25,186 @@ public async Task ConfigurationBuilderRunsWithoutDiagnostic() // Assert Assert.Empty(diagnostic); } - /** - * Verify the fixed code and the diagnostic for builder.Host.ConfigureAppConfiguration - */ + [Fact] public async Task ConfigureAppHostBuilderProducesDiagnostic() { // Arrange - var source = @" + var source = TestSource.Read(@" using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Configuration; var builder = WebApplication.CreateBuilder(args); -builder.Host.ConfigureAppConfiguration(builder => +builder.Host./*MM*/ConfigureAppConfiguration(builder => { - builder.AddJsonFile(fileName, optional: true); + builder.AddJsonFile(""foo.json"", optional: true); }); -"; - var fixedSource = @" -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Hosting; -var builder = WebApplication.CreateBuilder(args); -builder.Configuration.AddJsonFile(fileName, optional: true); -"; +"); + // Act - var expectedDiagnostic = new DiagnosticResult(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder); + var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); // Assert - await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource); + var diagnostic = Assert.Single(diagnostics); + Assert.Same(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, diagnostic.Descriptor); + AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location); + Assert.Equal("Replace with builder.Configuration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); } - /** - * Verify the fixed code and the diagnostic for builder.Host.ConfigureHostConfiguration - */ [Fact] public async Task ConfigureHostHostBuilderProducesDiagnostic() { // Arrange - var source = @" + var source = TestSource.Read(@" using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Configuration; var builder = WebApplication.CreateBuilder(args); -builder.Host.ConfigureHostConfiguration(builder => +builder.Host./*MM*/ConfigureHostConfiguration(builder => { - builder.AddJsonFile(fileName, optional: true); + builder.AddJsonFile(""foo.json"", optional: true); }); -"; - var fixedSource = @" -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Hosting; -var builder = WebApplication.CreateBuilder(args); -builder.Configuration.AddJsonFile(fileName, optional: true); -"; +"); + // Act - var expectedDiagnostic = new DiagnosticResult(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder); + var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); // Assert - await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource); + var diagnostic = Assert.Single(diagnostics); + Assert.Same(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, diagnostic.Descriptor); + AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location); + Assert.Equal("Replace with builder.Configuration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); } - /** - * Verify the fixed code and the diagnostic for builder.WebHost.ConfigureAppConfiguration - */ [Fact] public async Task ConfigureAppWebHostBuilderProducesDiagnostic() { // Arrange - var source = @" + var source = TestSource.Read(@" using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Hosting; using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Configuration; var builder = WebApplication.CreateBuilder(args); -builder.WebHost.ConfigureAppConfiguration(builder => +builder.WebHost./*MM*/ConfigureAppConfiguration(builder => { - builder.AddJsonFile(fileName, optional: true); + builder.AddJsonFile(""foo.json"", optional: true); }); -"; - var fixedSource = @" +"); + + // Act + var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); + + // Assert + var diagnostic = Assert.Single(diagnostics); + Assert.Same(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, diagnostic.Descriptor); + AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location); + Assert.Equal("Replace with builder.Configuration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); + } + + [Fact] + public async Task ConfigureAppWebHostBuilderWithContextProducesDiagnostic() + { + // Arrange + var source = TestSource.Read(@" using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Hosting; using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Configuration; var builder = WebApplication.CreateBuilder(args); -builder.Configuration.AddJsonFile(fileName, optional: true); -"; +builder.WebHost./*MM*/ConfigureAppConfiguration((context, webHostBuilder) => { }); +"); + + // Act + var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); + + // Assert + var diagnostic = Assert.Single(diagnostics); + Assert.Same(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, diagnostic.Descriptor); + AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location); + Assert.Equal("Replace with builder.Configuration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); + } + [Fact] + public async Task ConfigureAppWebHostBuilderProducesDiagnosticInMain() + { + // Arrange + var source = TestSource.Read(@" +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +public static class Test +{ + public static void Main(string[]args) { + var builder = WebApplication.CreateBuilder(args); + builder.WebHost./*MM*/ConfigureAppConfiguration(builder => { }); +} +} +"); + + // Act + var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); + + // Assert + var diagnostic = Assert.Single(diagnostics); + Assert.Same(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, diagnostic.Descriptor); + AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location); + Assert.Equal("Replace with builder.Configuration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); + } + [Fact] + public async Task ConfigureAppWebHostOnBuilderProducesDiagnosticInMain() + { + // Arrange + var source = TestSource.Read(@" +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +public static class Test +{ + public static void Main(string[]args) { + var builder = WebApplication.CreateBuilder(args); + var webhost = builder.WebHost; + webhost./*MM*/ConfigureAppConfiguration(builder => { }); +} +} +"); + + // Act + var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); + + // Assert + var diagnostic = Assert.Single(diagnostics); + Assert.Same(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, diagnostic.Descriptor); + AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location); + Assert.Equal("Replace with builder.Configuration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); + } + [Fact] + public async Task TwoInvocationsProduceTwoDiagnostic() + { + // Arrange + var source = TestSource.Read(@" +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +var builder = WebApplication.CreateBuilder(args); +builder.Host./*MM1*/ConfigureHostConfiguration(builder => +{ + builder.AddJsonFile(""foo.json"", optional: true); +}); +builder.WebHost./*MM2*/ConfigureAppConfiguration(builder => +{ + builder.AddJsonFile(""foo.json"", optional: true); +}); +"); + // Act - var expectedDiagnostic = new DiagnosticResult(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder); + var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); // Assert - await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource); + Assert.Equal(2, diagnostics.Length); + var diagnostic1 = diagnostics[0]; + var diagnostic2 = diagnostics[1]; + Assert.Same(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, diagnostic1.Descriptor); + AnalyzerAssert.DiagnosticLocation(source.MarkerLocations["MM1"], diagnostic1.Location); + Assert.Equal("Replace with builder.Configuration", diagnostic1.GetMessage(CultureInfo.InvariantCulture)); + Assert.Same(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, diagnostic2.Descriptor); + AnalyzerAssert.DiagnosticLocation(source.MarkerLocations["MM2"], diagnostic2.Location); + Assert.Equal("Replace with builder.Configuration", diagnostic2.GetMessage(CultureInfo.InvariantCulture)); } } From feca4d05b88c29436f376f922b3873296425a7a0 Mon Sep 17 00:00:00 2001 From: anhthidao <107068384+anhthidao@users.noreply.github.com> Date: Thu, 23 Jun 2022 10:16:59 -0700 Subject: [PATCH 4/7] Update src/Http/samples/MinimalSample/Program.cs Co-authored-by: Safia Abdalla --- src/Http/samples/MinimalSample/Program.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Http/samples/MinimalSample/Program.cs b/src/Http/samples/MinimalSample/Program.cs index 4c2939b196d1..41914ad574d0 100644 --- a/src/Http/samples/MinimalSample/Program.cs +++ b/src/Http/samples/MinimalSample/Program.cs @@ -18,7 +18,6 @@ Username: {Environment.UserName} Date and Time: {DateTime.Now} """); - var outer = app.MapGroup("/outer"); var inner = outer.MapGroup("/inner"); From e562806d99b0a3b16f711d0e3a60b3adc4d25569 Mon Sep 17 00:00:00 2001 From: Anh Thi Dao Date: Fri, 24 Jun 2022 11:03:47 -0700 Subject: [PATCH 5/7] Changing the severity of the error. Changing the wording of the title and message. Changing the WebApplicationBuilderAnalyzers class so that the method name can be passed into the diagnostic message --- .../src/Analyzers/DiagnosticDescriptors.cs | 6 +++--- .../WebApplicationBuilderAnalyzer.cs | 2 +- ...llowConfigureAppConfigureHostBuilderTest.cs | 18 +++++++++--------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs index 0b93cf806712..1dbc75a40005 100644 --- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs +++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs @@ -82,10 +82,10 @@ internal static class DiagnosticDescriptors internal static readonly DiagnosticDescriptor DisallowConfigureAppConfigureHostBuilder = new( "ASP0013", - "Do not use builder.Host.ConfigureAppConfiguration or builder.Host.ConfigureHostConfiguration", - "Replace with builder.Configuration", + "Suggest switching from using Configure methods to WebApplicationBuilder.Configuration", + "Suggest using WebApplicationBuilder.Configuration instead of {0}", "Usage", - DiagnosticSeverity.Error, + DiagnosticSeverity.Warning, isEnabledByDefault: true, helpLinkUri: "https://aka.ms/aspnet/analyzers"); diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WebApplicationBuilderAnalyzer.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WebApplicationBuilderAnalyzer.cs index d777ef7fe2ba..91dd7181a5b6 100644 --- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WebApplicationBuilderAnalyzer.cs +++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WebApplicationBuilderAnalyzer.cs @@ -204,7 +204,7 @@ static Diagnostic CreateDiagnostic(DiagnosticDescriptor descriptor, IInvocationO location = Location.Create(operation.Syntax.SyntaxTree, targetSpan); } - return Diagnostic.Create(descriptor, location); + return Diagnostic.Create(descriptor, location, methodName); } }, OperationKind.Invocation); diff --git a/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs index a620540361c3..1e0bec1e3907 100644 --- a/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs +++ b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs @@ -23,7 +23,7 @@ public async Task ConfigurationBuilderRunsWithoutDiagnostic() var diagnostic = await Runner.GetDiagnosticsAsync(source); // Assert - Assert.Empty(diagnostic); + Assert.Empty(diagnostic); } [Fact] @@ -48,7 +48,7 @@ public async Task ConfigureAppHostBuilderProducesDiagnostic() var diagnostic = Assert.Single(diagnostics); Assert.Same(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, diagnostic.Descriptor); AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location); - Assert.Equal("Replace with builder.Configuration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); + Assert.Equal("Suggest using WebApplicationBuilder.Configuration instead of ConfigureAppConfiguration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); } [Fact] @@ -72,7 +72,7 @@ public async Task ConfigureHostHostBuilderProducesDiagnostic() var diagnostic = Assert.Single(diagnostics); Assert.Same(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, diagnostic.Descriptor); AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location); - Assert.Equal("Replace with builder.Configuration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); + Assert.Equal("Suggest using WebApplicationBuilder.Configuration instead of ConfigureHostConfiguration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); } [Fact] @@ -97,7 +97,7 @@ public async Task ConfigureAppWebHostBuilderProducesDiagnostic() var diagnostic = Assert.Single(diagnostics); Assert.Same(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, diagnostic.Descriptor); AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location); - Assert.Equal("Replace with builder.Configuration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); + Assert.Equal("Suggest using WebApplicationBuilder.Configuration instead of ConfigureAppConfiguration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); } [Fact] @@ -119,7 +119,7 @@ public async Task ConfigureAppWebHostBuilderWithContextProducesDiagnostic() var diagnostic = Assert.Single(diagnostics); Assert.Same(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, diagnostic.Descriptor); AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location); - Assert.Equal("Replace with builder.Configuration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); + Assert.Equal("Suggest using WebApplicationBuilder.Configuration instead of ConfigureAppConfiguration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); } [Fact] public async Task ConfigureAppWebHostBuilderProducesDiagnosticInMain() @@ -145,7 +145,7 @@ public static void Main(string[]args) { var diagnostic = Assert.Single(diagnostics); Assert.Same(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, diagnostic.Descriptor); AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location); - Assert.Equal("Replace with builder.Configuration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); + Assert.Equal("Suggest using WebApplicationBuilder.Configuration instead of ConfigureAppConfiguration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); } [Fact] public async Task ConfigureAppWebHostOnBuilderProducesDiagnosticInMain() @@ -172,7 +172,7 @@ public static void Main(string[]args) { var diagnostic = Assert.Single(diagnostics); Assert.Same(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, diagnostic.Descriptor); AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location); - Assert.Equal("Replace with builder.Configuration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); + Assert.Equal("Suggest using WebApplicationBuilder.Configuration instead of ConfigureAppConfiguration", diagnostic.GetMessage(CultureInfo.InvariantCulture)); } [Fact] public async Task TwoInvocationsProduceTwoDiagnostic() @@ -202,9 +202,9 @@ public async Task TwoInvocationsProduceTwoDiagnostic() var diagnostic2 = diagnostics[1]; Assert.Same(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, diagnostic1.Descriptor); AnalyzerAssert.DiagnosticLocation(source.MarkerLocations["MM1"], diagnostic1.Location); - Assert.Equal("Replace with builder.Configuration", diagnostic1.GetMessage(CultureInfo.InvariantCulture)); + Assert.Equal("Suggest using WebApplicationBuilder.Configuration instead of ConfigureHostConfiguration", diagnostic1.GetMessage(CultureInfo.InvariantCulture)); Assert.Same(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder, diagnostic2.Descriptor); AnalyzerAssert.DiagnosticLocation(source.MarkerLocations["MM2"], diagnostic2.Location); - Assert.Equal("Replace with builder.Configuration", diagnostic2.GetMessage(CultureInfo.InvariantCulture)); + Assert.Equal("Suggest using WebApplicationBuilder.Configuration instead of ConfigureAppConfiguration", diagnostic2.GetMessage(CultureInfo.InvariantCulture)); } } From db0d5e96f9326f6c64ebc4c7f4761ae6bb75a820 Mon Sep 17 00:00:00 2001 From: Anh Thi Dao Date: Fri, 24 Jun 2022 11:35:52 -0700 Subject: [PATCH 6/7] Changing the severity of the error. Changing the wording of the title and message. Changing the WebApplicationBuilderAnalyzers class so that the method name can be passed into the diagnostic message --- .../DisallowConfigureAppConfigureHostBuilderTest.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs index 1e0bec1e3907..96e61c63154c 100644 --- a/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs +++ b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Analyzers.WebApplicationBuilder; public partial class DisallowConfigureAppConfigureHostBuilderTest { private TestDiagnosticAnalyzerRunner Runner { get; } = new(new WebApplicationBuilderAnalyzer()); - + [Fact] public async Task ConfigurationBuilderRunsWithoutDiagnostic() { @@ -25,7 +25,7 @@ public async Task ConfigurationBuilderRunsWithoutDiagnostic() // Assert Assert.Empty(diagnostic); } - + [Fact] public async Task ConfigureAppHostBuilderProducesDiagnostic() { @@ -40,7 +40,7 @@ public async Task ConfigureAppHostBuilderProducesDiagnostic() builder.AddJsonFile(""foo.json"", optional: true); }); "); - + // Act var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); @@ -64,7 +64,7 @@ public async Task ConfigureHostHostBuilderProducesDiagnostic() builder.AddJsonFile(""foo.json"", optional: true); }); "); - + // Act var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); @@ -89,7 +89,7 @@ public async Task ConfigureAppWebHostBuilderProducesDiagnostic() builder.AddJsonFile(""foo.json"", optional: true); }); "); - + // Act var diagnostics = await Runner.GetDiagnosticsAsync(source.Source); From 3b624fa5adb70d3bea909686f5bcaf32fe0e405b Mon Sep 17 00:00:00 2001 From: anhthidao <107068384+anhthidao@users.noreply.github.com> Date: Tue, 28 Jun 2022 16:12:31 -0700 Subject: [PATCH 7/7] Update DiagnosticDescriptors.cs --- .../AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs index 1dbc75a40005..58e7b8fa07dc 100644 --- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs +++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs @@ -82,7 +82,7 @@ internal static class DiagnosticDescriptors internal static readonly DiagnosticDescriptor DisallowConfigureAppConfigureHostBuilder = new( "ASP0013", - "Suggest switching from using Configure methods to WebApplicationBuilder.Configuration", + "Suggest using WebApplicationBuilder.Configuration over Configure methods", "Suggest using WebApplicationBuilder.Configuration instead of {0}", "Usage", DiagnosticSeverity.Warning,