No duplication for parameter name/types from current file and from classes
This commit is contained in:
+22
-6
@@ -34,10 +34,15 @@ import org.jetbrains.kotlin.idea.core.KotlinIndicesHelper
|
|||||||
import org.jetbrains.kotlin.idea.core.formatter.JetCodeStyleSettings
|
import org.jetbrains.kotlin.idea.core.formatter.JetCodeStyleSettings
|
||||||
import org.jetbrains.kotlin.idea.core.refactoring.EmptyValidator
|
import org.jetbrains.kotlin.idea.core.refactoring.EmptyValidator
|
||||||
import org.jetbrains.kotlin.idea.core.refactoring.JetNameSuggester
|
import org.jetbrains.kotlin.idea.core.refactoring.JetNameSuggester
|
||||||
|
import org.jetbrains.kotlin.idea.imports.importableFqName
|
||||||
|
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType
|
import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
||||||
|
import org.jetbrains.kotlin.renderer.render
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor
|
||||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||||
import org.jetbrains.kotlin.resolve.scopes.JetScope
|
import org.jetbrains.kotlin.resolve.scopes.JetScope
|
||||||
import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered
|
import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered
|
||||||
@@ -141,37 +146,48 @@ class ParameterNameAndTypeCompletion(
|
|||||||
|
|
||||||
private abstract class NameAndType(val parameterName: String) {
|
private abstract class NameAndType(val parameterName: String) {
|
||||||
abstract fun createTypeLookupElement(lookupElementFactory: LookupElementFactory): LookupElement?
|
abstract fun createTypeLookupElement(lookupElementFactory: LookupElementFactory): LookupElement?
|
||||||
|
abstract val typeIdString: String // types with equal id-string are considered as equal (used to avoid duplicated items)
|
||||||
}
|
}
|
||||||
|
|
||||||
private class NameAndDescriptorType(parameterName: String, private val type: ClassifierDescriptor) : NameAndType(parameterName) {
|
private class NameAndDescriptorType(parameterName: String, private val classifier: ClassifierDescriptor) : NameAndType(parameterName) {
|
||||||
override fun createTypeLookupElement(lookupElementFactory: LookupElementFactory)
|
override fun createTypeLookupElement(lookupElementFactory: LookupElementFactory)
|
||||||
= lookupElementFactory.createLookupElement(type, false)
|
= lookupElementFactory.createLookupElement(classifier, false)
|
||||||
|
|
||||||
|
override val typeIdString: String
|
||||||
|
get() = DescriptorUtils.getFqName(classifier).render()
|
||||||
}
|
}
|
||||||
|
|
||||||
private class NameAndJavaType(parameterName: String, private val type: PsiClass) : NameAndType(parameterName) {
|
private class NameAndJavaType(parameterName: String, private val psiClass: PsiClass) : NameAndType(parameterName) {
|
||||||
override fun createTypeLookupElement(lookupElementFactory: LookupElementFactory)
|
override fun createTypeLookupElement(lookupElementFactory: LookupElementFactory)
|
||||||
= lookupElementFactory.createLookupElementForJavaClass(type)
|
= lookupElementFactory.createLookupElementForJavaClass(psiClass)
|
||||||
|
|
||||||
|
override val typeIdString: String
|
||||||
|
get() = psiClass.getQualifiedName()!!
|
||||||
}
|
}
|
||||||
|
|
||||||
private class NameAndArbitraryType(parameterName: String, private val type: JetType) : NameAndType(parameterName) {
|
private class NameAndArbitraryType(parameterName: String, private val type: JetType) : NameAndType(parameterName) {
|
||||||
override fun createTypeLookupElement(lookupElementFactory: LookupElementFactory)
|
override fun createTypeLookupElement(lookupElementFactory: LookupElementFactory)
|
||||||
= lookupElementFactory.createLookupElementForType(type)
|
= lookupElementFactory.createLookupElementForType(type)
|
||||||
|
|
||||||
|
override val typeIdString: String
|
||||||
|
get() = IdeDescriptorRenderers.SOURCE_CODE.renderType(type)
|
||||||
}
|
}
|
||||||
|
|
||||||
private class MyLookupElement private constructor(
|
private class MyLookupElement private constructor(
|
||||||
private val parameterName: String,
|
private val parameterName: String,
|
||||||
|
private val typeIdString: String,
|
||||||
typeLookupElement: LookupElement
|
typeLookupElement: LookupElement
|
||||||
) : LookupElementDecorator<LookupElement>(typeLookupElement) {
|
) : LookupElementDecorator<LookupElement>(typeLookupElement) {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun create(nameAndType: NameAndType, factory: LookupElementFactory): LookupElement? {
|
fun create(nameAndType: NameAndType, factory: LookupElementFactory): LookupElement? {
|
||||||
val lookupElement = nameAndType.createTypeLookupElement(factory) ?: return null
|
val lookupElement = nameAndType.createTypeLookupElement(factory) ?: return null
|
||||||
return MyLookupElement(nameAndType.parameterName, lookupElement).suppressAutoInsertion()
|
return MyLookupElement(nameAndType.parameterName, nameAndType.typeIdString, lookupElement).suppressAutoInsertion()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun equals(other: Any?)
|
override fun equals(other: Any?)
|
||||||
= other is MyLookupElement && parameterName == other.parameterName && getDelegate() == other.getDelegate()
|
= other is MyLookupElement && parameterName == other.parameterName && typeIdString == other.typeIdString
|
||||||
override fun hashCode() = parameterName.hashCode()
|
override fun hashCode() = parameterName.hashCode()
|
||||||
|
|
||||||
override fun getLookupString() = parameterName
|
override fun getLookupString() = parameterName
|
||||||
|
|||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
package ppp
|
||||||
|
|
||||||
|
import java.io.*
|
||||||
|
|
||||||
|
class MyPrintStream
|
||||||
|
|
||||||
|
fun f1(printStream: PrintStream){}
|
||||||
|
fun f2(printStream: PrintStream?){}
|
||||||
|
fun f3(printStream: MyPrintStream){}
|
||||||
|
|
||||||
|
fun f(printStr<caret>)
|
||||||
|
|
||||||
|
// EXIST_JAVA_ONLY: { lookupString: "printStream", itemText: "printStream: PrintStream", tailText: " (java.io)" }
|
||||||
|
// EXIST_JAVA_ONLY: { lookupString: "printStream", itemText: "printStream: PrintStream?", tailText: " (java.io)" }
|
||||||
|
// EXIST: { lookupString: "printStream", itemText: "printStream: MyPrintStream", tailText: " (ppp)" }
|
||||||
|
// EXIST: { lookupString: "myPrintStream", itemText: "myPrintStream: MyPrintStream", tailText: " (ppp)" }
|
||||||
|
// NOTHING_ELSE
|
||||||
+6
@@ -1428,6 +1428,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("NoFromFileAndFromClassesDuplication.kt")
|
||||||
|
public void testNoFromFileAndFromClassesDuplication() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/parameterNameAndType/NoFromFileAndFromClassesDuplication.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("NotForCatchParameter.kt")
|
@TestMetadata("NotForCatchParameter.kt")
|
||||||
public void testNotForCatchParameter() throws Exception {
|
public void testNotForCatchParameter() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/parameterNameAndType/NotForCatchParameter.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/parameterNameAndType/NotForCatchParameter.kt");
|
||||||
|
|||||||
+6
@@ -1428,6 +1428,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("NoFromFileAndFromClassesDuplication.kt")
|
||||||
|
public void testNoFromFileAndFromClassesDuplication() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/parameterNameAndType/NoFromFileAndFromClassesDuplication.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("NotForCatchParameter.kt")
|
@TestMetadata("NotForCatchParameter.kt")
|
||||||
public void testNotForCatchParameter() throws Exception {
|
public void testNotForCatchParameter() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/parameterNameAndType/NotForCatchParameter.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/parameterNameAndType/NotForCatchParameter.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user