From ec1541a692d2e870b3312fd3507b463a172eee78 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 22 Dec 2014 21:33:48 +0300 Subject: [PATCH] No completion auto-popup where parameter name can be --- .../idea/completion/CompletionSession.kt | 87 ++++++++++--------- .../completion/KotlinCompletionContributor.kt | 9 +- .../NoParameterAnnotationAutoPopup1.kt | 4 + .../NoParameterAnnotationAutoPopup2.kt | 4 + .../annotations/ParameterAnnotation1.kt | 3 + .../annotations/ParameterAnnotation2.kt | 4 + .../annotations/ParameterAnnotation3.kt | 3 + .../annotations/ParameterAnnotation4.kt | 3 + .../annotations/ParameterAnnotation5.kt | 3 + .../annotations/ParameterAnnotation6.kt | 1 + .../annotations/ParameterAnnotation7.kt.todo | 3 +- .../annotations/ParameterAnnotation8.kt | 3 + .../annotations/ParameterAnnotation9.kt | 3 + .../annotations/ParameterAnnotationArgs.kt | 1 + .../ParameterAnnotationAutoPopup1.kt | 8 ++ .../ParameterAnnotationAutoPopup2.kt | 8 ++ .../JSBasicCompletionTestGenerated.java | 24 +++++ .../JvmBasicCompletionTestGenerated.java | 24 +++++ 18 files changed, 154 insertions(+), 41 deletions(-) create mode 100644 idea/testData/completion/basic/common/annotations/NoParameterAnnotationAutoPopup1.kt create mode 100644 idea/testData/completion/basic/common/annotations/NoParameterAnnotationAutoPopup2.kt create mode 100644 idea/testData/completion/basic/common/annotations/ParameterAnnotationAutoPopup1.kt create mode 100644 idea/testData/completion/basic/common/annotations/ParameterAnnotationAutoPopup2.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt b/idea/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt index 01a5c09c435..1bc4a17b596 100644 --- a/idea/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt +++ b/idea/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt @@ -46,7 +46,7 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import com.intellij.patterns.StandardPatterns import com.intellij.util.ProcessingContext import com.intellij.patterns.PatternCondition -import org.jetbrains.jet.lang.psi.psiUtil.isAncestor +import org.jetbrains.kotlin.psi.psiUtil.isAncestor class CompletionSessionConfiguration( val completeNonImportedDeclarations: Boolean, @@ -216,17 +216,60 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration, resultSet: CompletionResultSet) : CompletionSessionBase(configuration, parameters, resultSet) { + public enum class CompletionKind { + KEYWORDS_ONLY + NAMED_PARAMETERS_ONLY + ALL + TYPES + ANNOTATION_TYPES + ANNOTATION_TYPES_OR_PARAMETER_NAME + } + + public val completionKind: CompletionKind = calcCompletionKind() + + private fun calcCompletionKind(): CompletionKind { + if (NamedParametersCompletion.isOnlyNamedParameterExpected(position)) { + return CompletionKind.NAMED_PARAMETERS_ONLY + } + + if (reference == null) { + return CompletionKind.KEYWORDS_ONLY + } + + val annotationEntry = position.getStrictParentOfType() + if (annotationEntry != null) { + val valueArgList = position.getStrictParentOfType() + if (valueArgList == null || !annotationEntry.isAncestor(valueArgList)) { + val parent = annotationEntry.getParent() + if (parent is JetDeclarationModifierList && parent.getParent() is JetParameter) { + return CompletionKind.ANNOTATION_TYPES_OR_PARAMETER_NAME + } + return CompletionKind.ANNOTATION_TYPES + } + } + + // Check that completion in the type annotation context and if there's a qualified + // expression we are at first of it + val typeReference = position.getStrictParentOfType() + if (typeReference != null) { + val firstPartReference = PsiTreeUtil.findChildOfType(typeReference, javaClass()) + if (firstPartReference == reference.expression) { + return CompletionKind.TYPES + } + } + + return CompletionKind.ALL + } + override fun doComplete() { assert(parameters.getCompletionType() == CompletionType.BASIC) - val completionKind = completionKind() - if (completionKind != CompletionKind.NAMED_PARAMETERS_ONLY) { val kindFilter = when (completionKind) { CompletionKind.TYPES -> DescriptorKindFilter(DescriptorKindFilter.CLASSIFIERS_MASK or DescriptorKindFilter.PACKAGES_MASK) exclude DescriptorKindExclude.EnumEntry - CompletionKind.ANNOTATION_TYPES -> + CompletionKind.ANNOTATION_TYPES, CompletionKind.ANNOTATION_TYPES_OR_PARAMETER_NAME -> DescriptorKindFilter(DescriptorKindFilter.NON_SINGLETON_CLASSIFIERS_MASK or DescriptorKindFilter.PACKAGES_MASK) exclude NonAnnotationClassifierExclude else -> @@ -296,7 +339,7 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration, private fun addNonImported(completionKind: CompletionKind) { if (shouldRunTopLevelCompletion()) { addAllClasses { - if (completionKind != CompletionKind.ANNOTATION_TYPES) + if (completionKind != CompletionKind.ANNOTATION_TYPES && completionKind != CompletionKind.ANNOTATION_TYPES_OR_PARAMETER_NAME) it != ClassKind.ENUM_ENTRY else it == ClassKind.ANNOTATION_CLASS @@ -312,40 +355,6 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration, } } - private enum class CompletionKind { - KEYWORDS_ONLY - NAMED_PARAMETERS_ONLY - ALL - TYPES - ANNOTATION_TYPES - } - - private fun completionKind(): CompletionKind { - if (NamedParametersCompletion.isOnlyNamedParameterExpected(position)) return CompletionKind.NAMED_PARAMETERS_ONLY - - if (reference == null) return CompletionKind.KEYWORDS_ONLY - - val modifierList = position.getStrictParentOfType() - if (modifierList != null) { - val valueArgList = position.getStrictParentOfType() - if (valueArgList == null || !modifierList.isAncestor(valueArgList)) { - return CompletionKind.ANNOTATION_TYPES - } - } - - // Check that completion in the type annotation context and if there's a qualified - // expression we are at first of it - val typeReference = position.getStrictParentOfType() - if (typeReference != null) { - val firstPartReference = PsiTreeUtil.findChildOfType(typeReference, javaClass()) - if (firstPartReference == reference.expression) { - return CompletionKind.TYPES - } - } - - return CompletionKind.ALL - } - private fun addReferenceVariants(kindFilter: DescriptorKindFilter, shouldCastToRuntimeType: Boolean) { collector.addDescriptorElements( getReferenceVariants(kindFilter, shouldCastToRuntimeType), diff --git a/idea/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt b/idea/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt index 845460126e5..1cea527f590 100644 --- a/idea/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt @@ -207,7 +207,14 @@ public class KotlinCompletionContributor : CompletionContributor() { val configuration = CompletionSessionConfiguration(parameters) if (parameters.getCompletionType() == CompletionType.BASIC) { - val somethingAdded = BasicCompletionSession(configuration, parameters, result).complete() + val session = BasicCompletionSession(configuration, parameters, result) + + if (session.completionKind == BasicCompletionSession.CompletionKind.ANNOTATION_TYPES_OR_PARAMETER_NAME && parameters.isAutoPopup()) { + result.stopHere() + return + } + + val somethingAdded = session.complete() if (!somethingAdded && parameters.getInvocationCount() < 2) { // Rerun completion if nothing was found val newConfiguration = CompletionSessionConfiguration(completeNonImportedDeclarations = true, diff --git a/idea/testData/completion/basic/common/annotations/NoParameterAnnotationAutoPopup1.kt b/idea/testData/completion/basic/common/annotations/NoParameterAnnotationAutoPopup1.kt new file mode 100644 index 00000000000..30d1f85466c --- /dev/null +++ b/idea/testData/completion/basic/common/annotations/NoParameterAnnotationAutoPopup1.kt @@ -0,0 +1,4 @@ +fun foo(i) { } + +// INVOCATION_COUNT: 0 +// NUMBER: 0 diff --git a/idea/testData/completion/basic/common/annotations/NoParameterAnnotationAutoPopup2.kt b/idea/testData/completion/basic/common/annotations/NoParameterAnnotationAutoPopup2.kt new file mode 100644 index 00000000000..a861e7fb97f --- /dev/null +++ b/idea/testData/completion/basic/common/annotations/NoParameterAnnotationAutoPopup2.kt @@ -0,0 +1,4 @@ +fun foo([inlineOptions] i) { } + +// INVOCATION_COUNT: 0 +// NUMBER: 0 diff --git a/idea/testData/completion/basic/common/annotations/ParameterAnnotation1.kt b/idea/testData/completion/basic/common/annotations/ParameterAnnotation1.kt index 43fd1e7effe..9f7c3307060 100644 --- a/idea/testData/completion/basic/common/annotations/ParameterAnnotation1.kt +++ b/idea/testData/completion/basic/common/annotations/ParameterAnnotation1.kt @@ -1,7 +1,10 @@ +annotation class Hello val v = 1 fun foo() { } +// INVOCATION_COUNT: 1 +// EXIST: Hello // EXIST: inlineOptions // ABSENT: String // ABSENT: v diff --git a/idea/testData/completion/basic/common/annotations/ParameterAnnotation2.kt b/idea/testData/completion/basic/common/annotations/ParameterAnnotation2.kt index 260fb160d56..7b81e7d3ea1 100644 --- a/idea/testData/completion/basic/common/annotations/ParameterAnnotation2.kt +++ b/idea/testData/completion/basic/common/annotations/ParameterAnnotation2.kt @@ -1,3 +1,7 @@ +annotation class iHello + fun foo(i) { } +// INVOCATION_COUNT: 1 +// EXIST: iHello // EXIST: inlineOptions diff --git a/idea/testData/completion/basic/common/annotations/ParameterAnnotation3.kt b/idea/testData/completion/basic/common/annotations/ParameterAnnotation3.kt index 30ad74e4f1f..22dd7cd1829 100644 --- a/idea/testData/completion/basic/common/annotations/ParameterAnnotation3.kt +++ b/idea/testData/completion/basic/common/annotations/ParameterAnnotation3.kt @@ -1,7 +1,10 @@ +annotation class Hello val v = 1 fun foo(p: String, ) { } +// INVOCATION_COUNT: 1 +// EXIST: Hello // EXIST: inlineOptions // ABSENT: String // ABSENT: v diff --git a/idea/testData/completion/basic/common/annotations/ParameterAnnotation4.kt b/idea/testData/completion/basic/common/annotations/ParameterAnnotation4.kt index 54bf47aa6c9..e49c8f90aaa 100644 --- a/idea/testData/completion/basic/common/annotations/ParameterAnnotation4.kt +++ b/idea/testData/completion/basic/common/annotations/ParameterAnnotation4.kt @@ -1,7 +1,10 @@ +annotation class Hello val v = 1 fun foo(volatile ) { } +// INVOCATION_COUNT: 1 +// EXIST: Hello // EXIST: inlineOptions // ABSENT: String // ABSENT: v diff --git a/idea/testData/completion/basic/common/annotations/ParameterAnnotation5.kt b/idea/testData/completion/basic/common/annotations/ParameterAnnotation5.kt index e7e54fb0325..0f5c30c94e6 100644 --- a/idea/testData/completion/basic/common/annotations/ParameterAnnotation5.kt +++ b/idea/testData/completion/basic/common/annotations/ParameterAnnotation5.kt @@ -1,7 +1,10 @@ +annotation class Hello val v = 1 fun foo( +// INVOCATION_COUNT: 1 +// EXIST: Hello // EXIST: inlineOptions // ABSENT: String // ABSENT: v diff --git a/idea/testData/completion/basic/common/annotations/ParameterAnnotation6.kt b/idea/testData/completion/basic/common/annotations/ParameterAnnotation6.kt index 4698e6ee538..fa108725d8a 100644 --- a/idea/testData/completion/basic/common/annotations/ParameterAnnotation6.kt +++ b/idea/testData/completion/basic/common/annotations/ParameterAnnotation6.kt @@ -2,6 +2,7 @@ val v = 1 fun foo(inlineOptions(InlineOp) { } +// INVOCATION_COUNT: 1 // EXIST: InlineOption // ABSENT: String // ABSENT: v diff --git a/idea/testData/completion/basic/common/annotations/ParameterAnnotation7.kt.todo b/idea/testData/completion/basic/common/annotations/ParameterAnnotation7.kt.todo index f4fef0c786c..871f085ab09 100644 --- a/idea/testData/completion/basic/common/annotations/ParameterAnnotation7.kt.todo +++ b/idea/testData/completion/basic/common/annotations/ParameterAnnotation7.kt.todo @@ -1,4 +1,5 @@ -fun foo(koltin.) { } +fun foo(kotlin.) { } +// INVOCATION_COUNT: 1 // EXIST: inlineOptions // ABSENT: String diff --git a/idea/testData/completion/basic/common/annotations/ParameterAnnotation8.kt b/idea/testData/completion/basic/common/annotations/ParameterAnnotation8.kt index d1e6ee65ecb..c3e5c96d7aa 100644 --- a/idea/testData/completion/basic/common/annotations/ParameterAnnotation8.kt +++ b/idea/testData/completion/basic/common/annotations/ParameterAnnotation8.kt @@ -1,7 +1,10 @@ +annotation class Hello val v = 1 fun foo([) { } +// INVOCATION_COUNT: 1 +// EXIST: Hello // EXIST: inlineOptions // ABSENT: String // ABSENT: v diff --git a/idea/testData/completion/basic/common/annotations/ParameterAnnotation9.kt b/idea/testData/completion/basic/common/annotations/ParameterAnnotation9.kt index 031752bfc32..64b9118d576 100644 --- a/idea/testData/completion/basic/common/annotations/ParameterAnnotation9.kt +++ b/idea/testData/completion/basic/common/annotations/ParameterAnnotation9.kt @@ -1,7 +1,10 @@ +annotation class iHello val v = 1 fun foo([i) { } +// INVOCATION_COUNT: 1 +// EXIST: iHello // EXIST: inlineOptions // ABSENT: String // ABSENT: v diff --git a/idea/testData/completion/basic/common/annotations/ParameterAnnotationArgs.kt b/idea/testData/completion/basic/common/annotations/ParameterAnnotationArgs.kt index ee181c79585..f3b6bbb8826 100644 --- a/idea/testData/completion/basic/common/annotations/ParameterAnnotationArgs.kt +++ b/idea/testData/completion/basic/common/annotations/ParameterAnnotationArgs.kt @@ -2,6 +2,7 @@ val v = 1 fun foo(inlineOptions() { } +// INVOCATION_COUNT: 1 // EXIST: InlineOption // EXIST: String // EXIST: v diff --git a/idea/testData/completion/basic/common/annotations/ParameterAnnotationAutoPopup1.kt b/idea/testData/completion/basic/common/annotations/ParameterAnnotationAutoPopup1.kt new file mode 100644 index 00000000000..dd539b132a8 --- /dev/null +++ b/idea/testData/completion/basic/common/annotations/ParameterAnnotationAutoPopup1.kt @@ -0,0 +1,8 @@ +val v = 1 + +fun foo([i) { } + +// INVOCATION_COUNT: 0 +// EXIST: inlineOptions +// ABSENT: String +// ABSENT: v diff --git a/idea/testData/completion/basic/common/annotations/ParameterAnnotationAutoPopup2.kt b/idea/testData/completion/basic/common/annotations/ParameterAnnotationAutoPopup2.kt new file mode 100644 index 00000000000..a7b6a5450a9 --- /dev/null +++ b/idea/testData/completion/basic/common/annotations/ParameterAnnotationAutoPopup2.kt @@ -0,0 +1,8 @@ +val v = 1 + +fun foo([volatile i) { } + +// INVOCATION_COUNT: 0 +// EXIST: inlineOptions +// ABSENT: String +// ABSENT: v diff --git a/idea/tests/org/jetbrains/kotlin/completion/JSBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/completion/JSBasicCompletionTestGenerated.java index f4bb381764a..f9cee1bce7c 100644 --- a/idea/tests/org/jetbrains/kotlin/completion/JSBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/completion/JSBasicCompletionTestGenerated.java @@ -900,6 +900,18 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/completion/basic/common/annotations"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("NoParameterAnnotationAutoPopup1.kt") + public void testNoParameterAnnotationAutoPopup1() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/annotations/NoParameterAnnotationAutoPopup1.kt"); + doTest(fileName); + } + + @TestMetadata("NoParameterAnnotationAutoPopup2.kt") + public void testNoParameterAnnotationAutoPopup2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/annotations/NoParameterAnnotationAutoPopup2.kt"); + doTest(fileName); + } + @TestMetadata("ParameterAnnotation1.kt") public void testParameterAnnotation1() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/annotations/ParameterAnnotation1.kt"); @@ -953,6 +965,18 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/annotations/ParameterAnnotationArgs.kt"); doTest(fileName); } + + @TestMetadata("ParameterAnnotationAutoPopup1.kt") + public void testParameterAnnotationAutoPopup1() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/annotations/ParameterAnnotationAutoPopup1.kt"); + doTest(fileName); + } + + @TestMetadata("ParameterAnnotationAutoPopup2.kt") + public void testParameterAnnotationAutoPopup2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/annotations/ParameterAnnotationAutoPopup2.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/completion/basic/common/extensions") diff --git a/idea/tests/org/jetbrains/kotlin/completion/JvmBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/completion/JvmBasicCompletionTestGenerated.java index 7a41d05477c..4fbea8317e8 100644 --- a/idea/tests/org/jetbrains/kotlin/completion/JvmBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/completion/JvmBasicCompletionTestGenerated.java @@ -900,6 +900,18 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/completion/basic/common/annotations"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("NoParameterAnnotationAutoPopup1.kt") + public void testNoParameterAnnotationAutoPopup1() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/annotations/NoParameterAnnotationAutoPopup1.kt"); + doTest(fileName); + } + + @TestMetadata("NoParameterAnnotationAutoPopup2.kt") + public void testNoParameterAnnotationAutoPopup2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/annotations/NoParameterAnnotationAutoPopup2.kt"); + doTest(fileName); + } + @TestMetadata("ParameterAnnotation1.kt") public void testParameterAnnotation1() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/annotations/ParameterAnnotation1.kt"); @@ -953,6 +965,18 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/annotations/ParameterAnnotationArgs.kt"); doTest(fileName); } + + @TestMetadata("ParameterAnnotationAutoPopup1.kt") + public void testParameterAnnotationAutoPopup1() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/annotations/ParameterAnnotationAutoPopup1.kt"); + doTest(fileName); + } + + @TestMetadata("ParameterAnnotationAutoPopup2.kt") + public void testParameterAnnotationAutoPopup2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/annotations/ParameterAnnotationAutoPopup2.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/completion/basic/common/extensions")