diff options
author | Stephan Herrmann | 2016-11-26 22:59:50 +0000 |
---|---|---|
committer | Stephan Herrmann | 2016-11-26 22:59:50 +0000 |
commit | 02944c35e14fd9fc46bb9f58ae0fbd467d91cbd6 (patch) | |
tree | 2c2e2d05df41d73a2590313d05acdc374d97502a | |
parent | ee91beb0460af10ae7ba0ef8d517ac9816180a16 (diff) | |
download | org.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
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) |