Fix for remaining issue of Bug 329374 - Implicit Lowering of a Role Array as return results in compiler error
Test has been adjusted to trigger the compile order problem.
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lifting/ArrayLowering.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lifting/ArrayLowering.java
index 2cdf798..09edc8a 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lifting/ArrayLowering.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lifting/ArrayLowering.java
@@ -35,7 +35,7 @@
*/
public class ArrayLowering extends ArrayTranslations {
- ArrayLowering(Expression teamExpression) {
+ public ArrayLowering(Expression teamExpression) {
this._teamExpr = teamExpression;
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/RoleTypeCreator.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/RoleTypeCreator.java
index 9f1be43..bd11311 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/RoleTypeCreator.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/RoleTypeCreator.java
@@ -39,6 +39,7 @@
import org.eclipse.objectteams.otdt.internal.core.compiler.control.ITranslationStates;
import org.eclipse.objectteams.otdt.internal.core.compiler.lifting.DeclaredLifting;
import org.eclipse.objectteams.otdt.internal.core.compiler.lifting.Lifting;
+import org.eclipse.objectteams.otdt.internal.core.compiler.lifting.ArrayLowering;
import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.DependentTypeBinding;
import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.ITeamAnchor;
import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.ProblemAnchorBinding;
@@ -52,8 +53,6 @@
import org.eclipse.objectteams.otdt.internal.core.compiler.statemachine.copyinheritance.CopyInheritance;
/**
- * MIGRATION_STATE: Eclipse 3.2
- *
* This class is a non-instantiate-utility for creating RoleTypeBindings.
*
* @author stephan
@@ -727,6 +726,7 @@
method.returnType = roleArrayType;
} else {
method.returnType = maybeWrapSignatureType(method.returnType, decl.scope, typedExpr, defaultAnchor);
+ checkArrayLoweringForReturn(method, decl.scope);
}
TypeBinding[] parameters = method.parameters;
@@ -742,6 +742,21 @@
}
doingSignatures = false;
}
+ private static void checkArrayLoweringForReturn(MethodBinding method, BlockScope scope) {
+ int dimensions = method.returnType.dimensions();
+ if (dimensions == 0)
+ return; // not an array
+ if ((method.declaringClass.isRole() && !method.isPublic()) || method.isPrivate())
+ return; // not visible
+ TypeBinding leafReturn = method.returnType.leafComponentType();
+ if (!leafReturn.isRole())
+ return; // not a role type
+ TypeBinding baseType = ((ReferenceBinding) leafReturn).baseclass();
+ if (baseType == null)
+ return; // not bound
+ baseType = scope.createArrayType(baseType, dimensions);
+ new ArrayLowering(null).ensureTransformMethod(scope, null, method.returnType, baseType, false);
+ }
/* Wraps either relative to defaultAnchor or unqualified. */
private static TypeBinding maybeWrapSignatureType(TypeBinding type, MethodScope scope, ASTNode typedNode, ITeamAnchor defaultAnchor) {