From f8d50fd9bbe43ccbfd865f6e4f3238ccc60b824a Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 16 Apr 2012 20:50:01 +0400 Subject: [PATCH] Fix project completion in the beginning --- .../completion/JetPackagesContributor.java | 17 +++++++--------- .../completion/basic/InPackageBegin.kt | 5 +++++ .../completion/JetBasicCompletionTest.java | 4 ++++ .../jet/completion/JetCompletionTestBase.java | 20 +++++++++++++------ 4 files changed, 30 insertions(+), 16 deletions(-) create mode 100644 idea/testData/completion/basic/InPackageBegin.kt diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetPackagesContributor.java b/idea/src/org/jetbrains/jet/plugin/completion/JetPackagesContributor.java index b56c747395f..4fbf325a7ae 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetPackagesContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetPackagesContributor.java @@ -29,6 +29,7 @@ import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetNamespaceHeader; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.plugin.project.WholeProjectAnalyzerFacade; +import org.jetbrains.jet.plugin.references.JetSimpleNameReference; /** * Performs completion in package directive. Should suggest only packages and avoid showing fake package produced by @@ -59,20 +60,16 @@ public class JetPackagesContributor extends CompletionContributor { final PsiReference ref = parameters.getPosition().getContainingFile().findReferenceAt(parameters.getOffset()); - if (ref != null) { + if (ref instanceof JetSimpleNameReference) { + JetSimpleNameReference simpleNameReference = (JetSimpleNameReference)ref; - // For package there will be a wrong prefix matcher with the whole package directive as prefix - PsiElement nameIdentifier = namespaceHeader.getNameIdentifier(); - if (nameIdentifier == null) { + String name = simpleNameReference.getExpression().getText(); + if (name == null) { return; } - if (!(nameIdentifier.getTextOffset() <= parameters.getOffset())) { - return; - } - - int prefixLength = parameters.getOffset() - nameIdentifier.getTextOffset(); - result = result.withPrefixMatcher(new PlainPrefixMatcher(nameIdentifier.getText().substring(0, prefixLength))); + int prefixLength = parameters.getOffset() - simpleNameReference.getExpression().getTextOffset(); + result = result.withPrefixMatcher(new PlainPrefixMatcher(name.substring(0, prefixLength))); BindingContext bindingContext = WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile( (JetFile)namespaceHeader.getContainingFile()) diff --git a/idea/testData/completion/basic/InPackageBegin.kt b/idea/testData/completion/basic/InPackageBegin.kt new file mode 100644 index 00000000000..145e0f062cb --- /dev/null +++ b/idea/testData/completion/basic/InPackageBegin.kt @@ -0,0 +1,5 @@ +package kttesting.util + +// Test that there won't be package with completion fake suffix + +// NUMBER: 0 \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/completion/JetBasicCompletionTest.java b/idea/tests/org/jetbrains/jet/completion/JetBasicCompletionTest.java index 5cc1ece871a..d1a1c3ba9b0 100644 --- a/idea/tests/org/jetbrains/jet/completion/JetBasicCompletionTest.java +++ b/idea/tests/org/jetbrains/jet/completion/JetBasicCompletionTest.java @@ -105,6 +105,10 @@ public class JetBasicCompletionTest extends JetCompletionTestBase { doTest(); } + public void testInPackageBegin() { + doTest(); + } + public void testInTypeAnnotation() { doTest(); } diff --git a/idea/tests/org/jetbrains/jet/completion/JetCompletionTestBase.java b/idea/tests/org/jetbrains/jet/completion/JetCompletionTestBase.java index d12ef7d1976..947917387db 100644 --- a/idea/tests/org/jetbrains/jet/completion/JetCompletionTestBase.java +++ b/idea/tests/org/jetbrains/jet/completion/JetCompletionTestBase.java @@ -64,13 +64,22 @@ public abstract class JetCompletionTestBase extends LightCompletionTestCase { ExpectedCompletionUtils.CompletionProposal[] unexpected = completionUtils.itemsShouldAbsent(fileText); Integer itemsNumber = completionUtils.getExpectedNumber(fileText); - assertTrue("Should be some assertions about completion", expected.length != 0 || unexpected.length != 0 || itemsNumber != null); + assertTrue("Should be some assertions about completion", + expected.length != 0 || unexpected.length != 0 || itemsNumber != null); + + if (myItems == null) { + myItems = new LookupElement[0]; + } ExpectedCompletionUtils.assertContainsRenderedItems(expected, myItems); ExpectedCompletionUtils.assertNotContainsRenderedItems(unexpected, myItems); if (itemsNumber != null) { - assertEquals("Invalid number of completion items", itemsNumber.intValue(), myItems.length); + assertEquals( + String.format( + "Invalid number of completion items: %s", + ExpectedCompletionUtils.listToString(ExpectedCompletionUtils.getItemsInformation(myItems))), + itemsNumber.intValue(), myItems.length); } } finally { @@ -78,9 +87,8 @@ public abstract class JetCompletionTestBase extends LightCompletionTestCase { ConfigRuntimeUtil.unConfigureKotlinRuntime(getModule(), getProjectJDK()); } } - - - } catch (Exception e) { + } + catch (Exception e) { throw new AssertionError(e); } } @@ -102,7 +110,7 @@ public abstract class JetCompletionTestBase extends LightCompletionTestCase { protected void complete(final int time) { new CodeCompletionHandlerBase(type, false, false, true).invokeCompletion(getProject(), getEditor(), time, false); - LookupImpl lookup = (LookupImpl) LookupManager.getActiveLookup(myEditor); + LookupImpl lookup = (LookupImpl)LookupManager.getActiveLookup(myEditor); myItems = lookup == null ? null : lookup.getItems().toArray(LookupElement.EMPTY_ARRAY); myPrefix = lookup == null ? null : lookup.itemPattern(lookup.getItems().get(0)); }