@@ -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