Lines 50-57
Link Here
|
50 |
return this.pattern.fineGrain; |
50 |
return this.pattern.fineGrain; |
51 |
} |
51 |
} |
52 |
|
52 |
|
53 |
private MethodBinding getMethodBinding(ReferenceBinding type, TypeBinding[] argumentTypes) { |
53 |
private MethodBinding getMethodBinding(ReferenceBinding type, char[] methodName, TypeBinding[] argumentTypes) { |
54 |
MethodBinding[] methods = type.getMethods(this.pattern.selector); |
54 |
MethodBinding[] methods = type.getMethods(methodName); |
55 |
MethodBinding method = null; |
55 |
MethodBinding method = null; |
56 |
methodsLoop: for (int i=0, length=methods.length; i<length; i++) { |
56 |
methodsLoop: for (int i=0, length=methods.length; i<length; i++) { |
57 |
method = methods[i]; |
57 |
method = methods[i]; |
Lines 613-619
Link Here
|
613 |
subType = CharOperation.compareWith(this.pattern.declaringQualification, method.declaringClass.fPackage.shortReadableName()) == 0; |
613 |
subType = CharOperation.compareWith(this.pattern.declaringQualification, method.declaringClass.fPackage.shortReadableName()) == 0; |
614 |
} |
614 |
} |
615 |
int declaringLevel = subType |
615 |
int declaringLevel = subType |
616 |
? resolveLevelAsSubtype(this.pattern.declaringSimpleName, this.pattern.declaringQualification, method.declaringClass, null) |
616 |
? resolveLevelAsSubtype(this.pattern.declaringSimpleName, this.pattern.declaringQualification, method.declaringClass, method.selector, null) |
617 |
: resolveLevelForType(this.pattern.declaringSimpleName, this.pattern.declaringQualification, method.declaringClass); |
617 |
: resolveLevelForType(this.pattern.declaringSimpleName, this.pattern.declaringQualification, method.declaringClass); |
618 |
return (methodLevel & MATCH_LEVEL_MASK) > (declaringLevel & MATCH_LEVEL_MASK) ? declaringLevel : methodLevel; // return the weaker match |
618 |
return (methodLevel & MATCH_LEVEL_MASK) > (declaringLevel & MATCH_LEVEL_MASK) ? declaringLevel : methodLevel; // return the weaker match |
619 |
} |
619 |
} |
Lines 646-652
Link Here
|
646 |
int declaringLevel; |
646 |
int declaringLevel; |
647 |
if (isVirtualInvoke(method, messageSend) && (messageSend.actualReceiverType instanceof ReferenceBinding)) { |
647 |
if (isVirtualInvoke(method, messageSend) && (messageSend.actualReceiverType instanceof ReferenceBinding)) { |
648 |
ReferenceBinding methodReceiverType = (ReferenceBinding) messageSend.actualReceiverType; |
648 |
ReferenceBinding methodReceiverType = (ReferenceBinding) messageSend.actualReceiverType; |
649 |
declaringLevel = resolveLevelAsSubtype(this.pattern.declaringSimpleName, this.pattern.declaringQualification, methodReceiverType, method.parameters); |
649 |
declaringLevel = resolveLevelAsSubtype(this.pattern.declaringSimpleName, this.pattern.declaringQualification, methodReceiverType, method.selector, method.parameters); |
650 |
if (declaringLevel == IMPOSSIBLE_MATCH) { |
650 |
if (declaringLevel == IMPOSSIBLE_MATCH) { |
651 |
if (method.declaringClass == null || this.allSuperDeclaringTypeNames == null) { |
651 |
if (method.declaringClass == null || this.allSuperDeclaringTypeNames == null) { |
652 |
declaringLevel = INACCURATE_MATCH; |
652 |
declaringLevel = INACCURATE_MATCH; |
Lines 674-685
Link Here
|
674 |
* Returns INACCURATE_MATCH if resolve fails |
674 |
* Returns INACCURATE_MATCH if resolve fails |
675 |
* Returns IMPOSSIBLE_MATCH if it doesn't. |
675 |
* Returns IMPOSSIBLE_MATCH if it doesn't. |
676 |
*/ |
676 |
*/ |
677 |
protected int resolveLevelAsSubtype(char[] simplePattern, char[] qualifiedPattern, ReferenceBinding type, TypeBinding[] argumentTypes) { |
677 |
protected int resolveLevelAsSubtype(char[] simplePattern, char[] qualifiedPattern, ReferenceBinding type, char[] methodName, TypeBinding[] argumentTypes) { |
678 |
if (type == null) return INACCURATE_MATCH; |
678 |
if (type == null) return INACCURATE_MATCH; |
679 |
|
679 |
|
680 |
int level = resolveLevelForType(simplePattern, qualifiedPattern, type); |
680 |
int level = resolveLevelForType(simplePattern, qualifiedPattern, type); |
681 |
if (level != IMPOSSIBLE_MATCH) { |
681 |
if (level != IMPOSSIBLE_MATCH) { |
682 |
MethodBinding method = argumentTypes == null ? null : getMethodBinding(type, argumentTypes); |
682 |
MethodBinding method = argumentTypes == null ? null : getMethodBinding(type, methodName, argumentTypes); |
683 |
if (((method != null && !method.isAbstract()) || !type.isAbstract()) && !type.isInterface()) { // if concrete, then method is overridden |
683 |
if (((method != null && !method.isAbstract()) || !type.isAbstract()) && !type.isInterface()) { // if concrete, then method is overridden |
684 |
level |= OVERRIDDEN_METHOD_FLAVOR; |
684 |
level |= OVERRIDDEN_METHOD_FLAVOR; |
685 |
} |
685 |
} |
Lines 688-698
Link Here
|
688 |
|
688 |
|
689 |
// matches superclass |
689 |
// matches superclass |
690 |
if (!type.isInterface() && !CharOperation.equals(type.compoundName, TypeConstants.JAVA_LANG_OBJECT)) { |
690 |
if (!type.isInterface() && !CharOperation.equals(type.compoundName, TypeConstants.JAVA_LANG_OBJECT)) { |
691 |
level = resolveLevelAsSubtype(simplePattern, qualifiedPattern, type.superclass(), argumentTypes); |
691 |
level = resolveLevelAsSubtype(simplePattern, qualifiedPattern, type.superclass(), methodName, argumentTypes); |
692 |
if (level != IMPOSSIBLE_MATCH) { |
692 |
if (level != IMPOSSIBLE_MATCH) { |
693 |
if (argumentTypes != null) { |
693 |
if (argumentTypes != null) { |
694 |
// need to verify if method may be overridden |
694 |
// need to verify if method may be overridden |
695 |
MethodBinding method = getMethodBinding(type, argumentTypes); |
695 |
MethodBinding method = getMethodBinding(type, methodName, argumentTypes); |
696 |
if (method != null) { // one method match in hierarchy |
696 |
if (method != null) { // one method match in hierarchy |
697 |
if ((level & OVERRIDDEN_METHOD_FLAVOR) != 0) { |
697 |
if ((level & OVERRIDDEN_METHOD_FLAVOR) != 0) { |
698 |
// this method is already overridden on a super class, current match is impossible |
698 |
// this method is already overridden on a super class, current match is impossible |
Lines 712-718
Link Here
|
712 |
ReferenceBinding[] interfaces = type.superInterfaces(); |
712 |
ReferenceBinding[] interfaces = type.superInterfaces(); |
713 |
if (interfaces == null) return INACCURATE_MATCH; |
713 |
if (interfaces == null) return INACCURATE_MATCH; |
714 |
for (int i = 0; i < interfaces.length; i++) { |
714 |
for (int i = 0; i < interfaces.length; i++) { |
715 |
level = resolveLevelAsSubtype(simplePattern, qualifiedPattern, interfaces[i], null); |
715 |
level = resolveLevelAsSubtype(simplePattern, qualifiedPattern, interfaces[i], methodName, null); |
716 |
if (level != IMPOSSIBLE_MATCH) { |
716 |
if (level != IMPOSSIBLE_MATCH) { |
717 |
if (!type.isAbstract() && !type.isInterface()) { // if concrete class, then method is overridden |
717 |
if (!type.isAbstract() && !type.isInterface()) { // if concrete class, then method is overridden |
718 |
level |= OVERRIDDEN_METHOD_FLAVOR; |
718 |
level |= OVERRIDDEN_METHOD_FLAVOR; |