From 69e24e90d4fee7115ecbc8c7786915b1f741471b Mon Sep 17 00:00:00 2001 From: aclement Date: Tue, 23 May 2006 07:55:53 +0000 Subject: [PATCH] fix for 142466 --- .../loadtime/ConcreteAspectCodeGen.java | 84 ++++++++++++++----- tests/bugs152/pr142466/AbstractMethods.aj | 31 +++++++ .../pr142466/AtAspectTestConcreteMethods.java | 6 ++ tests/bugs152/pr142466/ConcreteMethods.aj | 8 ++ tests/bugs152/pr142466/HelloWorld.java | 11 +++ tests/bugs152/pr142466/aop-tracing.xml | 10 +++ .../bugs152/pr142466/case2/AbstractMethods.aj | 31 +++++++ .../case2/AtAspectTestConcreteMethods.java | 6 ++ .../bugs152/pr142466/case2/ConcreteMethods.aj | 7 ++ tests/bugs152/pr142466/case2/HelloWorld.java | 11 +++ tests/bugs152/pr142466/case2/aop-tracing.xml | 10 +++ .../systemtest/ajc152/Ajc152Tests.java | 2 + .../org/aspectj/systemtest/ajc152/ajc152.xml | 27 ++++++ 13 files changed, 223 insertions(+), 21 deletions(-) create mode 100644 tests/bugs152/pr142466/AbstractMethods.aj create mode 100644 tests/bugs152/pr142466/AtAspectTestConcreteMethods.java create mode 100644 tests/bugs152/pr142466/ConcreteMethods.aj create mode 100644 tests/bugs152/pr142466/HelloWorld.java create mode 100644 tests/bugs152/pr142466/aop-tracing.xml create mode 100644 tests/bugs152/pr142466/case2/AbstractMethods.aj create mode 100644 tests/bugs152/pr142466/case2/AtAspectTestConcreteMethods.java create mode 100644 tests/bugs152/pr142466/case2/ConcreteMethods.aj create mode 100644 tests/bugs152/pr142466/case2/HelloWorld.java create mode 100644 tests/bugs152/pr142466/case2/aop-tracing.xml diff --git a/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java b/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java index 73ac9f3da..facebc489 100644 --- a/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java +++ b/loadtime/src/org/aspectj/weaver/loadtime/ConcreteAspectCodeGen.java @@ -38,9 +38,12 @@ import org.aspectj.weaver.patterns.PerSingleton; import java.lang.reflect.Modifier; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; /** * Generates bytecode for concrete-aspect @@ -159,27 +162,35 @@ public class ConcreteAspectCodeGen { // must have all abstractions defined List elligibleAbstractions = new ArrayList(); - Iterator methods = m_parent.getMethods(); - while (methods.hasNext()) { - ResolvedMember method = (ResolvedMember) methods.next(); - if (method.isAbstract()) { - if ("()V".equals(method.getSignature())) { - String n = method.getName(); - if (n.startsWith("ajc$pointcut")) { // Allow for the abstract pointcut being from a code style aspect compiled with -1.5 (see test for 128744) - n = n.substring(14); - n = n.substring(0,n.indexOf("$")); - elligibleAbstractions.add(n); - } else { - // Only interested in abstract methods that take no parameters and are marked @Pointcut - if (hasPointcutAnnotation(method)) - elligibleAbstractions.add(method.getName()); - } - } else { - reportError("Abstract method '" + method.getName() + "' cannot be concretized as a pointcut (illegal signature, must have no arguments, must return void): " + stringify()); - return false; - } + + Collection abstractMethods = getOutstandingAbstractMethods(m_parent); + for (Iterator iter = abstractMethods.iterator(); iter.hasNext();) { + ResolvedMember method = (ResolvedMember) iter.next(); + if ("()V".equals(method.getSignature())) { + String n = method.getName(); + if (n.startsWith("ajc$pointcut")) { // Allow for the abstract pointcut being from a code style aspect compiled with -1.5 (see test for 128744) + n = n.substring(14); + n = n.substring(0,n.indexOf("$")); + elligibleAbstractions.add(n); + } else if (hasPointcutAnnotation(method)) { + elligibleAbstractions.add(method.getName()); + } else { + // error, an outstanding abstract method that can't be concretized in XML + reportError("Abstract method '" + method.toString() + "' cannot be concretized in XML: " + stringify()); + return false; + } + } else { + if (method.getName().startsWith("ajc$pointcut") || hasPointcutAnnotation(method)) { + // it may be a pointcut but it doesn't meet the requirements for XML concretization + reportError("Abstract method '" + method.toString() + "' cannot be concretized as a pointcut (illegal signature, must have no arguments, must return void): " + stringify()); + return false; + } else { + // error, an outstanding abstract method that can't be concretized in XML + reportError("Abstract method '" + method.toString() + "' cannot be concretized in XML: " + stringify()); + return false; + } } - } + } List pointcutNames = new ArrayList(); for (Iterator it = m_concreteAspect.pointcuts.iterator(); it.hasNext();) { Definition.Pointcut abstractPc = (Definition.Pointcut) it.next(); @@ -198,7 +209,38 @@ public class ConcreteAspectCodeGen { return m_isValid; } - /** + private Collection getOutstandingAbstractMethods(ResolvedType type) { + Map collector = new HashMap(); + // let's get to the top of the hierarchy and then walk down ... recording abstract methods then removing + // them if they get defined further down the hierarchy + getOutstandingAbstractMethodsHelper(type,collector); + return collector.values(); + } + + // We are trying to determine abstract methods left over at the bottom of a hierarchy that have not been + // concretized. + private void getOutstandingAbstractMethodsHelper(ResolvedType type,Map collector) { + if (type==null) return; + // Get to the top + if (type!=null && !type.equals(ResolvedType.OBJECT)) { + if (type.getSuperclass()!=null) + getOutstandingAbstractMethodsHelper(type.getSuperclass(),collector); + } + ResolvedMember[] rms = type.getDeclaredMethods(); + if (rms!=null) { + for (int i = 0; i < rms.length; i++) { + ResolvedMember member = rms[i]; + String key = member.getName()+member.getSignature(); + if (member.isAbstract()) { + collector.put(key,member); + } else { + collector.remove(key); + } + } + } + } + + /** * Rebuild the XML snip that defines this concrete aspect, for log error purpose * * @return string repr. diff --git a/tests/bugs152/pr142466/AbstractMethods.aj b/tests/bugs152/pr142466/AbstractMethods.aj new file mode 100644 index 000000000..f252d8838 --- /dev/null +++ b/tests/bugs152/pr142466/AbstractMethods.aj @@ -0,0 +1,31 @@ +import org.aspectj.lang.annotation.*; + + +@Aspect +public abstract class AbstractMethods { + + @Pointcut + protected abstract void tracingScope(); + + @Before("tracingScope()") + public void doit() { + test(); + System.out.println("advice running"); + } + protected abstract void test(); +} + +/* +public abstract aspect AbstractMethods { + + protected abstract pointcut tracingScope (); + + before () : tracingScope () { + test(); + System.out.println("advice running"); + } + + protected abstract void test (); +// protected void test () {} +} +*/ diff --git a/tests/bugs152/pr142466/AtAspectTestConcreteMethods.java b/tests/bugs152/pr142466/AtAspectTestConcreteMethods.java new file mode 100644 index 000000000..90e4cc34e --- /dev/null +++ b/tests/bugs152/pr142466/AtAspectTestConcreteMethods.java @@ -0,0 +1,6 @@ +import org.aspectj.lang.annotation.Aspect; + +@Aspect +public class AtAspectTestConcreteMethods extends ConcreteMethods { + +} diff --git a/tests/bugs152/pr142466/ConcreteMethods.aj b/tests/bugs152/pr142466/ConcreteMethods.aj new file mode 100644 index 000000000..cd2dd1eca --- /dev/null +++ b/tests/bugs152/pr142466/ConcreteMethods.aj @@ -0,0 +1,8 @@ + + +public abstract aspect ConcreteMethods extends AbstractMethods { + + protected void test () {} + public abstract void foo(int i) ; + +} diff --git a/tests/bugs152/pr142466/HelloWorld.java b/tests/bugs152/pr142466/HelloWorld.java new file mode 100644 index 000000000..f741a2c0e --- /dev/null +++ b/tests/bugs152/pr142466/HelloWorld.java @@ -0,0 +1,11 @@ +public class HelloWorld { + + public static void main(String[] args) { + new HelloWorld().println(); + } + + public void println() { + System.out.print("Hello World!"); + } + +} diff --git a/tests/bugs152/pr142466/aop-tracing.xml b/tests/bugs152/pr142466/aop-tracing.xml new file mode 100644 index 000000000..2c805137b --- /dev/null +++ b/tests/bugs152/pr142466/aop-tracing.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/tests/bugs152/pr142466/case2/AbstractMethods.aj b/tests/bugs152/pr142466/case2/AbstractMethods.aj new file mode 100644 index 000000000..f252d8838 --- /dev/null +++ b/tests/bugs152/pr142466/case2/AbstractMethods.aj @@ -0,0 +1,31 @@ +import org.aspectj.lang.annotation.*; + + +@Aspect +public abstract class AbstractMethods { + + @Pointcut + protected abstract void tracingScope(); + + @Before("tracingScope()") + public void doit() { + test(); + System.out.println("advice running"); + } + protected abstract void test(); +} + +/* +public abstract aspect AbstractMethods { + + protected abstract pointcut tracingScope (); + + before () : tracingScope () { + test(); + System.out.println("advice running"); + } + + protected abstract void test (); +// protected void test () {} +} +*/ diff --git a/tests/bugs152/pr142466/case2/AtAspectTestConcreteMethods.java b/tests/bugs152/pr142466/case2/AtAspectTestConcreteMethods.java new file mode 100644 index 000000000..90e4cc34e --- /dev/null +++ b/tests/bugs152/pr142466/case2/AtAspectTestConcreteMethods.java @@ -0,0 +1,6 @@ +import org.aspectj.lang.annotation.Aspect; + +@Aspect +public class AtAspectTestConcreteMethods extends ConcreteMethods { + +} diff --git a/tests/bugs152/pr142466/case2/ConcreteMethods.aj b/tests/bugs152/pr142466/case2/ConcreteMethods.aj new file mode 100644 index 000000000..cdce053b3 --- /dev/null +++ b/tests/bugs152/pr142466/case2/ConcreteMethods.aj @@ -0,0 +1,7 @@ + + +public abstract aspect ConcreteMethods extends AbstractMethods { + +// protected void test () {} + +} diff --git a/tests/bugs152/pr142466/case2/HelloWorld.java b/tests/bugs152/pr142466/case2/HelloWorld.java new file mode 100644 index 000000000..f741a2c0e --- /dev/null +++ b/tests/bugs152/pr142466/case2/HelloWorld.java @@ -0,0 +1,11 @@ +public class HelloWorld { + + public static void main(String[] args) { + new HelloWorld().println(); + } + + public void println() { + System.out.print("Hello World!"); + } + +} diff --git a/tests/bugs152/pr142466/case2/aop-tracing.xml b/tests/bugs152/pr142466/case2/aop-tracing.xml new file mode 100644 index 000000000..2c805137b --- /dev/null +++ b/tests/bugs152/pr142466/case2/aop-tracing.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/tests/src/org/aspectj/systemtest/ajc152/Ajc152Tests.java b/tests/src/org/aspectj/systemtest/ajc152/Ajc152Tests.java index 126c8e887..1105d8235 100644 --- a/tests/src/org/aspectj/systemtest/ajc152/Ajc152Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc152/Ajc152Tests.java @@ -17,6 +17,8 @@ import org.aspectj.testing.XMLBasedAjcTestCase; public class Ajc152Tests extends org.aspectj.testing.XMLBasedAjcTestCase { + public void testConcretizingAbstractMethods_pr142466() { runTest("aop.xml aspect inheriting but not concretizing abstract method");} + public void testConcretizingAbstractMethods_pr142466_2() { runTest("aop.xml aspect inheriting but not concretizing abstract method - 2");} public void testComplexGenericDecl_pr137568() { runTest("complicated generics declaration");} public void testItdOnInnerTypeOfGenericType_pr132349() { runTest("ITD on inner type of generic type");} public void testItdOnInnerTypeOfGenericType_pr132349_2() { runTest("ITD on inner type of generic type - 2");} diff --git a/tests/src/org/aspectj/systemtest/ajc152/ajc152.xml b/tests/src/org/aspectj/systemtest/ajc152/ajc152.xml index aaa4a7c07..64857100d 100644 --- a/tests/src/org/aspectj/systemtest/ajc152/ajc152.xml +++ b/tests/src/org/aspectj/systemtest/ajc152/ajc152.xml @@ -287,6 +287,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.39.5