From dbc1f6b42c2e9b215c78add5eb2d4751bcb9220e Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Tue, 17 Dec 2013 17:36:03 +0400 Subject: [PATCH] Fix autopopup completion with irrelevant variants after typing 'f' suffix for float number #KT-4312 Fixed --- .../JetLiveTemplateCompletionContributor.java | 19 ++++++++++ .../basic/common/AfterFloatOnNewLine.kt | 7 ++++ .../common/AfterIntSeparatedWithComments.kt | 7 ++++ .../common/ExtensionToIntInFloatStyle.kt | 5 +++ .../basic/common/NoCompletionAfterBigFloat.kt | 3 ++ .../basic/common/NoCompletionAfterFloat.kt | 3 ++ .../basic/common/NoCompletionAfterInt.kt | 5 +++ .../basic/common/NoCompletionAfterLong.kt | 3 ++ .../JetBasicJSCompletionTestGenerated.java | 35 +++++++++++++++++++ .../JetBasicJavaCompletionTestGenerated.java | 35 +++++++++++++++++++ 10 files changed, 122 insertions(+) create mode 100644 idea/testData/completion/basic/common/AfterFloatOnNewLine.kt create mode 100644 idea/testData/completion/basic/common/AfterIntSeparatedWithComments.kt create mode 100644 idea/testData/completion/basic/common/ExtensionToIntInFloatStyle.kt create mode 100644 idea/testData/completion/basic/common/NoCompletionAfterBigFloat.kt create mode 100644 idea/testData/completion/basic/common/NoCompletionAfterFloat.kt create mode 100644 idea/testData/completion/basic/common/NoCompletionAfterInt.kt create mode 100644 idea/testData/completion/basic/common/NoCompletionAfterLong.kt diff --git a/idea/src/org/jetbrains/jet/plugin/liveTemplates/JetLiveTemplateCompletionContributor.java b/idea/src/org/jetbrains/jet/plugin/liveTemplates/JetLiveTemplateCompletionContributor.java index 25c18d9f277..27422e93fdc 100644 --- a/idea/src/org/jetbrains/jet/plugin/liveTemplates/JetLiveTemplateCompletionContributor.java +++ b/idea/src/org/jetbrains/jet/plugin/liveTemplates/JetLiveTemplateCompletionContributor.java @@ -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 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() { @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 templates = listApplicableTemplates(file, offset); diff --git a/idea/testData/completion/basic/common/AfterFloatOnNewLine.kt b/idea/testData/completion/basic/common/AfterFloatOnNewLine.kt new file mode 100644 index 00000000000..cfbbbd031bc --- /dev/null +++ b/idea/testData/completion/basic/common/AfterFloatOnNewLine.kt @@ -0,0 +1,7 @@ +fun test() { + val some = 1 + val f = 1.0f + som +} + +// EXIST: some \ No newline at end of file diff --git a/idea/testData/completion/basic/common/AfterIntSeparatedWithComments.kt b/idea/testData/completion/basic/common/AfterIntSeparatedWithComments.kt new file mode 100644 index 00000000000..e6b250ee53a --- /dev/null +++ b/idea/testData/completion/basic/common/AfterIntSeparatedWithComments.kt @@ -0,0 +1,7 @@ +fun test() { + val floor = "Floor" + val a = 1/**/f +} + +// EXIST: floor +// EXIST: false \ No newline at end of file diff --git a/idea/testData/completion/basic/common/ExtensionToIntInFloatStyle.kt b/idea/testData/completion/basic/common/ExtensionToIntInFloatStyle.kt new file mode 100644 index 00000000000..fd5d8aaa4c1 --- /dev/null +++ b/idea/testData/completion/basic/common/ExtensionToIntInFloatStyle.kt @@ -0,0 +1,5 @@ +val Int.f: Float get() = this.toFloat() + +val test = 1. + +// EXIST: f \ No newline at end of file diff --git a/idea/testData/completion/basic/common/NoCompletionAfterBigFloat.kt b/idea/testData/completion/basic/common/NoCompletionAfterBigFloat.kt new file mode 100644 index 00000000000..092782e5488 --- /dev/null +++ b/idea/testData/completion/basic/common/NoCompletionAfterBigFloat.kt @@ -0,0 +1,3 @@ +val a = 1.0F + +// NUMBER: 0 \ No newline at end of file diff --git a/idea/testData/completion/basic/common/NoCompletionAfterFloat.kt b/idea/testData/completion/basic/common/NoCompletionAfterFloat.kt new file mode 100644 index 00000000000..be7e44ce8ce --- /dev/null +++ b/idea/testData/completion/basic/common/NoCompletionAfterFloat.kt @@ -0,0 +1,3 @@ +val a = 1.0f + +// NUMBER: 0 diff --git a/idea/testData/completion/basic/common/NoCompletionAfterInt.kt b/idea/testData/completion/basic/common/NoCompletionAfterInt.kt new file mode 100644 index 00000000000..4c8afd79429 --- /dev/null +++ b/idea/testData/completion/basic/common/NoCompletionAfterInt.kt @@ -0,0 +1,5 @@ +fun test() { + val a = 10 +} + +// NUMBER: 0 diff --git a/idea/testData/completion/basic/common/NoCompletionAfterLong.kt b/idea/testData/completion/basic/common/NoCompletionAfterLong.kt new file mode 100644 index 00000000000..8d10049b23d --- /dev/null +++ b/idea/testData/completion/basic/common/NoCompletionAfterLong.kt @@ -0,0 +1,3 @@ +val a = 1L + +// NUMBER: 0 diff --git a/idea/tests/org/jetbrains/jet/completion/JetBasicJSCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JetBasicJSCompletionTestGenerated.java index a9ec35fdadc..8eca731a4ca 100644 --- a/idea/tests/org/jetbrains/jet/completion/JetBasicJSCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JetBasicJSCompletionTestGenerated.java @@ -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"); diff --git a/idea/tests/org/jetbrains/jet/completion/JetBasicJavaCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JetBasicJavaCompletionTestGenerated.java index 8946b0ed9f1..75c288f0ce9 100644 --- a/idea/tests/org/jetbrains/jet/completion/JetBasicJavaCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JetBasicJavaCompletionTestGenerated.java @@ -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");