diff options
author | Andy Clement <andrew.clement@gmail.com> | 2013-05-31 23:07:29 -0700 |
---|---|---|
committer | Andy Clement <andrew.clement@gmail.com> | 2013-05-31 23:07:29 -0700 |
commit | 31d8e259e5cd8b1b4810d69bbf4b9ea45ae4a4c8 (patch) | |
tree | 4a273bd73d75a264bbca01cdffbf7a3c9dc1fd57 | |
parent | 6f4140ac7028b9074e694e4c0b9de8b05e4b048a (diff) | |
download | aspectj-31d8e259e5cd8b1b4810d69bbf4b9ea45ae4a4c8.tar.gz aspectj-31d8e259e5cd8b1b4810d69bbf4b9ea45ae4a4c8.zip |
Use class file attributes to find containing class
https://bugs.eclipse.org/bugs/show_bug.cgi?id=407494
10 files changed, 93 insertions, 29 deletions
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java index 1a8b83bae..12ffdc9fc 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/EclipseSourceType.java @@ -155,6 +155,12 @@ public class EclipseSourceType extends AbstractReferenceTypeDelegate { } public ResolvedType getOuterClass() { + if (declaration.binding != null) { + ReferenceBinding enclosingType = declaration.binding.enclosingType(); + return enclosingType==null?null:eclipseWorld().fromEclipse(enclosingType); + } + // TODO are we going to make a mistake here if the binding is null? + // Do we ever get asked when the binding is null if (declaration.enclosingType == null) { return null; } diff --git a/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/CompileAndRunTestCase.java b/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/CompileAndRunTestCase.java index 644b92e98..4d1d6db26 100644 --- a/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/CompileAndRunTestCase.java +++ b/org.aspectj.ajdt.core/testsrc/org/aspectj/ajdt/internal/compiler/batch/CompileAndRunTestCase.java @@ -32,10 +32,10 @@ public class CompileAndRunTestCase extends CommandTestCase { } // new style itds where itdfs on interfaces are not mangled - public void testInterType2() throws IOException { - checkCompile("src1/InterType2.java", NO_ERRORS); - runMain("InterType2"); - } +// public void testInterType2() throws IOException { +// checkCompile("src1/InterType2.java", NO_ERRORS); +// runMain("InterType2"); +// } public void testInterTypeMethods() throws IOException { checkCompile("src1/InterTypeMethods.java", NO_ERRORS); diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedType.java b/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedType.java index 31f770da6..9746fea81 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedType.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedType.java @@ -914,6 +914,10 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl return false; } + public ResolvedType getOuterClass() { + return null; + } + public void addAnnotation(AnnotationAJ annotationX) { throw new RuntimeException("ResolvedType.addAnnotation() should never be called"); } @@ -1503,20 +1507,14 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl * given in JLS 13.1, where it guarantees that if you call getDeclaringType() repeatedly, you will eventually get the top-level * class, but it does not say anything about classes in between. * - * @return the declaring UnresolvedType object, or null. + * @return the declaring type, or null if it is not an nested type. */ public ResolvedType getDeclaringType() { if (isArray()) { return null; } - String name = getName(); - int lastDollar = name.lastIndexOf('$'); - while (lastDollar > 0) { // allow for classes starting '$' (pr120474) - ResolvedType ret = world.resolve(UnresolvedType.forName(name.substring(0, lastDollar)), true); - if (!ResolvedType.isMissing(ret)) { - return ret; - } - lastDollar = name.lastIndexOf('$', lastDollar - 1); + if (isNested() || isAnonymous()) { + return getOuterClass(); } return null; } diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/patterns/ReferencePointcut.java b/org.aspectj.matcher/src/org/aspectj/weaver/patterns/ReferencePointcut.java index 6888ff2f7..6e74a1a2f 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/patterns/ReferencePointcut.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/patterns/ReferencePointcut.java @@ -124,7 +124,7 @@ public class ReferencePointcut extends Pointcut { public void resolveBindings(IScope scope, Bindings bindings) { if (onTypeSymbolic != null) { onType = onTypeSymbolic.resolveExactType(scope, bindings); - // in this case we've already signalled an error + // in this case we've already signaled an error if (ResolvedType.isMissing(onType)) { return; } diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegate.java b/org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegate.java index 5b605ef96..3a7e31d6f 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegate.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/reflect/ReflectionBasedReferenceTypeDelegate.java @@ -48,7 +48,7 @@ public class ReflectionBasedReferenceTypeDelegate implements ReferenceTypeDelega protected Class myClass = null; protected WeakClassLoaderReference classLoaderReference = null; - private World world; + protected World world; private ReferenceType resolvedType; private ResolvedMember[] fields = null; private ResolvedMember[] methods = null; @@ -150,23 +150,19 @@ public class ReflectionBasedReferenceTypeDelegate implements ReferenceTypeDelega } public boolean isAnonymous() { - return false; + // this isn't in < Java 1.5 but I think we are moving beyond the need to support those levels + return this.myClass.isAnonymousClass(); } public boolean isNested() { - // FIXME this is *wrong* but isMemberClass() doesnt exist in pre-1.5... - // (same deal as isAnonymous above...) - return true; - // boolean member = this.myClass.isMemberClass(); - // return member; + // this isn't in < Java 1.5 but I think we are moving beyond the need to support those levels + return this.myClass.isMemberClass(); } public ResolvedType getOuterClass() { - // FIXME getEnclosingClass() is Java5 ... dammit - // return - // ReflectionBasedReferenceTypeDelegateFactory.resolveTypeInWorld( - // myClass.getEnclosingClass(),world); - return null; + // this isn't in < Java 1.5 but I think we are moving beyond the need to support those levels + return ReflectionBasedReferenceTypeDelegateFactory.resolveTypeInWorld( + myClass.getEnclosingClass(),world); } /* @@ -308,9 +304,7 @@ public class ReflectionBasedReferenceTypeDelegate implements ReferenceTypeDelega return Collections.EMPTY_SET; } - /* - * (non-Javadoc) - * + /* * @see org.aspectj.weaver.ReferenceTypeDelegate#getTypeMungers() */ public Collection getTypeMungers() { diff --git a/tests/bugs173/pr407494/A.java b/tests/bugs173/pr407494/A.java new file mode 100644 index 000000000..0c1a1f636 --- /dev/null +++ b/tests/bugs173/pr407494/A.java @@ -0,0 +1,16 @@ +package a.b.c; + +public class A { + class B { + } + class $C { + } +} +class A$$B$$C { +} + +aspect X { + before(): within(A+) && staticinitialization(*) { + + } +} diff --git a/tests/bugs173/pr407494/A2.java b/tests/bugs173/pr407494/A2.java new file mode 100644 index 000000000..de0640892 --- /dev/null +++ b/tests/bugs173/pr407494/A2.java @@ -0,0 +1,17 @@ +package a.b.c; + +public class A2 { + class B { + } + class $C { + class Inner {} + } +} +class A$$B$$C { +} + +aspect X { + before(): within(*$C+) && staticinitialization(*) { + + } +} diff --git a/tests/src/org/aspectj/systemtest/ajc173/Ajc173Tests.java b/tests/src/org/aspectj/systemtest/ajc173/Ajc173Tests.java index 91f4b6760..de3437baf 100644 --- a/tests/src/org/aspectj/systemtest/ajc173/Ajc173Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc173/Ajc173Tests.java @@ -28,6 +28,14 @@ public class Ajc173Tests extends org.aspectj.testing.XMLBasedAjcTestCase { // test that class literals allowed runTest("class anno value 1"); } + + public void testInnerNames_407494() throws Exception { + runTest("inner names"); + } + + public void testInnerNames_407494_2() throws Exception { + runTest("inner names 2"); + } // public void testClassAnnoValue_405016() throws Exception { // runTest("class anno value"); diff --git a/tests/src/org/aspectj/systemtest/ajc173/ajc173.xml b/tests/src/org/aspectj/systemtest/ajc173/ajc173.xml index 0589f1aca..bcbfa7b96 100644 --- a/tests/src/org/aspectj/systemtest/ajc173/ajc173.xml +++ b/tests/src/org/aspectj/systemtest/ajc173/ajc173.xml @@ -2,6 +2,20 @@ <suite> + <ajc-test dir="bugs173/pr407494" title="inner names"> + <compile files="A.java" options="-1.5 -showWeaveInfo"> + <message kind="weave" text="Join point 'staticinitialization(void a.b.c.A$B.<clinit>())' in Type 'a.b.c.A$B' (A.java:4) advised by before advice from 'a.b.c.X' (A.java:13)"/> + <message kind="weave" text="Join point 'staticinitialization(void a.b.c.A.<clinit>())' in Type 'a.b.c.A' (A.java:3) advised by before advice from 'a.b.c.X' (A.java:13)"/> + <message kind="weave" text="Join point 'staticinitialization(void a.b.c.A$$C.<clinit>())' in Type 'a.b.c.A$$C' (A.java:6) advised by before advice from 'a.b.c.X' (A.java:13)"/> + </compile> + </ajc-test> + + <ajc-test dir="bugs173/pr407494" title="inner names 2"> + <compile files="A2.java" options="-1.5 -showWeaveInfo"> + <message kind="weave" text="Join point 'staticinitialization(void a.b.c.A$$B$$C.<clinit>())' in Type 'a.b.c.A$$B$$C' (A2.java:10) advised by before advice from 'a.b.c.X' (A2.java:14)"/> + </compile> + </ajc-test> + <ajc-test dir="bugs173/pr405016/one" title="class anno value 1"> <compile files="Gimme.java Thingy.java" options="-1.5 -showWeaveInfo"> <message kind="weave" text="Extending interface set for type 'Thingy' (Thingy.java) to include 'java.io.Serializable' (Thingy.java)"/> diff --git a/weaver5/java5-src/org/aspectj/weaver/reflect/Java15ReflectionBasedReferenceTypeDelegate.java b/weaver5/java5-src/org/aspectj/weaver/reflect/Java15ReflectionBasedReferenceTypeDelegate.java index 695dd7567..2782bddb5 100644 --- a/weaver5/java5-src/org/aspectj/weaver/reflect/Java15ReflectionBasedReferenceTypeDelegate.java +++ b/weaver5/java5-src/org/aspectj/weaver/reflect/Java15ReflectionBasedReferenceTypeDelegate.java @@ -364,5 +364,16 @@ public class Java15ReflectionBasedReferenceTypeDelegate extends ReflectionBasedR public boolean isAnonymous() { return this.myClass.isAnonymousClass(); } + + @Override + public boolean isNested() { + return this.myClass.isMemberClass(); + } + + @Override + public ResolvedType getOuterClass() { + return ReflectionBasedReferenceTypeDelegateFactory.resolveTypeInWorld( + myClass.getEnclosingClass(),world); + } } |