Skip to content

Commit c802940

Browse files
committed
Fix handling of property accessor visibility
Fixes #1844
1 parent 5b2c3bd commit c802940

1 file changed

Lines changed: 65 additions & 28 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers/DocumentationRules/PropertySummaryDocumentationAnalyzer.cs

Lines changed: 65 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -118,43 +118,80 @@ private static void AnalyzeSummaryElement(SyntaxNodeAnalysisContext context, Xml
118118
if (setter != null)
119119
{
120120
// There is no way getter is null (can't have expression body and accessor list)
121-
var getterAccessibility = getter.GetEffectiveAccessibility(context.SemanticModel, context.CancellationToken);
122-
var setterAccessibility = setter.GetEffectiveAccessibility(context.SemanticModel, context.CancellationToken);
123121
bool getterVisible;
124122
bool setterVisible;
125123

126-
switch (getterAccessibility)
124+
if (!getter.Modifiers.Any() && !setter.Modifiers.Any())
127125
{
128-
case Accessibility.Public:
129-
case Accessibility.ProtectedOrInternal:
130-
case Accessibility.Protected:
126+
// Case 1: The getter and setter have the same declared accessibility
131127
getterVisible = true;
132-
break;
133-
134-
case Accessibility.Internal:
135-
getterVisible = setterAccessibility == Accessibility.Private;
136-
break;
137-
138-
default:
139-
getterVisible = false;
140-
break;
128+
setterVisible = true;
141129
}
142-
143-
switch (setterAccessibility)
130+
else if (getter.Modifiers.Any(SyntaxKind.PrivateKeyword))
144131
{
145-
case Accessibility.Public:
146-
case Accessibility.ProtectedOrInternal:
147-
case Accessibility.Protected:
132+
// Case 3
133+
getterVisible = false;
148134
setterVisible = true;
149-
break;
150-
151-
case Accessibility.Internal:
152-
setterVisible = getterAccessibility == Accessibility.Private;
153-
break;
154-
155-
default:
135+
}
136+
else if (setter.Modifiers.Any(SyntaxKind.PrivateKeyword))
137+
{
138+
// Case 3
139+
getterVisible = true;
156140
setterVisible = false;
157-
break;
141+
}
142+
else
143+
{
144+
var propertyAccessibility = propertyDeclaration.GetEffectiveAccessibility(context.SemanticModel, context.CancellationToken);
145+
bool propertyOnlyInternal = propertyAccessibility == Accessibility.Internal
146+
|| propertyAccessibility == Accessibility.ProtectedAndInternal
147+
|| propertyAccessibility == Accessibility.Private;
148+
if (propertyOnlyInternal)
149+
{
150+
// Case 2: Property only internal and no accessor is explicitly private
151+
getterVisible = true;
152+
setterVisible = true;
153+
}
154+
else
155+
{
156+
var getterAccessibility = getter.GetEffectiveAccessibility(context.SemanticModel, context.CancellationToken);
157+
var setterAccessibility = setter.GetEffectiveAccessibility(context.SemanticModel, context.CancellationToken);
158+
159+
switch (getterAccessibility)
160+
{
161+
case Accessibility.Public:
162+
case Accessibility.ProtectedOrInternal:
163+
case Accessibility.Protected:
164+
// Case 4
165+
getterVisible = true;
166+
break;
167+
168+
case Accessibility.Internal:
169+
case Accessibility.ProtectedAndInternal:
170+
case Accessibility.Private:
171+
default:
172+
// The property is externally accessible, so the setter must be more accessible.
173+
getterVisible = false;
174+
break;
175+
}
176+
177+
switch (setterAccessibility)
178+
{
179+
case Accessibility.Public:
180+
case Accessibility.ProtectedOrInternal:
181+
case Accessibility.Protected:
182+
// Case 4
183+
setterVisible = true;
184+
break;
185+
186+
case Accessibility.Internal:
187+
case Accessibility.ProtectedAndInternal:
188+
case Accessibility.Private:
189+
default:
190+
// The property is externally accessible, so the getter must be more accessible.
191+
setterVisible = false;
192+
break;
193+
}
194+
}
158195
}
159196

160197
if (getterVisible && !setterVisible)

0 commit comments

Comments
 (0)