Bug 443575 - [otdre] compile error from code generated for a base
predicate
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/statemachine/transformer/SwitchOnBaseTypeGenerator.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/statemachine/transformer/SwitchOnBaseTypeGenerator.java
index ea75348..80f5f7d 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/statemachine/transformer/SwitchOnBaseTypeGenerator.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/statemachine/transformer/SwitchOnBaseTypeGenerator.java
@@ -25,6 +25,7 @@
import org.eclipse.jdt.internal.compiler.ast.Expression;
import org.eclipse.jdt.internal.compiler.ast.IfStatement;
import org.eclipse.jdt.internal.compiler.ast.Statement;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions.WeavingScheme;
import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
import org.eclipse.objectteams.otdt.core.compiler.IOTConstants;
import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.WeakenedTypeBinding;
@@ -98,7 +99,7 @@
ReferenceBinding castType = null;
if (staticRoleType.baseclass() instanceof WeakenedTypeBinding)
castType = ((WeakenedTypeBinding)staticRoleType.baseclass()).getStrongType();
- else if (hasBindingAmbiguity)
+ else if (hasBindingAmbiguity || caseObjects[0].getWeavingScheme() == WeavingScheme.OTDRE)
castType = staticBaseType;
if (castType != null)
baseArg = gen.castExpression(baseArg, gen.typeReference(castType), CastExpression.RAW);
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/otjld/org/eclipse/objectteams/otdt/tests/otjld/teamactivation/Predicates.java b/testplugins/org.eclipse.objectteams.otdt.tests/otjld/org/eclipse/objectteams/otdt/tests/otjld/teamactivation/Predicates.java
index 655eeef..b5523ab 100644
--- a/testplugins/org.eclipse.objectteams.otdt.tests/otjld/org/eclipse/objectteams/otdt/tests/otjld/teamactivation/Predicates.java
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/otjld/org/eclipse/objectteams/otdt/tests/otjld/teamactivation/Predicates.java
@@ -3203,4 +3203,45 @@
customOptions,
null/*no custom requestor*/);
}
+
+ public void testBugXYZ() {
+ runConformTest(
+ new String[] {
+ "bugxyz/Main.java",
+ "package bugxyz;\n" +
+ "\n" +
+ "public class Main {\n" +
+ " public static void main(String[] args) {\n" +
+ " new T1().activate();\n" +
+ " new B1().foo();\n" +
+ " }\n" +
+ "}\n",
+ "bugxzy/B1.java",
+ "package bugxyz;\n" +
+ "\n" +
+ "public class B1 {\n" +
+ " boolean test() { return true; }\n" +
+ " void foo() { }\n" +
+ "}\n",
+ "bugxzy/B2.java",
+ "package bugxyz;\n" +
+ "\n" +
+ "public class B2 extends B1 {}\n",
+ "bugxyz/T1.java",
+ "package bugxyz;\n" +
+ "\n" +
+ "public team class T1 {\n" +
+ " protected class R1 playedBy B1 {\n" +
+ " bar <- before foo\n" +
+ " base when (base.test());\n" +
+ "\n" +
+ " private void bar() {\n" +
+ " System.out.println(\"bar\");\n" +
+ " }\n" +
+ " }\n" +
+ " protected class R2 extends R1 playedBy B2 { }\n" +
+ "}\n"
+ },
+ "bar");
+ }
}