KT-8664 Hide componentX() functions for data classes from completion

#KT-8664 Fixed
This commit is contained in:
Valentin Kipyatkov
2016-09-27 22:04:03 +03:00
parent 7263d0a056
commit 2f5e820afb
7 changed files with 81 additions and 4 deletions
@@ -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) }
@@ -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
@@ -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");
@@ -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");