Skip to content

Commit 903a384

Browse files
committed
fb
1 parent fafb89e commit 903a384

File tree

4 files changed

+20
-17
lines changed

4 files changed

+20
-17
lines changed

docs/list-of-diagnostics.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
| __`ASP0027`__ | Unnecessary public Program class declaration |
3636
| __`ASP0028`__ | Consider using ListenAnyIP() instead of Listen(IPAddress.Any) |
3737
| __`ASP0029`__ | Experimental warning for validations resolver APIs |
38+
| __`ASP0030`__ | Use Host.CreateDefaultBuilder instead of WebHost.CreateDefaultBuilder |
3839

3940
### API (`API1000-API1003`)
4041

src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ internal static class DiagnosticDescriptors
250250
helpLinkUri: AnalyzersLink);
251251

252252
internal static readonly DiagnosticDescriptor UseCreateHostBuilderInsteadOfCreateWebHostBuilder = new(
253-
"ASP0029",
253+
"ASP0030",
254254
CreateLocalizableResourceString(nameof(Resources.Analyzer_UseCreateHostBuilderInsteadOfCreateWebHostBuilder_Title)),
255255
CreateLocalizableResourceString(nameof(Resources.Analyzer_UseCreateHostBuilderInsteadOfCreateWebHostBuilder_Message)),
256256
Usage,

src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/UseCreateHostBuilderInsteadOfCreateWebHostBuilderAnalyzer.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
using Microsoft.CodeAnalysis.Diagnostics;
1111
using Microsoft.CodeAnalysis.Operations;
1212

13+
using WellKnownType = Microsoft.AspNetCore.App.Analyzers.Infrastructure.WellKnownTypeData.WellKnownType;
14+
1315
namespace Microsoft.AspNetCore.Analyzers.WebApplicationBuilder;
1416

1517
[DiagnosticAnalyzer(LanguageNames.CSharp)]
@@ -34,7 +36,7 @@ public override void Initialize(AnalysisContext context)
3436
var targetMethod = invocation.TargetMethod;
3537

3638
// Check if this is WebHost.CreateDefaultBuilder
37-
if (IsWebHostCreateDefaultBuilderCall(targetMethod))
39+
if (IsWebHostCreateDefaultBuilderCall(targetMethod, wellKnownTypes))
3840
{
3941
var diagnostic = Diagnostic.Create(
4042
DiagnosticDescriptors.UseCreateHostBuilderInsteadOfCreateWebHostBuilder,
@@ -51,7 +53,7 @@ public override void Initialize(AnalysisContext context)
5153
var symbol = semantic.GetDeclaredSymbol(methodDeclaration);
5254

5355
// Check if this method returns IWebHostBuilder
54-
if (symbol != null && IsWebHostBuilderReturnType(symbol))
56+
if (symbol != null && IsWebHostBuilderReturnType(symbol, wellKnownTypes))
5557
{
5658
// Check if the method body contains WebHost.CreateDefaultBuilder
5759
if (ContainsWebHostCreateDefaultBuilder(methodDeclaration))
@@ -67,25 +69,23 @@ public override void Initialize(AnalysisContext context)
6769
});
6870
}
6971

70-
private static bool IsWebHostCreateDefaultBuilderCall(IMethodSymbol method)
72+
private static bool IsWebHostCreateDefaultBuilderCall(IMethodSymbol method, WellKnownTypes wellKnownTypes)
7173
{
7274
// Check if this is WebHost.CreateDefaultBuilder (not other WebHost methods)
73-
if (method.Name == "CreateDefaultBuilder" &&
74-
method.ContainingType?.Name == "WebHost" &&
75-
method.ContainingType?.ContainingNamespace?.ToDisplayString() == "Microsoft.AspNetCore")
75+
if (method.Name == "CreateDefaultBuilder" &&
76+
SymbolEqualityComparer.Default.Equals(method.ContainingType, wellKnownTypes.Get(WellKnownType.Microsoft_AspNetCore_WebHost)))
7677
{
7778
return true;
7879
}
7980

8081
return false;
8182
}
8283

83-
private static bool IsWebHostBuilderReturnType(IMethodSymbol method)
84+
private static bool IsWebHostBuilderReturnType(IMethodSymbol method, WellKnownTypes wellKnownTypes)
8485
{
8586
// Check if the return type is IWebHostBuilder
8687
var returnType = method.ReturnType;
87-
return returnType.Name == "IWebHostBuilder" &&
88-
returnType.ContainingNamespace?.ToDisplayString() == "Microsoft.AspNetCore.Hosting";
88+
return SymbolEqualityComparer.Default.Equals(returnType, wellKnownTypes.Get(WellKnownType.Microsoft_AspNetCore_Hosting_IWebHostBuilder));
8989
}
9090

9191
private static bool ContainsWebHostCreateDefaultBuilder(MethodDeclarationSyntax methodDeclaration)

src/Framework/AspNetCoreAnalyzers/src/CodeFixes/UseCreateHostBuilderInsteadOfCreateWebHostBuilderFixer.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ private static async Task<Document> ConvertWebHostBuilderMethod(Document documen
129129

130130
private static bool IsWebHostBuilderType(TypeSyntax typeSyntax)
131131
{
132-
return typeSyntax.ToString().Contains("IWebHostBuilder");
132+
return typeSyntax.ToString().Equals("IWebHostBuilder");
133133
}
134134

135135
private static async Task<Document> ConvertWebHostCreateDefaultBuilder(Document document, InvocationExpressionSyntax invocation, CancellationToken cancellationToken)
@@ -257,7 +257,7 @@ private static ExpressionSyntax TransformExpression(ExpressionSyntax expression)
257257
hostCreateCall.WithTrailingTrivia(),
258258
SyntaxFactory.IdentifierName("ConfigureWebHostDefaults"))
259259
.WithOperatorToken(SyntaxFactory.Token(SyntaxKind.DotToken)
260-
.WithLeadingTrivia(SyntaxFactory.EndOfLine("\r\n"))
260+
.WithLeadingTrivia(SyntaxFactory.ElasticCarriageReturnLineFeed)
261261
.WithTrailingTrivia()))
262262
.WithArgumentList(SyntaxFactory.ArgumentList(
263263
SyntaxFactory.SingletonSeparatedList(
@@ -267,11 +267,13 @@ private static ExpressionSyntax TransformExpression(ExpressionSyntax expression)
267267
ExpressionSyntax result = configureCall;
268268
if (remainingChain != null)
269269
{
270-
// Replace the placeholder with the actual configure call
271-
result = remainingChain.ReplaceNode(
272-
remainingChain.DescendantNodes().OfType<IdentifierNameSyntax>()
273-
.First(n => n.Identifier.ValueText == "HOST_PLACEHOLDER"),
274-
configureCall);
270+
var placeHolder = remainingChain.DescendantNodes().OfType<IdentifierNameSyntax>()
271+
.FirstOrDefault(n => n.Identifier.ValueText == "HOST_PLACEHOLDER");
272+
if (placeHolder != null)
273+
{
274+
// Replace the placeholder with the actual configure call
275+
result = remainingChain.ReplaceNode(placeHolder, configureCall);
276+
}
275277
}
276278

277279
return result.WithTrailingTrivia(expression.GetTrailingTrivia())

0 commit comments

Comments
 (0)