Bug 386704 - Requesting AST throws NPE if base class is unresolved
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/BaseCallMessageSend.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/BaseCallMessageSend.java
index 0a9cc19..5b17514 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/BaseCallMessageSend.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/BaseCallMessageSend.java
@@ -232,9 +232,9 @@
// return type:
TypeBinding returnType = null;
- if (referenceMethod != null && ! referenceMethod.ignoreFurtherInvestigation) {
+ if (referenceMethod != null) {
returnType = MethodModel.getReturnType(referenceMethod.binding);
- if (returnType.isBaseType()) {
+ if (returnType != null && returnType.isBaseType()) {
if (returnType != TypeBinding.VOID)
this._wrappee = gen.createUnboxing(this._wrappee, (BaseTypeBinding)returnType);
else if (outerCallinMethod == null)
diff --git a/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/src/org/eclipse/objectteams/otdt/ui/tests/dom/converter/DOMRegressionTests.java b/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/src/org/eclipse/objectteams/otdt/ui/tests/dom/converter/DOMRegressionTests.java
index 1eb2a3b..05aa63b 100644
--- a/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/src/org/eclipse/objectteams/otdt/ui/tests/dom/converter/DOMRegressionTests.java
+++ b/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/src/org/eclipse/objectteams/otdt/ui/tests/dom/converter/DOMRegressionTests.java
@@ -24,7 +24,10 @@
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTParser;
+import org.eclipse.jdt.core.dom.BaseCallMessageSend;
import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.IfStatement;
+import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.objectteams.otdt.ui.tests.dom.FileBasedDOMTest;
@@ -95,4 +98,29 @@
assertEquals("No fields expected",nestedTeam.getFields().length, 0);
}
+ // Bug 386704 - Requesting AST throws NPE if base class is unresolved
+ // request resolved AST despite syntax error (missing ';')
+ public void testBug386704() throws JavaModelException {
+ ICompilationUnit teamClass = getCompilationUnit(
+ getTestProjectDir(),
+ "src",
+ "regression.basecall",
+ "T.java");
+ ASTParser parser = ASTParser.newParser(JAVA_LANGUAGE_SPEC_LEVEL);
+ parser.setProject(getJavaProject(TEST_PROJECT));
+ parser.setSource(teamClass);
+ parser.setStatementsRecovery(true);
+ parser.setResolveBindings(true);
+
+ ASTNode root = parser.createAST( new NullProgressMonitor() );
+ CompilationUnit compUnit = (CompilationUnit) root;
+ TypeDeclaration topTeam = (TypeDeclaration) compUnit.types().get(0);
+ TypeDeclaration role = (TypeDeclaration) topTeam.getTypes()[0];
+ MethodDeclaration method = (MethodDeclaration) role.bodyDeclarations().get(1);
+ IfStatement ifStat = (IfStatement) method.getBody().statements().get(0);
+ BaseCallMessageSend basecall = (BaseCallMessageSend) ifStat.getExpression();
+ // note: the bug was related to mistakenly converted generated fields.
+ assertEquals("Call to foo expected", "foo", basecall.getName().getIdentifier());
+ }
+
}
diff --git a/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/workspace/DOM_AST/src/regression/basecall/B.java b/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/workspace/DOM_AST/src/regression/basecall/B.java
new file mode 100644
index 0000000..02d1fe9
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/workspace/DOM_AST/src/regression/basecall/B.java
@@ -0,0 +1,4 @@
+package regression.basecall;
+public class B {
+ boolean getFlag(String i) { return false; }
+}
\ No newline at end of file
diff --git a/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/workspace/DOM_AST/src/regression/basecall/T.java b/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/workspace/DOM_AST/src/regression/basecall/T.java
new file mode 100644
index 0000000..4c1df77
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/workspace/DOM_AST/src/regression/basecall/T.java
@@ -0,0 +1,17 @@
+package regression.basecall;
+public team class T {
+ protected class R playedBy B {
+ boolean foo(String i) <- replace boolean getFlag(String i);
+ callin boolean foo(String i) {
+ if (base.foo(i)) return true;
+ int l = i.length();
+ switch (l) {
+ case 1 :
+ if (i.equals("OK"))
+ return true;
+ return false;
+ default return
+ }
+ }
+ }
+}
\ No newline at end of file