summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraclement <aclement>2005-12-13 13:41:47 +0000
committeraclement <aclement>2005-12-13 13:41:47 +0000
commita29212c28921626874bc1c6cbb38ddc72c773280 (patch)
treeff1de0348c075bf22ceff71943af4821a043b385
parentc0fc8fc41653160c06bdc7e8995a5b3a0049ee3a (diff)
downloadaspectj-a29212c28921626874bc1c6cbb38ddc72c773280.tar.gz
aspectj-a29212c28921626874bc1c6cbb38ddc72c773280.zip
test and fix for 119749
-rw-r--r--tests/bugs150/pr119749/InheritedThrows.java9
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/Ajc150Tests.java2
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/ajc150.xml6
-rw-r--r--weaver/src/org/aspectj/weaver/Advice.java14
-rw-r--r--weaver/src/org/aspectj/weaver/ResolvedType.java16
5 files changed, 35 insertions, 12 deletions
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 @@
</ajc-test>
<ajc-test dir="bugs150/pr119749" pr="119749" title="incorrect exception signature matching">
- <compile files="InheritedThrows.java" options="">
- <message kind="warning" line="19" text="one"/>
- <message kind="warning" line="27" text="one"/>
+ <compile files="InheritedThrows.java" options="-showWeaveInfo">
+ <message kind="weave" text="Join point 'method-execution(void InheritedThrows$NestedClassBoth.m())' in Type 'InheritedThrows$NestedClassBoth' (InheritedThrows.java:24) advised by afterThrowing advice from 'InheritedThrows$A' (InheritedThrows.java:4)"/>
+ <message kind="weave" text="Join point 'method-execution(void InheritedThrows$NestedClass1.m())' in Type 'InheritedThrows$NestedClass1' (InheritedThrows.java:16) advised by afterThrowing advice from 'InheritedThrows$A' (InheritedThrows.java:4)"/>
</compile>
</ajc-test>
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