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;
 	}
 
 	/**