Skip to content

Commit

Permalink
Shimlayer: Fix TypeDeclarationSyntax ParameterList for RecordDeclarat…
Browse files Browse the repository at this point in the history
…ionSyntax (#9621)
  • Loading branch information
CristianAmbrosini committed Aug 8, 2024
1 parent 11467f8 commit d18f669
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 19 deletions.
Original file line number Diff line number Diff line change
@@ -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<TypeDeclarationSyntax, ParameterListSyntax> 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);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<TypeDeclarationSyntax, ParameterListSyntax?> ParameterListAccessor;
private static readonly Func<TypeDeclarationSyntax, ParameterListSyntax?, TypeDeclarationSyntax> WithParameterListAccessor;
Expand All @@ -15,25 +15,9 @@ static TypeDeclarationSyntaxExtensions()
{
ParameterListAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<TypeDeclarationSyntax, ParameterListSyntax>(typeof(TypeDeclarationSyntax), nameof(ParameterList));
WithParameterListAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<TypeDeclarationSyntax, ParameterListSyntax?>(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<TypeDeclarationSyntax, ParameterListSyntax>(recordDeclaration, nameof(ParameterList)); // Sonar
}

public static TypeDeclarationSyntax WithParameterList(this TypeDeclarationSyntax syntax, ParameterListSyntax? parameterList)
Expand Down

0 comments on commit d18f669

Please sign in to comment.