Hiding getters and setters from completion

This commit is contained in:
Valentin Kipyatkov
2015-07-09 20:32:30 +03:00
parent 3faa0a193d
commit b33202d32d
12 changed files with 99 additions and 16 deletions
@@ -18,11 +18,11 @@
package org.jetbrains.kotlin.idea.codeInsight
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.idea.util.*
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.idea.util.CallType
import org.jetbrains.kotlin.idea.util.ShadowedDeclarationsFilter
import org.jetbrains.kotlin.idea.util.getImplicitReceiversWithInstance
import org.jetbrains.kotlin.idea.util.substituteExtensionIfCallable
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
@@ -37,9 +37,11 @@ import org.jetbrains.kotlin.resolve.scopes.JetScope
import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
import org.jetbrains.kotlin.synthetic.SyntheticExtensionPropertyDescriptor
import org.jetbrains.kotlin.types.JetType
import org.jetbrains.kotlin.types.TypeUtils
import org.jetbrains.kotlin.types.checker.JetTypeChecker
import org.jetbrains.kotlin.utils.addIfNotNull
import java.util.*
public class ReferenceVariantsHelper(
@@ -61,11 +63,28 @@ public class ReferenceVariantsHelper(
expression: JetSimpleNameExpression,
kindFilter: DescriptorKindFilter,
nameFilter: (Name) -> Boolean,
filterOutJavaGettersAndSetters: Boolean = false,
useRuntimeReceiverType: Boolean = false
): Collection<DeclarationDescriptor> {
val variants = getReferenceVariantsNoVisibilityFilter(expression, kindFilter, useRuntimeReceiverType, nameFilter)
var variants: Collection<DeclarationDescriptor>
= getReferenceVariantsNoVisibilityFilter(expression, kindFilter, useRuntimeReceiverType, nameFilter)
.filter(visibilityFilter)
return ShadowedDeclarationsFilter(context, moduleDescriptor, project).filter(variants, expression)
variants = ShadowedDeclarationsFilter(context, moduleDescriptor, project).filter(variants, expression)
if (filterOutJavaGettersAndSetters) {
val accessorMethodsToRemove = HashSet<FunctionDescriptor>()
for (variant in variants) {
if (variant is SyntheticExtensionPropertyDescriptor) {
accessorMethodsToRemove.add(variant.getMethod)
accessorMethodsToRemove.addIfNotNull(variant.setMethod)
}
}
variants = variants.filter { it !in accessorMethodsToRemove }
}
return variants
}
private fun getReferenceVariantsNoVisibilityFilter(
@@ -61,11 +61,15 @@ import kotlin.properties.Delegates
class CompletionSessionConfiguration(
val completeNonImportedDeclarations: Boolean,
val completeNonAccessibleDeclarations: Boolean)
val completeNonAccessibleDeclarations: Boolean,
val filterOutJavaGettersAndSetters: Boolean
)
fun CompletionSessionConfiguration(parameters: CompletionParameters) = CompletionSessionConfiguration(
completeNonImportedDeclarations = parameters.getInvocationCount() >= 2,
completeNonAccessibleDeclarations = parameters.getInvocationCount() >= 2)
completeNonAccessibleDeclarations = parameters.getInvocationCount() >= 2,
filterOutJavaGettersAndSetters = parameters.getInvocationCount() < 2
)
abstract class CompletionSession(protected val configuration: CompletionSessionConfiguration,
protected val parameters: CompletionParameters,
@@ -208,7 +212,7 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC
protected val referenceVariants: Collection<DeclarationDescriptor> by Delegates.lazy {
if (descriptorKindFilter != null) {
val expression = reference!!.expression
referenceVariantsHelper.getReferenceVariants(expression, descriptorKindFilter!!, prefixMatcher.asNameFilter())
referenceVariantsHelper.getReferenceVariants(expression, descriptorKindFilter!!, prefixMatcher.asNameFilter(), filterOutJavaGettersAndSetters = configuration.filterOutJavaGettersAndSetters)
.excludeNonInitializedVariable(expression)
}
else {
@@ -249,7 +249,8 @@ public class KotlinCompletionContributor : CompletionContributor() {
if (!somethingAdded && parameters.getInvocationCount() < 2) {
// Rerun completion if nothing was found
val newConfiguration = CompletionSessionConfiguration(completeNonImportedDeclarations = true,
completeNonAccessibleDeclarations = false)
completeNonAccessibleDeclarations = false,
filterOutJavaGettersAndSetters = false)
BasicCompletionSession(newConfiguration, parameters, result).complete()
}
}
@@ -0,0 +1,8 @@
import java.io.File
fun File.foo(absolutePath: String) {
<caret>
}
// EXIST_JAVA_ONLY: getAbsolutePath
// ABSENT: { itemText: "absolutePath", tailText: " for File" }
@@ -0,0 +1,5 @@
fun foo(thread: Thread) {
thread.get<caret>
}
// EXIST_JAVA_ONLY: getPriority
@@ -0,0 +1,8 @@
fun foo(thread: Thread) {
thread.<caret>
}
// INVOCATION_COUNT: 2
// EXIST_JAVA_ONLY: { lookupString: "priority", itemText: "priority", tailText: " for Thread", typeText: "Int" }
// EXIST_JAVA_ONLY: getPriority
// EXIST_JAVA_ONLY: setPriority
@@ -5,3 +5,4 @@ fun foo(file: File) {
}
// EXIST_JAVA_ONLY: { lookupString: "absolutePath", itemText: "absolutePath", tailText: " for File", typeText: "String!" }
// ABSENT: getAbsolutePath
@@ -1,7 +1,7 @@
import java.io.File
fun File.foo() {
fun Thread.foo() {
<caret>
}
// EXIST_JAVA_ONLY: { lookupString: "absolutePath", itemText: "absolutePath", tailText: " for File", typeText: "String!" }
// EXIST_JAVA_ONLY: { lookupString: "priority", itemText: "priority", tailText: " for Thread", typeText: "Int" }
// ABSENT: getPriority
// ABSENT: setPriority
@@ -5,3 +5,4 @@ fun foo(file: File?) {
}
// EXIST_JAVA_ONLY: { lookupString: "absolutePath", itemText: "absolutePath", tailText: " for File", typeText: "String!" }
// ABSENT: getAbsolutePath
@@ -1107,6 +1107,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
doTest(fileName);
}
@TestMetadata("DoNotHideGetterWhenExtensionCannotBeUsed.kt")
public void testDoNotHideGetterWhenExtensionCannotBeUsed() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/extensions/DoNotHideGetterWhenExtensionCannotBeUsed.kt");
doTest(fileName);
}
@TestMetadata("ExtensionInExtendedClass.kt")
public void testExtensionInExtendedClass() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/extensions/ExtensionInExtendedClass.kt");
@@ -1209,6 +1215,18 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
doTest(fileName);
}
@TestMetadata("ShowGetMethodWhenNothingElseMatch.kt")
public void testShowGetMethodWhenNothingElseMatch() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/extensions/ShowGetMethodWhenNothingElseMatch.kt");
doTest(fileName);
}
@TestMetadata("ShowGetSetOnSecondCompletion.kt")
public void testShowGetSetOnSecondCompletion() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/extensions/ShowGetSetOnSecondCompletion.kt");
doTest(fileName);
}
@TestMetadata("SyntheticExtensions1.kt")
public void testSyntheticExtensions1() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/extensions/SyntheticExtensions1.kt");
@@ -1107,6 +1107,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
doTest(fileName);
}
@TestMetadata("DoNotHideGetterWhenExtensionCannotBeUsed.kt")
public void testDoNotHideGetterWhenExtensionCannotBeUsed() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/extensions/DoNotHideGetterWhenExtensionCannotBeUsed.kt");
doTest(fileName);
}
@TestMetadata("ExtensionInExtendedClass.kt")
public void testExtensionInExtendedClass() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/extensions/ExtensionInExtendedClass.kt");
@@ -1209,6 +1215,18 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
doTest(fileName);
}
@TestMetadata("ShowGetMethodWhenNothingElseMatch.kt")
public void testShowGetMethodWhenNothingElseMatch() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/extensions/ShowGetMethodWhenNothingElseMatch.kt");
doTest(fileName);
}
@TestMetadata("ShowGetSetOnSecondCompletion.kt")
public void testShowGetSetOnSecondCompletion() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/extensions/ShowGetSetOnSecondCompletion.kt");
doTest(fileName);
}
@TestMetadata("SyntheticExtensions1.kt")
public void testSyntheticExtensions1() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/extensions/SyntheticExtensions1.kt");
@@ -414,7 +414,7 @@ public class JetFunctionParameterInfoHandler implements ParameterInfoHandlerWith
};
Collection<DeclarationDescriptor> variants = new ReferenceVariantsHelper(bindingContext, moduleDescriptor, file.getProject(), visibilityFilter).getReferenceVariants(
callNameExpression, new DescriptorKindFilter(DescriptorKindFilter.FUNCTIONS_MASK | DescriptorKindFilter.CLASSIFIERS_MASK,
Collections.<DescriptorKindExclude>emptyList()), nameFilter, false);
Collections.<DescriptorKindExclude>emptyList()), nameFilter, false, false);
Collection<Pair<? extends DeclarationDescriptor, ResolutionFacade>> itemsToShow = new ArrayList<Pair<? extends DeclarationDescriptor, ResolutionFacade>>();
for (DeclarationDescriptor variant : variants) {