diff options
| author | Manoj Palat | 2018-01-02 06:02:41 +0000 |
|---|---|---|
| committer | Manoj Palat | 2018-01-02 06:50:05 +0000 |
| commit | 3d3255b352abe329b038fed8610941e23064d10c (patch) | |
| tree | 3b461bd37f20619a12ee940ce6f52eb768ff2421 | |
| parent | 43ed51dd824b3eca375d90515175904e1d4fab63 (diff) | |
| download | eclipse.jdt.core-3d3255b352abe329b038fed8610941e23064d10c.tar.gz eclipse.jdt.core-3d3255b352abe329b038fed8610941e23064d10c.tar.xz eclipse.jdt.core-3d3255b352abe329b038fed8610941e23064d10c.zip | |
Fix for Bug 529123 - [9][content assist] support MODULE_DECLARATION inI20180104-2000I20180104-0030I20180103-2000I20180103-0140I20180102-2215I20180102-2000
CompletionProposal.getDeclarationSignature
Change-Id: I5f181fa6eed957a8d8fbf6b09896588966d5a534
5 files changed, 154 insertions, 25 deletions
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests9.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests9.java index fb1c08fbeb..2f4ebde955 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests9.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests9.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2016, 2017 IBM Corporation and others. + * Copyright (c) 2016, 2018 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -315,7 +315,7 @@ public void test486988_0009() throws Exception { ICompilationUnit unit = getCompilationUnit(filePath); unit.codeComplete(cursorLocation, requestor); - String expected = "[PROPOSAL]{org.eclipse.foo, org.eclipse.foo, null, null, 49}"; + String expected = "[MODULE_REF]{org.eclipse.foo, org.eclipse.foo, null, null, 49}"; assertResults(expected, requestor.getResults()); } finally { deleteProject(project1); @@ -349,7 +349,7 @@ public void test522604_0001() throws Exception { ICompilationUnit unit = getCompilationUnit(filePath); unit.codeComplete(cursorLocation, requestor); - String expected = "[PROPOSAL]{j.s.r, j.s.r, null, null, 49}"; + String expected = "[MODULE_REF]{j.s.r, j.s.r, null, null, 49}"; assertResults(expected, requestor.getResults()); } finally { deleteProject(project1); @@ -391,7 +391,7 @@ public void test486988_0010() throws Exception { ICompilationUnit unit = getCompilationUnit(filePath); unit.codeComplete(cursorLocation, requestor); - String expected = "[PROPOSAL]{com.greetings, com.greetings, null, null, 49}"; + String expected = "[MODULE_REF]{com.greetings, com.greetings, null, null, 49}"; assertResults(expected, requestor.getResults()); } finally { deleteProject(project1); @@ -1016,14 +1016,120 @@ public void testBug525203_001() throws Exception { ICompilationUnit unit = getCompilationUnit("/Completion9_1/src/module-info.java"); unit.codeComplete(cursorLocation, requestor); - String expected = "[PROPOSAL]{test.second, test.second, null, null, 49}\n" + - "[PROPOSAL]{test.some.core.api, test.some.core.api, null, null, 49}\n" + - "[PROPOSAL]{test.third.from.manifest, test.third.from.manifest, null, null, 49}"; + String expected = "[MODULE_REF]{test.second, test.second, null, null, 49}\n" + + "[MODULE_REF]{test.some.core.api, test.some.core.api, null, null, 49}\n" + + "[MODULE_REF]{test.third.from.manifest, test.third.from.manifest, null, null, 49}"; assertResults(expected, requestor.getResults()); } finally { deleteProject(project1); } } +public void testBug529123_001() throws Exception { + IJavaProject project1 = createJavaProject("Completion9_1", new String[] {"src"}, new String[] {"JCL18_LIB"}, "bin", "9"); + try { + project1.open(null); + String filePath = "/Completion9_1/src/module-info.java"; + String fileContent = "module Com"; + createFile(filePath, fileContent); + String completeBehind = "Com"; + int cursorLocation = fileContent.lastIndexOf(completeBehind) + completeBehind.length(); + CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(); + + ICompilationUnit unit = getCompilationUnit(filePath); + unit.codeComplete(cursorLocation, requestor); + + String expected = "Completion9_1[MODULE_DECLARATION]{Completion9_1, Completion9_1, null, Completion9_1, 31}"; + assertResults(expected, requestor.getResults()); + } finally { + deleteProject(project1); + } +} +public void testBug529123_002() throws Exception { + String pName = "Completion9-1"; // with a -, + IJavaProject project1 = createJavaProject(pName, new String[] {"src"}, new String[] {"JCL18_LIB"}, "bin", "9"); + try { + project1.open(null); + String filePath = "/" + pName +"/src/module-info.java"; + String fileContent = "module Com"; + createFile(filePath, fileContent); + String completeBehind = "Com"; + int cursorLocation = fileContent.lastIndexOf(completeBehind) + completeBehind.length(); + CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(); + + ICompilationUnit unit = getCompilationUnit(filePath); + unit.codeComplete(cursorLocation, requestor); + + String expected = ""; + assertResults(expected, requestor.getResults()); + } finally { + deleteProject(project1); + } +} +public void testBug529123_003() throws Exception { + String pName = "529123"; // a number - invalid module name but a valid project name + IJavaProject project1 = createJavaProject(pName, new String[] {"src"}, new String[] {"JCL18_LIB"}, "bin", "9"); + try { + project1.open(null); + String filePath = "/" + pName +"/src/module-info.java"; + String fileContent = "module Com"; + createFile(filePath, fileContent); + String completeBehind = "Com"; + int cursorLocation = fileContent.lastIndexOf(completeBehind) + completeBehind.length(); + CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(); + + ICompilationUnit unit = getCompilationUnit(filePath); + unit.codeComplete(cursorLocation, requestor); + + String expected = ""; + assertResults(expected, requestor.getResults()); + } finally { + deleteProject(project1); + } +} +public void testBug529123_004() throws Exception { + String pName = "module.name.test"; // with dots + IJavaProject project1 = createJavaProject(pName, new String[] {"src"}, new String[] {"JCL18_LIB"}, "bin", "9"); + try { + project1.open(null); + String filePath = "/" + pName +"/src/module-info.java"; + String fileContent = "module Com"; + createFile(filePath, fileContent); + String completeBehind = "Com"; + int cursorLocation = fileContent.lastIndexOf(completeBehind) + completeBehind.length(); + CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(); + + ICompilationUnit unit = getCompilationUnit(filePath); + unit.codeComplete(cursorLocation, requestor); + + String expected = ""; + assertResults(expected, requestor.getResults()); + } finally { + deleteProject(project1); + } +} +public void testBug529123_005() throws Exception { + IJavaProject project1 = createJavaProject("Completion9_1", new String[] {"src"}, new String[] {"JCL18_LIB"}, "bin", "9"); + try { + project1.open(null); + String filePath = "/Completion9_1/src/module-info.java"; + String fileContent = "module Com"; + createFile(filePath, fileContent); + String completeBehind = "Com"; + int cursorLocation = fileContent.lastIndexOf(completeBehind) + completeBehind.length(); + CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(); + + ICompilationUnit unit = getCompilationUnit(filePath); + unit.codeComplete(cursorLocation, requestor); + + String expected = "Completion9_1[MODULE_DECLARATION]{Completion9_1, Completion9_1, null, Completion9_1, 31}"; + String[] actual = requestor.getStringsResult(); + assertTrue("Null result", actual != null); + assertTrue("Incorrect number of elements", actual.length == 1); + assertResults(expected, requestor.getResults()); + } finally { + deleteProject(project1); + } +} }
\ No newline at end of file diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTestsRequestor2.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTestsRequestor2.java index 6ba2dd8f70..4ca2966aa3 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTestsRequestor2.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTestsRequestor2.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2015 IBM Corporation and others. + * Copyright (c) 2004, 2018 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -354,6 +354,12 @@ public class CompletionTestsRequestor2 extends CompletionRequestor { buffer.append("<CONSTRUCTOR>"); //$NON-NLS-1$ } break; + case CompletionProposal.MODULE_DECLARATION : + buffer.append("MODULE_DECLARATION"); //$NON-NLS-1$ + break; + case CompletionProposal.MODULE_REF : + buffer.append("MODULE_REF"); //$NON-NLS-1$ + break; case CompletionProposal.PACKAGE_REF : buffer.append("PACKAGE_REF"); //$NON-NLS-1$ break; @@ -590,6 +596,7 @@ public class CompletionTestsRequestor2 extends CompletionRequestor { case CompletionProposal.ANONYMOUS_CLASS_CONSTRUCTOR_INVOCATION : return new String(proposal.getName()); case CompletionProposal.PACKAGE_REF: + case CompletionProposal.MODULE_DECLARATION: return new String(proposal.getDeclarationSignature()); } return ""; 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 34fa590cd2..836d38dcb5 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2017 IBM Corporation and others. + * Copyright (c) 2000, 2018 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -2058,7 +2058,7 @@ public final class CompletionEngine buildContext(parsedUnit.moduleDeclaration, null, parsedUnit, null, null); //this.requestor.setIgnored(CompletionProposal.MODULE_DECLARATION, false); //TODO: Hack until ui fixes this issue. if(!this.requestor.isIgnored(CompletionProposal.MODULE_DECLARATION)) { - findModuleName(parsedUnit); + proposeModuleName(parsedUnit); } debugPrintf(); return; @@ -10689,20 +10689,22 @@ public final class CompletionEngine } } - private void findModuleName(CompilationUnitDeclaration parsedUnit) { - char[] fileName1 = parsedUnit.getFileName(); - if (fileName1 == null || !CharOperation.endsWith(fileName1, MODULE_INFO_FILE_NAME)) return; - int lastFileSeparatorIndex = fileName1.length - (MODULE_INFO_FILE_NAME.length + 1); - if (lastFileSeparatorIndex <= 0) return; - int prevFileSeparatorIndex = CharOperation.lastIndexOf(fileName1[lastFileSeparatorIndex], fileName1, 0, lastFileSeparatorIndex - 1); - prevFileSeparatorIndex = prevFileSeparatorIndex < 0 ? 0 : prevFileSeparatorIndex + 1; - char[] moduleName = CharOperation.subarray(fileName1, prevFileSeparatorIndex, lastFileSeparatorIndex); - if (moduleName == null || moduleName.length == 0) return; + private void proposeModuleName(CompilationUnitDeclaration parsedUnit) { + String projectName = this.javaProject.getElementName(); + char[] moduleName = projectName.toCharArray(); + if (moduleName.length > 0) {// do not propose invalid names + if (!Character.isJavaIdentifierStart(moduleName[0])) return; + for (char c : moduleName) { + if (!Character.isJavaIdentifierPart(c) && c != '.') return; + } + } this.completionToken = CharOperation.concatWith(this.moduleDeclaration.tokens, '.'); + setSourceRange(this.moduleDeclaration.sourceStart, this.moduleDeclaration.bodyStart); if (this.completionToken.length > 0 && !CharOperation.prefixEquals(this.completionToken, moduleName)) return; InternalCompletionProposal proposal = createProposal(CompletionProposal.MODULE_DECLARATION, this.actualCompletionPosition); proposal.setName(moduleName); + proposal.setDeclarationSignature(moduleName); proposal.setCompletion(moduleName); proposal.setReplaceRange((this.startPosition < 0) ? 0 : this.startPosition - this.offset, this.endPosition - this.offset); proposal.setTokenRange((this.tokenStart < 0) ? 0 : this.tokenStart - this.offset, this.tokenEnd - this.offset); @@ -13059,6 +13061,12 @@ public final class CompletionEngine case CompletionProposal.METHOD_REF_WITH_CASTED_RECEIVER : buffer.append("METHOD_REF_WITH_CASTED_RECEIVER"); //$NON-NLS-1$ break; + case CompletionProposal.MODULE_DECLARATION : + buffer.append("MODULE_DECLARATION"); //$NON-NLS-1$ + break; + case CompletionProposal.MODULE_REF : + buffer.append("MODULE_REF"); //$NON-NLS-1$ + break; case CompletionProposal.PACKAGE_REF : buffer.append("PACKAGE_REF"); //$NON-NLS-1$ break; diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/InternalCompletionProposal.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/InternalCompletionProposal.java index 40bc7b18d2..8826f308ae 100644 --- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/InternalCompletionProposal.java +++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/InternalCompletionProposal.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2016 IBM Corporation and others. + * Copyright (c) 2004, 2018 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -1068,6 +1068,12 @@ public class InternalCompletionProposal extends CompletionProposal { buffer.append("<CONSTRUCTOR>"); //$NON-NLS-1$ } break; + case CompletionProposal.MODULE_DECLARATION : + buffer.append("MODULE_DECLARATION"); //$NON-NLS-1$ + break; + case CompletionProposal.MODULE_REF : + buffer.append("MODULE_REF"); //$NON-NLS-1$ + break; case CompletionProposal.PACKAGE_REF : buffer.append("PACKAGE_REF"); //$NON-NLS-1$ break; diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/CompletionProposal.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/CompletionProposal.java index 3dfe18f19d..da63c15e04 100644 --- a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/CompletionProposal.java +++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/CompletionProposal.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2016 IBM Corporation and others. + * Copyright (c) 2004, 2018 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -1179,7 +1179,7 @@ public class CompletionProposal { } /** - * Returns the type signature or package name or module name (1.9) of the relevant + * Returns the type signature or package name or module name (9) of the relevant * declaration in the context, or <code>null</code> if none. * <p> * This field is available for the following kinds of @@ -1204,6 +1204,8 @@ public class CompletionProposal { * <li><code>METHOD_DECLARATION</code> - type signature * of the type that declares the method that is being * implemented or overridden</li> + * <li><code>MODULE_DECLARATION</code> - + * possible name of the module that is being declared</li> * <li><code>MODULE_REF</code> - * name of the module that is referenced</li> * <li><code>PACKAGE_REF</code> - dot-based package @@ -1220,7 +1222,7 @@ public class CompletionProposal { * returned. * </p> * - * @return a type signature or a package name or module name (1.9) (depending + * @return a type signature or a package name or module name (9) (depending * on the kind of completion), or <code>null</code> if none * @see Signature */ @@ -1256,7 +1258,7 @@ public class CompletionProposal { } /** - * Sets the type or package or module(1.9) signature of the relevant + * Sets the type or package signature or module name (9) of the relevant * declaration in the context, or <code>null</code> if none. * <p> * If not set, defaults to none. @@ -1266,7 +1268,7 @@ public class CompletionProposal { * its properties; this method is not intended to be used by other clients. * </p> * - * @param signature the type or package or module(1.9) signature, or + * @param signature the type or package signature or module name(9) , or * <code>null</code> if none */ public void setDeclarationSignature(char[] signature) { |
