KT-8664 Hide componentX() functions for data classes from completion
#KT-8664 Fixed
This commit is contained in:
@@ -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) }
|
||||
|
||||
+2
-2
@@ -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)
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
data class X {
|
||||
operator fun component1(): Int = 0
|
||||
}
|
||||
|
||||
fun foo(x: X) {
|
||||
x.<caret>
|
||||
}
|
||||
|
||||
// EXIST: component1
|
||||
@@ -0,0 +1,10 @@
|
||||
data class Data(val val1: Int, val val2: String)
|
||||
|
||||
fun foo(d: Data) {
|
||||
d.<caret>
|
||||
}
|
||||
|
||||
// EXIST: val1
|
||||
// EXIST: val2
|
||||
// ABSENT: component1
|
||||
// ABSENT: component2
|
||||
@@ -0,0 +1,8 @@
|
||||
data class Data(val val1: Int, val val2: String)
|
||||
|
||||
fun foo(d: Data) {
|
||||
d.comp<caret>
|
||||
}
|
||||
|
||||
// EXIST: component1
|
||||
// EXIST: component2
|
||||
+18
@@ -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");
|
||||
|
||||
+18
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user