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
This commit is contained in:
Stanislav Erokhin
2021-05-10 11:20:51 +02:00
parent dc1ce19db9
commit 335c5a03b6
17 changed files with 13 additions and 17 deletions
@@ -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<T> 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<KotlinType> =
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<KotlinType> =
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
@@ -1,4 +1,3 @@
// IGNORE_FE10_BINDING_BY_FIR
fun foo() {
val c = Container()
c.cont<caret>ains(1)
@@ -1,4 +1,3 @@
// IGNORE_FE10_BINDING_BY_FIR
fun foo() {
val c = Container()
1 in c
@@ -1,4 +1,3 @@
// IGNORE_FE10_BINDING_BY_FIR
fun <T> doSomething(a: T) {}
fun test() {
@@ -1,4 +1,3 @@
// IGNORE_FE10_BINDING_BY_FIR
fun <T> doSomething(a: T) {}
fun test() {
@@ -1,4 +1,3 @@
// IGNORE_FE10_BINDING_BY_FIR
fun test() {
class Test()
operator fun Test.contains(a: Int) : Boolean = true
@@ -1,4 +1,3 @@
// IGNORE_FE10_BINDING_BY_FIR
fun test() {
class Test()
operator fun Test.contains(a: Int) : Boolean = true
@@ -1,4 +1,3 @@
// IGNORE_FE10_BINDING_BY_FIR
fun test() {
class Test{
operator fun contains(a: Int) : Boolean = true
@@ -1,4 +1,3 @@
// IGNORE_FE10_BINDING_BY_FIR
fun test() {
class Test{
operator fun contains(a: Int) : Boolean = true
@@ -1,4 +1,3 @@
// IGNORE_FE10_BINDING_BY_FIR
class C {
companion object {
operator fun contains(s: String) = true
@@ -1,4 +1,3 @@
// IGNORE_FE10_BINDING_BY_FIR
class C {
companion object {
operator fun contains(s: String) = true
@@ -1,4 +1,3 @@
// IGNORE_FE10_BINDING_BY_FIR
fun test() {
class Test{
operator fun contains(a: Int) : Boolean = true
@@ -1,4 +1,3 @@
// IGNORE_FE10_BINDING_BY_FIR
fun test() {
class Test{
operator fun contains(a: Int) : Boolean = true
@@ -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() {
@@ -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() {
@@ -1,4 +1,3 @@
// IGNORE_FE10_BINDING_BY_FIR
fun test() {
class Test{
operator fun <T> contains(a: T): Boolean = false
@@ -1,4 +1,3 @@
// IGNORE_FE10_BINDING_BY_FIR
fun test() {
class Test{
operator fun <T> contains(a: T): Boolean = false