Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephan Herrmann2016-11-26 22:59:50 +0000
committerStephan Herrmann2016-11-26 22:59:50 +0000
commit02944c35e14fd9fc46bb9f58ae0fbd467d91cbd6 (patch)
tree2c2e2d05df41d73a2590313d05acdc374d97502a
parentee91beb0460af10ae7ba0ef8d517ac9816180a16 (diff)
downloadorg.eclipse.objectteams-02944c35e14fd9fc46bb9f58ae0fbd467d91cbd6.tar.gz
org.eclipse.objectteams-02944c35e14fd9fc46bb9f58ae0fbd467d91cbd6.tar.xz
org.eclipse.objectteams-02944c35e14fd9fc46bb9f58ae0fbd467d91cbd6.zip
Bug 416779: [assist] completion throws JME for std. phantom roles
-rw-r--r--org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java20
-rw-r--r--testplugins/org.eclipse.objectteams.otdt.ui.tests/src/org/eclipse/objectteams/otdt/ui/tests/core/CodeCompletionTest.java44
2 files changed, 64 insertions, 0 deletions
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 5967f2252..edc8b2f35 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
@@ -5268,6 +5268,12 @@ public final class CompletionEngine
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 (currentType.isInterface()) {
char[] completion = CharOperation.NO_CHAR;
char[] typeCompletion = null;
@@ -6031,6 +6037,10 @@ public final class CompletionEngine
relevance);
}
+//{ObjectTeams: no anonymous classes from roles:
+ if (currentType.isRole())
+ return;
+// SH}
// This code is disabled because there is too much proposals when constructors and anonymous are proposed
if (!isIgnored(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF)
&& !currentType.isFinal()
@@ -13516,6 +13526,11 @@ public final class CompletionEngine
if (isInterface || (typeModifiers & ClassFileConstants.AccAbstract) != 0) {
this.noProposal = false;
+//{ObjectTeams: no anonymous roles:
+ if ((typeModifiers & ExtraCompilerModifiers.AccRole) != 0) {
+ break;
+ }
+// SH}
if(!isIgnored(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF)) {
InternalCompletionProposal proposal = createProposal(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, this.actualCompletionPosition);
proposal.setDeclarationSignature(createNonGenericTypeSignature(packageName, typeName));
@@ -13568,6 +13583,11 @@ public final class CompletionEngine
case 0: // constructor with no parameter
if ((typeModifiers & ClassFileConstants.AccAbstract) != 0) {
+//{ObjectTeams: no anonymous roles:
+ if ((typeModifiers & ExtraCompilerModifiers.AccRole) != 0) {
+ break;
+ }
+// SH}
this.noProposal = false;
if(!isIgnored(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, CompletionProposal.TYPE_REF)) {
InternalCompletionProposal proposal = createProposal(CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION, this.actualCompletionPosition);
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 4fb41fbb2..cc1dcd4be 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
@@ -40,6 +40,7 @@ import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
import org.eclipse.jdt.internal.ui.text.java.JavaCompletionProcessor;
+import org.eclipse.jdt.internal.ui.text.java.JavaMethodCompletionProposal;
import org.eclipse.jdt.internal.ui.text.java.ParameterGuessingProposal;
import org.eclipse.jdt.internal.ui.text.template.contentassist.TemplateProposal;
import org.eclipse.jdt.testplugin.TestOptions;
@@ -1953,6 +1954,49 @@ public class CodeCompletionTest extends CoreTests {
assertChoices(proposal, new String[][]{new String[]{"arg0", "rarg", "null"}}); // <- this is key: expect "rarg" next to "arg0"!
}
+ public void testBug416779a() throws CoreException {
+ StringBuffer teamContent = new StringBuffer(
+ "public team class Completion_testBug416779 {\n" +
+ " protecte abstract class R {\n" +
+ " }\n" +
+ " R test() {\n" +
+ " return new R\n" +
+ " }\n" +
+ "}\n");
+ String completeBehind = "new R";
+ int pos = teamContent.indexOf(completeBehind)+completeBehind.length();
+
+ assertNosuchProposal("R()", teamContent, new Region(pos, 0), 0);
+ assertNosuchProposal("Completion_testBug416779.R()", teamContent, new Region(pos, 0), 0);
+ }
+
+ public void testBug416779b() throws CoreException {
+ StringBuffer teamContent = new StringBuffer(
+ "public team class Completion_testBug416779 {\n" +
+ " protecte class R {\n" +
+ " }\n" +
+ " R test() {\n" +
+ " return new R\n" +
+ " }\n" +
+ "}\n");
+ String completeBehind = "new R";
+ int pos = teamContent.indexOf(completeBehind)+completeBehind.length();
+
+ StringBuffer expectedContent = new StringBuffer(
+ "public team class Completion_testBug416779 {\n" +
+ " protecte class R {\n" +
+ " }\n" +
+ " R test() {\n" +
+ " return new R()\n" +
+ " }\n" +
+ "}\n");
+
+ int posAfter = expectedContent.indexOf("new R()") + "new R()".length();
+
+ ICompletionProposal proposal = assertProposal("R()", null, null, teamContent, new Region(pos, 0), expectedContent, new Region(posAfter, 0), 0);
+ assertTrue("Should be a java method proposal", proposal instanceof JavaMethodCompletionProposal);
+ }
+
// == Below: Helper methods/fields. ==
private void createBaseClass(String classBody)

Back to the top