fixed two situations where generated code needs more casts
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/mappings/CallinImplementorDyn.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/mappings/CallinImplementorDyn.java
index bd1460b..45de236 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/mappings/CallinImplementorDyn.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/mappings/CallinImplementorDyn.java
@@ -29,6 +29,7 @@
import org.eclipse.jdt.internal.compiler.ast.Expression;
import org.eclipse.jdt.internal.compiler.ast.MessageSend;
import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
+import org.eclipse.jdt.internal.compiler.ast.SingleNameReference;
import org.eclipse.jdt.internal.compiler.ast.Statement;
import org.eclipse.jdt.internal.compiler.ast.SwitchStatement;
import org.eclipse.jdt.internal.compiler.ast.ThisReference;
@@ -512,8 +513,13 @@
baseSpec);
if (Lifting.isLiftToMethodCall(arg))
canLiftingFail |= checkLiftingProblem(teamDecl, callinDecl, roleType);
+ boolean isBaseReference = arg instanceof SingleNameReference
+ && CharOperation.equals(((SingleNameReference)arg).token, IOTConstants.BASE);
if (needLiftedRoleVar)
arg = new PotentialRoleReceiverExpression(arg, roleVar, gen.typeReference(roleType.getRealClass()));
+ // mapped expression may require casting: "base" reference has static type IBoundBase
+ if (isBaseReference)
+ arg = gen.castExpression(arg, gen.typeReference(roleParam), CastExpression.RAW);
}
char[] localName = (OT_LOCAL+i).toCharArray(); // RoleParamType _OT$local$n = preparedArg<n>;
TypeReference roleParamType = gen.typeReference(roleParam);
@@ -565,7 +571,9 @@
gen.typeReference(roleType.getRealClass()));
messageSendStatements = new Statement[] {
callinDecl.resultVar =
- gen.localVariable(IOTConstants.RESULT, baseReturn, result), // result = role.roleMethod(args);
+ gen.localVariable(IOTConstants.RESULT, baseReturn, // result = (Type)role.roleMethod(args);
+ gen.castExpression(result, gen.typeReference(baseReturn), CastExpression.RAW)),
+ // cast because role return might be generalized
gen.returnStatement(mappedResult) // return mappedResult(result);
};
} else {