Bug 562120 - DOM cannot handle super(base(x)) calls
- make BaseConstructorInvocation an Expression
- avoid NPE in DefaultBindingResolver if lift-arg has not been resolved
- avoid AbortCompilation when compiling OT/J code due to null annotation
diff --git a/org.eclipse.jdt.core/.settings/.api_filters b/org.eclipse.jdt.core/.settings/.api_filters
index b025e66..d42e238 100644
--- a/org.eclipse.jdt.core/.settings/.api_filters
+++ b/org.eclipse.jdt.core/.settings/.api_filters
@@ -257,6 +257,13 @@
</message_arguments>
</filter>
</resource>
+ <resource path="dom/org/eclipse/jdt/core/dom/BaseConstructorInvocation.java" type="org.eclipse.jdt.core.dom.BaseConstructorInvocation">
+ <filter comment="subclassing statement was wrong" id="338849923">
+ <message_arguments>
+ <message_argument value="org.eclipse.jdt.core.dom.BaseConstructorInvocation"/>
+ </message_arguments>
+ </filter>
+ </resource>
<resource path="dom/org/eclipse/jdt/core/dom/InstanceofExpression.java" type="org.eclipse.jdt.core.dom.InstanceofExpression">
<filter comment="For Java 14" id="336658481">
<message_arguments>
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
index 097f2b0..3050763 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
@@ -82,6 +82,7 @@
import org.eclipse.jdt.internal.core.util.Util;
import org.eclipse.objectteams.otdt.core.compiler.IOTConstants;
import org.eclipse.objectteams.otdt.core.exceptions.InternalCompilerError;
+import org.eclipse.objectteams.otdt.internal.core.compiler.ast.BaseAllocationExpression;
import org.eclipse.objectteams.otdt.internal.core.compiler.ast.BaseReference;
import org.eclipse.objectteams.otdt.internal.core.compiler.ast.CalloutMappingDeclaration;
import org.eclipse.objectteams.otdt.internal.core.compiler.ast.FieldAccessSpec;
@@ -2091,6 +2092,10 @@
return convert((org.eclipse.jdt.internal.compiler.ast.CompoundAssignment) expression);
}
if (expression instanceof org.eclipse.jdt.internal.compiler.ast.Assignment) {
+//{ObjectTeams:
+ if (expression instanceof BaseAllocationExpression)
+ return convert((BaseAllocationExpression) expression);
+// SH}
return convert((org.eclipse.jdt.internal.compiler.ast.Assignment) expression);
}
if (expression instanceof org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess) {
@@ -3175,7 +3180,8 @@
//gbr}
//{ObjectTeams: handle BaseConstructorMessageSend. Note: might be unresolvable, i.e. incomplete rhs!
if (statement instanceof org.eclipse.objectteams.otdt.internal.core.compiler.ast.BaseAllocationExpression) {
- return convert((org.eclipse.objectteams.otdt.internal.core.compiler.ast.BaseAllocationExpression) statement);
+ BaseConstructorInvocation invocation = convert((org.eclipse.objectteams.otdt.internal.core.compiler.ast.BaseAllocationExpression) statement);
+ return this.ast.newExpressionStatement(invocation);
}
//carp}
if (statement instanceof org.eclipse.jdt.internal.compiler.ast.Block) {
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BaseConstructorInvocation.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BaseConstructorInvocation.java
index 238fe3b..b9f8927 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BaseConstructorInvocation.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BaseConstructorInvocation.java
@@ -1,7 +1,7 @@
/**********************************************************************
* This file is part of "Object Teams Development Tooling"-Software
*
- * Copyright 2004, 2006 Fraunhofer Gesellschaft, Munich, Germany,
+ * Copyright 2004, 2020 Fraunhofer Gesellschaft, Munich, Germany,
* for its Fraunhofer Institute for Computer Architecture and Software
* Technology (FIRST), Berlin, Germany and Technical University Berlin,
* Germany.
@@ -47,7 +47,7 @@
* @author mkr
* @version $Id: BaseConstructorInvocation.java 23416 2010-02-03 19:59:31Z stephan $
*/
-public class BaseConstructorInvocation extends Statement implements Invocation
+public class BaseConstructorInvocation extends Expression implements Invocation
{
/**
* The "arguments" structural property of this node type.
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java
index 76e7957..65c1a12 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java
@@ -2108,10 +2108,12 @@
SingleVariableDeclaration fakedVariable = realVariable.newFakedRoleVariable((LiftingType) realVariable.getType());
if (fakedVariable != null) { // else a faked variable has already been registered
IVariableBinding fakedBinding = getVariableBinding(fakedArgument.binding, variable);
- this.bindingsToAstNodes.put(fakedBinding, fakedVariable);
- key = fakedBinding.getKey();
- if (key != null)
- this.bindingTables.bindingKeysToBindings.put(key, fakedBinding);
+ if (fakedBinding != null) { // null happens, e.g., if resolving was skipped due to AbortCompilation
+ this.bindingsToAstNodes.put(fakedBinding, fakedVariable);
+ key = fakedBinding.getKey();
+ if (key != null)
+ this.bindingTables.bindingKeysToBindings.put(key, fakedBinding);
+ }
// for repeated lookup of fakedVariable (using this same method) we also need the AST mapping:
this.newAstToOldAst.put(fakedVariable, fakedArgument);
}
diff --git a/plugins/org.eclipse.objectteams.runtime/META-INF/MANIFEST.MF b/plugins/org.eclipse.objectteams.runtime/META-INF/MANIFEST.MF
index 6830fca..2c93083 100644
--- a/plugins/org.eclipse.objectteams.runtime/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.objectteams.runtime/META-INF/MANIFEST.MF
@@ -6,7 +6,7 @@
Bundle-Version: 2.8.0.qualifier
Bundle-Vendor: %providerName
Bundle-Localization: plugin
-Require-Bundle: org.eclipse.jdt.annotation;bundle-version="[2.2.0,3.0.0)";resolution:=optional
+Require-Bundle: org.eclipse.jdt.annotation;bundle-version="[2.2.0,3.0.0)";resolution:=optional;visibility:=reexport
Export-Package: org.eclipse.objectteams.otredyn.runtime;version="2.8.0",
org.eclipse.objectteams.runtime;version="2.8.0",
org.objectteams;version="2.8.0"
diff --git a/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/src/org/eclipse/objectteams/otdt/ui/tests/dom/converter/BaseConstructorInvocationTest.java b/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/src/org/eclipse/objectteams/otdt/ui/tests/dom/converter/BaseConstructorInvocationTest.java
index 2e91cb4..bbe3382 100644
--- a/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/src/org/eclipse/objectteams/otdt/ui/tests/dom/converter/BaseConstructorInvocationTest.java
+++ b/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/src/org/eclipse/objectteams/otdt/ui/tests/dom/converter/BaseConstructorInvocationTest.java
@@ -36,11 +36,11 @@
import org.eclipse.jdt.core.dom.BaseConstructorInvocation;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.Expression;
+import org.eclipse.jdt.core.dom.ExpressionStatement;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.RoleTypeDeclaration;
-import org.eclipse.jdt.core.dom.Statement;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.objectteams.otdt.ui.tests.dom.FileBasedDOMTest;
@@ -52,7 +52,7 @@
public class BaseConstructorInvocationTest extends FileBasedDOMTest
{
public static final String TEST_PROJECT = "DOM_AST";
- private static final int JAVA_LANGUAGE_SPEC_LEVEL = AST.JLS4;
+ private static final int JAVA_LANGUAGE_SPEC_LEVEL = AST.JLS14;
private TypeDeclaration _typeDecl;
private TypeDeclaration _role;
@@ -97,11 +97,16 @@
super.setUp();
}
+ private BaseConstructorInvocation getBaseConstructorInvocation(MethodDeclaration constructor) {
+ Object statement = constructor.getBody().statements().get(0);
+ return (BaseConstructorInvocation) ((ExpressionStatement) statement).getExpression();
+ }
+
public void testInstanceType1()
{
MethodDeclaration constructor = _role.getMethods()[0];
- Statement testObj = (Statement)constructor.getBody().statements().get(0);
+ BaseConstructorInvocation testObj = getBaseConstructorInvocation(constructor);
assertTrue("Template for tests, always true",
testObj instanceof BaseConstructorInvocation);
@@ -111,7 +116,7 @@
{
MethodDeclaration constructor = _role.getMethods()[0];
- _testObj = (BaseConstructorInvocation)constructor.getBody().statements().get(0);
+ _testObj = getBaseConstructorInvocation(constructor);
int actual = _testObj.getNodeType();
@@ -123,9 +128,9 @@
public void testGetArguments_NoArgs()
{
MethodDeclaration constructor = _role.getMethods()[0];
- _testObj = (BaseConstructorInvocation)constructor.getBody().statements().get(0);
+ _testObj = getBaseConstructorInvocation(constructor);
- List actual = _testObj.getArguments();
+ List<?> actual = _testObj.getArguments();
assertEquals("BaseConstructorMessageSend has wrong number of arguments",
0,
@@ -136,9 +141,9 @@
{
RoleTypeDeclaration role = _typeDecl.getRoles()[0];
MethodDeclaration constructor = role.getMethods()[1];
- _testObj = (BaseConstructorInvocation)constructor.getBody().statements().get(0);
+ _testObj = getBaseConstructorInvocation(constructor);
- List actual = _testObj.getArguments();
+ List<?> actual = _testObj.getArguments();
assertEquals("BaseConstructorMessageSend has wrong number of arguments",
2,
@@ -149,13 +154,13 @@
public void testChildNodesHaveCorrectParent1()
{
MethodDeclaration constructor = _role.getMethods()[1];
- _testObj = (BaseConstructorInvocation) constructor.getBody().statements().get(0);
+ _testObj = getBaseConstructorInvocation(constructor);
- List childNodes = _testObj.getArguments();
+ List<Expression> childNodes = _testObj.getArguments();
- for (Iterator iter = childNodes.iterator(); iter.hasNext();)
+ for (Iterator<Expression> iter = childNodes.iterator(); iter.hasNext();)
{
- Expression curChild = (Expression) iter.next();
+ Expression curChild = iter.next();
assertEquals("Base call arguments have wrong parent node",
_testObj,
curChild.getParent());
@@ -165,7 +170,7 @@
public void testSubtreeMatch1()
{
MethodDeclaration constructor = _role.getMethods()[1];
- _testObj = (BaseConstructorInvocation)constructor.getBody().statements().get(0);
+ _testObj = getBaseConstructorInvocation(constructor);
boolean actual = _testObj.subtreeMatch(new ASTMatcher(), _testObj);
@@ -176,7 +181,7 @@
public void testtoString1()
{
MethodDeclaration constructor = _role.getMethods()[1];
- _testObj = (BaseConstructorInvocation)constructor.getBody().statements().get(0);
+ _testObj = getBaseConstructorInvocation(constructor);
String actual = _testObj.toString();
String expected = "base(dummy0, dummy1);";
@@ -206,7 +211,7 @@
TypeDeclaration role2Decl = team2Decl.getTypes()[0];
MethodDeclaration constructor = role2Decl.getMethods()[1];
- _testObj = (BaseConstructorInvocation)constructor.getBody().statements().get(0);
+ _testObj = getBaseConstructorInvocation(constructor);
String actual = _testObj.toString();
String expected = "base(dummy0, dummy1);";
@@ -220,7 +225,7 @@
RoleTypeDeclaration role = _typeDecl.getRoles()[0];
MethodDeclaration constructor = role.getMethods()[1];
- _testObj = (BaseConstructorInvocation)constructor.getBody().statements().get(0);
+ _testObj = getBaseConstructorInvocation(constructor);
ITypeBinding baseClass = role.resolveBinding().getBaseClass();
IMethodBinding baseConstructorBinding = baseClass.getDeclaredMethods()[1];