diff --git a/analyzers/src/SonarAnalyzer.ShimLayer/Sonar/TypeDeclarationSyntaxExtensions.cs b/analyzers/src/SonarAnalyzer.ShimLayer/Sonar/TypeDeclarationSyntaxExtensions.cs new file mode 100644 index 00000000000..6014d812f3f --- /dev/null +++ b/analyzers/src/SonarAnalyzer.ShimLayer/Sonar/TypeDeclarationSyntaxExtensions.cs @@ -0,0 +1,36 @@ +/* + * SonarAnalyzer for .NET + * Copyright (C) 2015-2024 SonarSource SA + * mailto: contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace StyleCop.Analyzers.Lightup; + +internal static partial class TypeDeclarationSyntaxExtensions +{ + private static readonly Func RecordDeclarationParameterListAccessor; + + // In earlier versions, the ParameterList was only available on the derived RecordDeclarationSyntax (starting from version 3.7) + // To work with version 3.7 to version 4.6 we need to special case the record declaration and access + // the parameter list from the derived RecordDeclarationSyntax. + public static ParameterListSyntax ParameterList(this TypeDeclarationSyntax syntax) => + syntax.Kind() is SyntaxKindEx.RecordDeclaration or SyntaxKindEx.RecordStructDeclaration + ? RecordDeclarationParameterListAccessor(syntax) + : ParameterListAccessor(syntax); +} diff --git a/analyzers/src/SonarAnalyzer.ShimLayer/TypeDeclarationSyntaxExtensions.cs b/analyzers/src/SonarAnalyzer.ShimLayer/TypeDeclarationSyntaxExtensions.cs index c4ee988eb59..05520003b64 100644 --- a/analyzers/src/SonarAnalyzer.ShimLayer/TypeDeclarationSyntaxExtensions.cs +++ b/analyzers/src/SonarAnalyzer.ShimLayer/TypeDeclarationSyntaxExtensions.cs @@ -6,7 +6,7 @@ namespace StyleCop.Analyzers.Lightup; using System; using Microsoft.CodeAnalysis.CSharp.Syntax; -internal static class TypeDeclarationSyntaxExtensions +internal static partial class TypeDeclarationSyntaxExtensions { private static readonly Func ParameterListAccessor; private static readonly Func WithParameterListAccessor; @@ -15,25 +15,9 @@ static TypeDeclarationSyntaxExtensions() { ParameterListAccessor = LightupHelpers.CreateSyntaxPropertyAccessor(typeof(TypeDeclarationSyntax), nameof(ParameterList)); WithParameterListAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor(typeof(TypeDeclarationSyntax), nameof(ParameterList)); - } - - public static ParameterListSyntax? ParameterList(this TypeDeclarationSyntax syntax) - { - if (!LightupHelpers.SupportsCSharp12) - { - // Prior to C# 12, the ParameterList property in RecordDeclarationSyntax did not override a base method. - switch (syntax.Kind()) - { - case SyntaxKindEx.RecordDeclaration: - case SyntaxKindEx.RecordStructDeclaration: - return ((RecordDeclarationSyntaxWrapper)syntax).ParameterList; - - default: - return null; - } - } - return ParameterListAccessor(syntax); + var recordDeclaration = SyntaxWrapperHelper.GetWrappedType(typeof(RecordDeclarationSyntaxWrapper)); // Sonar + RecordDeclarationParameterListAccessor = LightupHelpers.CreateSyntaxPropertyAccessor(recordDeclaration, nameof(ParameterList)); // Sonar } public static TypeDeclarationSyntax WithParameterList(this TypeDeclarationSyntax syntax, ParameterListSyntax? parameterList)