Bug 462605 - [otdre] running OTDT on OTDRE
- fixes needed for compiling OTTypeHierarchies (2)
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java
index 1970af2..db38143 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java
@@ -78,6 +78,9 @@
public char[] token;
public MethodBinding[] syntheticAccessors; // [0]=read accessor [1]=write accessor
public TypeBinding genericCast;
+//{ObjectTeams: in generated out-of-scope code a name may have the privilige of a (t)this:
+ public boolean isThisLike;
+// SH}
public SingleNameReference(char[] source, long pos) {
super();
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 fcb4849..f0f308c 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
@@ -447,7 +447,7 @@
roleType,
false,
gen)));
- receiver = gen.singleNameReference(roleVar);
+ receiver = gen.thislikeNameReference(roleVar);
// private receiver needs to be casted to the class.
} else {
// method is from role's enclosing team
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/AstGenerator.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/AstGenerator.java
index 3f820b8..7f6b01c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/AstGenerator.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/AstGenerator.java
@@ -239,7 +239,13 @@
return result;
}
- public ResultReference resultReference(
+ public Expression thislikeNameReference(char[] name) {
+ SingleNameReference result = singleNameReference(name);
+ result.isThisLike = true;
+ return result;
+ }
+
+ public ResultReference resultReference(
SingleNameReference ref, AbstractMethodMappingDeclaration mapping)
{
return new ResultReference(ref, mapping);
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 9ec21d8..cd7fdba 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
@@ -216,6 +216,7 @@
};
}
if ( !(variableBinding instanceof TThisBinding)
+ && !isThisLike(anchorExpr)
&& !refBinding.isPublic()
&& !decapsulationAllowed)
{
@@ -237,6 +238,12 @@
return originalType;
}
+ private static boolean isThisLike(Expression expression) {
+ if (expression instanceof SingleNameReference)
+ return ((SingleNameReference) expression).isThisLike;
+ return false;
+ }
+
static ITeamAnchor retrieveAnchor(ReferenceBinding refBinding) {
if (refBinding instanceof DependentTypeBinding)
return ((DependentTypeBinding)refBinding)._teamAnchor;
@@ -360,11 +367,12 @@
static boolean avoidWrapRoleType(BlockScope scope, Expression receiver) {
if (scope.compilerOptions().weavingScheme == WeavingScheme.OTRE) {
- if (CallinImplementor.avoidWrapRoleType(scope, receiver))
- // don't use synthetic _OT$role as additional anchor
- return true;
+ // don't use synthetic _OT$role as additional anchor
+ return CallinImplementor.avoidWrapRoleType(scope, receiver);
+ } else {
+ // same here, just different way to detect:
+ return isThisLike(receiver);
}
- return false;
}
/**