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) {