Skip to content

Commit

Permalink
Address comments
Browse files Browse the repository at this point in the history
  • Loading branch information
CristianAmbrosini committed Oct 26, 2023
1 parent 748f1b1 commit dda3c12
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 17 deletions.
13 changes: 13 additions & 0 deletions analyzers/src/SonarAnalyzer.CSharp/Extensions/ISymbolExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,14 @@ namespace SonarAnalyzer.Extensions
{
internal static class ISymbolExtensions
{
private static readonly SyntaxKind[] DeclarationsTypesWithPrimaryConstructor =
{
SyntaxKind.ClassDeclaration,
SyntaxKind.StructDeclaration,
SyntaxKindEx.RecordClassDeclaration,
SyntaxKindEx.RecordStructDeclaration
};

public static bool HasConstraint(this ISymbol symbol, SymbolicConstraint constraint, ProgramState programState)
{
var symbolicValue = programState.GetSymbolValue(symbol);
Expand Down Expand Up @@ -93,6 +101,11 @@ public static ImmutableArray<SyntaxToken> DeclaringReferenceIdentifiers(this ISy
.WhereNotNull()
.ToImmutableArray();

public static bool IsPrimaryConstructor(this ISymbol symbol) =>
symbol.IsConstructor()
&& symbol.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax() is { } syntax
&& DeclarationsTypesWithPrimaryConstructor.Contains(syntax.Kind());

public static SyntaxToken? NodeIdentifier(this SyntaxNode node) =>
node.RemoveParentheses() switch
{
Expand Down
21 changes: 4 additions & 17 deletions analyzers/src/SonarAnalyzer.CSharp/Rules/VariableShadowsField.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,6 @@ public sealed class VariableShadowsField : SonarDiagnosticAnalyzer

private static readonly DiagnosticDescriptor Rule = DescriptorFactory.Create(DiagnosticId, MessageFormat);

private static readonly SyntaxKind[] TypesWithPrimaryConstructorDeclarations =
{
SyntaxKind.ClassDeclaration,
SyntaxKind.StructDeclaration,
SyntaxKindEx.RecordClassDeclaration,
SyntaxKindEx.RecordStructDeclaration
};

public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } = ImmutableArray.Create(Rule);

protected override void Initialize(SonarAnalysisContext context) =>
Expand Down Expand Up @@ -90,17 +82,12 @@ _ when VariableDesignationSyntaxWrapper.IsInstance(node) => ((VariableDesignatio

private static List<ISymbol> GetContextSymbols(SonarSyntaxNodeReportingContext context)
{
var symbols = ((INamespaceOrTypeSymbol)context.ContainingSymbol.ContainingSymbol).GetMembers();
var primaryCtor = symbols.FirstOrDefault(x => x is IMethodSymbol && IsPrimaryCtor(x));
var relevantSymbols = symbols.Where(x => x is IPropertySymbol or IFieldSymbol).ToList();
return primaryCtor is null ? relevantSymbols : relevantSymbols.Concat(primaryCtor.GetParameters()).ToList();
var members = context.ContainingSymbol.ContainingType.GetMembers();
var primaryConstructorParameters = members.FirstOrDefault(x => x.IsPrimaryConstructor())?.GetParameters();
var fieldsAndProperties = members.Where(x => x is IPropertySymbol or IFieldSymbol).ToList();
return primaryConstructorParameters is null ? fieldsAndProperties : fieldsAndProperties.Concat(primaryConstructorParameters).ToList();
}

private static bool IsPrimaryCtor(ISymbol methodSymbol) =>
methodSymbol.IsConstructor()
&& methodSymbol.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax() is { } syntax
&& TypesWithPrimaryConstructorDeclarations.Contains(syntax.Kind());

private static void ReportOnVariableMatchingField(SonarSyntaxNodeReportingContext context, IEnumerable<ISymbol> members, SyntaxToken identifier)
{
if (members.FirstOrDefault(x => x.Name == identifier.ValueText) is { } matchingMember)
Expand Down

0 comments on commit dda3c12

Please sign in to comment.