Fix autopopup completion with irrelevant variants after typing 'f' suffix for float number

#KT-4312 Fixed
This commit is contained in:
Nikolay Krasko
2013-12-17 17:36:03 +04:00
parent 31ad4f8451
commit dbc1f6b42c
10 changed files with 122 additions and 0 deletions
@@ -24,27 +24,46 @@ import com.intellij.codeInsight.template.impl.TemplateImpl;
import com.intellij.codeInsight.template.impl.TemplateManagerImpl;
import com.intellij.codeInsight.template.impl.TemplateSettings;
import com.intellij.openapi.util.Ref;
import com.intellij.patterns.ElementPattern;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.psi.JavaTokenType;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.util.Consumer;
import com.intellij.util.ProcessingContext;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lexer.JetToken;
import org.jetbrains.jet.lexer.JetTokens;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import static com.intellij.patterns.PsiJavaPatterns.elementType;
import static com.intellij.patterns.PsiJavaPatterns.psiElement;
public class JetLiveTemplateCompletionContributor extends CompletionContributor {
private static final ElementPattern<PsiElement> AFTER_NUMBER_LITERAL = psiElement().afterLeafSkipping(
psiElement().withText(""),
psiElement().withElementType(elementType().oneOf(JetTokens.FLOAT_LITERAL, JetTokens.INTEGER_LITERAL)));
public JetLiveTemplateCompletionContributor() {
extend(CompletionType.BASIC, PlatformPatterns.psiElement(), new CompletionProvider<CompletionParameters>() {
@Override
protected void addCompletions(@NotNull CompletionParameters parameters,
ProcessingContext context,
@NotNull final CompletionResultSet result) {
if (AFTER_NUMBER_LITERAL.accepts(parameters.getPosition())) {
// First Kotlin completion contributors - stop here will stop all completion
result.stopHere();
return;
}
if (parameters.getInvocationCount() == 0) {
return;
}
PsiFile file = parameters.getPosition().getContainingFile();
int offset = parameters.getOffset();
final List<TemplateImpl> templates = listApplicableTemplates(file, offset);
@@ -0,0 +1,7 @@
fun test() {
val some = 1
val f = 1.0f
som<caret>
}
// EXIST: some
@@ -0,0 +1,7 @@
fun test() {
val floor = "Floor"
val a = 1/**/f<caret>
}
// EXIST: floor
// EXIST: false
@@ -0,0 +1,5 @@
val Int.f: Float get() = this.toFloat()
val test = 1.<caret>
// EXIST: f
@@ -0,0 +1,3 @@
val a = 1.0F<caret>
// NUMBER: 0
@@ -0,0 +1,3 @@
val a = 1.0f<caret>
// NUMBER: 0
@@ -0,0 +1,5 @@
fun test() {
val a = 10<caret>
}
// NUMBER: 0
@@ -0,0 +1,3 @@
val a = 1L<caret>
// NUMBER: 0
@@ -35,6 +35,16 @@ public class JetBasicJSCompletionTestGenerated extends AbstractJSBasicCompletion
@TestMetadata("idea/testData/completion/basic/common")
@InnerTestClasses({Common.Extensions.class})
public static class Common extends AbstractJSBasicCompletionTest {
@TestMetadata("AfterFloatOnNewLine.kt")
public void testAfterFloatOnNewLine() throws Exception {
doTest("idea/testData/completion/basic/common/AfterFloatOnNewLine.kt");
}
@TestMetadata("AfterIntSeparatedWithComments.kt")
public void testAfterIntSeparatedWithComments() throws Exception {
doTest("idea/testData/completion/basic/common/AfterIntSeparatedWithComments.kt");
}
public void testAllFilesPresentInCommon() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/completion/basic/common"), Pattern.compile("^(.+)\\.kt$"), true);
}
@@ -139,6 +149,11 @@ public class JetBasicJSCompletionTestGenerated extends AbstractJSBasicCompletion
doTest("idea/testData/completion/basic/common/ExtensionInsideFunction.kt");
}
@TestMetadata("ExtensionToIntInFloatStyle.kt")
public void testExtensionToIntInFloatStyle() throws Exception {
doTest("idea/testData/completion/basic/common/ExtensionToIntInFloatStyle.kt");
}
@TestMetadata("ExtensionWithAdditionalTypeParameters.kt")
public void testExtensionWithAdditionalTypeParameters() throws Exception {
doTest("idea/testData/completion/basic/common/ExtensionWithAdditionalTypeParameters.kt");
@@ -299,6 +314,26 @@ public class JetBasicJSCompletionTestGenerated extends AbstractJSBasicCompletion
doTest("idea/testData/completion/basic/common/NoClassNameDuplication.kt");
}
@TestMetadata("NoCompletionAfterBigFloat.kt")
public void testNoCompletionAfterBigFloat() throws Exception {
doTest("idea/testData/completion/basic/common/NoCompletionAfterBigFloat.kt");
}
@TestMetadata("NoCompletionAfterFloat.kt")
public void testNoCompletionAfterFloat() throws Exception {
doTest("idea/testData/completion/basic/common/NoCompletionAfterFloat.kt");
}
@TestMetadata("NoCompletionAfterInt.kt")
public void testNoCompletionAfterInt() throws Exception {
doTest("idea/testData/completion/basic/common/NoCompletionAfterInt.kt");
}
@TestMetadata("NoCompletionAfterLong.kt")
public void testNoCompletionAfterLong() throws Exception {
doTest("idea/testData/completion/basic/common/NoCompletionAfterLong.kt");
}
@TestMetadata("NoEmptyNamespace.kt")
public void testNoEmptyNamespace() throws Exception {
doTest("idea/testData/completion/basic/common/NoEmptyNamespace.kt");
@@ -35,6 +35,16 @@ public class JetBasicJavaCompletionTestGenerated extends AbstractJvmBasicComplet
@TestMetadata("idea/testData/completion/basic/common")
@InnerTestClasses({Common.Extensions.class})
public static class Common extends AbstractJvmBasicCompletionTest {
@TestMetadata("AfterFloatOnNewLine.kt")
public void testAfterFloatOnNewLine() throws Exception {
doTest("idea/testData/completion/basic/common/AfterFloatOnNewLine.kt");
}
@TestMetadata("AfterIntSeparatedWithComments.kt")
public void testAfterIntSeparatedWithComments() throws Exception {
doTest("idea/testData/completion/basic/common/AfterIntSeparatedWithComments.kt");
}
public void testAllFilesPresentInCommon() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("idea/testData/completion/basic/common"), Pattern.compile("^(.+)\\.kt$"), true);
}
@@ -139,6 +149,11 @@ public class JetBasicJavaCompletionTestGenerated extends AbstractJvmBasicComplet
doTest("idea/testData/completion/basic/common/ExtensionInsideFunction.kt");
}
@TestMetadata("ExtensionToIntInFloatStyle.kt")
public void testExtensionToIntInFloatStyle() throws Exception {
doTest("idea/testData/completion/basic/common/ExtensionToIntInFloatStyle.kt");
}
@TestMetadata("ExtensionWithAdditionalTypeParameters.kt")
public void testExtensionWithAdditionalTypeParameters() throws Exception {
doTest("idea/testData/completion/basic/common/ExtensionWithAdditionalTypeParameters.kt");
@@ -299,6 +314,26 @@ public class JetBasicJavaCompletionTestGenerated extends AbstractJvmBasicComplet
doTest("idea/testData/completion/basic/common/NoClassNameDuplication.kt");
}
@TestMetadata("NoCompletionAfterBigFloat.kt")
public void testNoCompletionAfterBigFloat() throws Exception {
doTest("idea/testData/completion/basic/common/NoCompletionAfterBigFloat.kt");
}
@TestMetadata("NoCompletionAfterFloat.kt")
public void testNoCompletionAfterFloat() throws Exception {
doTest("idea/testData/completion/basic/common/NoCompletionAfterFloat.kt");
}
@TestMetadata("NoCompletionAfterInt.kt")
public void testNoCompletionAfterInt() throws Exception {
doTest("idea/testData/completion/basic/common/NoCompletionAfterInt.kt");
}
@TestMetadata("NoCompletionAfterLong.kt")
public void testNoCompletionAfterLong() throws Exception {
doTest("idea/testData/completion/basic/common/NoCompletionAfterLong.kt");
}
@TestMetadata("NoEmptyNamespace.kt")
public void testNoEmptyNamespace() throws Exception {
doTest("idea/testData/completion/basic/common/NoEmptyNamespace.kt");