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.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
@@ -1,4 +1,3 @@
|
||||
// IGNORE_FE10_BINDING_BY_FIR
|
||||
fun foo() {
|
||||
val c = Container()
|
||||
c.cont<caret>ains(1)
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_FE10_BINDING_BY_FIR
|
||||
fun foo() {
|
||||
val c = Container()
|
||||
1 in c
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_FE10_BINDING_BY_FIR
|
||||
fun <T> doSomething(a: T) {}
|
||||
|
||||
fun test() {
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_FE10_BINDING_BY_FIR
|
||||
fun <T> doSomething(a: T) {}
|
||||
|
||||
fun test() {
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_FE10_BINDING_BY_FIR
|
||||
fun test() {
|
||||
class Test()
|
||||
operator fun Test.contains(a: Int) : Boolean = true
|
||||
|
||||
-1
@@ -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
@@ -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
@@ -1,4 +1,3 @@
|
||||
// IGNORE_FE10_BINDING_BY_FIR
|
||||
class C {
|
||||
companion object {
|
||||
operator fun contains(s: String) = true
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_FE10_BINDING_BY_FIR
|
||||
fun test() {
|
||||
class Test{
|
||||
operator fun contains(a: Int) : Boolean = true
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_FE10_BINDING_BY_FIR
|
||||
fun test() {
|
||||
class Test{
|
||||
operator fun contains(a: Int) : Boolean = true
|
||||
|
||||
-1
@@ -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
@@ -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
@@ -1,4 +1,3 @@
|
||||
// IGNORE_FE10_BINDING_BY_FIR
|
||||
fun test() {
|
||||
class Test{
|
||||
operator fun <T> contains(a: T): Boolean = false
|
||||
|
||||
Reference in New Issue
Block a user