diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt index c3f2fcca18a..c368d89a2b6 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt @@ -40,6 +40,7 @@ import org.jetbrains.kotlin.idea.util.* import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf +import org.jetbrains.kotlin.resolve.DataClassDescriptorResolver import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.DescriptorKindExclude @@ -57,7 +58,8 @@ class CompletionSessionConfiguration( val completeNonAccessibleDeclarations: Boolean, val filterOutJavaGettersAndSetters: Boolean, val completeJavaClassesNotToBeUsed: Boolean, - val completeStaticMembers: Boolean + val completeStaticMembers: Boolean, + val dataClassComponentFunctions: Boolean ) fun CompletionSessionConfiguration(parameters: CompletionParameters) = CompletionSessionConfiguration( @@ -65,7 +67,8 @@ fun CompletionSessionConfiguration(parameters: CompletionParameters) = Completio completeNonAccessibleDeclarations = parameters.invocationCount >= 2, filterOutJavaGettersAndSetters = parameters.invocationCount < 2, completeJavaClassesNotToBeUsed = parameters.invocationCount >= 2, - completeStaticMembers = parameters.invocationCount >= 2 + completeStaticMembers = parameters.invocationCount >= 2, + dataClassComponentFunctions = parameters.invocationCount >= 2 ) abstract class CompletionSession( @@ -343,9 +346,20 @@ abstract class CompletionSession( variants = referenceVariantsHelper.filterOutJavaGettersAndSetters(variants) } + if (!configuration.dataClassComponentFunctions) { + variants = variants.filter { !isDataClassComponentFunction(it) } + } + return ReferenceVariants(variants, notImportedExtensions) } + private fun isDataClassComponentFunction(descriptor: DeclarationDescriptor): Boolean { + return descriptor is FunctionDescriptor && + descriptor.isOperator && + DataClassDescriptorResolver.isComponentLike(descriptor.name) && + descriptor.kind == CallableMemberDescriptor.Kind.SYNTHESIZED + } + protected fun referenceVariantsWithSingleFunctionTypeParameter(): ReferenceVariants? { val variants = referenceVariants ?: return null val filter: (DeclarationDescriptor) -> Boolean = { it is FunctionDescriptor && LookupElementFactory.hasSingleFunctionTypeParameter(it) } diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt index f5c9bbce839..bceec70d434 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/KotlinCompletionContributor.kt @@ -20,7 +20,6 @@ import com.intellij.codeInsight.completion.* import com.intellij.codeInsight.lookup.LookupElement import com.intellij.codeInsight.lookup.LookupElementDecorator import com.intellij.openapi.editor.Document -import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.util.Key import com.intellij.patterns.PlatformPatterns import com.intellij.patterns.PsiJavaPatterns.elementType @@ -305,7 +304,8 @@ class KotlinCompletionContributor : CompletionContributor() { completeNonAccessibleDeclarations = false, filterOutJavaGettersAndSetters = false, completeJavaClassesNotToBeUsed = false, - completeStaticMembers = parameters.invocationCount > 0 + completeStaticMembers = parameters.invocationCount > 0, + dataClassComponentFunctions = true ) val newSession = BasicCompletionSession(newConfiguration, parameters, toFromOriginalFileMapper, result) diff --git a/idea/idea-completion/testData/basic/common/ComponentFunction.kt b/idea/idea-completion/testData/basic/common/ComponentFunction.kt new file mode 100644 index 00000000000..3308da60981 --- /dev/null +++ b/idea/idea-completion/testData/basic/common/ComponentFunction.kt @@ -0,0 +1,9 @@ +data class X { + operator fun component1(): Int = 0 +} + +fun foo(x: X) { + x. +} + +// EXIST: component1 diff --git a/idea/idea-completion/testData/basic/common/DataClassMembers.kt b/idea/idea-completion/testData/basic/common/DataClassMembers.kt new file mode 100644 index 00000000000..35087ead156 --- /dev/null +++ b/idea/idea-completion/testData/basic/common/DataClassMembers.kt @@ -0,0 +1,10 @@ +data class Data(val val1: Int, val val2: String) + +fun foo(d: Data) { + d. +} + +// EXIST: val1 +// EXIST: val2 +// ABSENT: component1 +// ABSENT: component2 \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/common/DataClassMembers2.kt b/idea/idea-completion/testData/basic/common/DataClassMembers2.kt new file mode 100644 index 00000000000..109190726d9 --- /dev/null +++ b/idea/idea-completion/testData/basic/common/DataClassMembers2.kt @@ -0,0 +1,8 @@ +data class Data(val val1: Int, val val2: String) + +fun foo(d: Data) { + d.comp +} + +// EXIST: component1 +// EXIST: component2 \ No newline at end of file diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java index c38608fe871..a7f3cc6ee32 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java @@ -97,6 +97,24 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } + @TestMetadata("ComponentFunction.kt") + public void testComponentFunction() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/ComponentFunction.kt"); + doTest(fileName); + } + + @TestMetadata("DataClassMembers.kt") + public void testDataClassMembers() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/DataClassMembers.kt"); + doTest(fileName); + } + + @TestMetadata("DataClassMembers2.kt") + public void testDataClassMembers2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/DataClassMembers2.kt"); + doTest(fileName); + } + @TestMetadata("ExtendClassName.kt") public void testExtendClassName() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/ExtendClassName.kt"); diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java index 5426e969bf7..feb3091f96a 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java @@ -97,6 +97,24 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } + @TestMetadata("ComponentFunction.kt") + public void testComponentFunction() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/ComponentFunction.kt"); + doTest(fileName); + } + + @TestMetadata("DataClassMembers.kt") + public void testDataClassMembers() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/DataClassMembers.kt"); + doTest(fileName); + } + + @TestMetadata("DataClassMembers2.kt") + public void testDataClassMembers2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/DataClassMembers2.kt"); + doTest(fileName); + } + @TestMetadata("ExtendClassName.kt") public void testExtendClassName() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/ExtendClassName.kt");