From: aclement Date: Tue, 13 Dec 2005 13:41:47 +0000 (+0000) Subject: test and fix for 119749 X-Git-Tag: V1_5_0RC1~19 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a29212c28921626874bc1c6cbb38ddc72c773280;p=aspectj.git test and fix for 119749 --- diff --git a/tests/bugs150/pr119749/InheritedThrows.java b/tests/bugs150/pr119749/InheritedThrows.java index d29a72089..3c3021d5d 100644 --- a/tests/bugs150/pr119749/InheritedThrows.java +++ b/tests/bugs150/pr119749/InheritedThrows.java @@ -1,10 +1,7 @@ public class InheritedThrows { static aspect A { - declare warning : execution (* *.*(..) throws Ex1) : "one"; -// declare warning : execution (* *.*(..) throws Ex2) : "two"; -// declare warning : execution (* *.*(..) throws !(Ex1||Ex2)) : "neither"; -// declare warning : execution (* *.*(..) throws Ex1, Ex2) : "both"; + after() throwing(Ex1 a): execution(* *.*(..) throws Ex1) {} } public static class Ex1 extends Exception {} @@ -16,7 +13,7 @@ public class InheritedThrows { } private static class NestedClass1 implements MyInterface { - public void m() throws Ex1 {} + public void m() throws Ex1 {} // MATCHES HERE } private static class NestedClass2 implements MyInterface { @@ -24,7 +21,7 @@ public class InheritedThrows { } private static class NestedClassBoth implements MyInterface { - public void m() throws Ex1, Ex2 {} + public void m() throws Ex1, Ex2 {} // MATCHES HERE } private static class NestedClassNeither implements MyInterface { diff --git a/tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java b/tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java index 1ff229944..ba040ceac 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java @@ -52,7 +52,7 @@ public class Ajc150Tests extends org.aspectj.testing.XMLBasedAjcTestCase { public void testCunningDeclareParents_pr92311() { runTest("cunning declare parents");} public void testGenericITDsAndAbstractMethodError_pr102357() { runTest("generic itds and abstract method error");} */ - //public void testIncorrectSignatureMatchingWithExceptions_pr119749() { runTest("incorrect exception signature matching");} + public void testIncorrectSignatureMatchingWithExceptions_pr119749() { runTest("incorrect exception signature matching");} public void testGeneratingCodeForAnOldRuntime_pr116679_1() { runTest("generating code for a 1.2.1 runtime - 1");} public void testGeneratingCodeForAnOldRuntime_pr116679_2() { runTest("generating code for a 1.2.1 runtime - 2");} public void testAmbiguousMethod_pr118599_1() { runTest("ambiguous method when binary weaving - 1");} diff --git a/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml b/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml index 790dca6f9..a73365dc2 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml +++ b/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml @@ -136,9 +136,9 @@ - - - + + + diff --git a/weaver/src/org/aspectj/weaver/Advice.java b/weaver/src/org/aspectj/weaver/Advice.java index 791b9a853..f8b26a41e 100644 --- a/weaver/src/org/aspectj/weaver/Advice.java +++ b/weaver/src/org/aspectj/weaver/Advice.java @@ -116,8 +116,8 @@ public abstract class Advice extends ShadowMunger { } } - - if (hasExtraParameter() && kind == AdviceKind.AfterReturning) { + + if (hasExtraParameter() && kind == AdviceKind.AfterReturning) { ResolvedType resolvedExtraParameterType = getExtraParameterType().resolve(world); ResolvedType shadowReturnType = shadow.getReturnType().resolve(world); boolean matches = @@ -127,6 +127,16 @@ public abstract class Advice extends ShadowMunger { maybeIssueUncheckedMatchWarning(resolvedExtraParameterType,shadowReturnType,shadow,world); } return matches; + } else if (hasExtraParameter() && kind==AdviceKind.AfterThrowing) { // pr119749 + ResolvedType exceptionType = getExtraParameterType().resolve(world); + if (!exceptionType.isCheckedException()) return true; + UnresolvedType[] shadowThrows = shadow.getSignature().getExceptions(world); + boolean matches = false; + for (int i = 0; i < shadowThrows.length && !matches; i++) { + ResolvedType type = shadowThrows[i].resolve(world); + if (exceptionType.isAssignableFrom(type)) matches=true; + } + return matches; } else if (kind == AdviceKind.PerTargetEntry) { return shadow.hasTarget(); } else if (kind == AdviceKind.PerThisEntry) { diff --git a/weaver/src/org/aspectj/weaver/ResolvedType.java b/weaver/src/org/aspectj/weaver/ResolvedType.java index d16b041c2..ee8b7d0ac 100644 --- a/weaver/src/org/aspectj/weaver/ResolvedType.java +++ b/weaver/src/org/aspectj/weaver/ResolvedType.java @@ -1883,6 +1883,22 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl public ResolvedPointcutDefinition findPointcut(String name, World world) { throw new UnsupportedOperationException("Not yet implemenented"); } + + /** + * @return true if assignable to java.lang.Exception + */ + public boolean isException() { + return (world.getCoreType(UnresolvedType.JAVA_LANG_EXCEPTION).isAssignableFrom(this)); + } + + /** + * @return true if it is an exception and it is a checked one, false otherwise. + */ + public boolean isCheckedException() { + if (!isException()) return false; + if (world.getCoreType(UnresolvedType.RUNTIME_EXCEPTION).isAssignableFrom(this)) return false; + return true; + } /** * Determines if variables of this type could be assigned values of another