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:
+13
-1
@@ -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.idea.frontend.api.types.*
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
||||||
import org.jetbrains.kotlin.name.Name
|
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.DescriptorKindFilter
|
||||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||||
import org.jetbrains.kotlin.types.*
|
import org.jetbrains.kotlin.types.*
|
||||||
@@ -29,7 +30,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
|||||||
|
|
||||||
abstract class KtSymbolBasedAbstractTypeConstructor<T> internal constructor(
|
abstract class KtSymbolBasedAbstractTypeConstructor<T> internal constructor(
|
||||||
val ktSBDescriptor: T
|
val ktSBDescriptor: T
|
||||||
) : TypeConstructor where T : KtSymbolBasedDeclarationDescriptor, T : ClassifierDescriptor {
|
) : ClassifierBasedTypeConstructor() where T : KtSymbolBasedDeclarationDescriptor, T : ClassifierDescriptor {
|
||||||
override fun getDeclarationDescriptor(): ClassifierDescriptor = ktSBDescriptor
|
override fun getDeclarationDescriptor(): ClassifierDescriptor = ktSBDescriptor
|
||||||
|
|
||||||
// TODO: captured types
|
// TODO: captured types
|
||||||
@@ -53,6 +54,12 @@ class KtSymbolBasedClassTypeConstructor(ktSBDescriptor: KtSymbolBasedClassDescri
|
|||||||
|
|
||||||
override fun getSupertypes(): Collection<KotlinType> =
|
override fun getSupertypes(): Collection<KotlinType> =
|
||||||
ktSBDescriptor.ktSymbol.superTypes.map { it.toKotlinType(ktSBDescriptor.context) }
|
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) :
|
class KtSymbolBasedTypeParameterTypeConstructor(ktSBDescriptor: KtSymbolBasedTypeParameterDescriptor) :
|
||||||
@@ -61,6 +68,11 @@ class KtSymbolBasedTypeParameterTypeConstructor(ktSBDescriptor: KtSymbolBasedTyp
|
|||||||
|
|
||||||
override fun getSupertypes(): Collection<KotlinType> =
|
override fun getSupertypes(): Collection<KotlinType> =
|
||||||
ktSBDescriptor.ktSymbol.upperBounds.map { it.toKotlinType(ktSBDescriptor.context) }
|
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
|
// This class is not suppose to be used as "is instance of" because scopes could be wrapped into other scopes
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FE10_BINDING_BY_FIR
|
|
||||||
fun foo() {
|
fun foo() {
|
||||||
val c = Container()
|
val c = Container()
|
||||||
c.cont<caret>ains(1)
|
c.cont<caret>ains(1)
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FE10_BINDING_BY_FIR
|
|
||||||
fun foo() {
|
fun foo() {
|
||||||
val c = Container()
|
val c = Container()
|
||||||
1 in c
|
1 in c
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FE10_BINDING_BY_FIR
|
|
||||||
fun <T> doSomething(a: T) {}
|
fun <T> doSomething(a: T) {}
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FE10_BINDING_BY_FIR
|
|
||||||
fun <T> doSomething(a: T) {}
|
fun <T> doSomething(a: T) {}
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FE10_BINDING_BY_FIR
|
|
||||||
fun test() {
|
fun test() {
|
||||||
class Test()
|
class Test()
|
||||||
operator fun Test.contains(a: Int) : Boolean = true
|
operator fun Test.contains(a: Int) : Boolean = true
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FE10_BINDING_BY_FIR
|
|
||||||
fun test() {
|
fun test() {
|
||||||
class Test()
|
class Test()
|
||||||
operator fun Test.contains(a: Int) : Boolean = true
|
operator fun Test.contains(a: Int) : Boolean = true
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FE10_BINDING_BY_FIR
|
|
||||||
fun test() {
|
fun test() {
|
||||||
class Test{
|
class Test{
|
||||||
operator fun contains(a: Int) : Boolean = true
|
operator fun contains(a: Int) : Boolean = true
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FE10_BINDING_BY_FIR
|
|
||||||
fun test() {
|
fun test() {
|
||||||
class Test{
|
class Test{
|
||||||
operator fun contains(a: Int) : Boolean = true
|
operator fun contains(a: Int) : Boolean = true
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FE10_BINDING_BY_FIR
|
|
||||||
class C {
|
class C {
|
||||||
companion object {
|
companion object {
|
||||||
operator fun contains(s: String) = true
|
operator fun contains(s: String) = true
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FE10_BINDING_BY_FIR
|
|
||||||
class C {
|
class C {
|
||||||
companion object {
|
companion object {
|
||||||
operator fun contains(s: String) = true
|
operator fun contains(s: String) = true
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FE10_BINDING_BY_FIR
|
|
||||||
fun test() {
|
fun test() {
|
||||||
class Test{
|
class Test{
|
||||||
operator fun contains(a: Int) : Boolean = true
|
operator fun contains(a: Int) : Boolean = true
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FE10_BINDING_BY_FIR
|
|
||||||
fun test() {
|
fun test() {
|
||||||
class Test{
|
class Test{
|
||||||
operator fun contains(a: Int) : Boolean = true
|
operator fun contains(a: Int) : Boolean = true
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FE10_BINDING_BY_FIR
|
|
||||||
@Suppress("INAPPLICABLE_OPERATOR_MODIFIER")
|
@Suppress("INAPPLICABLE_OPERATOR_MODIFIER")
|
||||||
public operator fun CharSequence.contains(other: CharSequence, ignoreCase: Boolean = false): Boolean = false
|
public operator fun CharSequence.contains(other: CharSequence, ignoreCase: Boolean = false): Boolean = false
|
||||||
fun test() {
|
fun test() {
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FE10_BINDING_BY_FIR
|
|
||||||
@Suppress("INAPPLICABLE_OPERATOR_MODIFIER")
|
@Suppress("INAPPLICABLE_OPERATOR_MODIFIER")
|
||||||
public operator fun CharSequence.contains(other: CharSequence, ignoreCase: Boolean = false): Boolean = false
|
public operator fun CharSequence.contains(other: CharSequence, ignoreCase: Boolean = false): Boolean = false
|
||||||
fun test() {
|
fun test() {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FE10_BINDING_BY_FIR
|
|
||||||
fun test() {
|
fun test() {
|
||||||
class Test{
|
class Test{
|
||||||
operator fun <T> contains(a: T): Boolean = false
|
operator fun <T> contains(a: T): Boolean = false
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_FE10_BINDING_BY_FIR
|
|
||||||
fun test() {
|
fun test() {
|
||||||
class Test{
|
class Test{
|
||||||
operator fun <T> contains(a: T): Boolean = false
|
operator fun <T> contains(a: T): Boolean = false
|
||||||
|
|||||||
Reference in New Issue
Block a user