diff options
author | avasseur <avasseur> | 2005-10-18 15:52:50 +0000 |
---|---|---|
committer | avasseur <avasseur> | 2005-10-18 15:52:50 +0000 |
commit | 51a117846c60df84bd6b368cd2297c8ebd8f2cca (patch) | |
tree | 65651ab3536efebf3ad5fa440f76ead8068e2e93 | |
parent | ae612d9752200a3784de33ea6b79815e77aabaed (diff) | |
download | aspectj-51a117846c60df84bd6b368cd2297c8ebd8f2cca.tar.gz aspectj-51a117846c60df84bd6b368cd2297c8ebd8f2cca.zip |
due fix and test for @AJ ITD reweavable, serialization of the method delegate munger
10 files changed, 196 insertions, 15 deletions
diff --git a/tests/java5/ataspectj/ajc-ant.xml b/tests/java5/ataspectj/ajc-ant.xml index 393b92f30..6d0dcee0e 100644 --- a/tests/java5/ataspectj/ajc-ant.xml +++ b/tests/java5/ataspectj/ajc-ant.xml @@ -122,4 +122,43 @@ <jvmarg value="-Daj5.def=ataspectj/aop-unweavabletest.xml"/> </java> </target> + + <target name="ltw.Decp"> + <java fork="yes" classname="ataspectj.DeclareParentsInterfaceTest" failonerror="yes"> + <classpath> + <path refid="aj.path"/> + </classpath> + <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> + <jvmarg value="-Daj5.def=ataspectj/aop-decptest.xml"/> + </java> + <java fork="yes" classname="ataspectj.DeclareParentsImplementsTest" failonerror="yes"> + <classpath> + <path refid="aj.path"/> + </classpath> + <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> + <jvmarg value="-Daj5.def=ataspectj/aop-decptest.xml"/> + </java> + </target> + + <target name="ltw.Decp2"> + <!-- javac compile the 2nd aspect --> + <javac destdir="${aj.sandbox}" + srcdir="${basedir}" + includes="ataspectj/DeclareParentsImplementsReweavableTestAspect.java" + debug="true"> + <classpath> + <path refid="aj.path"/> + <pathelement path="${aj.sandbox}"/> + </classpath> + </javac> + + <java fork="yes" classname="ataspectj.DeclareParentsImplementsReweavableTest" failonerror="yes"> + <classpath> + <path refid="aj.path"/> + </classpath> + <jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/> + <jvmarg value="-Daj5.def=ataspectj/aop-decptest2.xml"/> + <jvmarg line="${jdwp}"/> + </java> + </target> </project>
\ No newline at end of file diff --git a/tests/java5/ataspectj/ataspectj/DeclareParentsImplementsReweavableTest.java b/tests/java5/ataspectj/ataspectj/DeclareParentsImplementsReweavableTest.java new file mode 100644 index 000000000..5e1a7d3c0 --- /dev/null +++ b/tests/java5/ataspectj/ataspectj/DeclareParentsImplementsReweavableTest.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2005 Contributors. + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution and is available at + * http://eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alexandre Vasseur initial implementation + *******************************************************************************/ +package ataspectj; + +import junit.framework.TestCase; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.DeclareParents; + +import java.util.Arrays; + +/** + * @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a> + */ +public class DeclareParentsImplementsReweavableTest extends TestCase { + + static class Target {} + + static interface I1 { int do1(); } + + static class Imp1 implements I1 { + public int do1() {return 1;} + } + + public static interface I2 { int do2(); } + + public static class Imp2 implements I2 { + public int do2() {return 2;} + } + + @Aspect + static class TestAspect { + + @DeclareParents("ataspectj.DeclareParentsImplementsReweavableTest.Target") + public static I1 i1 = new Imp1(); + } + + public void testDecPInt() { + Class[] intfs = Target.class.getInterfaces(); + assertTrue("I1 was not introduced", Arrays.asList(intfs).contains(I1.class)); + assertEquals(1, ((I1)new Target()).do1()); + + // test stuff weaved in by DeclareParentsImplementsReweavableAspect + // thru reweable mode + assertTrue("I2 was not introduced", Arrays.asList(intfs).contains(I2.class)); + assertEquals(2, ((I2)new Target()).do2()); + } + + public static void main(String[] args) { + TestHelper.runAndThrowOnFailure(suite()); + } + + public static junit.framework.Test suite() { + return new junit.framework.TestSuite(DeclareParentsImplementsReweavableTest.class); + } + +} diff --git a/tests/java5/ataspectj/ataspectj/DeclareParentsImplementsReweavableTestAspect.java b/tests/java5/ataspectj/ataspectj/DeclareParentsImplementsReweavableTestAspect.java new file mode 100644 index 000000000..c75585f75 --- /dev/null +++ b/tests/java5/ataspectj/ataspectj/DeclareParentsImplementsReweavableTestAspect.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2005 Contributors. + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution and is available at + * http://eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alexandre Vasseur initial implementation + *******************************************************************************/ +package ataspectj; + +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.DeclareParents; + +/** + * @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a> + */ +@Aspect +public class DeclareParentsImplementsReweavableTestAspect { + + @DeclareParents("ataspectj.DeclareParentsImplementsReweavableTest.Target") + public static DeclareParentsImplementsReweavableTest.I2 i2 = new DeclareParentsImplementsReweavableTest.Imp2(); + +} diff --git a/tests/java5/ataspectj/ataspectj/aop-decptest.xml b/tests/java5/ataspectj/ataspectj/aop-decptest.xml new file mode 100644 index 000000000..fe04e96b1 --- /dev/null +++ b/tests/java5/ataspectj/ataspectj/aop-decptest.xml @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<aspectj> + <weaver options="-XmessageHandlerClass:ataspectj.TestHelper"/> + <aspects> + <aspect name="ataspectj.DeclareParentsImplementsTest.TestAspect"/> + <aspect name="ataspectj.DeclareParentsInterfaceTest.TestAspect"/> + </aspects> +</aspectj> diff --git a/tests/java5/ataspectj/ataspectj/aop-decptest2.xml b/tests/java5/ataspectj/ataspectj/aop-decptest2.xml new file mode 100644 index 000000000..2fc5016f8 --- /dev/null +++ b/tests/java5/ataspectj/ataspectj/aop-decptest2.xml @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<aspectj> + <weaver options="-XmessageHandlerClass:ataspectj.TestHelper"/> + <aspects> + <aspect name="ataspectj.DeclareParentsImplementsReweavableTest.TestAspect"/> + <aspect name="ataspectj.DeclareParentsImplementsReweavableTestAspect"/> + </aspects> +</aspectj> diff --git a/tests/src/org/aspectj/systemtest/ajc150/ataspectj/AtAjLTWTests.java b/tests/src/org/aspectj/systemtest/ajc150/ataspectj/AtAjLTWTests.java index d7af9679a..431232ff5 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/ataspectj/AtAjLTWTests.java +++ b/tests/src/org/aspectj/systemtest/ajc150/ataspectj/AtAjLTWTests.java @@ -82,4 +82,11 @@ public class AtAjLTWTests extends XMLBasedAjcTestCase { runTest("LTW Unweavable"); } + public void testLTWDecp() { + runTest("LTW Decp"); + } + + public void testLTWDecp2() { + runTest("LTW Decp2"); + } } diff --git a/tests/src/org/aspectj/systemtest/ajc150/ataspectj/ltw.xml b/tests/src/org/aspectj/systemtest/ajc150/ataspectj/ltw.xml index aaa2c97e4..11dd7e656 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/ataspectj/ltw.xml +++ b/tests/src/org/aspectj/systemtest/ajc150/ataspectj/ltw.xml @@ -102,4 +102,22 @@ <ant file="ajc-ant.xml" target="ltw.Unweavable" verbose="true"/> </ajc-test> + <ajc-test dir="java5/ataspectj" title="LTW Decp"> + <!-- ajc compile them to test reweable as well --> + <compile + files="ataspectj/DeclareParentsInterfaceTest.java,ataspectj/DeclareParentsImplementsTest.java,ataspectj/TestHelper.java" + options="-1.5" + /> + <ant file="ajc-ant.xml" target="ltw.Decp" verbose="true"/> + </ajc-test> + + <ajc-test dir="java5/ataspectj" title="LTW Decp2"> + <!-- ajc compile them but with only one aspect --> + <compile + files="ataspectj/DeclareParentsImplementsReweavableTest.java,ataspectj/TestHelper.java" + options="-1.5" + /> + <!-- compile the other aspect alone (won't be applied) --> + <ant file="ajc-ant.xml" target="ltw.Decp2" verbose="true"/> + </ajc-test> </suite>
\ No newline at end of file diff --git a/weaver/src/org/aspectj/weaver/MethodDelegateTypeMunger.java b/weaver/src/org/aspectj/weaver/MethodDelegateTypeMunger.java index 797e7ae7b..26ae5b21d 100644 --- a/weaver/src/org/aspectj/weaver/MethodDelegateTypeMunger.java +++ b/weaver/src/org/aspectj/weaver/MethodDelegateTypeMunger.java @@ -65,22 +65,31 @@ public class MethodDelegateTypeMunger extends ResolvedTypeMunger { } } + private MethodDelegateTypeMunger(ResolvedMember signature, ResolvedMember fieldDelegate, TypePattern typePattern) { + super(MethodDelegate, signature); + this.aspectFieldDelegate = fieldDelegate; + this.typePattern = typePattern; + } + public ResolvedMember getDelegate() { return aspectFieldDelegate; } public void write(DataOutputStream s) throws IOException { - ;//FIXME AVITD needed as changes public signature throw new RuntimeException("unimplemented"); + kind.write(s); + signature.write(s); + aspectFieldDelegate.write(s); + typePattern.write(s); } -// public static ResolvedTypeMunger readMethod(VersionedDataInputStream s, ISourceContext context) throws IOException { -// ResolvedMemberImpl rmi = ResolvedMemberImpl.readResolvedMember(s, context); -// Set superMethodsCalled = readSuperMethodsCalled(s); -// ISourceLocation sLoc = readSourceLocation(s); -// ResolvedTypeMunger munger = new MethodDelegateTypeMunger(rmi, superMethodsCalled); -// if (sLoc != null) munger.setSourceLocation(sLoc); -// return munger; -// } + + + public static ResolvedTypeMunger readMethod(VersionedDataInputStream s, ISourceContext context) throws IOException { + ResolvedMemberImpl signature = ResolvedMemberImpl.readResolvedMember(s, context); + ResolvedMemberImpl field = ResolvedMemberImpl.readResolvedMember(s, context); + TypePattern tp = TypePattern.read(s, context); + return new MethodDelegateTypeMunger(signature, field, tp); + } /** * Match based on given type pattern, only classes can be matched diff --git a/weaver/src/org/aspectj/weaver/NewMethodTypeMunger.java b/weaver/src/org/aspectj/weaver/NewMethodTypeMunger.java index 6f60d9965..f4fdeafca 100644 --- a/weaver/src/org/aspectj/weaver/NewMethodTypeMunger.java +++ b/weaver/src/org/aspectj/weaver/NewMethodTypeMunger.java @@ -47,8 +47,7 @@ public class NewMethodTypeMunger extends ResolvedTypeMunger { } public static ResolvedTypeMunger readMethod(VersionedDataInputStream s, ISourceContext context) throws IOException { - - ISourceLocation sloc = null; + ISourceLocation sloc = null; ResolvedMemberImpl rmImpl = ResolvedMemberImpl.readResolvedMember(s, context); Set superMethodsCalled = readSuperMethodsCalled(s); sloc = readSourceLocation(s); diff --git a/weaver/src/org/aspectj/weaver/ResolvedTypeMunger.java b/weaver/src/org/aspectj/weaver/ResolvedTypeMunger.java index 06ae53554..73588f89c 100644 --- a/weaver/src/org/aspectj/weaver/ResolvedTypeMunger.java +++ b/weaver/src/org/aspectj/weaver/ResolvedTypeMunger.java @@ -123,10 +123,11 @@ public abstract class ResolvedTypeMunger { return NewFieldTypeMunger.readField(s, context); } else if (kind == Method) { return NewMethodTypeMunger.readMethod(s, context); - } else if (kind == Constructor) { return NewConstructorTypeMunger.readConstructor(s, context); - } else { + } else if (kind == MethodDelegate) { + return MethodDelegateTypeMunger.readMethod(s, context); + } else { throw new RuntimeException("unimplemented"); } } @@ -227,7 +228,8 @@ public abstract class ResolvedTypeMunger { case 1: return Field; case 2: return Method; case 5: return Constructor; - } + case 9: return MethodDelegate; + } throw new BCException("bad kind: " + key); } } @@ -247,7 +249,7 @@ public abstract class ResolvedTypeMunger { public static final Kind AnnotationOnType = new Kind("AnnotationOnType",8); // not serialized - public static final Kind MethodDelegate = new Kind("MethodDelegate", 9);// not serialized, @AJ ITDs + public static final Kind MethodDelegate = new Kind("MethodDelegate", 9);// serialized, @AJ ITDs public static final String SUPER_DISPATCH_NAME = "superDispatch"; |