From 335c5a03b6a9a0c3e1a6f0f949c06c9700f30f7e Mon Sep 17 00:00:00 2001 From: Stanislav Erokhin Date: Mon, 10 May 2021 11:20:51 +0200 Subject: [PATCH] Add correct equals/hashCode to KtSymbolBasedAbstractTypeConstructor Previously there were no equals/hashCode implementation. Because of that subtyping not working properly. That is because in subtyping we have checks that type constructors are equals Also toString was added so now it is a bit easier to debug code involving the KtSymbolBasedAbstractTypeConstructor --- .../idea/fir/fe10/KtSymbolBasedKotlinTypes.kt | 14 +++++++++++++- .../replaceContains/containsFromJava.kt | 1 - .../replaceContains/containsFromJava.kt.after | 1 - .../replaceContains/containsInExpression.kt | 1 - .../replaceContains/containsInExpression.kt.after | 1 - .../replaceContains/extensionFunction.kt | 1 - .../replaceContains/extensionFunction.kt.after | 1 - .../replaceContains/notContains.kt | 1 - .../replaceContains/notContains.kt.after | 1 - .../replaceContains/qualifier.kt | 1 - .../replaceContains/qualifier.kt.after | 1 - .../replaceContains/simpleArgument.kt | 1 - .../replaceContains/simpleArgument.kt.after | 1 - .../replaceContains/simpleStringLiteral.kt | 1 - .../replaceContains/simpleStringLiteral.kt.after | 1 - .../replaceContains/typeArguments.kt | 1 - .../replaceContains/typeArguments.kt.after | 1 - 17 files changed, 13 insertions(+), 17 deletions(-) diff --git a/idea/idea-fir-fe10-binding/src/org/jetbrains/kotlin/idea/fir/fe10/KtSymbolBasedKotlinTypes.kt b/idea/idea-fir-fe10-binding/src/org/jetbrains/kotlin/idea/fir/fe10/KtSymbolBasedKotlinTypes.kt index b4f9aac6af3..be6b938e7ff 100644 --- a/idea/idea-fir-fe10-binding/src/org/jetbrains/kotlin/idea/fir/fe10/KtSymbolBasedKotlinTypes.kt +++ b/idea/idea-fir-fe10-binding/src/org/jetbrains/kotlin/idea/fir/fe10/KtSymbolBasedKotlinTypes.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotatio import org.jetbrains.kotlin.idea.frontend.api.types.* import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.types.* @@ -29,7 +30,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs abstract class KtSymbolBasedAbstractTypeConstructor internal constructor( val ktSBDescriptor: T -) : TypeConstructor where T : KtSymbolBasedDeclarationDescriptor, T : ClassifierDescriptor { +) : ClassifierBasedTypeConstructor() where T : KtSymbolBasedDeclarationDescriptor, T : ClassifierDescriptor { override fun getDeclarationDescriptor(): ClassifierDescriptor = ktSBDescriptor // TODO: captured types @@ -53,6 +54,12 @@ class KtSymbolBasedClassTypeConstructor(ktSBDescriptor: KtSymbolBasedClassDescri override fun getSupertypes(): Collection = ktSBDescriptor.ktSymbol.superTypes.map { it.toKotlinType(ktSBDescriptor.context) } + + override fun isSameClassifier(classifier: ClassifierDescriptor): Boolean { + return classifier is ClassDescriptor && areFqNamesEqual(declarationDescriptor, classifier) + } + + override fun toString() = DescriptorUtils.getFqName(ktSBDescriptor).asString() } class KtSymbolBasedTypeParameterTypeConstructor(ktSBDescriptor: KtSymbolBasedTypeParameterDescriptor) : @@ -61,6 +68,11 @@ class KtSymbolBasedTypeParameterTypeConstructor(ktSBDescriptor: KtSymbolBasedTyp override fun getSupertypes(): Collection = ktSBDescriptor.ktSymbol.upperBounds.map { it.toKotlinType(ktSBDescriptor.context) } + + // TODO overrides: see AbstractTypeParameterDescriptor.TypeParameterTypeConstructor.isSameClassifier + override fun isSameClassifier(classifier: ClassifierDescriptor): Boolean = ktSBDescriptor == classifier + + override fun toString(): String = ktSBDescriptor.name.asString() } // This class is not suppose to be used as "is instance of" because scopes could be wrapped into other scopes diff --git a/idea/testData/intentions/conventionNameCalls/replaceContains/containsFromJava.kt b/idea/testData/intentions/conventionNameCalls/replaceContains/containsFromJava.kt index 84acc009667..fcb6a65a8f8 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceContains/containsFromJava.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceContains/containsFromJava.kt @@ -1,4 +1,3 @@ -// IGNORE_FE10_BINDING_BY_FIR fun foo() { val c = Container() c.contains(1) diff --git a/idea/testData/intentions/conventionNameCalls/replaceContains/containsFromJava.kt.after b/idea/testData/intentions/conventionNameCalls/replaceContains/containsFromJava.kt.after index 56c9bedce04..f82141b91e2 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceContains/containsFromJava.kt.after +++ b/idea/testData/intentions/conventionNameCalls/replaceContains/containsFromJava.kt.after @@ -1,4 +1,3 @@ -// IGNORE_FE10_BINDING_BY_FIR fun foo() { val c = Container() 1 in c diff --git a/idea/testData/intentions/conventionNameCalls/replaceContains/containsInExpression.kt b/idea/testData/intentions/conventionNameCalls/replaceContains/containsInExpression.kt index 78b296ff6f8..42465755658 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceContains/containsInExpression.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceContains/containsInExpression.kt @@ -1,4 +1,3 @@ -// IGNORE_FE10_BINDING_BY_FIR fun doSomething(a: T) {} fun test() { diff --git a/idea/testData/intentions/conventionNameCalls/replaceContains/containsInExpression.kt.after b/idea/testData/intentions/conventionNameCalls/replaceContains/containsInExpression.kt.after index f00cde545f4..826ddb2ddd3 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceContains/containsInExpression.kt.after +++ b/idea/testData/intentions/conventionNameCalls/replaceContains/containsInExpression.kt.after @@ -1,4 +1,3 @@ -// IGNORE_FE10_BINDING_BY_FIR fun doSomething(a: T) {} fun test() { diff --git a/idea/testData/intentions/conventionNameCalls/replaceContains/extensionFunction.kt b/idea/testData/intentions/conventionNameCalls/replaceContains/extensionFunction.kt index 1a1172f71a6..8ceea9daf18 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceContains/extensionFunction.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceContains/extensionFunction.kt @@ -1,4 +1,3 @@ -// IGNORE_FE10_BINDING_BY_FIR fun test() { class Test() operator fun Test.contains(a: Int) : Boolean = true diff --git a/idea/testData/intentions/conventionNameCalls/replaceContains/extensionFunction.kt.after b/idea/testData/intentions/conventionNameCalls/replaceContains/extensionFunction.kt.after index f4ec525d734..03e22435f2d 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceContains/extensionFunction.kt.after +++ b/idea/testData/intentions/conventionNameCalls/replaceContains/extensionFunction.kt.after @@ -1,4 +1,3 @@ -// IGNORE_FE10_BINDING_BY_FIR fun test() { class Test() operator fun Test.contains(a: Int) : Boolean = true diff --git a/idea/testData/intentions/conventionNameCalls/replaceContains/notContains.kt b/idea/testData/intentions/conventionNameCalls/replaceContains/notContains.kt index a2d3aeb8776..902e32f0ae9 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceContains/notContains.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceContains/notContains.kt @@ -1,4 +1,3 @@ -// IGNORE_FE10_BINDING_BY_FIR fun test() { class Test{ operator fun contains(a: Int) : Boolean = true diff --git a/idea/testData/intentions/conventionNameCalls/replaceContains/notContains.kt.after b/idea/testData/intentions/conventionNameCalls/replaceContains/notContains.kt.after index 89e7e22eda3..58db7c6dfb6 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceContains/notContains.kt.after +++ b/idea/testData/intentions/conventionNameCalls/replaceContains/notContains.kt.after @@ -1,4 +1,3 @@ -// IGNORE_FE10_BINDING_BY_FIR fun test() { class Test{ operator fun contains(a: Int) : Boolean = true diff --git a/idea/testData/intentions/conventionNameCalls/replaceContains/qualifier.kt b/idea/testData/intentions/conventionNameCalls/replaceContains/qualifier.kt index 4555f550344..d22131d10f8 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceContains/qualifier.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceContains/qualifier.kt @@ -1,4 +1,3 @@ -// IGNORE_FE10_BINDING_BY_FIR class C { companion object { operator fun contains(s: String) = true diff --git a/idea/testData/intentions/conventionNameCalls/replaceContains/qualifier.kt.after b/idea/testData/intentions/conventionNameCalls/replaceContains/qualifier.kt.after index c00c41a3962..a124b9b51bf 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceContains/qualifier.kt.after +++ b/idea/testData/intentions/conventionNameCalls/replaceContains/qualifier.kt.after @@ -1,4 +1,3 @@ -// IGNORE_FE10_BINDING_BY_FIR class C { companion object { operator fun contains(s: String) = true diff --git a/idea/testData/intentions/conventionNameCalls/replaceContains/simpleArgument.kt b/idea/testData/intentions/conventionNameCalls/replaceContains/simpleArgument.kt index 8a3abf68449..80b18cc023a 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceContains/simpleArgument.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceContains/simpleArgument.kt @@ -1,4 +1,3 @@ -// IGNORE_FE10_BINDING_BY_FIR fun test() { class Test{ operator fun contains(a: Int) : Boolean = true diff --git a/idea/testData/intentions/conventionNameCalls/replaceContains/simpleArgument.kt.after b/idea/testData/intentions/conventionNameCalls/replaceContains/simpleArgument.kt.after index 43044407c1b..c0e7ff5d70d 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceContains/simpleArgument.kt.after +++ b/idea/testData/intentions/conventionNameCalls/replaceContains/simpleArgument.kt.after @@ -1,4 +1,3 @@ -// IGNORE_FE10_BINDING_BY_FIR fun test() { class Test{ operator fun contains(a: Int) : Boolean = true diff --git a/idea/testData/intentions/conventionNameCalls/replaceContains/simpleStringLiteral.kt b/idea/testData/intentions/conventionNameCalls/replaceContains/simpleStringLiteral.kt index cafcf6e9946..71d267653ae 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceContains/simpleStringLiteral.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceContains/simpleStringLiteral.kt @@ -1,4 +1,3 @@ -// IGNORE_FE10_BINDING_BY_FIR @Suppress("INAPPLICABLE_OPERATOR_MODIFIER") public operator fun CharSequence.contains(other: CharSequence, ignoreCase: Boolean = false): Boolean = false fun test() { diff --git a/idea/testData/intentions/conventionNameCalls/replaceContains/simpleStringLiteral.kt.after b/idea/testData/intentions/conventionNameCalls/replaceContains/simpleStringLiteral.kt.after index 61fa6b7ad90..62cf21faca3 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceContains/simpleStringLiteral.kt.after +++ b/idea/testData/intentions/conventionNameCalls/replaceContains/simpleStringLiteral.kt.after @@ -1,4 +1,3 @@ -// IGNORE_FE10_BINDING_BY_FIR @Suppress("INAPPLICABLE_OPERATOR_MODIFIER") public operator fun CharSequence.contains(other: CharSequence, ignoreCase: Boolean = false): Boolean = false fun test() { diff --git a/idea/testData/intentions/conventionNameCalls/replaceContains/typeArguments.kt b/idea/testData/intentions/conventionNameCalls/replaceContains/typeArguments.kt index 9b002a3dfb4..023bf5859d4 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceContains/typeArguments.kt +++ b/idea/testData/intentions/conventionNameCalls/replaceContains/typeArguments.kt @@ -1,4 +1,3 @@ -// IGNORE_FE10_BINDING_BY_FIR fun test() { class Test{ operator fun contains(a: T): Boolean = false diff --git a/idea/testData/intentions/conventionNameCalls/replaceContains/typeArguments.kt.after b/idea/testData/intentions/conventionNameCalls/replaceContains/typeArguments.kt.after index 7d862c47677..044a18fc1fc 100644 --- a/idea/testData/intentions/conventionNameCalls/replaceContains/typeArguments.kt.after +++ b/idea/testData/intentions/conventionNameCalls/replaceContains/typeArguments.kt.after @@ -1,4 +1,3 @@ -// IGNORE_FE10_BINDING_BY_FIR fun test() { class Test{ operator fun contains(a: T): Boolean = false