Fix CallinMarkerTest.testMarkers_4() as a witness for bug 303474:
- RoleType.getBaseClass() now supports explicit resolving relative to a value parameter, too
diff --git a/org.eclipse.jdt.core/model/org/eclipse/objectteams/otdt/internal/core/RoleType.java b/org.eclipse.jdt.core/model/org/eclipse/objectteams/otdt/internal/core/RoleType.java
index eff117f..1b60009 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/objectteams/otdt/internal/core/RoleType.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/objectteams/otdt/internal/core/RoleType.java
@@ -33,11 +33,13 @@
 import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IJavaModelStatus;
 import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeParameter;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.Signature;
 import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
 import org.eclipse.jdt.internal.core.JavaModelStatus;
+import org.eclipse.jdt.internal.core.TypeParameter;
 import org.eclipse.jdt.internal.core.util.Util;
 import org.eclipse.objectteams.otdt.core.IMethodMapping;
 import org.eclipse.objectteams.otdt.core.IOTJavaElement;
@@ -320,11 +322,22 @@
         else
         {
 	        IField field = currentType.getField(anchorField);
-	        if (!field.exists())
-	            return null;
-            
-	        String fieldType = Signature.toString(field.getTypeSignature());
-	        anchorType = resolveInType(enclosingTeam, fieldType);
+	        String fieldType = null;
+	        if (field.exists()) {
+	        	fieldType = Signature.toString(field.getTypeSignature());
+	        } else {
+	        	// try value parameter instead:
+	        	for (ITypeParameter param : currentType.getTypeParameters()) {
+	        		if (((TypeParameter)param).isValueParameter) {
+	        			if (param.getElementName().equals(anchorField)) {
+	        				fieldType = param.getBounds()[0]; // FIXME(SH): one value param only
+	        				break;
+	        			}
+	        		}
+	        	}
+	        }
+	        if (fieldType != null)
+	        	anchorType = resolveInType(enclosingTeam, fieldType);
         }
         
         if (anchorType == null || !anchorType.exists())
diff --git a/testplugins/org.eclipse.objectteams.otdt.ui.tests/src/org/eclipse/objectteams/otdt/ui/tests/callinmarker/CallinMarkerTests.java b/testplugins/org.eclipse.objectteams.otdt.ui.tests/src/org/eclipse/objectteams/otdt/ui/tests/callinmarker/CallinMarkerTests.java
index 8fa1972..4aa6658 100644
--- a/testplugins/org.eclipse.objectteams.otdt.ui.tests/src/org/eclipse/objectteams/otdt/ui/tests/callinmarker/CallinMarkerTests.java
+++ b/testplugins/org.eclipse.objectteams.otdt.ui.tests/src/org/eclipse/objectteams/otdt/ui/tests/callinmarker/CallinMarkerTests.java
@@ -334,7 +334,7 @@
         synchronousCreateMarkers(_baseResource);
 
         Set<String> expectedMarkers = new HashSet<String>();
-        expectedMarkers.add("=CallinMarker/src<cycle{B.java[B$R[A$Q~run");
+        expectedMarkers.add("=CallinMarker/src<cycle2{B.java[B[R~run");
         
         IMarker[] markers = getCallinMarkers(_baseResource);
         assertMarkers(expectedMarkers, markers);
diff --git a/testplugins/org.eclipse.objectteams.otdt.ui.tests/workspace/CallinMarker/src/cycle2/A.java b/testplugins/org.eclipse.objectteams.otdt.ui.tests/workspace/CallinMarker/src/cycle2/A.java
index 8066b26..95e6a24 100644
--- a/testplugins/org.eclipse.objectteams.otdt.ui.tests/workspace/CallinMarker/src/cycle2/A.java
+++ b/testplugins/org.eclipse.objectteams.otdt.ui.tests/workspace/CallinMarker/src/cycle2/A.java
@@ -1,4 +1,4 @@
-package compileorder;
+package cycle2;
 public team class A<B b> {
         public void run() {
                 System.out.println("A.run()");
diff --git a/testplugins/org.eclipse.objectteams.otdt.ui.tests/workspace/CallinMarker/src/cycle2/B.java b/testplugins/org.eclipse.objectteams.otdt.ui.tests/workspace/CallinMarker/src/cycle2/B.java
index fda6441..ddbfc2e 100644
--- a/testplugins/org.eclipse.objectteams.otdt.ui.tests/workspace/CallinMarker/src/cycle2/B.java
+++ b/testplugins/org.eclipse.objectteams.otdt.ui.tests/workspace/CallinMarker/src/cycle2/B.java
@@ -1,4 +1,4 @@
-package compileorder;
+package cycle2;
 public team class B {
         public class R playedBy A {
                 void run() <- replace void run();
diff --git a/testplugins/org.eclipse.objectteams.otdt.ui.tests/workspace/CallinMarker/src/cycle2/TheTest.java b/testplugins/org.eclipse.objectteams.otdt.ui.tests/workspace/CallinMarker/src/cycle2/TheTest.java
index 2ded140..fe67108 100644
--- a/testplugins/org.eclipse.objectteams.otdt.ui.tests/workspace/CallinMarker/src/cycle2/TheTest.java
+++ b/testplugins/org.eclipse.objectteams.otdt.ui.tests/workspace/CallinMarker/src/cycle2/TheTest.java
@@ -1,4 +1,4 @@
-package compileorder;
+package cycle2;
 public class TheTest {
         final B b = new B();
         final A a = new A<@b>();