aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraclement <aclement>2004-07-28 14:43:40 +0000
committeraclement <aclement>2004-07-28 14:43:40 +0000
commit573741c8081c6b6b45921cafaae39f37eede2302 (patch)
treefae17176ce374ed0881cb10a8a161e39b3e18fbb
parentc143eb5ec12a8ee9cf480e8bf4a4e12acef38d40 (diff)
downloadaspectj-573741c8081c6b6b45921cafaae39f37eede2302.tar.gz
aspectj-573741c8081c6b6b45921cafaae39f37eede2302.zip
Fix for 64331
java.lang.NullPointerException in WeaverMessageHandler class
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/WeaverMessageHandler.java20
-rw-r--r--tests/ajcTests.xml7
-rw-r--r--tests/bugs/abstractITDs/A.java2
-rw-r--r--tests/bugs/abstractITDs/B.aj3
-rw-r--r--tests/bugs/abstractITDs/B.jarbin0 -> 1396 bytes
-rw-r--r--tests/bugs/abstractITDs/C.java2
-rw-r--r--tests/bugs/abstractITDs/buildBJar.bat1
-rw-r--r--weaver/src/org/aspectj/weaver/ResolvedTypeX.java9
8 files changed, 37 insertions, 7 deletions
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/WeaverMessageHandler.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/WeaverMessageHandler.java
index 71017a6c3..a379fccb6 100644
--- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/WeaverMessageHandler.java
+++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/WeaverMessageHandler.java
@@ -10,6 +10,7 @@
*******************************************************************************/
package org.aspectj.ajdt.internal.compiler;
+import java.util.ArrayList;
import java.util.List;
import org.aspectj.ajdt.internal.compiler.lookup.EclipseSourceLocation;
@@ -164,12 +165,13 @@ public class WeaverMessageHandler implements IMessageHandler {
private IProblem[] buildSeeAlsoProblems(List sourceLocations,
CompilationResult problemSource,
boolean usedBinarySourceFileName) {
- int probLength = sourceLocations.size();
- if (usedBinarySourceFileName) probLength++;
- IProblem[] ret = new IProblem[probLength];
+ List ret = new ArrayList();
+
for (int i = 0; i < sourceLocations.size(); i++) {
ISourceLocation loc = (ISourceLocation) sourceLocations.get(i);
- ret[i] = new DefaultProblem(loc.getSourceFile().getPath().toCharArray(),
+ if (loc != null ) {
+ DefaultProblem dp =
+ new DefaultProblem( loc.getSourceFile().getPath().toCharArray(),
"see also",
0,
new String[] {},
@@ -177,13 +179,19 @@ public class WeaverMessageHandler implements IMessageHandler {
getStartPos(loc,null),
getEndPos(loc,null),
loc.getLine());
+ ret.add(dp);
+ } else {
+ throw new RuntimeException("Internal Compiler Error: Unexpected null source location passed as 'see also' location.");
+ }
}
if (usedBinarySourceFileName) {
- ret[ret.length -1] = new DefaultProblem(problemSource.fileName,"see also",0,new String[] {},
+ DefaultProblem dp = new DefaultProblem(problemSource.fileName,"see also",0,new String[] {},
ProblemSeverities.Ignore,0,
0,0);
+ ret.add(dp);
}
- return ret;
+ IProblem[] retValue = (IProblem[])ret.toArray(new IProblem[]{});
+ return retValue;
}
}
diff --git a/tests/ajcTests.xml b/tests/ajcTests.xml
index 85c36164b..f76405da3 100644
--- a/tests/ajcTests.xml
+++ b/tests/ajcTests.xml
@@ -7795,4 +7795,11 @@
</compile>
</ajc-test>
+ <ajc-test dir="bugs/abstractITDs"
+ pr="64331" title="java.lang.NullPointerException in WeaverMessageHandler class">
+ <compile files="A.java,C.java" aspectpath="B.jar">
+ <message kind="error" line="1" text="must implement abstract inter-type declaration: void A.foo()"/>
+ </compile>
+ </ajc-test>
+
</suite>
diff --git a/tests/bugs/abstractITDs/A.java b/tests/bugs/abstractITDs/A.java
new file mode 100644
index 000000000..5d9e777af
--- /dev/null
+++ b/tests/bugs/abstractITDs/A.java
@@ -0,0 +1,2 @@
+public abstract class A {
+}
diff --git a/tests/bugs/abstractITDs/B.aj b/tests/bugs/abstractITDs/B.aj
new file mode 100644
index 000000000..54af3233e
--- /dev/null
+++ b/tests/bugs/abstractITDs/B.aj
@@ -0,0 +1,3 @@
+public aspect B {
+ abstract public void A.foo();
+} \ No newline at end of file
diff --git a/tests/bugs/abstractITDs/B.jar b/tests/bugs/abstractITDs/B.jar
new file mode 100644
index 000000000..b0fcaad10
--- /dev/null
+++ b/tests/bugs/abstractITDs/B.jar
Binary files differ
diff --git a/tests/bugs/abstractITDs/C.java b/tests/bugs/abstractITDs/C.java
new file mode 100644
index 000000000..8e6613707
--- /dev/null
+++ b/tests/bugs/abstractITDs/C.java
@@ -0,0 +1,2 @@
+public class C extends A {
+} \ No newline at end of file
diff --git a/tests/bugs/abstractITDs/buildBJar.bat b/tests/bugs/abstractITDs/buildBJar.bat
new file mode 100644
index 000000000..4905f255f
--- /dev/null
+++ b/tests/bugs/abstractITDs/buildBJar.bat
@@ -0,0 +1 @@
+ajc A.java B.aj -outjar B.jar
diff --git a/weaver/src/org/aspectj/weaver/ResolvedTypeX.java b/weaver/src/org/aspectj/weaver/ResolvedTypeX.java
index 16634af07..2779f7cdd 100644
--- a/weaver/src/org/aspectj/weaver/ResolvedTypeX.java
+++ b/weaver/src/org/aspectj/weaver/ResolvedTypeX.java
@@ -986,10 +986,17 @@ public abstract class ResolvedTypeX extends TypeX {
for (Iterator iter = getInterTypeMungersIncludingSupers().iterator(); iter.hasNext();) {
ConcreteTypeMunger element = (ConcreteTypeMunger) iter.next();
if (element.getSignature() != null && element.getSignature().isAbstract()) {
+ ISourceLocation xtraLocation = element.getSourceLocation();
+ if (xtraLocation == null) {
+ // Until intertype mungers remember where they came from, the source location
+ // for the element is null when binary weaving. In these cases uses the
+ // source location for the aspect containing the ITD
+ xtraLocation = element.getAspectType().getSourceLocation();
+ }
world.getMessageHandler().handleMessage(
new Message("must implement abstract inter-type declaration: " + element.getSignature(),
"", IMessage.ERROR, getSourceLocation(), null,
- new ISourceLocation[] { element.getSourceLocation() }));
+ new ISourceLocation[] { xtraLocation }));
}
}
}