Skip to content

Commit

Permalink
Allow protected setters in abstract classes.
Browse files Browse the repository at this point in the history
  • Loading branch information
StevenTCramer committed Aug 22, 2024
1 parent fcf2c87 commit 5989f05
Showing 1 changed file with 13 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,13 @@ private static void AnalyzeNode(SyntaxNodeAnalysisContext context)
if (!InheritsFromState(classDeclaration, context.SemanticModel))
return;

bool isAbstract = classDeclaration.Modifiers.Any(SyntaxKind.AbstractKeyword);

foreach (MemberDeclarationSyntax member in classDeclaration.Members)
{
if (member is PropertyDeclarationSyntax propertyDeclaration)
{
AnalyzeProperty(propertyDeclaration, context);
AnalyzeProperty(propertyDeclaration, context, isAbstract);
}
}
}
Expand All @@ -56,18 +58,24 @@ private static bool InheritsFromState(ClassDeclarationSyntax classDeclaration, S
return false;
}

private static void AnalyzeProperty(PropertyDeclarationSyntax propertyDeclaration, SyntaxNodeAnalysisContext context)
private static void AnalyzeProperty(PropertyDeclarationSyntax propertyDeclaration, SyntaxNodeAnalysisContext context, bool isAbstractClass)
{
if (!propertyDeclaration.Modifiers.Any(SyntaxKind.PublicKeyword)) return;

AccessorDeclarationSyntax? setter =
propertyDeclaration.AccessorList?.Accessors
.FirstOrDefault(a => a.IsKind(SyntaxKind.SetAccessorDeclaration));

if (setter != null && !setter.Modifiers.Any(SyntaxKind.PrivateKeyword))
if (setter != null)
{
var diagnostic = Diagnostic.Create(Rule, propertyDeclaration.Identifier.GetLocation(), propertyDeclaration.Identifier.Text);
context.ReportDiagnostic(diagnostic);
bool isSetterPrivate = setter.Modifiers.Any(SyntaxKind.PrivateKeyword);
bool isSetterProtected = setter.Modifiers.Any(SyntaxKind.ProtectedKeyword);

if (!isSetterPrivate && !(isAbstractClass && isSetterProtected))
{
var diagnostic = Diagnostic.Create(Rule, propertyDeclaration.Identifier.GetLocation(), propertyDeclaration.Identifier.Text);
context.ReportDiagnostic(diagnostic);
}
}
}
}

0 comments on commit 5989f05

Please sign in to comment.