[Frontend, Ir] Equality test passes
This commit is contained in:
committed by
Space
parent
df1de3a7d3
commit
e69a973b07
@@ -621,7 +621,7 @@ fun Fir2IrComponents.createTemporaryVariableForSafeCallConstruction(
|
|||||||
|
|
||||||
// TODO: implement inlineClassRepresentation in FirRegularClass instead.
|
// TODO: implement inlineClassRepresentation in FirRegularClass instead.
|
||||||
fun Fir2IrComponents.computeInlineClassRepresentation(klass: FirRegularClass): InlineClassRepresentation<IrSimpleType>? {
|
fun Fir2IrComponents.computeInlineClassRepresentation(klass: FirRegularClass): InlineClassRepresentation<IrSimpleType>? {
|
||||||
if (!klass.isInline) return null
|
if (!(klass.isInline && klass.primaryConstructorIfAny(session)?.valueParameterSymbols?.size == 1)) return null
|
||||||
val parameter = klass.getInlineClassUnderlyingParameter(session) ?: error("Inline class has no underlying parameter: ${klass.render()}")
|
val parameter = klass.getInlineClassUnderlyingParameter(session) ?: error("Inline class has no underlying parameter: ${klass.render()}")
|
||||||
val underlyingType = parameter.returnTypeRef.toIrType(typeConverter)
|
val underlyingType = parameter.returnTypeRef.toIrType(typeConverter)
|
||||||
return InlineClassRepresentation(
|
return InlineClassRepresentation(
|
||||||
|
|||||||
@@ -26,7 +26,10 @@ import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
|
|||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrEnumConstructorCallImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrEnumConstructorCallImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.*
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrTypeAliasSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.*
|
import org.jetbrains.kotlin.ir.symbols.impl.*
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
|
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
|
||||||
@@ -284,7 +287,7 @@ class Fir2IrClassifierStorage(
|
|||||||
isInner = regularClass.isInner,
|
isInner = regularClass.isInner,
|
||||||
isData = regularClass.isData,
|
isData = regularClass.isData,
|
||||||
isExternal = regularClass.isExternal,
|
isExternal = regularClass.isExternal,
|
||||||
isInline = regularClass.isInline,
|
isInline = regularClass.isInline && regularClass.primaryConstructorIfAny(session)?.valueParameterSymbols?.size == 1,
|
||||||
isExpect = regularClass.isExpect,
|
isExpect = regularClass.isExpect,
|
||||||
isFun = regularClass.isFun
|
isFun = regularClass.isFun
|
||||||
).apply {
|
).apply {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.backend.*
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.primaryConstructorIfAny
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||||
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull
|
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull
|
||||||
import org.jetbrains.kotlin.fir.isNewPlaceForBodyGeneration
|
import org.jetbrains.kotlin.fir.isNewPlaceForBodyGeneration
|
||||||
@@ -94,7 +95,7 @@ class Fir2IrLazyClass(
|
|||||||
get() = fir.isExternal
|
get() = fir.isExternal
|
||||||
|
|
||||||
override val isInline: Boolean
|
override val isInline: Boolean
|
||||||
get() = fir.isInline
|
get() = fir.isInline && fir.primaryConstructorIfAny(session)?.valueParameterSymbols?.size == 1
|
||||||
|
|
||||||
override val isExpect: Boolean
|
override val isExpect: Boolean
|
||||||
get() = fir.isExpect
|
get() = fir.isExpect
|
||||||
|
|||||||
+9
-9
@@ -159,15 +159,15 @@ fun box(): String {
|
|||||||
assert(b.toString() == b.toString())
|
assert(b.toString() == b.toString())
|
||||||
assert(b.hashCode() == b.hashCode())
|
assert(b.hashCode() == b.hashCode())
|
||||||
|
|
||||||
assert(f1.toString() == "to be replaced")
|
assert(f1.toString() == "F1(x=1)") { f1.toString() }
|
||||||
assert(f2.toString() == "to be replaced")
|
assert(f2.toString() == "F2(x=4294967295)") { f2.toString() }
|
||||||
assert(f3.toString() == "to be replaced")
|
assert(f3.toString().startsWith("F3@")) { f3.toString() } // not data class yet
|
||||||
assert(f4.toString() == "to be replaced")
|
assert(f4.toString() == "F4(x=5)") { f4.toString() }
|
||||||
assert(f5.toString() == "to be replaced")
|
assert(f5.toString() == "F5(x=4294967294)") { f5.toString() }
|
||||||
assert(f6.toString() == "to be replaced")
|
assert(f6.toString() == "F6(x=678)") { f6.toString() }
|
||||||
assert(a1.toString() == "to be replaced")
|
assert(a1.toString().startsWith("A@")) { a1.toString() } // not data class yet
|
||||||
assert(a2.toString() == "to be replaced")
|
assert(a2.toString().startsWith("A@")) { a2.toString() } // not data class yet
|
||||||
assert(b.toString() == "to be replaced")
|
assert(b.toString().let { it.startsWith("OverridenBToString(a1 = A@") && ", a2 = A@" in it }) { b.toString() } // not data class yet
|
||||||
|
|
||||||
return "OK"
|
return "OK"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,10 @@ package org.jetbrains.kotlin.resolve
|
|||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.types.*
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
import org.jetbrains.kotlin.types.TypeSubstitutor
|
||||||
|
import org.jetbrains.kotlin.types.TypeUtils
|
||||||
|
import org.jetbrains.kotlin.types.Variance
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||||
|
|
||||||
val JVM_INLINE_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.JvmInline")
|
val JVM_INLINE_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.JvmInline")
|
||||||
@@ -16,7 +19,8 @@ val JVM_INLINE_ANNOTATION_CLASS_ID = ClassId.topLevel(JVM_INLINE_ANNOTATION_FQ_N
|
|||||||
|
|
||||||
// FIXME: DeserializedClassDescriptor in reflection do not have @JvmInline annotation, that we
|
// FIXME: DeserializedClassDescriptor in reflection do not have @JvmInline annotation, that we
|
||||||
// FIXME: would like to check as well.
|
// FIXME: would like to check as well.
|
||||||
fun DeclarationDescriptor.isInlineClass(): Boolean = this is ClassDescriptor && (isInline || isValue)
|
fun DeclarationDescriptor.isInlineClass(): Boolean =
|
||||||
|
this is ClassDescriptor && (isInline || isValue) && unsubstitutedPrimaryConstructor?.valueParameters?.size == 1
|
||||||
|
|
||||||
fun KotlinType.unsubstitutedUnderlyingType(): KotlinType? =
|
fun KotlinType.unsubstitutedUnderlyingType(): KotlinType? =
|
||||||
constructor.declarationDescriptor.safeAs<ClassDescriptor>()?.inlineClassRepresentation?.underlyingType
|
constructor.declarationDescriptor.safeAs<ClassDescriptor>()?.inlineClassRepresentation?.underlyingType
|
||||||
|
|||||||
Reference in New Issue
Block a user