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];