diff options
author | aclement <aclement> | 2011-05-09 22:41:38 +0000 |
---|---|---|
committer | aclement <aclement> | 2011-05-09 22:41:38 +0000 |
commit | 999d3836f0b541f619f50580d2aca8316485ecb7 (patch) | |
tree | 9f9884223d6b332041ae9eb3f46d72e6ca858e0e | |
parent | 1051d6079548485d055eb224ae8aef8f13fabd9e (diff) | |
download | aspectj-999d3836f0b541f619f50580d2aca8316485ecb7.tar.gz aspectj-999d3836f0b541f619f50580d2aca8316485ecb7.zip |
345172
-rw-r--r-- | weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java b/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java index ffb0469ed..57fb89a97 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java @@ -2898,6 +2898,37 @@ class BcelClassWeaver implements IClassWeaver { } /** + * Find the specified member in the specified type. + * + * @param type the type to search for the member + * @param methodName the name of the method to find + * @param Class[] the method parameters that the discovered method should have + */ + private ResolvedMember findResolvedMemberNamed(ResolvedType type, String methodName, UnresolvedType[] params) { + ResolvedMember[] allMethods = type.getDeclaredMethods(); + for (int i = 0; i < allMethods.length; i++) { + ResolvedMember candidate = allMethods[i]; + if (candidate.getName().equals(methodName)) { + UnresolvedType[] candidateParams = candidate.getParameterTypes(); + if (candidateParams.length == params.length) { + // boolean allOK = true; // this checking all breaks down with generics in the mix, unfortunately, dont have + // time to fix it up right now + // for (int p = 0; p < candidateParams.length; p++) { + // if (!candidateParams[p].getErasureSignature().equals(params[p].getErasureSignature())) { + // allOK = false; + // break; + // } + // } + // if (allOK) { + return candidate; + // } + } + } + } + return null; + } + + /** * For a given resolvedmember, this will discover the real annotations for it. <b>Should only be used when the resolvedmember is * the contents of an effective signature attribute, as thats the only time when the annotations aren't stored directly in the * resolvedMember</b> @@ -2963,10 +2994,8 @@ class BcelClassWeaver implements IClassWeaver { } else { ResolvedMember realthing = AjcMemberMaker.interMethodDispatcher(rm.resolve(world), memberHostType).resolve( world); - // ResolvedMember resolvedDooberry = - // world.resolve(realthing); - ResolvedMember theRealMember = findResolvedMemberNamed(memberHostType.resolve(world), realthing.getName()); - // AMC temp guard for M4 + ResolvedMember theRealMember = findResolvedMemberNamed(memberHostType.resolve(world), realthing.getName(), + realthing.getParameterTypes()); if (theRealMember == null) { throw new UnsupportedOperationException( "Known limitation in M4 - can't find ITD members when type variable is used as an argument and has upper bound specified"); |