- changed status to resolved
Error in most specific method attributes
JastAddJ 7.1.1-313-gbcfa5f1 Java SE 7
The attributes in JastAddJ for finding the most specific method declaration for a method access seem to be incorrect.
The current implementation looks like this, in the Java 5 module:
private static SimpleSet MethodAccess.mostSpecific(SimpleSet maxSpecific, MethodDecl decl) {
if (maxSpecific.isEmpty()) {
maxSpecific = maxSpecific.add(decl);
} else {
if (decl.moreSpecificThan((MethodDecl)maxSpecific.iterator().next())) {
maxSpecific = decl;
} else if (!((MethodDecl)maxSpecific.iterator().next()).moreSpecificThan(decl)) {
maxSpecific = maxSpecific.add(decl);
}
}
return maxSpecific;
}
The attribute of moreSpecificThan
lacks documentation, and the implementation contradicts what the attribute name implies that the attribute should compute. A better name for the attribute would have been notLessSpecificThan
, because the attribute only returns false if the parameter list of the receiving method is empty or some parameter type in the argument method is a supertype of the corresponding argument type in the receiving method:
refine MethodDecl eq MethodDecl.moreSpecificThan(MethodDecl m) {
if (getNumParameter() == 0) {
return false;
}
int numA = getNumParameter();
int numB = m.getNumParameter();
int num = Math.max(numA, numB);
for (int i = 0; i < num; i++) {
TypeDecl t1 = getParameter(Math.min(i, numA-1)).type();
TypeDecl t2 = m.getParameter(Math.min(i, numB-1)).type();
if (!t1.instanceOf(t2) && !t1.withinBounds(t2, Parameterization.RAW)) {
return false;
}
}
return true;
}
The attribute moreSpecificThan
should either be fixed to work as the name implies, or it should be renamed to notLessSpecificThan
, which seems less useful.
A test case for the incorrect most specific method lookup:
// Test that ambiguous method access is reported.
// .result=COMPILE_FAIL
class ParType<T> {
public void m(T x) { }
public void m(Integer x) { }
}
public class Test {
public void f(ParType<Integer> x) {
x.m(123);// ambiguous method access!
}
}
This test case should fail to compile, but with the current version of JastAddJ it passes.
Comments (1)
-
reporter - Log in to comment
Improved MethodDecl.moreSpecificThan attribute
The MethodDecl.moreSpecificThan attribute did not work as the name implied: it could return true even when a method was not definitely more specific than another method.
Added MethodDecl.lessSpecificThan helper attribute.
fixes
#110(bitbucket)→ <<cset 2c013336b925>>