From c2797bef4144a683cbc1572217910ed7df57e8dc Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Tue, 19 Feb 2013 22:37:52 +0100 Subject: [PATCH] when searching for some method in hierarchy, should also search in interfaces (correctly fix IDEA-101410) --- .../InstrumentationClassFinder.java | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/java/compiler/instrumentation-util/src/com/intellij/compiler/instrumentation/InstrumentationClassFinder.java b/java/compiler/instrumentation-util/src/com/intellij/compiler/instrumentation/InstrumentationClassFinder.java index 4eba0eee8bf8..77a13ad1d844 100644 --- a/java/compiler/instrumentation-util/src/com/intellij/compiler/instrumentation/InstrumentationClassFinder.java +++ b/java/compiler/instrumentation-util/src/com/intellij/compiler/instrumentation/InstrumentationClassFinder.java @@ -250,15 +250,36 @@ public class InstrumentationClassFinder { return null; } - public PseudoMethod findMethodInHierarchy(String name, String descriptor) throws IOException, ClassNotFoundException { - PseudoMethod method = findMethod(name, descriptor); - if (method == null) { - PseudoClass superClass = getSuperClass(); - if (superClass != null) { - method = superClass.findMethodInHierarchy(name, descriptor); + public PseudoMethod findMethodInHierarchy(final String name, final String descriptor) throws IOException, ClassNotFoundException { + // first find in superclasses + for (PseudoClass c = this; c != null; c = c.getSuperClass()) { + final PseudoMethod method = c.findMethod(name, descriptor); + if (method != null) { + return method; } } - return method; + // second, check interfaces + for (PseudoClass iface : getInterfaces()) { + final PseudoMethod method = findInterfaceMethodRecursively(iface, name, descriptor); + if (method != null) { + return method; + } + } + return null; + } + + private static PseudoMethod findInterfaceMethodRecursively(PseudoClass fromIface, final String name, final String descriptor) throws IOException, ClassNotFoundException { + PseudoMethod method = fromIface.findMethod(name, descriptor); + if (method != null) { + return method; + } + for (PseudoClass superIface : fromIface.getInterfaces()) { + method = findInterfaceMethodRecursively(superIface, name, descriptor); + if (method != null) { + return method; + } + } + return null; } public InstrumentationClassFinder getFinder() {