@@ -180,29 +180,15 @@ class Member extends DotNet::Member, Modifiable, @member {
180180 override predicate isStatic ( ) { Modifiable .super .isStatic ( ) }
181181}
182182
183+ private class TOverridable = @virtualizable or @callable_accessor;
184+
183185/**
184- * A member where the `virtual` modifier is valid . That is, a method,
185- * a property, an indexer, or an event .
186+ * A declaration that can be overridden or implemented . That is, a method,
187+ * a property, an indexer, an event, or an accessor .
186188 *
187- * Equivalently, these are the members that can be defined in an interface .
189+ * Unlike `Virtualizable`, this class includes accessors .
188190 */
189- class Virtualizable extends Member , @virtualizable {
190- /** Holds if this member has the modifier `override`. */
191- predicate isOverride ( ) { this .hasModifier ( "override" ) }
192-
193- /** Holds if this member is `virtual`. */
194- predicate isVirtual ( ) { this .hasModifier ( "virtual" ) }
195-
196- override predicate isPublic ( ) {
197- Member .super .isPublic ( ) or
198- this .implementsExplicitInterface ( )
199- }
200-
201- override predicate isPrivate ( ) {
202- super .isPrivate ( ) and
203- not this .implementsExplicitInterface ( )
204- }
205-
191+ class Overridable extends Declaration , TOverridable {
206192 /**
207193 * Gets any interface this member explicitly implements; this only applies
208194 * to members that can be declared on an interface, i.e. methods, properties,
@@ -216,19 +202,10 @@ class Virtualizable extends Member, @virtualizable {
216202 predicate implementsExplicitInterface ( ) { exists ( this .getExplicitlyImplementedInterface ( ) ) }
217203
218204 /** Holds if this member can be overridden or implemented. */
219- predicate isOverridableOrImplementable ( ) {
220- not this .isSealed ( ) and
221- not this .getDeclaringType ( ) .isSealed ( ) and
222- (
223- this .isVirtual ( ) or
224- this .isOverride ( ) or
225- this .isAbstract ( ) or
226- this .getDeclaringType ( ) instanceof Interface
227- )
228- }
205+ predicate isOverridableOrImplementable ( ) { none ( ) }
229206
230207 /** Gets the member that is immediately overridden by this member, if any. */
231- Virtualizable getOverridee ( ) {
208+ Overridable getOverridee ( ) {
232209 overrides ( this , result )
233210 or
234211 // For accessors (which are `Callable`s), the extractor generates entries
@@ -242,7 +219,7 @@ class Virtualizable extends Member, @virtualizable {
242219 }
243220
244221 /** Gets a member that immediately overrides this member, if any. */
245- Virtualizable getAnOverrider ( ) { this = result .getOverridee ( ) }
222+ Overridable getAnOverrider ( ) { this = result .getOverridee ( ) }
246223
247224 /** Holds if this member is overridden by some other member. */
248225 predicate isOverridden ( ) { exists ( this .getAnOverrider ( ) ) }
@@ -273,10 +250,10 @@ class Virtualizable extends Member, @virtualizable {
273250 * `A.M.getImplementee(B) = I.M` and
274251 * `C.M.getImplementee(C) = I.M`.
275252 */
276- Virtualizable getImplementee ( ValueOrRefType t ) { implements ( this , result , t ) }
253+ Overridable getImplementee ( ValueOrRefType t ) { implements ( this , result , t ) }
277254
278255 /** Gets the interface member that is immediately implemented by this member, if any. */
279- Virtualizable getImplementee ( ) { result = this .getImplementee ( _) }
256+ Overridable getImplementee ( ) { result = this .getImplementee ( _) }
280257
281258 /**
282259 * Gets a member that immediately implements this interface member, if any.
@@ -301,10 +278,10 @@ class Virtualizable extends Member, @virtualizable {
301278 * `I.M.getAnImplementor(B) = A.M` and
302279 * `I.M.getAnImplementor(C) = C.M`.
303280 */
304- Virtualizable getAnImplementor ( ValueOrRefType t ) { this = result .getImplementee ( t ) }
281+ Overridable getAnImplementor ( ValueOrRefType t ) { this = result .getImplementee ( t ) }
305282
306283 /** Gets a member that immediately implements this interface member, if any. */
307- Virtualizable getAnImplementor ( ) { this = result .getImplementee ( ) }
284+ Overridable getAnImplementor ( ) { this = result .getImplementee ( ) }
308285
309286 /**
310287 * Gets an interface member that is (transitively) implemented by this
@@ -334,8 +311,8 @@ class Virtualizable extends Member, @virtualizable {
334311 * - If this member is `D.M` then `I.M = getAnUltimateImplementee()`.
335312 */
336313 pragma [ nomagic]
337- Virtualizable getAnUltimateImplementee ( ) {
338- exists ( Virtualizable implementation , ValueOrRefType implementationType |
314+ Overridable getAnUltimateImplementee ( ) {
315+ exists ( Overridable implementation , ValueOrRefType implementationType |
339316 implements ( implementation , result , implementationType )
340317 |
341318 this = implementation
@@ -354,7 +331,7 @@ class Virtualizable extends Member, @virtualizable {
354331 * Note that this is generally *not* equivalent with
355332 * `getImplementor().getAnOverrider*()` (see `getImplementee`).
356333 */
357- Virtualizable getAnUltimateImplementor ( ) { this = result .getAnUltimateImplementee ( ) }
334+ Overridable getAnUltimateImplementor ( ) { this = result .getAnUltimateImplementee ( ) }
358335
359336 /** Holds if this interface member is implemented by some other member. */
360337 predicate isImplemented ( ) { exists ( this .getAnImplementor ( ) ) }
@@ -366,7 +343,7 @@ class Virtualizable extends Member, @virtualizable {
366343 * Holds if this member overrides or implements (transitively)
367344 * `that` member.
368345 */
369- predicate overridesOrImplements ( Virtualizable that ) {
346+ predicate overridesOrImplements ( Overridable that ) {
370347 this .getOverridee + ( ) = that or
371348 this .getAnUltimateImplementee ( ) = that
372349 }
@@ -375,12 +352,49 @@ class Virtualizable extends Member, @virtualizable {
375352 * Holds if this member overrides or implements (reflexively, transitively)
376353 * `that` member.
377354 */
378- predicate overridesOrImplementsOrEquals ( Virtualizable that ) {
355+ predicate overridesOrImplementsOrEquals ( Overridable that ) {
379356 this = that or
380357 this .overridesOrImplements ( that )
381358 }
382359}
383360
361+ /**
362+ * A member where the `virtual` modifier is valid. That is, a method,
363+ * a property, an indexer, or an event.
364+ *
365+ * Equivalently, these are the members that can be defined in an interface.
366+ *
367+ * Unlike `Overridable`, this class excludes accessors.
368+ */
369+ class Virtualizable extends Overridable , Member , @virtualizable {
370+ /** Holds if this member has the modifier `override`. */
371+ predicate isOverride ( ) { this .hasModifier ( "override" ) }
372+
373+ /** Holds if this member is `virtual`. */
374+ predicate isVirtual ( ) { this .hasModifier ( "virtual" ) }
375+
376+ override predicate isPublic ( ) {
377+ Member .super .isPublic ( ) or
378+ this .implementsExplicitInterface ( )
379+ }
380+
381+ override predicate isPrivate ( ) {
382+ super .isPrivate ( ) and
383+ not this .implementsExplicitInterface ( )
384+ }
385+
386+ override predicate isOverridableOrImplementable ( ) {
387+ not this .isSealed ( ) and
388+ not this .getDeclaringType ( ) .isSealed ( ) and
389+ (
390+ this .isVirtual ( ) or
391+ this .isOverride ( ) or
392+ this .isAbstract ( ) or
393+ this .getDeclaringType ( ) instanceof Interface
394+ )
395+ }
396+ }
397+
384398/**
385399 * A parameterizable declaration. Either a callable (`Callable`), a delegate
386400 * type (`DelegateType`), or an indexer (`Indexer`).
0 commit comments