@@ -180,29 +180,15 @@ class Member extends DotNet::Member, Modifiable, @member {
180
180
override predicate isStatic ( ) { Modifiable .super .isStatic ( ) }
181
181
}
182
182
183
+ private class TOverridable = @virtualizable or @callable_accessor;
184
+
183
185
/**
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 .
186
188
*
187
- * Equivalently, these are the members that can be defined in an interface .
189
+ * Unlike `Virtualizable`, this class includes accessors .
188
190
*/
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 {
206
192
/**
207
193
* Gets any interface this member explicitly implements; this only applies
208
194
* to members that can be declared on an interface, i.e. methods, properties,
@@ -216,19 +202,10 @@ class Virtualizable extends Member, @virtualizable {
216
202
predicate implementsExplicitInterface ( ) { exists ( this .getExplicitlyImplementedInterface ( ) ) }
217
203
218
204
/** 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 ( ) }
229
206
230
207
/** Gets the member that is immediately overridden by this member, if any. */
231
- Virtualizable getOverridee ( ) {
208
+ Overridable getOverridee ( ) {
232
209
overrides ( this , result )
233
210
or
234
211
// For accessors (which are `Callable`s), the extractor generates entries
@@ -242,7 +219,7 @@ class Virtualizable extends Member, @virtualizable {
242
219
}
243
220
244
221
/** Gets a member that immediately overrides this member, if any. */
245
- Virtualizable getAnOverrider ( ) { this = result .getOverridee ( ) }
222
+ Overridable getAnOverrider ( ) { this = result .getOverridee ( ) }
246
223
247
224
/** Holds if this member is overridden by some other member. */
248
225
predicate isOverridden ( ) { exists ( this .getAnOverrider ( ) ) }
@@ -273,10 +250,10 @@ class Virtualizable extends Member, @virtualizable {
273
250
* `A.M.getImplementee(B) = I.M` and
274
251
* `C.M.getImplementee(C) = I.M`.
275
252
*/
276
- Virtualizable getImplementee ( ValueOrRefType t ) { implements ( this , result , t ) }
253
+ Overridable getImplementee ( ValueOrRefType t ) { implements ( this , result , t ) }
277
254
278
255
/** 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 ( _) }
280
257
281
258
/**
282
259
* Gets a member that immediately implements this interface member, if any.
@@ -301,10 +278,10 @@ class Virtualizable extends Member, @virtualizable {
301
278
* `I.M.getAnImplementor(B) = A.M` and
302
279
* `I.M.getAnImplementor(C) = C.M`.
303
280
*/
304
- Virtualizable getAnImplementor ( ValueOrRefType t ) { this = result .getImplementee ( t ) }
281
+ Overridable getAnImplementor ( ValueOrRefType t ) { this = result .getImplementee ( t ) }
305
282
306
283
/** Gets a member that immediately implements this interface member, if any. */
307
- Virtualizable getAnImplementor ( ) { this = result .getImplementee ( ) }
284
+ Overridable getAnImplementor ( ) { this = result .getImplementee ( ) }
308
285
309
286
/**
310
287
* Gets an interface member that is (transitively) implemented by this
@@ -334,8 +311,8 @@ class Virtualizable extends Member, @virtualizable {
334
311
* - If this member is `D.M` then `I.M = getAnUltimateImplementee()`.
335
312
*/
336
313
pragma [ nomagic]
337
- Virtualizable getAnUltimateImplementee ( ) {
338
- exists ( Virtualizable implementation , ValueOrRefType implementationType |
314
+ Overridable getAnUltimateImplementee ( ) {
315
+ exists ( Overridable implementation , ValueOrRefType implementationType |
339
316
implements ( implementation , result , implementationType )
340
317
|
341
318
this = implementation
@@ -354,7 +331,7 @@ class Virtualizable extends Member, @virtualizable {
354
331
* Note that this is generally *not* equivalent with
355
332
* `getImplementor().getAnOverrider*()` (see `getImplementee`).
356
333
*/
357
- Virtualizable getAnUltimateImplementor ( ) { this = result .getAnUltimateImplementee ( ) }
334
+ Overridable getAnUltimateImplementor ( ) { this = result .getAnUltimateImplementee ( ) }
358
335
359
336
/** Holds if this interface member is implemented by some other member. */
360
337
predicate isImplemented ( ) { exists ( this .getAnImplementor ( ) ) }
@@ -366,7 +343,7 @@ class Virtualizable extends Member, @virtualizable {
366
343
* Holds if this member overrides or implements (transitively)
367
344
* `that` member.
368
345
*/
369
- predicate overridesOrImplements ( Virtualizable that ) {
346
+ predicate overridesOrImplements ( Overridable that ) {
370
347
this .getOverridee + ( ) = that or
371
348
this .getAnUltimateImplementee ( ) = that
372
349
}
@@ -375,12 +352,49 @@ class Virtualizable extends Member, @virtualizable {
375
352
* Holds if this member overrides or implements (reflexively, transitively)
376
353
* `that` member.
377
354
*/
378
- predicate overridesOrImplementsOrEquals ( Virtualizable that ) {
355
+ predicate overridesOrImplementsOrEquals ( Overridable that ) {
379
356
this = that or
380
357
this .overridesOrImplements ( that )
381
358
}
382
359
}
383
360
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
+
384
398
/**
385
399
* A parameterizable declaration. Either a callable (`Callable`), a delegate
386
400
* type (`DelegateType`), or an indexer (`Indexer`).
0 commit comments