From 6b67fcd4c5f535784ff47443bdb3e2b76fb258a2 Mon Sep 17 00:00:00 2001 From: Ben Hopkins Date: Tue, 4 Mar 2025 21:22:18 +0000 Subject: [PATCH 1/4] Check length of TypeArguments before accessing via index --- .../DisallowNonParsableComplexTypesOnParameters.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowNonParsableComplexTypesOnParameters.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowNonParsableComplexTypesOnParameters.cs index 1d5f8550a1a5..5bac7a255181 100644 --- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowNonParsableComplexTypesOnParameters.cs +++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowNonParsableComplexTypesOnParameters.cs @@ -128,7 +128,8 @@ static bool ReportFromAttributeDiagnostic(OperationAnalysisContext context, Well } // If it is nullable, unwrap it. - if (parameterTypeSymbol!.ConstructedFrom.SpecialType == SpecialType.System_Nullable_T) + if (parameterTypeSymbol!.ConstructedFrom.SpecialType == SpecialType.System_Nullable_T && + parameterTypeSymbol.TypeArguments.Length > 0) { parameterTypeSymbol = parameterTypeSymbol.TypeArguments[0] as INamedTypeSymbol; } From 92f9bb36c9bc05639513c7223eadd508ac14785c Mon Sep 17 00:00:00 2001 From: Ben Hopkins Date: Tue, 4 Mar 2025 21:22:35 +0000 Subject: [PATCH 2/4] Removed unecessary using in associated test --- .../DisallowNonParsableComplexTypesOnParametersTest.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Framework/AspNetCoreAnalyzers/test/RouteHandlers/DisallowNonParsableComplexTypesOnParametersTest.cs b/src/Framework/AspNetCoreAnalyzers/test/RouteHandlers/DisallowNonParsableComplexTypesOnParametersTest.cs index 6651effa31fa..58e7476ca796 100644 --- a/src/Framework/AspNetCoreAnalyzers/test/RouteHandlers/DisallowNonParsableComplexTypesOnParametersTest.cs +++ b/src/Framework/AspNetCoreAnalyzers/test/RouteHandlers/DisallowNonParsableComplexTypesOnParametersTest.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Security.Policy; using Microsoft.CodeAnalysis.Testing; using VerifyCS = Microsoft.AspNetCore.Analyzers.Verifiers.CSharpAnalyzerVerifier; From 5f0d9762341aa8f495f16650a49f89f434ff5b9c Mon Sep 17 00:00:00 2001 From: Ben Hopkins Date: Thu, 6 Mar 2025 18:07:48 +0000 Subject: [PATCH 3/4] Fixed a spelling mistake --- .../DisallowNonParsableComplexTypesOnParameters.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowNonParsableComplexTypesOnParameters.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowNonParsableComplexTypesOnParameters.cs index 5bac7a255181..17d384d46465 100644 --- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowNonParsableComplexTypesOnParameters.cs +++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowNonParsableComplexTypesOnParameters.cs @@ -30,7 +30,7 @@ private static void DisallowNonParsableComplexTypesOnParameters( continue; } - var parameterTypeSymbol = ResovleParameterTypeSymbol(handlerDelegateParameter); + var parameterTypeSymbol = ResolveParameterTypeSymbol(handlerDelegateParameter); // If this is null it means we aren't working with a named type symbol. if (parameterTypeSymbol == null) @@ -113,7 +113,7 @@ static bool ReportFromAttributeDiagnostic(OperationAnalysisContext context, Well return false; } - static INamedTypeSymbol? ResovleParameterTypeSymbol(IParameterSymbol parameterSymbol) + static INamedTypeSymbol? ResolveParameterTypeSymbol(IParameterSymbol parameterSymbol) { INamedTypeSymbol? parameterTypeSymbol = null; From b3854fd897ba8072ce2e6e1a8523f3f87cf48cdd Mon Sep 17 00:00:00 2001 From: Ben Hopkins Date: Mon, 10 Mar 2025 21:58:28 +0000 Subject: [PATCH 4/4] Added comments around the additional check --- .../DisallowNonParsableComplexTypesOnParameters.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowNonParsableComplexTypesOnParameters.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowNonParsableComplexTypesOnParameters.cs index 17d384d46465..22ef6d3bdd38 100644 --- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowNonParsableComplexTypesOnParameters.cs +++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowNonParsableComplexTypesOnParameters.cs @@ -127,7 +127,8 @@ static bool ReportFromAttributeDiagnostic(OperationAnalysisContext context, Well parameterTypeSymbol = namedTypeSymbol; } - // If it is nullable, unwrap it. + // If it is nullable and we have type arguments, unwrap it. + // The length check aims to alleviate AD0001 warnings when referencing methods in external class libraries that contain parameters if (parameterTypeSymbol!.ConstructedFrom.SpecialType == SpecialType.System_Nullable_T && parameterTypeSymbol.TypeArguments.Length > 0) {