From 19fb090f284a847fcbbbadb85fc2f1a03c083694 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 19 Sep 2014 22:50:31 +0400 Subject: [PATCH] Do not autopopup completion in name of generic function or property too --- .../completion/JetCompletionContributor.kt | 18 ++++++++-- .../common/GenericExtensionFunTypeArgument.kt | 2 +- .../common/NestedClassNameForExtension.kt | 1 + .../common/NestedClassNameForExtension2.kt | 1 + .../basic/common/NoAutopopupInExtFunName.kt | 8 +++++ .../common/NoAutopopupInGenericExtFunName.kt | 8 +++++ .../common/NoAutopopupInGenericFunName.kt | 4 +++ .../common/NoAutopopupInGenericValName.kt | 4 +++ .../common/NoAutopopupInGenericVarName.kt | 4 +++ .../JSBasicCompletionTestGenerated.java | 35 ++++++++++++++++++- .../JvmBasicCompletionTestGenerated.java | 35 ++++++++++++++++--- 11 files changed, 111 insertions(+), 9 deletions(-) create mode 100644 idea/testData/completion/basic/common/NoAutopopupInExtFunName.kt create mode 100644 idea/testData/completion/basic/common/NoAutopopupInGenericExtFunName.kt create mode 100644 idea/testData/completion/basic/common/NoAutopopupInGenericFunName.kt create mode 100644 idea/testData/completion/basic/common/NoAutopopupInGenericValName.kt create mode 100644 idea/testData/completion/basic/common/NoAutopopupInGenericVarName.kt diff --git a/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.kt b/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.kt index 417b34f4276..b1006eae560 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/JetCompletionContributor.kt @@ -47,7 +47,6 @@ public class JetCompletionContributor : CompletionContributor() { private val AFTER_NUMBER_LITERAL = psiElement().afterLeafSkipping(psiElement().withText(""), psiElement().withElementType(elementType().oneOf(JetTokens.FLOAT_LITERAL, JetTokens.INTEGER_LITERAL))) private val AFTER_INTEGER_LITERAL_AND_DOT = psiElement().afterLeafSkipping(psiElement().withText("."), psiElement().withElementType(elementType().oneOf(JetTokens.INTEGER_LITERAL))) - private val EXTENSION_RECEIVER_TYPE_PATTERN = psiElement().afterLeaf(JetTokens.FUN_KEYWORD.toString(), JetTokens.VAL_KEYWORD.toString(), JetTokens.VAR_KEYWORD.toString()) private val DEFAULT_DUMMY_IDENTIFIER = CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED + "$" // add '$' to ignore context after the caret @@ -199,12 +198,25 @@ public class JetCompletionContributor : CompletionContributor() { // no completion auto-popup after integer and dot if (invocationCount == 0 && prefixMatcher.getPrefix().isEmpty() && AFTER_INTEGER_LITERAL_AND_DOT.accepts(position)) return true - // no auto-popup on typing after "val", "var" and "fun" - if (invocationCount == 0 && EXTENSION_RECEIVER_TYPE_PATTERN.accepts(position)) return true + // no auto-popup on typing after "val", "var" and "fun" because it's likely the name of the declaration which is being typed by user + if (invocationCount == 0 && isInExtensionReceiver(position)) return true return false } + private fun isInExtensionReceiver(position: PsiElement): Boolean { + val nameRef = position.getParent() as? JetNameReferenceExpression ?: return false + val userType = nameRef.getParent() as? JetUserType ?: return false + val typeRef = userType.getParent() as? JetTypeReference ?: return false + if (userType != typeRef.getTypeElement()) return false + val parent = typeRef.getParent() + return when (parent) { + is JetNamedFunction -> typeRef == parent.getReceiverTypeRef() + is JetProperty -> typeRef == parent.getReceiverTypeRef() + else -> false + } + } + private fun isAtEndOfLine(offset: Int, document: Document): Boolean { var i = offset val chars = document.getCharsSequence() diff --git a/idea/testData/completion/basic/common/GenericExtensionFunTypeArgument.kt b/idea/testData/completion/basic/common/GenericExtensionFunTypeArgument.kt index e29318bdf95..37fee6a814e 100644 --- a/idea/testData/completion/basic/common/GenericExtensionFunTypeArgument.kt +++ b/idea/testData/completion/basic/common/GenericExtensionFunTypeArgument.kt @@ -2,7 +2,7 @@ fun Strange(){} fun Annotations -// INVOCATION_COUNT: 1 +// INVOCATION_COUNT: 0 // EXIST: String // EXIST: Set // ABSENT: Strange diff --git a/idea/testData/completion/basic/common/NestedClassNameForExtension.kt b/idea/testData/completion/basic/common/NestedClassNameForExtension.kt index 929b6c57652..2941f4661d9 100644 --- a/idea/testData/completion/basic/common/NestedClassNameForExtension.kt +++ b/idea/testData/completion/basic/common/NestedClassNameForExtension.kt @@ -5,4 +5,5 @@ class Test { fun Test. } +// INVOCATION_COUNT: 1 // EXIST: Nested diff --git a/idea/testData/completion/basic/common/NestedClassNameForExtension2.kt b/idea/testData/completion/basic/common/NestedClassNameForExtension2.kt index f2a55c674b5..581dff6db41 100644 --- a/idea/testData/completion/basic/common/NestedClassNameForExtension2.kt +++ b/idea/testData/completion/basic/common/NestedClassNameForExtension2.kt @@ -5,4 +5,5 @@ class Test { fun Test.N } +// INVOCATION_COUNT: 1 // EXIST: Nested diff --git a/idea/testData/completion/basic/common/NoAutopopupInExtFunName.kt b/idea/testData/completion/basic/common/NoAutopopupInExtFunName.kt new file mode 100644 index 00000000000..f399f725fc6 --- /dev/null +++ b/idea/testData/completion/basic/common/NoAutopopupInExtFunName.kt @@ -0,0 +1,8 @@ +class Outer { + class Nested +} + +fun Outer. + +// INVOCATION_COUNT: 0 +// NUMBER: 0 diff --git a/idea/testData/completion/basic/common/NoAutopopupInGenericExtFunName.kt b/idea/testData/completion/basic/common/NoAutopopupInGenericExtFunName.kt new file mode 100644 index 00000000000..802c9018722 --- /dev/null +++ b/idea/testData/completion/basic/common/NoAutopopupInGenericExtFunName.kt @@ -0,0 +1,8 @@ +class Outer { + class Nested +} + +fun Outer. + +// INVOCATION_COUNT: 0 +// NUMBER: 0 diff --git a/idea/testData/completion/basic/common/NoAutopopupInGenericFunName.kt b/idea/testData/completion/basic/common/NoAutopopupInGenericFunName.kt new file mode 100644 index 00000000000..d5f66ff9777 --- /dev/null +++ b/idea/testData/completion/basic/common/NoAutopopupInGenericFunName.kt @@ -0,0 +1,4 @@ +fun + +// INVOCATION_COUNT: 0 +// NUMBER: 0 diff --git a/idea/testData/completion/basic/common/NoAutopopupInGenericValName.kt b/idea/testData/completion/basic/common/NoAutopopupInGenericValName.kt new file mode 100644 index 00000000000..171cd88a049 --- /dev/null +++ b/idea/testData/completion/basic/common/NoAutopopupInGenericValName.kt @@ -0,0 +1,4 @@ +val + +// INVOCATION_COUNT: 0 +// NUMBER: 0 diff --git a/idea/testData/completion/basic/common/NoAutopopupInGenericVarName.kt b/idea/testData/completion/basic/common/NoAutopopupInGenericVarName.kt new file mode 100644 index 00000000000..b82535ab995 --- /dev/null +++ b/idea/testData/completion/basic/common/NoAutopopupInGenericVarName.kt @@ -0,0 +1,4 @@ +var a + +// INVOCATION_COUNT: 0 +// NUMBER: 0 diff --git a/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java index 42ac9d727f2..e571f044c06 100644 --- a/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JSBasicCompletionTestGenerated.java @@ -17,10 +17,13 @@ package org.jetbrains.jet.completion; import com.intellij.testFramework.TestDataPath; +import junit.framework.Test; +import junit.framework.TestSuite; +import org.junit.runner.RunWith; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.test.InnerTestClasses; import org.jetbrains.jet.test.TestMetadata; -import org.junit.runner.RunWith; +import org.jetbrains.jet.JUnit3RunnerWithInners; import java.io.File; import java.util.regex.Pattern; @@ -453,12 +456,42 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } + @TestMetadata("NoAutopopupInExtFunName.kt") + public void testNoAutopopupInExtFunName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoAutopopupInExtFunName.kt"); + doTest(fileName); + } + @TestMetadata("NoAutopopupInFunName.kt") public void testNoAutopopupInFunName() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoAutopopupInFunName.kt"); doTest(fileName); } + @TestMetadata("NoAutopopupInGenericExtFunName.kt") + public void testNoAutopopupInGenericExtFunName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoAutopopupInGenericExtFunName.kt"); + doTest(fileName); + } + + @TestMetadata("NoAutopopupInGenericFunName.kt") + public void testNoAutopopupInGenericFunName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoAutopopupInGenericFunName.kt"); + doTest(fileName); + } + + @TestMetadata("NoAutopopupInGenericValName.kt") + public void testNoAutopopupInGenericValName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoAutopopupInGenericValName.kt"); + doTest(fileName); + } + + @TestMetadata("NoAutopopupInGenericVarName.kt") + public void testNoAutopopupInGenericVarName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoAutopopupInGenericVarName.kt"); + doTest(fileName); + } + @TestMetadata("NoAutopopupInVarName.kt") public void testNoAutopopupInVarName() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoAutopopupInVarName.kt"); diff --git a/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java index 8e176e51463..a2314bbeb96 100644 --- a/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JvmBasicCompletionTestGenerated.java @@ -17,13 +17,10 @@ package org.jetbrains.jet.completion; import com.intellij.testFramework.TestDataPath; -import junit.framework.Test; -import junit.framework.TestSuite; -import org.junit.runner.RunWith; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.test.InnerTestClasses; import org.jetbrains.jet.test.TestMetadata; -import org.jetbrains.jet.JUnit3RunnerWithInners; +import org.junit.runner.RunWith; import java.io.File; import java.util.regex.Pattern; @@ -456,12 +453,42 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } + @TestMetadata("NoAutopopupInExtFunName.kt") + public void testNoAutopopupInExtFunName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoAutopopupInExtFunName.kt"); + doTest(fileName); + } + @TestMetadata("NoAutopopupInFunName.kt") public void testNoAutopopupInFunName() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoAutopopupInFunName.kt"); doTest(fileName); } + @TestMetadata("NoAutopopupInGenericExtFunName.kt") + public void testNoAutopopupInGenericExtFunName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoAutopopupInGenericExtFunName.kt"); + doTest(fileName); + } + + @TestMetadata("NoAutopopupInGenericFunName.kt") + public void testNoAutopopupInGenericFunName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoAutopopupInGenericFunName.kt"); + doTest(fileName); + } + + @TestMetadata("NoAutopopupInGenericValName.kt") + public void testNoAutopopupInGenericValName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoAutopopupInGenericValName.kt"); + doTest(fileName); + } + + @TestMetadata("NoAutopopupInGenericVarName.kt") + public void testNoAutopopupInGenericVarName() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoAutopopupInGenericVarName.kt"); + doTest(fileName); + } + @TestMetadata("NoAutopopupInVarName.kt") public void testNoAutopopupInVarName() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoAutopopupInVarName.kt");