From dd48c7e91baa342a8439d0ce1f167134fa7b2cdc Mon Sep 17 00:00:00 2001 From: Alexander Zolotov Date: Mon, 8 Dec 2014 18:50:34 +0300 Subject: [PATCH] Prefer live template among other exact matched elements --- .../completion/JavaAutoPopupTest.groovy | 15 ++++++++++++++ .../completion/CompletionLookupArranger.java | 20 +++++++++++++------ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy index ce00ff76ee67..3c077f1ca801 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy @@ -1115,6 +1115,21 @@ public class UTest { assert myFixture.lookupElementStrings == ['new', 'nextWord'] } + public void testExactMatchesTemplateFirst() { + LiveTemplateCompletionContributor.setShowTemplatesInTests(true, getTestRootDisposable()) + myFixture.configureByText("a.java", """ +public class Test { + void itar() {} + + void foo() { + ita + } +}""") + type 'r' + assert myFixture.lookupElementStrings == ['itar', 'itar'] + assert myFixture.lookup.currentItem instanceof LiveTemplateLookupElement + } + public void testUpdatePrefixMatchingOnTyping() { myFixture.addClass("class CertificateEncodingException {}") myFixture.addClass("class CertificateException {}") diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionLookupArranger.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionLookupArranger.java index 1772ac77d451..a676dd225980 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionLookupArranger.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionLookupArranger.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -339,17 +339,25 @@ public class CompletionLookupArranger extends LookupArranger { } String selectedText = lookup.getEditor().getSelectionModel().getSelectedText(); + int exactMatchIndex = -1; for (int i = 0; i < items.size(); i++) { LookupElement item = items.get(i); - boolean isTemplate = isLiveTemplate(item); - if (isPrefixItem(lookup, item, true) && !isTemplate || + boolean isSuddenLiveTemplate = isSuddenLiveTemplate(item); + if (isPrefixItem(lookup, item, true) && !isSuddenLiveTemplate || item.getLookupString().equals(selectedText)) { - return i; + + if (exactMatchIndex == -1 || item instanceof LiveTemplateLookupElement) { + // prefer most recent item or LiveTemplate item + exactMatchIndex = i; + } } - if (i == 0 && isTemplate && items.size() > 1 && !CompletionServiceImpl.isStartMatch(items.get(1), lookup)) { + else if (i == 0 && isSuddenLiveTemplate && items.size() > 1 && !CompletionServiceImpl.isStartMatch(items.get(1), lookup)) { return 0; } } + if (exactMatchIndex >= 0) { + return exactMatchIndex; + } return Math.max(0, ContainerUtil.indexOfIdentity(items, mostRelevant)); } @@ -370,7 +378,7 @@ public class CompletionLookupArranger extends LookupArranger { } - private static boolean isLiveTemplate(LookupElement element) { + private static boolean isSuddenLiveTemplate(LookupElement element) { return element instanceof LiveTemplateLookupElement && ((LiveTemplateLookupElement)element).sudden; }