Bug 394035 - [assist] completion fails to propose role creation
- test & fix
- also cleared up confusion fjProject1 vs.
CompletionTestSetup.getProject() which broke testPlayedBy2()
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
index 190cbdc..57e8a0e 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java
@@ -5003,7 +5003,12 @@
 		if (missingElements != null) {
 			relevance += computeRelevanceForMissingElements(missingElementsHaveProblems);
 		}
-		
+//{ObjectTeams: other parts of completion prefer role interfaces, but here we need to go back to the role class:
+		if (currentType.isSynthInterface()) {
+			currentType = currentType.roleModel.getClassPartBinding();
+			if (currentType == null) return;
+		}
+// SH}
 		findAnonymousType(
 				currentType,
 				argTypes,
@@ -5764,7 +5769,12 @@
 			InvocationSite invocationSite,
 			boolean isQualified,
 			int relevance) {
-		
+//{ObjectTeams: other parts of completion prefer role interfaces, but here we need to go back to the role class:
+		if (currentType.isSynthInterface()) {
+			currentType = currentType.roleModel.getClassPartBinding();
+			if (currentType == null) return;
+		}
+// SH}
 		if (!isIgnored(CompletionProposal.CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF)
 				&& currentType.isClass()
 				&& !currentType.isAbstract()) {
diff --git a/testplugins/org.eclipse.objectteams.otdt.ui.tests/src/org/eclipse/objectteams/otdt/ui/tests/core/CodeCompletionTest.java b/testplugins/org.eclipse.objectteams.otdt.ui.tests/src/org/eclipse/objectteams/otdt/ui/tests/core/CodeCompletionTest.java
index eda00f9..7be4b5c 100644
--- a/testplugins/org.eclipse.objectteams.otdt.ui.tests/src/org/eclipse/objectteams/otdt/ui/tests/core/CodeCompletionTest.java
+++ b/testplugins/org.eclipse.objectteams.otdt.ui.tests/src/org/eclipse/objectteams/otdt/ui/tests/core/CodeCompletionTest.java
@@ -27,6 +27,8 @@
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.jdt.core.IJavaProject;
@@ -332,7 +334,7 @@
 	}
 	
 	public void testCreateCalloutOverride1() throws Exception {
-		IPackageFragment pkg = CompletionTestSetup.getTestPackage("p1");
+		IPackageFragment pkg = CompletionTestSetup.getTestPackage(this.fJProject1, "p1");
 		pkg.createCompilationUnit("SuperTeam.java", 
 				"package test1.p1;\n" +
 				"public team class SuperTeam {\n" +
@@ -385,7 +387,7 @@
 	
 	// callout override to field
 	public void testCreateCalloutOverride2() throws Exception {
-		IPackageFragment pkg = CompletionTestSetup.getTestPackage("p1");
+		IPackageFragment pkg = CompletionTestSetup.getTestPackage(this.fJProject1, "p1");
 		pkg.createCompilationUnit("SuperTeam.java", 
 				"package test1.p1;\n" +
 				"public team class SuperTeam {\n" +
@@ -438,7 +440,7 @@
 	
 	// Bug 374840 - [assist] callout completion after parameter mapping garbles the code
 	public void testCreateCalloutOverride3() throws Exception {
-		IPackageFragment pkg = CompletionTestSetup.getTestPackage("p1");
+		IPackageFragment pkg = CompletionTestSetup.getTestPackage(this.fJProject1, "p1");
 		
 		pkg.createCompilationUnit("ABase.java", 
 				"package test1.p1;\n" +
@@ -585,7 +587,7 @@
 		buf.append("    public void foo(B1 b1, B1.Inner inner, B2 b2);\n");
 		buf.append("}\n");
 		String contents= buf.toString();
-		IPackageFragment basePkg = CompletionTestSetup.getAbsoluteTestPackage("test1");
+		IPackageFragment basePkg = CompletionTestSetup.getAbsoluteTestPackage(this.fJProject1, "test1");
 		basePkg.createCompilationUnit("B.java", contents, true, null);
 		
 		fAfterImports = "\n" +
@@ -1156,7 +1158,7 @@
 	}
 
 	public void testRoleTag1() throws Exception {
-		IPackageFragment teamPkg = CompletionTestSetup.getTestPackage("MyTeam");
+		IPackageFragment teamPkg = CompletionTestSetup.getTestPackage(this.fJProject1, "MyTeam");
 		teamPkg.createCompilationUnit("MyRole.java", 
 				"team package test1.MyTeam;\n" +
 				"public class MyRole {}\n", 
@@ -1184,7 +1186,7 @@
 	}
 	
 	public void testRoleTag2() throws Exception {
-		IPackageFragment teamPkg = CompletionTestSetup.getTestPackage("MyTeam");
+		IPackageFragment teamPkg = CompletionTestSetup.getTestPackage(this.fJProject1, "MyTeam");
 		teamPkg.createCompilationUnit("MyRole.java", 
 				"team package test1.MyTeam;\n" +
 				"public class MyRole {}\n", 
@@ -1213,7 +1215,7 @@
 	
 	
 	public void testCreateMethod1() throws Exception {
-		IPackageFragment pkg = CompletionTestSetup.getTestPackage("p1");
+		IPackageFragment pkg = CompletionTestSetup.getTestPackage(this.fJProject1, "p1");
 		pkg.createCompilationUnit("SuperTeam.java", 
 				"package test1.p1;\n" +
 				"public team class SuperTeam {\n" +
@@ -1257,7 +1259,7 @@
 
 	// Bug 362003 - [assist] completion is broken after <B base R> after a base guard
 	public void testCreateMethod2() throws Exception {
-		IPackageFragment pkg = CompletionTestSetup.getTestPackage("p1");
+		IPackageFragment pkg = CompletionTestSetup.getTestPackage(this.fJProject1, "p1");
 		pkg.createCompilationUnit("BaseClass.java", 
 				"package test1.p1;\n" +
 				"public class BaseClass {\n" +
@@ -1326,7 +1328,7 @@
 
 	// override role, simple case
 	public void testOverrideRole1() throws Exception {
-		IPackageFragment pkg = CompletionTestSetup.getTestPackage("p1");
+		IPackageFragment pkg = CompletionTestSetup.getTestPackage(this.fJProject1, "p1");
 		pkg.createCompilationUnit("SuperTeam.java", 
 				"package test1.p1;\n" +
 				"public team class SuperTeam {\n" +
@@ -1360,14 +1362,14 @@
 	
 	// override role, role file with mentioning in the team
 	public void testOverrideRole2() throws Exception {
-		IPackageFragment pkg = CompletionTestSetup.getTestPackage("p1");
+		IPackageFragment pkg = CompletionTestSetup.getTestPackage(this.fJProject1, "p1");
 		pkg.createCompilationUnit("SuperTeam.java", 
 				"package test1.p1;\n" +
 				"public team class SuperTeam {\n" +
 				"	RoleFile field\n;" + // help the compiler to find the role file
 				"}\n",
 				true, null);
-		IPackageFragment rolePack = CompletionTestSetup.getTestPackage("p1.SuperTeam");
+		IPackageFragment rolePack = CompletionTestSetup.getTestPackage(this.fJProject1, "p1.SuperTeam");
 		rolePack.createCompilationUnit("RoleFile.java", 
 				"team package test1.p1.SuperTeam;\n" +
 				"protected class RoleFile { }\n", 
@@ -1398,13 +1400,13 @@
 	
 	// override role, role file, without mentioning in the team (requires search engine help)
 	public void testOverrideRole3() throws Exception {
-		IPackageFragment pkg = CompletionTestSetup.getTestPackage("p1");
+		IPackageFragment pkg = CompletionTestSetup.getTestPackage(this.fJProject1, "p1");
 		pkg.createCompilationUnit("SuperTeam.java", 
 				"package test1.p1;\n" +
 				"public team class SuperTeam {\n" + // no mentioning of RoleFile
 				"}\n",
 				true, null);
-		IPackageFragment rolePack = CompletionTestSetup.getTestPackage("p1.SuperTeam");
+		IPackageFragment rolePack = CompletionTestSetup.getTestPackage(this.fJProject1, "p1.SuperTeam");
 		ICompilationUnit rofiCU = rolePack.createCompilationUnit("RoleFile.java", 
 				"team package test1.p1.SuperTeam;\n" +
 				"protected class RoleFile { }\n", 
@@ -1435,7 +1437,7 @@
 
 	// Bug 355255 - [assist] NPE during completion if team contains an enum
 	public void testOverrideRole4() throws Exception {
-		IPackageFragment pkg = CompletionTestSetup.getTestPackage("p1");
+		IPackageFragment pkg = CompletionTestSetup.getTestPackage(this.fJProject1, "p1");
 		pkg.createCompilationUnit("SuperTeam.java", 
 				"package test1.p1;\n" +
 				"public team class SuperTeam {\n" +
@@ -1469,6 +1471,7 @@
 		assertProposal("MyRole - Override", null, null, subTeamContent, new Region(pos, 0), expectedContent, new Region(posAfter, 0), 0); 
 	}
 
+	// propose creating a team instance:
 	public void testNewExpression1() throws CoreException {
 		createBaseClass("test2", "AClass", "public boolean check() { return false; }");
 		assertTypeBodyProposal(
@@ -1487,9 +1490,46 @@
 
 	}
 
+	// propose creating a role instance (bound role):
+	public void testNewExpression2() throws CoreException {
+		createBaseClass("test1", "AClass", "public boolean check() { return false; }");
+		assertTypeBodyProposal(
+				"protected class ARole playedBy AClass {\n" +
+				"}\n" +
+				"static void foo() {\n" +
+				"    new |\n" +
+				"}\n",
+				"A",
+				"protected class ARole playedBy AClass {\n" +
+				"}\n" +
+				"static void foo() {\n" +
+				"    new ARole(|base|)\n" + // editing base argument
+				"}\n",
+				0, false);
+
+	}
+
+	// propose creating a role instance (unbound role):
+	public void testNewExpression3() throws CoreException {
+		assertTypeBodyProposal(
+				"protected class ARole {\n" +
+				"}\n" +
+				"static void foo() {\n" +
+				"    new |\n" +
+				"}\n",
+				"A",
+				"protected class ARole {\n" +
+				"}\n" +
+				"static void foo() {\n" +
+				"    new ARole()|\n" + // no arguments to add
+				"}\n",
+				0, false);
+
+	}
+
 	// propose methods invoked via a phantom role, simple case
 	public void testMethodInvocation1() throws CoreException {
-		IPackageFragment pkg = CompletionTestSetup.getTestPackage("p1");
+		IPackageFragment pkg = CompletionTestSetup.getTestPackage(this.fJProject1, "p1");
 		pkg.createCompilationUnit("SuperTeam.java", 
 				"package test1.p1;\n" +
 				"public team class SuperTeam {\n" +
@@ -1530,7 +1570,7 @@
 
 	// propose methods invoked via a phantom role, two direct tsuper roles both have the method, pick the nearest version
 	public void testMethodInvocation2() throws CoreException {
-		IPackageFragment pkg = CompletionTestSetup.getTestPackage("p1");
+		IPackageFragment pkg = CompletionTestSetup.getTestPackage(this.fJProject1, "p1");
 		pkg.createCompilationUnit("SuperTeam.java", 
 				"package test1.p1;\n" +
 				"public team class SuperTeam {\n" +
@@ -1583,7 +1623,7 @@
 		expectedContent.append("  }\n");
 		expectedContent.append("}");
 		
-		String superMid1R = "%E2%98%82=TestSetupProject/src%3Ctest1.p1%7BSuperTeam.java%E2%98%83SuperTeam%E2%98%83Mid1%E2%98%83R";
+		String superMid1R = "%E2%98%82=OTTestProject1/src%3Ctest1.p1%7BSuperTeam.java%E2%98%83SuperTeam%E2%98%83Mid1%E2%98%83R";
 		String expectedInfo = ">foo in SuperMid2 " +
 							  "<div><b>Overrides:</b> " +
 							  "<a href='eclipse-javadoc:"+superMid1R+"~foo'>foo()</a> " +
@@ -1599,7 +1639,7 @@
 
 	// propose methods invoked via a phantom role, two direct tsuper roles, only more distant one has the method
 	public void testMethodInvocation3() throws CoreException {
-		IPackageFragment pkg = CompletionTestSetup.getTestPackage("p1");
+		IPackageFragment pkg = CompletionTestSetup.getTestPackage(this.fJProject1, "p1");
 		pkg.createCompilationUnit("SuperTeam.java", 
 				"package test1.p1;\n" +
 				"public team class SuperTeam {\n" +
@@ -1650,7 +1690,7 @@
 		expectedContent.append("  }\n");
 		expectedContent.append("}");
 		
-		String superMid1R = "%E2%98%82=TestSetupProject/src%3Ctest1.p1%7BSuperTeam.java%E2%98%83SuperTeam%E2%98%83Mid1%E2%98%83R";
+		String superMid1R = "%E2%98%82=OTTestProject1/src%3Ctest1.p1%7BSuperTeam.java%E2%98%83SuperTeam%E2%98%83Mid1%E2%98%83R";
 		String expectedInfo = ">foo in SubMid1 " +
 							  "<div><b>Overrides:</b> " +
 							  "<a href='eclipse-javadoc:"+superMid1R+"~foo'>foo()</a> " +
@@ -1772,7 +1812,7 @@
 		buf.append("}\n");
 		String contents= buf.toString();
 
-		IPackageFragment basePkg = CompletionTestSetup.getAbsoluteTestPackage(basePackage);
+		IPackageFragment basePkg = CompletionTestSetup.getAbsoluteTestPackage(this.fJProject1, basePackage);
 		basePkg.createCompilationUnit(className+".java", contents, true, null);
 	}
 
@@ -1821,7 +1861,7 @@
 	protected ICompletionProposal assertROFIBodyProposal(String before, String selector, String expected, int requiredRelevance) 
 			throws CoreException 
 	{
-		IPackageFragment testPkg = CompletionTestSetup.getTestPackage(null);
+		IPackageFragment testPkg = CompletionTestSetup.getTestPackage(this.fJProject1, null);
 		String teamName = "Completion_" + getName();
 		testPkg.createCompilationUnit(teamName + ".java", 
 				"package test1;\n" +
@@ -1915,7 +1955,7 @@
 
 	private ICompletionProposal assertProposal(String selector, String relativePackage, String typeName, StringBuffer contents, IRegion preSelection, StringBuffer result, IRegion expectedSelection, int requiredRelevance) throws CoreException {
 //{ObjectTeams: made package and file name configurable via new arguments `relativePackage'/`typeName':
-		IPackageFragment pkg = (relativePackage == null) ? CompletionTestSetup.getAnonymousTestPackage() : CompletionTestSetup.getTestPackage(relativePackage);
+		IPackageFragment pkg = (relativePackage == null) ? CompletionTestSetup.getAnonymousTestPackage(this.fJProject1) : CompletionTestSetup.getTestPackage(this.fJProject1, relativePackage);
 		fCU= (typeName == null) ? createCU(pkg, contents.toString()) : pkg.createCompilationUnit(typeName + ".java", contents.toString(), false, null); 
 // SH}
 		fEditor= (JavaEditor) EditorUtility.openInEditor(fCU);
@@ -1944,7 +1984,7 @@
 	private void assertNosuchProposal(String selector, StringBuffer contents, IRegion preSelection, int requiredRelevance) 
 			throws CoreException 
 	{
-		fCU= createCU(CompletionTestSetup.getAnonymousTestPackage(), contents.toString());
+		fCU= createCU(CompletionTestSetup.getAnonymousTestPackage(this.fJProject1), contents.toString());
 		fEditor= (JavaEditor) EditorUtility.openInEditor(fCU);
 		try {
 			ICompletionProposal proposal= findNamedProposal(selector, fCU, preSelection, requiredRelevance);
diff --git a/testplugins/org.eclipse.objectteams.otdt.ui.tests/src/org/eclipse/objectteams/otdt/ui/tests/core/CompletionTestSetup.java b/testplugins/org.eclipse.objectteams.otdt.ui.tests/src/org/eclipse/objectteams/otdt/ui/tests/core/CompletionTestSetup.java
index 76bb759..10c3fb4 100644
--- a/testplugins/org.eclipse.objectteams.otdt.ui.tests/src/org/eclipse/objectteams/otdt/ui/tests/core/CompletionTestSetup.java
+++ b/testplugins/org.eclipse.objectteams.otdt.ui.tests/src/org/eclipse/objectteams/otdt/ui/tests/core/CompletionTestSetup.java
@@ -36,15 +36,14 @@
  */
 class CompletionTestSetup extends ProjectTestSetup {
 
-	// SH: added parameter
-	public static IPackageFragment getTestPackage(String relativeName) throws CoreException {
+	// SH: added parameters
+	public static IPackageFragment getTestPackage(IJavaProject project, String relativeName) throws CoreException {
 		String packageName = "test1";
 		if (relativeName != null)
 			packageName += '.'+relativeName;
-		return getAbsoluteTestPackage(packageName);
+		return getAbsoluteTestPackage(project, packageName);
 	}
-	public static IPackageFragment getAbsoluteTestPackage(String packageName) throws CoreException {
-		IJavaProject project= getProject();
+	public static IPackageFragment getAbsoluteTestPackage(IJavaProject project, String packageName) throws CoreException {
 		IPackageFragmentRoot root= project.getPackageFragmentRoot("src");
 		if (!root.exists())
 			root= JavaProjectHelper.addSourceContainer(project, "src");
@@ -57,8 +56,7 @@
 	}
 	
 	private static int fAnonymousSoureFolderCounter= 0;
-	public static IPackageFragment getAnonymousTestPackage() throws CoreException {
-		IJavaProject project= getProject();
+	public static IPackageFragment getAnonymousTestPackage(IJavaProject project) throws CoreException {
 		String sourceFolder= "src" + fAnonymousSoureFolderCounter++;
 		IPackageFragmentRoot root= project.getPackageFragmentRoot(sourceFolder);
 		if (!root.exists())