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.name.Name
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
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.descriptorUtil.module
|
||||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindExclude
|
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindExclude
|
||||||
@@ -57,7 +58,8 @@ class CompletionSessionConfiguration(
|
|||||||
val completeNonAccessibleDeclarations: Boolean,
|
val completeNonAccessibleDeclarations: Boolean,
|
||||||
val filterOutJavaGettersAndSetters: Boolean,
|
val filterOutJavaGettersAndSetters: Boolean,
|
||||||
val completeJavaClassesNotToBeUsed: Boolean,
|
val completeJavaClassesNotToBeUsed: Boolean,
|
||||||
val completeStaticMembers: Boolean
|
val completeStaticMembers: Boolean,
|
||||||
|
val dataClassComponentFunctions: Boolean
|
||||||
)
|
)
|
||||||
|
|
||||||
fun CompletionSessionConfiguration(parameters: CompletionParameters) = CompletionSessionConfiguration(
|
fun CompletionSessionConfiguration(parameters: CompletionParameters) = CompletionSessionConfiguration(
|
||||||
@@ -65,7 +67,8 @@ fun CompletionSessionConfiguration(parameters: CompletionParameters) = Completio
|
|||||||
completeNonAccessibleDeclarations = parameters.invocationCount >= 2,
|
completeNonAccessibleDeclarations = parameters.invocationCount >= 2,
|
||||||
filterOutJavaGettersAndSetters = parameters.invocationCount < 2,
|
filterOutJavaGettersAndSetters = parameters.invocationCount < 2,
|
||||||
completeJavaClassesNotToBeUsed = parameters.invocationCount >= 2,
|
completeJavaClassesNotToBeUsed = parameters.invocationCount >= 2,
|
||||||
completeStaticMembers = parameters.invocationCount >= 2
|
completeStaticMembers = parameters.invocationCount >= 2,
|
||||||
|
dataClassComponentFunctions = parameters.invocationCount >= 2
|
||||||
)
|
)
|
||||||
|
|
||||||
abstract class CompletionSession(
|
abstract class CompletionSession(
|
||||||
@@ -343,9 +346,20 @@ abstract class CompletionSession(
|
|||||||
variants = referenceVariantsHelper.filterOutJavaGettersAndSetters(variants)
|
variants = referenceVariantsHelper.filterOutJavaGettersAndSetters(variants)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!configuration.dataClassComponentFunctions) {
|
||||||
|
variants = variants.filter { !isDataClassComponentFunction(it) }
|
||||||
|
}
|
||||||
|
|
||||||
return ReferenceVariants(variants, notImportedExtensions)
|
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? {
|
protected fun referenceVariantsWithSingleFunctionTypeParameter(): ReferenceVariants? {
|
||||||
val variants = referenceVariants ?: return null
|
val variants = referenceVariants ?: return null
|
||||||
val filter: (DeclarationDescriptor) -> Boolean = { it is FunctionDescriptor && LookupElementFactory.hasSingleFunctionTypeParameter(it) }
|
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.LookupElement
|
||||||
import com.intellij.codeInsight.lookup.LookupElementDecorator
|
import com.intellij.codeInsight.lookup.LookupElementDecorator
|
||||||
import com.intellij.openapi.editor.Document
|
import com.intellij.openapi.editor.Document
|
||||||
import com.intellij.openapi.progress.ProcessCanceledException
|
|
||||||
import com.intellij.openapi.util.Key
|
import com.intellij.openapi.util.Key
|
||||||
import com.intellij.patterns.PlatformPatterns
|
import com.intellij.patterns.PlatformPatterns
|
||||||
import com.intellij.patterns.PsiJavaPatterns.elementType
|
import com.intellij.patterns.PsiJavaPatterns.elementType
|
||||||
@@ -305,7 +304,8 @@ class KotlinCompletionContributor : CompletionContributor() {
|
|||||||
completeNonAccessibleDeclarations = false,
|
completeNonAccessibleDeclarations = false,
|
||||||
filterOutJavaGettersAndSetters = false,
|
filterOutJavaGettersAndSetters = false,
|
||||||
completeJavaClassesNotToBeUsed = false,
|
completeJavaClassesNotToBeUsed = false,
|
||||||
completeStaticMembers = parameters.invocationCount > 0
|
completeStaticMembers = parameters.invocationCount > 0,
|
||||||
|
dataClassComponentFunctions = true
|
||||||
)
|
)
|
||||||
|
|
||||||
val newSession = BasicCompletionSession(newConfiguration, parameters, toFromOriginalFileMapper, result)
|
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);
|
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")
|
@TestMetadata("ExtendClassName.kt")
|
||||||
public void testExtendClassName() throws Exception {
|
public void testExtendClassName() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/ExtendClassName.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/ExtendClassName.kt");
|
||||||
|
|||||||
+18
@@ -97,6 +97,24 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("ExtendClassName.kt")
|
||||||
public void testExtendClassName() throws Exception {
|
public void testExtendClassName() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/ExtendClassName.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/ExtendClassName.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user