@@ -129,7 +129,7 @@ pragma[nomagic]
129
129
private Virtualizable getACompatibleInterfaceMemberAux ( Virtualizable m ) {
130
130
result = getACompatibleInterfaceAccessor ( m ) or
131
131
result = getACompatibleInterfaceIndexer ( m ) or
132
- result = getACompatibleInterfaceMethod ( m )
132
+ result = getACompatibleRelevantInterfaceMember ( m )
133
133
}
134
134
135
135
/**
@@ -210,11 +210,13 @@ private predicate getACompatibleInterfaceIndexerAux(Indexer i, ValueOrRefType t)
210
210
t = getAPossibleImplementor ( i .getDeclaringType ( ) )
211
211
}
212
212
213
- private Method getACompatibleInterfaceMethod0 ( Method m , int i ) {
214
- result = getAnInterfaceMethodCandidate ( m ) and
213
+ private RelevantInterfaceMember getACompatibleRelevantInterfaceMember0 (
214
+ RelevantInterfaceMember m , int i
215
+ ) {
216
+ result = getARelevantInterfaceMemberCandidate ( m ) and
215
217
i = - 1
216
218
or
217
- result = getACompatibleInterfaceMethod0 ( m , i - 1 ) and
219
+ result = getACompatibleRelevantInterfaceMember0 ( m , i - 1 ) and
218
220
exists ( Type t1 , Type t2 |
219
221
t1 = getArgumentOrReturnType ( m , i ) and
220
222
t2 = getArgumentOrReturnType ( result , i )
@@ -223,32 +225,47 @@ private Method getACompatibleInterfaceMethod0(Method m, int i) {
223
225
)
224
226
}
225
227
226
- private Method getACompatibleInterfaceMethod ( Method m ) {
227
- result = getACompatibleInterfaceMethod0 ( m , m .getNumberOfParameters ( ) )
228
+ /**
229
+ * A class of callables relevant for interface member compatibility.
230
+ */
231
+ private class RelevantInterfaceMember extends Callable {
232
+ RelevantInterfaceMember ( ) {
233
+ this instanceof Method or
234
+ this instanceof Operator
235
+ }
236
+
237
+ predicate isPublic ( ) {
238
+ this .( Method ) .isPublic ( ) or
239
+ this .( Operator ) .isPublic ( )
240
+ }
241
+ }
242
+
243
+ private RelevantInterfaceMember getACompatibleRelevantInterfaceMember ( RelevantInterfaceMember m ) {
244
+ result = getACompatibleRelevantInterfaceMember0 ( m , m .getNumberOfParameters ( ) )
228
245
}
229
246
230
247
/**
231
- * Gets an interface method that may potentially be implemented by `m`.
248
+ * Gets an interface method or operator that may potentially be implemented by `m`.
232
249
*
233
250
* That is, a method with the same name, same number of parameters, and declared
234
251
* in a type that is a possible implementor type for the interface type.
235
252
*/
236
- private Method getAnInterfaceMethodCandidate ( Method m ) {
237
- getAPotentialInterfaceMethodAux ( result , m .getDeclaringType ( ) , m .getUndecoratedName ( ) ,
253
+ private RelevantInterfaceMember getARelevantInterfaceMemberCandidate ( RelevantInterfaceMember m ) {
254
+ getAPotentialRelevantInterfaceMemberAux ( result , m .getDeclaringType ( ) , m .getUndecoratedName ( ) ,
238
255
m .getNumberOfParameters ( ) ) and
239
256
m .isPublic ( )
240
257
}
241
258
242
259
pragma [ nomagic]
243
- private predicate getAPotentialInterfaceMethodAux (
244
- Method m , ValueOrRefType t , string name , int params
260
+ private predicate getAPotentialRelevantInterfaceMemberAux (
261
+ RelevantInterfaceMember m , ValueOrRefType t , string name , int params
245
262
) {
246
263
t = getAPossibleImplementor ( m .getDeclaringType ( ) ) and
247
264
name = m .getUndecoratedName ( ) and
248
265
params = m .getNumberOfParameters ( )
249
266
}
250
267
251
- private Type getArgumentOrReturnType ( Method m , int i ) {
268
+ private Type getArgumentOrReturnType ( RelevantInterfaceMember m , int i ) {
252
269
i = 0 and result = m .getReturnType ( )
253
270
or
254
271
result = m .getParameter ( i - 1 ) .getType ( )
0 commit comments