[Psi2Ir, Fir2Ir] Generate toString, hashCode, equals methods for MF VC

This commit is contained in:
Evgeniy.Zhelenskiy
2021-12-31 02:27:17 +03:00
committed by Space
parent c7edc353d3
commit e97ca2ada4
91 changed files with 465 additions and 426 deletions
@@ -47,7 +47,7 @@ val EXTERNAL_FUN = createBooleanFlagToModifier(Flags.IS_EXTERNAL_FUNCTION, KtTok
val EXTERNAL_PROPERTY = createBooleanFlagToModifier(Flags.IS_EXTERNAL_PROPERTY, KtTokens.EXTERNAL_KEYWORD) val EXTERNAL_PROPERTY = createBooleanFlagToModifier(Flags.IS_EXTERNAL_PROPERTY, KtTokens.EXTERNAL_KEYWORD)
val EXTERNAL_CLASS = createBooleanFlagToModifier(Flags.IS_EXTERNAL_CLASS, KtTokens.EXTERNAL_KEYWORD) val EXTERNAL_CLASS = createBooleanFlagToModifier(Flags.IS_EXTERNAL_CLASS, KtTokens.EXTERNAL_KEYWORD)
val INLINE = createBooleanFlagToModifier(Flags.IS_INLINE, KtTokens.INLINE_KEYWORD) val INLINE = createBooleanFlagToModifier(Flags.IS_INLINE, KtTokens.INLINE_KEYWORD)
val VALUE_CLASS = createBooleanFlagToModifier(Flags.IS_INLINE_CLASS, KtTokens.VALUE_KEYWORD) val VALUE_CLASS = createBooleanFlagToModifier(Flags.IS_VALUE_CLASS, KtTokens.VALUE_KEYWORD)
val FUN_INTERFACE = createBooleanFlagToModifier(Flags.IS_FUN_INTERFACE, KtTokens.FUN_KEYWORD) val FUN_INTERFACE = createBooleanFlagToModifier(Flags.IS_FUN_INTERFACE, KtTokens.FUN_KEYWORD)
val TAILREC = createBooleanFlagToModifier(Flags.IS_TAILREC, KtTokens.TAILREC_KEYWORD) val TAILREC = createBooleanFlagToModifier(Flags.IS_TAILREC, KtTokens.TAILREC_KEYWORD)
val SUSPEND = createBooleanFlagToModifier(Flags.IS_SUSPEND, KtTokens.SUSPEND_KEYWORD) val SUSPEND = createBooleanFlagToModifier(Flags.IS_SUSPEND, KtTokens.SUSPEND_KEYWORD)
@@ -15,7 +15,10 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.* import org.jetbrains.kotlin.fir.declarations.builder.*
import org.jetbrains.kotlin.fir.declarations.comparators.FirMemberDeclarationComparator import org.jetbrains.kotlin.fir.declarations.comparators.FirMemberDeclarationComparator
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.declarations.utils.addDeclarations
import org.jetbrains.kotlin.fir.declarations.utils.isCompanion
import org.jetbrains.kotlin.fir.declarations.utils.moduleName
import org.jetbrains.kotlin.fir.declarations.utils.sourceElement
import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirAnnotation
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
@@ -65,7 +68,7 @@ fun deserializeClassToSymbol(
isCompanion = kind == ProtoBuf.Class.Kind.COMPANION_OBJECT isCompanion = kind == ProtoBuf.Class.Kind.COMPANION_OBJECT
isInner = Flags.IS_INNER.get(flags) isInner = Flags.IS_INNER.get(flags)
isData = Flags.IS_DATA.get(classProto.flags) isData = Flags.IS_DATA.get(classProto.flags)
isInline = Flags.IS_INLINE_CLASS.get(classProto.flags) isInline = Flags.IS_VALUE_CLASS.get(classProto.flags)
isExternal = Flags.IS_EXTERNAL_CLASS.get(classProto.flags) isExternal = Flags.IS_EXTERNAL_CLASS.get(classProto.flags)
isFun = Flags.IS_FUN_INTERFACE.get(classProto.flags) isFun = Flags.IS_FUN_INTERFACE.get(classProto.flags)
} }
@@ -287,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 && regularClass.primaryConstructorIfAny(session)?.valueParameterSymbols?.size == 1, isValue = regularClass.isInline,
isExpect = regularClass.isExpect, isExpect = regularClass.isExpect,
isFun = regularClass.isFun isFun = regularClass.isFun
).apply { ).apply {
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.fir.backend.generators.DataClassMembersGenerator
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isLocal import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.declarations.utils.isSynthetic import org.jetbrains.kotlin.fir.declarations.utils.isSynthetic
import org.jetbrains.kotlin.fir.declarations.primaryConstructorIfAny
import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor import org.jetbrains.kotlin.fir.descriptors.FirModuleDescriptor
import org.jetbrains.kotlin.fir.extensions.declarationGenerators import org.jetbrains.kotlin.fir.extensions.declarationGenerators
import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.extensions.extensionService
@@ -30,7 +29,9 @@ import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.signaturer.FirBasedSignatureComposer import org.jetbrains.kotlin.fir.signaturer.FirBasedSignatureComposer
import org.jetbrains.kotlin.fir.signaturer.FirMangler import org.jetbrains.kotlin.fir.signaturer.FirMangler
import org.jetbrains.kotlin.ir.* import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.PsiIrFileEntry
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl
@@ -250,11 +251,14 @@ class Fir2IrConverter(
allDeclarations += delegatedMembers(irClass) allDeclarations += delegatedMembers(irClass)
// Add synthetic members *before* fake override generations. // Add synthetic members *before* fake override generations.
// Otherwise, redundant members, e.g., synthetic toString _and_ fake override toString, will be added. // Otherwise, redundant members, e.g., synthetic toString _and_ fake override toString, will be added.
if (irConstructor != null && (irClass.isInline || irClass.isData)) { if (irConstructor != null && (irClass.isValue || irClass.isData)) {
declarationStorage.enterScope(irConstructor) declarationStorage.enterScope(irConstructor)
val dataClassMembersGenerator = DataClassMembersGenerator(components) val dataClassMembersGenerator = DataClassMembersGenerator(components)
if (irClass.isInline) { if (irClass.isSingleFieldValueClass) {
allDeclarations += dataClassMembersGenerator.generateInlineClassMembers(regularClass, irClass) allDeclarations += dataClassMembersGenerator.generateSingleFieldValueClassMembers(regularClass, irClass)
}
if (irClass.isMultiFieldValueClass) {
allDeclarations += dataClassMembersGenerator.generateMultiFieldValueClassMembers(regularClass, irClass)
} }
if (irClass.isData) { if (irClass.isData) {
allDeclarations += dataClassMembersGenerator.generateDataClassMembers(regularClass, irClass) allDeclarations += dataClassMembersGenerator.generateDataClassMembers(regularClass, irClass)
@@ -666,7 +666,7 @@ class IrBuiltInsOverFir(
build() build()
irFactory.createClass( irFactory.createClass(
startOffset, endOffset, origin, symbol, name, kind, visibility, modality, startOffset, endOffset, origin, symbol, name, kind, visibility, modality,
isCompanion, isInner, isData, isExternal, isInline, isExpect, isFun isCompanion, isInner, isData, isExternal, isValue, isExpect, isFun
) )
}.also { }.also {
it.parent = parent it.parent = parent
@@ -701,7 +701,7 @@ class IrBuiltInsOverFir(
vararg supertypes: IrType, vararg supertypes: IrType,
classKind: ClassKind = ClassKind.CLASS, classKind: ClassKind = ClassKind.CLASS,
classModality: Modality = Modality.OPEN, classModality: Modality = Modality.OPEN,
classIsInline: Boolean = false, classIsValue: Boolean = false,
builderBlock: IrClassBuilder.() -> Unit = {}, builderBlock: IrClassBuilder.() -> Unit = {},
block: IrClass.() -> Unit = {} block: IrClass.() -> Unit = {}
): IrClassSymbol { ): IrClassSymbol {
@@ -709,7 +709,7 @@ class IrBuiltInsOverFir(
return this.createClass( return this.createClass(
signature, *supertypes, signature, *supertypes,
classKind = classKind, classModality = classModality, classIsInline = classIsInline, builderBlock = builderBlock, block = block classKind = classKind, classModality = classModality, classIsValue = classIsValue, builderBlock = builderBlock, block = block
) )
} }
@@ -718,7 +718,7 @@ class IrBuiltInsOverFir(
vararg supertypes: IrType, vararg supertypes: IrType,
classKind: ClassKind = ClassKind.CLASS, classKind: ClassKind = ClassKind.CLASS,
classModality: Modality = Modality.OPEN, classModality: Modality = Modality.OPEN,
classIsInline: Boolean = false, classIsValue: Boolean = false,
builderBlock: IrClassBuilder.() -> Unit = {}, builderBlock: IrClassBuilder.() -> Unit = {},
block: IrClass.() -> Unit = {} block: IrClass.() -> Unit = {}
): IrClassSymbol = components.symbolTable.declareClass( ): IrClassSymbol = components.symbolTable.declareClass(
@@ -729,12 +729,12 @@ class IrBuiltInsOverFir(
name = Name.identifier(signature.shortName) name = Name.identifier(signature.shortName)
kind = classKind kind = classKind
modality = classModality modality = classModality
isInline = classIsInline isValue = classIsValue
origin = IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB origin = IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB
builderBlock() builderBlock()
irFactory.createClass( irFactory.createClass(
startOffset, endOffset, origin, symbol, name, kind, visibility, modality, startOffset, endOffset, origin, symbol, name, kind, visibility, modality,
isCompanion, isInner, isData, isExternal, isInline, isExpect, isFun isCompanion, isInner, isData, isExternal, isValue, isExpect, isFun
) )
}.also { }.also {
it.parent = this it.parent = this
@@ -59,8 +59,13 @@ import org.jetbrains.kotlin.util.OperatorNameConventions.TO_STRING
*/ */
class DataClassMembersGenerator(val components: Fir2IrComponents) { class DataClassMembersGenerator(val components: Fir2IrComponents) {
fun generateInlineClassMembers(klass: FirClass, irClass: IrClass): List<FirDeclaration> = fun generateSingleFieldValueClassMembers(klass: FirClass, irClass: IrClass): List<FirDeclaration> =
MyDataClassMethodsGenerator(irClass, klass.symbol.toLookupTag(), IrDeclarationOrigin.GENERATED_INLINE_CLASS_MEMBER).generate(klass) MyDataClassMethodsGenerator(irClass, klass.symbol.toLookupTag(), IrDeclarationOrigin.GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER)
.generate(klass)
fun generateMultiFieldValueClassMembers(klass: FirClass, irClass: IrClass): List<FirDeclaration> =
MyDataClassMethodsGenerator(irClass, klass.symbol.toLookupTag(), IrDeclarationOrigin.GENERATED_MULTI_FIELD_VALUE_CLASS_MEMBER)
.generate(klass)
fun generateDataClassMembers(klass: FirClass, irClass: IrClass): List<FirDeclaration> = fun generateDataClassMembers(klass: FirClass, irClass: IrClass): List<FirDeclaration> =
MyDataClassMethodsGenerator(irClass, klass.symbol.toLookupTag(), IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER).generate(klass) MyDataClassMethodsGenerator(irClass, klass.symbol.toLookupTag(), IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER).generate(klass)
@@ -11,7 +11,6 @@ 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,8 +93,8 @@ class Fir2IrLazyClass(
override val isExternal: Boolean override val isExternal: Boolean
get() = fir.isExternal get() = fir.isExternal
override val isInline: Boolean override val isValue: Boolean
get() = fir.isInline && fir.primaryConstructorIfAny(session)?.valueParameterSymbols?.size == 1 get() = fir.isInline
override val isExpect: Boolean override val isExpect: Boolean
get() = fir.isExpect get() = fir.isExpect
@@ -37,17 +37,15 @@ import org.jetbrains.kotlin.resolve.lazy.LazyClassContext
import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.resolve.scopes.MemberScope.Companion.ALL_NAME_FILTER import org.jetbrains.kotlin.resolve.scopes.MemberScope.Companion.ALL_NAME_FILTER
import org.jetbrains.kotlin.storage.NotNullLazyValue import org.jetbrains.kotlin.storage.NotNullLazyValue
import org.jetbrains.kotlin.storage.NullableLazyValue import org.jetbrains.kotlin.storage.NullableLazyValue
import org.jetbrains.kotlin.storage.getValue import org.jetbrains.kotlin.storage.getValue
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeRefinement
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
import org.jetbrains.kotlin.types.checker.NewKotlinTypeCheckerImpl import org.jetbrains.kotlin.types.checker.NewKotlinTypeCheckerImpl
import org.jetbrains.kotlin.types.TypeRefinement
import org.jetbrains.kotlin.utils.addToStdlib.flatMapToNullable import org.jetbrains.kotlin.utils.addToStdlib.flatMapToNullable
import java.util.*
open class LazyClassMemberScope( open class LazyClassMemberScope(
c: LazyClassContext, c: LazyClassContext,
@@ -293,7 +291,7 @@ open class LazyClassMemberScope(
name: Name, name: Name,
fromSupertypes: List<SimpleFunctionDescriptor> fromSupertypes: List<SimpleFunctionDescriptor>
) { ) {
if (!thisDescriptor.isInlineClass()) return if (!thisDescriptor.isInlineOrValueClass()) return
FunctionsFromAny.addFunctionFromAnyIfNeeded(thisDescriptor, result, name, fromSupertypes) FunctionsFromAny.addFunctionFromAnyIfNeeded(thisDescriptor, result, name, fromSupertypes)
} }
@@ -11,10 +11,7 @@ import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope
import org.jetbrains.kotlin.ir.builders.irCall import org.jetbrains.kotlin.ir.builders.irCall
import org.jetbrains.kotlin.ir.builders.irString import org.jetbrains.kotlin.ir.builders.irString
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
@@ -91,7 +88,7 @@ interface InlineClassesUtils {
/** /**
* Should this class be treated as inline class? * Should this class be treated as inline class?
*/ */
fun isClassInlineLike(klass: IrClass): Boolean = klass.isInline fun isClassInlineLike(klass: IrClass): Boolean = klass.isSingleFieldValueClass
/** /**
* Unlike [org.jetbrains.kotlin.ir.util.getInlineClassUnderlyingType], doesn't use [IrClass.inlineClassRepresentation] because * Unlike [org.jetbrains.kotlin.ir.util.getInlineClassUnderlyingType], doesn't use [IrClass.inlineClassRepresentation] because
@@ -31,7 +31,7 @@ internal fun IrFactory.buildClass(builder: IrClassBuilder): IrClass = with(build
startOffset, endOffset, origin, startOffset, endOffset, origin,
IrClassSymbolImpl(), IrClassSymbolImpl(),
name, kind, visibility, modality, name, kind, visibility, modality,
isCompanion, isInner, isData, isExternal, isInline, isExpect, isFun isCompanion, isInner, isData, isExternal, isValue, isExpect, isFun
) )
} }
@@ -211,7 +211,7 @@ class ExportModelGenerator(
} }
} }
if (klass.isInline) if (klass.isSingleFieldValueClass)
return Exportability.Prohibited("Inline class ${klass.fqNameWhenAvailable}") return Exportability.Prohibited("Inline class ${klass.fqNameWhenAvailable}")
return Exportability.Allowed return Exportability.Allowed
@@ -186,7 +186,7 @@ class EqualityAndComparisonCallsTransformer(context: JsIrBackendContext) : Calls
isBuiltin() && this != PrimitiveType.FLOATING_POINT_NUMBER isBuiltin() && this != PrimitiveType.FLOATING_POINT_NUMBER
private fun IrType.isDefaultEqualsMethod() = private fun IrType.isDefaultEqualsMethod() =
findEqualsMethod()?.origin === IrDeclarationOrigin.GENERATED_INLINE_CLASS_MEMBER findEqualsMethod()?.origin === IrDeclarationOrigin.GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER
private fun IrExpression.isBoxIntrinsic() = private fun IrExpression.isBoxIntrinsic() =
this is IrCall && symbol == icUtils.boxIntrinsic this is IrCall && symbol == icUtils.boxIntrinsic
@@ -21,7 +21,9 @@ import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrGetValue import org.jetbrains.kotlin.ir.expressions.IrGetValue
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.file
import org.jetbrains.kotlin.ir.util.isSuspend
import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.org.objectweb.asm.MethodVisitor import org.jetbrains.org.objectweb.asm.MethodVisitor
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
@@ -125,7 +127,7 @@ private fun IrSimpleFunction.overridesReturningDifferentType(returnType: IrType)
val owner = overridden.owner val owner = overridden.owner
val overriddenReturnType = owner.returnType val overriddenReturnType = owner.returnType
if (!overriddenReturnType.erasedUpperBound.isInline) return true if (!overriddenReturnType.erasedUpperBound.isSingleFieldValueClass) return true
if (overriddenReturnType.isNullable() && if (overriddenReturnType.isNullable() &&
overriddenReturnType.makeNotNull().unboxInlineClass().isNullable() overriddenReturnType.makeNotNull().unboxInlineClass().isNullable()
@@ -1473,7 +1473,7 @@ class ExpressionCodegen(
companion object { companion object {
internal fun generateClassInstance(v: InstructionAdapter, classType: IrType, typeMapper: IrTypeMapper) { internal fun generateClassInstance(v: InstructionAdapter, classType: IrType, typeMapper: IrTypeMapper) {
val asmType = typeMapper.mapType(classType) val asmType = typeMapper.mapType(classType)
if (classType.getClass()?.isInline == true || !isPrimitive(asmType)) { if (classType.getClass()?.isSingleFieldValueClass == true || !isPrimitive(asmType)) {
v.aconst(typeMapper.boxType(classType)) v.aconst(typeMapper.boxType(classType))
} else { } else {
v.getstatic(boxType(asmType).internalName, "TYPE", "Ljava/lang/Class;") v.getstatic(boxType(asmType).internalName, "TYPE", "Ljava/lang/Class;")
@@ -318,7 +318,7 @@ class FunctionCodegen(private val irFunction: IrFunction, private val classCodeg
IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER, IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER,
JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR, JvmLoweredDeclarationOrigin.SYNTHETIC_ACCESSOR,
IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER, IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER,
IrDeclarationOrigin.GENERATED_INLINE_CLASS_MEMBER, IrDeclarationOrigin.GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER,
IrDeclarationOrigin.BRIDGE, IrDeclarationOrigin.BRIDGE,
IrDeclarationOrigin.BRIDGE_SPECIAL, IrDeclarationOrigin.BRIDGE_SPECIAL,
JvmLoweredDeclarationOrigin.ABSTRACT_BRIDGE_STUB, JvmLoweredDeclarationOrigin.ABSTRACT_BRIDGE_STUB,
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.backend.jvm.mapping.IrTypeMapper
import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.AsmUtil
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.ir.declarations.IrTypeParameter import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
import org.jetbrains.kotlin.ir.declarations.isSingleFieldValueClass
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.isTypeParameter import org.jetbrains.kotlin.ir.util.isTypeParameter
@@ -42,7 +43,7 @@ abstract class PromisedValue(val codegen: ExpressionCodegen, val type: Type, val
if (!isFromTypeUnboxed && isToTypeUnboxed) { if (!isFromTypeUnboxed && isToTypeUnboxed) {
val boxed = typeMapper.mapType(erasedTargetType, TypeMappingMode.CLASS_DECLARATION) val boxed = typeMapper.mapType(erasedTargetType, TypeMappingMode.CLASS_DECLARATION)
val irClass = codegen.irFunction.parentAsClass val irClass = codegen.irFunction.parentAsClass
if (irClass.isInline && irClass.symbol == irType.classifierOrNull && !irType.isNullable()) { if (irClass.isSingleFieldValueClass && irClass.symbol == irType.classifierOrNull && !irType.isNullable()) {
// Use getfield instead of unbox-impl inside inline classes // Use getfield instead of unbox-impl inside inline classes
codegen.mv.getfield(boxed.internalName, irClass.inlineClassFieldName.asString(), target.descriptor) codegen.mv.getfield(boxed.internalName, irClass.inlineClassFieldName.asString(), target.descriptor)
} else { } else {
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.backend.jvm.codegen package org.jetbrains.kotlin.backend.jvm.codegen
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.backend.common.ir.allOverridden import org.jetbrains.kotlin.backend.common.ir.allOverridden
import org.jetbrains.kotlin.backend.common.ir.ir2string import org.jetbrains.kotlin.backend.common.ir.ir2string
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
@@ -27,14 +26,11 @@ import org.jetbrains.kotlin.codegen.SourceInfo
import org.jetbrains.kotlin.codegen.inline.SourceMapper import org.jetbrains.kotlin.codegen.inline.SourceMapper
import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.types.IrSimpleType import org.jetbrains.kotlin.ir.types.IrSimpleType
@@ -45,7 +41,6 @@ import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.AsmTypes
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmClassSignature import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmClassSignature
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Opcodes
@@ -166,7 +161,7 @@ private fun IrDeclarationWithVisibility.specialCaseVisibility(kind: OwnerKind?):
return Opcodes.ACC_PUBLIC return Opcodes.ACC_PUBLIC
} }
if (this is IrConstructor && parentAsClass.isInline && kind === OwnerKind.IMPLEMENTATION) { if (this is IrConstructor && parentAsClass.isSingleFieldValueClass && kind === OwnerKind.IMPLEMENTATION) {
return Opcodes.ACC_PRIVATE return Opcodes.ACC_PRIVATE
} }
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.codegen.DescriptorAsmUtil.genAreEqualCall
import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.StackValue
import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.ir.declarations.isSingleFieldValueClass
import org.jetbrains.kotlin.ir.descriptors.toIrBasedKotlinType import org.jetbrains.kotlin.ir.descriptors.toIrBasedKotlinType
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
@@ -70,7 +71,7 @@ class Equals(val operator: IElementType) : IntrinsicMethod() {
if (a.isNullConst() || b.isNullConst()) { if (a.isNullConst() || b.isNullConst()) {
val irValue = if (a.isNullConst()) b else a val irValue = if (a.isNullConst()) b else a
val value = irValue.accept(codegen, data) val value = irValue.accept(codegen, data)
return if (!isPrimitive(value.type) && (irValue.type.classOrNull?.owner?.isInline != true || irValue.type.isNullable())) return if (!isPrimitive(value.type) && (irValue.type.classOrNull?.owner?.isSingleFieldValueClass != true || irValue.type.isNullable()))
BooleanNullCheck(value) BooleanNullCheck(value)
else { else {
value.discard() value.discard()
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.jvm.codegen.PromisedValue
import org.jetbrains.kotlin.backend.jvm.codegen.materialize import org.jetbrains.kotlin.backend.jvm.codegen.materialize
import org.jetbrains.kotlin.backend.jvm.mapping.mapTypeAsDeclaration import org.jetbrains.kotlin.backend.jvm.mapping.mapTypeAsDeclaration
import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.AsmUtil
import org.jetbrains.kotlin.ir.declarations.isSingleFieldValueClass
import org.jetbrains.kotlin.ir.expressions.IrClassReference import org.jetbrains.kotlin.ir.expressions.IrClassReference
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
import org.jetbrains.kotlin.ir.expressions.IrGetClass import org.jetbrains.kotlin.ir.expressions.IrGetClass
@@ -76,7 +77,7 @@ object GetJavaPrimitiveType : IntrinsicMethod() {
} }
private fun IrType.isInlineClassType(): Boolean { private fun IrType.isInlineClassType(): Boolean {
return (classOrNull ?: return false).owner.isInline return (classOrNull ?: return false).owner.isSingleFieldValueClass
} }
private fun Type.isVoidOrPrimitiveWrapper(): Boolean = private fun Type.isVoidOrPrimitiveWrapper(): Boolean =
@@ -37,7 +37,8 @@ object HashCode : IntrinsicMethod() {
val target = context.state.target val target = context.state.target
when { when {
irFunction.origin == JvmLoweredDeclarationOrigin.INLINE_CLASS_GENERATED_IMPL_METHOD || irFunction.origin == JvmLoweredDeclarationOrigin.INLINE_CLASS_GENERATED_IMPL_METHOD ||
irFunction.origin == IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER -> { irFunction.origin == IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER ||
irFunction.origin == IrDeclarationOrigin.GENERATED_MULTI_FIELD_VALUE_CLASS_MEMBER -> {
// TODO generate or lower IR for data class / inline class 'hashCode'? // TODO generate or lower IR for data class / inline class 'hashCode'?
DescriptorAsmUtil.genHashCode(mv, mv, receiverType, target) DescriptorAsmUtil.genHashCode(mv, mv, receiverType, target)
} }
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics
import org.jetbrains.kotlin.backend.jvm.codegen.* import org.jetbrains.kotlin.backend.jvm.codegen.*
import org.jetbrains.kotlin.codegen.AsmUtil.boxType import org.jetbrains.kotlin.codegen.AsmUtil.boxType
import org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive import org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive
import org.jetbrains.kotlin.ir.declarations.isSingleFieldValueClass
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
import org.jetbrains.kotlin.ir.types.classOrNull import org.jetbrains.kotlin.ir.types.classOrNull
import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.AsmTypes
@@ -33,7 +34,7 @@ object JavaClassProperty : IntrinsicMethod() {
when { when {
value.type == Type.VOID_TYPE -> value.type == Type.VOID_TYPE ->
invokeGetClass(value.materializedAt(AsmTypes.UNIT_TYPE, value.codegen.context.irBuiltIns.unitType)) invokeGetClass(value.materializedAt(AsmTypes.UNIT_TYPE, value.codegen.context.irBuiltIns.unitType))
value.irType.classOrNull?.owner?.isInline == true -> value.irType.classOrNull?.owner?.isSingleFieldValueClass == true ->
invokeGetClass(value.materializedAtBoxed(value.irType)) invokeGetClass(value.materializedAtBoxed(value.irType))
isPrimitive(value.type) -> { isPrimitive(value.type) -> {
value.discard() value.discard()
@@ -142,7 +142,7 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass
bridgeTargets.forEach { createBridges(declaration, it) } bridgeTargets.forEach { createBridges(declaration, it) }
if (declaration.isInline) { if (declaration.isSingleFieldValueClass) {
// Inline class (implementing 'MutableCollection<T>', where T is Int or an inline class mapped to Int) // Inline class (implementing 'MutableCollection<T>', where T is Int or an inline class mapped to Int)
// can contain a static replacement for a function 'remove', which forces value parameter boxing // can contain a static replacement for a function 'remove', which forces value parameter boxing
// in order to avoid signature clash with 'remove(int)' method in 'java.util.List'. // in order to avoid signature clash with 'remove(int)' method in 'java.util.List'.
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.ir.builders.declarations.addConstructor
import org.jetbrains.kotlin.ir.builders.irBlockBody import org.jetbrains.kotlin.ir.builders.irBlockBody
import org.jetbrains.kotlin.ir.builders.irDelegatingConstructorCall import org.jetbrains.kotlin.ir.builders.irDelegatingConstructorCall
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.isSingleFieldValueClass
import org.jetbrains.kotlin.ir.util.constructors import org.jetbrains.kotlin.ir.util.constructors
import org.jetbrains.kotlin.ir.util.hasDefaultValue import org.jetbrains.kotlin.ir.util.hasDefaultValue
@@ -37,7 +38,7 @@ internal val jvmDefaultConstructorPhase = makeIrFilePhase(
private class JvmDefaultConstructorLowering(val context: JvmBackendContext) : ClassLoweringPass { private class JvmDefaultConstructorLowering(val context: JvmBackendContext) : ClassLoweringPass {
override fun lower(irClass: IrClass) { override fun lower(irClass: IrClass) {
if (irClass.kind != ClassKind.CLASS || irClass.visibility == DescriptorVisibilities.LOCAL || irClass.isInline || irClass.isInner || if (irClass.kind != ClassKind.CLASS || irClass.visibility == DescriptorVisibilities.LOCAL || irClass.isSingleFieldValueClass || irClass.isInner ||
irClass.modality == Modality.SEALED irClass.modality == Modality.SEALED
) )
return return
@@ -85,7 +85,7 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
} }
} }
if (declaration.isInline) { if (declaration.isSingleFieldValueClass) {
val irConstructor = declaration.primaryConstructor!! val irConstructor = declaration.primaryConstructor!!
// The field getter is used by reflection and cannot be removed here unless it is internal. // The field getter is used by reflection and cannot be removed here unless it is internal.
declaration.declarations.removeIf { declaration.declarations.removeIf {
@@ -111,7 +111,7 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
} }
private fun transformFunctionFlat(function: IrFunction): List<IrDeclaration>? { private fun transformFunctionFlat(function: IrFunction): List<IrDeclaration>? {
if (function is IrConstructor && function.isPrimary && function.constructedClass.isInline) if (function is IrConstructor && function.isPrimary && function.constructedClass.isSingleFieldValueClass)
return null return null
val replacement = context.inlineClassReplacements.getReplacementFunction(function) val replacement = context.inlineClassReplacements.getReplacementFunction(function)
@@ -166,7 +166,7 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
bridgeFunction.overriddenSymbols = replacement.overriddenSymbols bridgeFunction.overriddenSymbols = replacement.overriddenSymbols
// Replace the function body with a wrapper // Replace the function body with a wrapper
if (!bridgeFunction.isFakeOverride || !bridgeFunction.parentAsClass.isInline) { if (!bridgeFunction.isFakeOverride || !bridgeFunction.parentAsClass.isSingleFieldValueClass) {
createBridgeBody(bridgeFunction, replacement) createBridgeBody(bridgeFunction, replacement)
} else { } else {
// Fake overrides redirect from the replacement to the original function, which is in turn replaced during interfacePhase. // Fake overrides redirect from the replacement to the original function, which is in turn replaced during interfacePhase.
@@ -417,7 +417,7 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
if (symbol != context.irBuiltIns.eqeqSymbol) if (symbol != context.irBuiltIns.eqeqSymbol)
return false return false
val leftClass = getValueArgument(0)?.type?.classOrNull?.owner?.takeIf { it.isInline } val leftClass = getValueArgument(0)?.type?.classOrNull?.owner?.takeIf { it.isSingleFieldValueClass }
?: return false ?: return false
// Before version 1.4, we cannot rely on the Result.equals-impl0 method // Before version 1.4, we cannot rely on the Result.equals-impl0 method
@@ -430,7 +430,7 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
val parent = field.parent val parent = field.parent
if (field.origin == IrDeclarationOrigin.PROPERTY_BACKING_FIELD && if (field.origin == IrDeclarationOrigin.PROPERTY_BACKING_FIELD &&
parent is IrClass && parent is IrClass &&
parent.isInline && parent.isSingleFieldValueClass &&
field.name == parent.inlineClassFieldName) { field.name == parent.inlineClassFieldName) {
val receiver = expression.receiver!!.transform(this, null) val receiver = expression.receiver!!.transform(this, null)
return coerceInlineClasses(receiver, receiver.type, field.type) return coerceInlineClasses(receiver, receiver.type, field.type)
@@ -492,7 +492,7 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
// Anonymous initializers in inline classes are processed when building the primary constructor. // Anonymous initializers in inline classes are processed when building the primary constructor.
override fun visitAnonymousInitializerNew(declaration: IrAnonymousInitializer): IrStatement { override fun visitAnonymousInitializerNew(declaration: IrAnonymousInitializer): IrStatement {
if (declaration.parent.safeAs<IrClass>()?.isInline == true) if (declaration.parent.safeAs<IrClass>()?.isSingleFieldValueClass == true)
return declaration return declaration
return super.visitAnonymousInitializerNew(declaration) return super.visitAnonymousInitializerNew(declaration)
} }
@@ -256,7 +256,6 @@ private class ScriptsToClassesLowering(val context: JvmBackendContext, val inner
name = Name.identifier("RunnerKt") name = Name.identifier("RunnerKt")
kind = ClassKind.CLASS kind = ClassKind.CLASS
modality = Modality.FINAL modality = Modality.FINAL
isInline = false
}.apply { }.apply {
parent = scriptingJvmPackage parent = scriptingJvmPackage
createImplicitParameterDeclarationWithWrappedDescriptor() createImplicitParameterDeclarationWithWrappedDescriptor()
@@ -369,7 +369,7 @@ private class SyntheticAccessorTransformer(
val constructedClass = constructedClass val constructedClass = constructedClass
if (!DescriptorVisibilities.isPrivate(visibility) && !constructedClass.isInline && hasMangledParameters && if (!DescriptorVisibilities.isPrivate(visibility) && !constructedClass.isSingleFieldValueClass && hasMangledParameters &&
!constructedClass.isAnonymousObject !constructedClass.isAnonymousObject
) return true ) return true
@@ -577,7 +577,7 @@ internal class LambdaMetafactoryArgumentsBuilder(
// All Kotlin inline classes are final, // All Kotlin inline classes are final,
// and their supertypes are trivially mapped to reference types. // and their supertypes are trivially mapped to reference types.
val erasedAdapteeClass = getErasedClassForSignatureAdaptation(adapteeType) val erasedAdapteeClass = getErasedClassForSignatureAdaptation(adapteeType)
if (erasedAdapteeClass.isInline) { if (erasedAdapteeClass.isSingleFieldValueClass) {
// Inline classes mapped to non-null reference types are a special case because they can't be boxed trivially. // Inline classes mapped to non-null reference types are a special case because they can't be boxed trivially.
// TODO consider adding a special type annotation to force boxing on an inline class type regardless of its underlying type. // TODO consider adding a special type annotation to force boxing on an inline class type regardless of its underlying type.
val underlyingAdapteeType = getInlineClassUnderlyingType(erasedAdapteeClass) val underlyingAdapteeType = getInlineClassUnderlyingType(erasedAdapteeClass)
@@ -586,7 +586,7 @@ internal class LambdaMetafactoryArgumentsBuilder(
} }
val erasedExpectedClass = getErasedClassForSignatureAdaptation(expectedType) val erasedExpectedClass = getErasedClassForSignatureAdaptation(expectedType)
return if (erasedExpectedClass.isInline) { return if (erasedExpectedClass.isSingleFieldValueClass) {
// LambdaMetafactory doesn't know about method mangling. // LambdaMetafactory doesn't know about method mangling.
TypeAdaptationConstraint.CONFLICT TypeAdaptationConstraint.CONFLICT
} else { } else {
@@ -57,7 +57,7 @@ object InlineClassAbi {
fun mangledNameFor(irFunction: IrFunction, mangleReturnTypes: Boolean, useOldMangleRules: Boolean): Name { fun mangledNameFor(irFunction: IrFunction, mangleReturnTypes: Boolean, useOldMangleRules: Boolean): Name {
if (irFunction is IrConstructor) { if (irFunction is IrConstructor) {
// Note that we might drop this convention and use standard mangling for constructors too, see KT-37186. // Note that we might drop this convention and use standard mangling for constructors too, see KT-37186.
assert(irFunction.constructedClass.isInline) { assert(irFunction.constructedClass.isSingleFieldValueClass) {
"Should not mangle names of non-inline class constructors: ${irFunction.render()}" "Should not mangle names of non-inline class constructors: ${irFunction.render()}"
} }
return Name.identifier("constructor-impl") return Name.identifier("constructor-impl")
@@ -69,7 +69,7 @@ object InlineClassAbi {
irFunction.returnType.takeIf { mangleReturnTypes && irFunction.hasMangledReturnType }, irFunction.returnType.takeIf { mangleReturnTypes && irFunction.hasMangledReturnType },
irFunction.isSuspend irFunction.isSuspend
) )
if (suffix == null && ((irFunction.parent as? IrClass)?.isInline != true || irFunction.origin == IrDeclarationOrigin.IR_BUILTINS_STUB)) { if (suffix == null && ((irFunction.parent as? IrClass)?.isSingleFieldValueClass != true || irFunction.origin == IrDeclarationOrigin.IR_BUILTINS_STUB)) {
return irFunction.name return irFunction.name
} }
@@ -121,16 +121,16 @@ object InlineClassAbi {
val IrType.requiresMangling: Boolean val IrType.requiresMangling: Boolean
get() { get() {
val irClass = erasedUpperBound val irClass = erasedUpperBound
return irClass.isInline && irClass.fqNameWhenAvailable != StandardNames.RESULT_FQ_NAME return irClass.isSingleFieldValueClass && irClass.fqNameWhenAvailable != StandardNames.RESULT_FQ_NAME
} }
val IrFunction.fullValueParameterList: List<IrValueParameter> val IrFunction.fullValueParameterList: List<IrValueParameter>
get() = listOfNotNull(extensionReceiverParameter) + valueParameters get() = listOfNotNull(extensionReceiverParameter) + valueParameters
val IrFunction.hasMangledParameters: Boolean val IrFunction.hasMangledParameters: Boolean
get() = dispatchReceiverParameter != null && parentAsClass.isInline || get() = dispatchReceiverParameter != null && parentAsClass.isSingleFieldValueClass ||
fullValueParameterList.any { it.type.requiresMangling } || fullValueParameterList.any { it.type.requiresMangling } ||
(this is IrConstructor && constructedClass.isInline) (this is IrConstructor && constructedClass.isSingleFieldValueClass)
val IrFunction.hasMangledReturnType: Boolean val IrFunction.hasMangledReturnType: Boolean
get() = returnType.isInlineClassType() && parentClassOrNull?.isFileClass != true get() = returnType.isInlineClassType() && parentClassOrNull?.isFileClass != true
@@ -139,5 +139,5 @@ val IrClass.inlineClassFieldName: Name
get() = (inlineClassRepresentation ?: error("Not an inline class: ${render()}")).underlyingPropertyName get() = (inlineClassRepresentation ?: error("Not an inline class: ${render()}")).underlyingPropertyName
val IrFunction.isInlineClassFieldGetter: Boolean val IrFunction.isInlineClassFieldGetter: Boolean
get() = (parent as? IrClass)?.isInline == true && this is IrSimpleFunction && extensionReceiverParameter == null && get() = (parent as? IrClass)?.isSingleFieldValueClass == true && this is IrSimpleFunction && extensionReceiverParameter == null &&
correspondingPropertySymbol?.let { it.owner.getter == this && it.owner.name == parentAsClass.inlineClassFieldName } == true correspondingPropertySymbol?.let { it.owner.getter == this && it.owner.name == parentAsClass.inlineClassFieldName } == true
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.ir.types.defaultType
import org.jetbrains.kotlin.ir.types.makeNullable import org.jetbrains.kotlin.ir.types.makeNullable
import org.jetbrains.kotlin.ir.types.typeWith import org.jetbrains.kotlin.ir.types.typeWith
import org.jetbrains.kotlin.ir.util.defaultType import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.ir.util.functions
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -131,14 +130,14 @@ class JvmReflectSymbols(val context: JvmBackendContext) {
fqName: FqName, fqName: FqName,
classKind: ClassKind = ClassKind.CLASS, classKind: ClassKind = ClassKind.CLASS,
classModality: Modality = Modality.FINAL, classModality: Modality = Modality.FINAL,
classIsInline: Boolean = false, classIsValue: Boolean = false,
block: (IrClass) -> Unit = {} block: (IrClass) -> Unit = {}
): IrClassSymbol = ): IrClassSymbol =
context.irFactory.buildClass { context.irFactory.buildClass {
name = fqName.shortName() name = fqName.shortName()
kind = classKind kind = classKind
modality = classModality modality = classModality
isInline = classIsInline isValue = classIsValue
}.apply { }.apply {
parent = javaLangReflectPackage parent = javaLangReflectPackage
createImplicitParameterDeclarationWithWrappedDescriptor() createImplicitParameterDeclarationWithWrappedDescriptor()
@@ -84,14 +84,14 @@ class JvmSymbols(
fqName: FqName, fqName: FqName,
classKind: ClassKind = ClassKind.CLASS, classKind: ClassKind = ClassKind.CLASS,
classModality: Modality = Modality.FINAL, classModality: Modality = Modality.FINAL,
classIsInline: Boolean = false, classIsValue: Boolean = false,
block: (IrClass) -> Unit = {} block: (IrClass) -> Unit = {}
): IrClassSymbol = ): IrClassSymbol =
irFactory.buildClass { irFactory.buildClass {
name = fqName.shortName() name = fqName.shortName()
kind = classKind kind = classKind
modality = classModality modality = classModality
isInline = classIsInline isValue = classIsValue
}.apply { }.apply {
parent = when (fqName.parent().asString()) { parent = when (fqName.parent().asString()) {
"kotlin" -> kotlinPackage "kotlin" -> kotlinPackage
@@ -271,7 +271,7 @@ class JvmSymbols(
} }
private val resultClassStub: IrClassSymbol = private val resultClassStub: IrClassSymbol =
createClass(StandardNames.RESULT_FQ_NAME, classIsInline = true) { klass -> createClass(StandardNames.RESULT_FQ_NAME, classIsValue = true) { klass ->
klass.addTypeParameter("T", irBuiltIns.anyNType, Variance.OUT_VARIANCE) klass.addTypeParameter("T", irBuiltIns.anyNType, Variance.OUT_VARIANCE)
klass.inlineClassRepresentation = InlineClassRepresentation(Name.identifier("value"), irBuiltIns.anyNType as IrSimpleType) klass.inlineClassRepresentation = InlineClassRepresentation(Name.identifier("value"), irBuiltIns.anyNType as IrSimpleType)
} }
@@ -63,7 +63,7 @@ class MemoizedInlineClassReplacements(
null null
// Mangle all functions in the body of an inline class // Mangle all functions in the body of an inline class
it.parent.safeAs<IrClass>()?.isInline == true -> it.parent.safeAs<IrClass>()?.isSingleFieldValueClass == true ->
when { when {
it.isRemoveAtSpecialBuiltinStub() -> it.isRemoveAtSpecialBuiltinStub() ->
null null
@@ -93,7 +93,7 @@ class MemoizedInlineClassReplacements(
if (this !is IrSimpleFunction) return false if (this !is IrSimpleFunction) return false
if (!this.isFakeOverride) return false if (!this.isFakeOverride) return false
val parentClass = parentClassOrNull ?: return false val parentClass = parentClassOrNull ?: return false
if (!parentClass.isInline) return false if (!parentClass.isSingleFieldValueClass) return false
val overridden = resolveFakeOverride() ?: return false val overridden = resolveFakeOverride() ?: return false
if (!overridden.parentAsClass.isJvmInterface) return false if (!overridden.parentAsClass.isJvmInterface) return false
@@ -113,7 +113,7 @@ class MemoizedInlineClassReplacements(
*/ */
val getBoxFunction: (IrClass) -> IrSimpleFunction = val getBoxFunction: (IrClass) -> IrSimpleFunction =
storageManager.createMemoizedFunction { irClass -> storageManager.createMemoizedFunction { irClass ->
require(irClass.isInline) require(irClass.isSingleFieldValueClass)
irFactory.buildFun { irFactory.buildFun {
name = Name.identifier(KotlinTypeMapper.BOX_JVM_METHOD_NAME) name = Name.identifier(KotlinTypeMapper.BOX_JVM_METHOD_NAME)
origin = JvmLoweredDeclarationOrigin.SYNTHETIC_INLINE_CLASS_MEMBER origin = JvmLoweredDeclarationOrigin.SYNTHETIC_INLINE_CLASS_MEMBER
@@ -134,7 +134,7 @@ class MemoizedInlineClassReplacements(
*/ */
val getUnboxFunction: (IrClass) -> IrSimpleFunction = val getUnboxFunction: (IrClass) -> IrSimpleFunction =
storageManager.createMemoizedFunction { irClass -> storageManager.createMemoizedFunction { irClass ->
require(irClass.isInline) require(irClass.isSingleFieldValueClass)
irFactory.buildFun { irFactory.buildFun {
name = Name.identifier(KotlinTypeMapper.UNBOX_JVM_METHOD_NAME) name = Name.identifier(KotlinTypeMapper.UNBOX_JVM_METHOD_NAME)
origin = JvmLoweredDeclarationOrigin.SYNTHETIC_INLINE_CLASS_MEMBER origin = JvmLoweredDeclarationOrigin.SYNTHETIC_INLINE_CLASS_MEMBER
@@ -147,7 +147,7 @@ class MemoizedInlineClassReplacements(
private val specializedEqualsCache = storageManager.createCacheWithNotNullValues<IrClass, IrSimpleFunction>() private val specializedEqualsCache = storageManager.createCacheWithNotNullValues<IrClass, IrSimpleFunction>()
fun getSpecializedEqualsMethod(irClass: IrClass, irBuiltIns: IrBuiltIns): IrSimpleFunction { fun getSpecializedEqualsMethod(irClass: IrClass, irBuiltIns: IrBuiltIns): IrSimpleFunction {
require(irClass.isInline) require(irClass.isSingleFieldValueClass)
return specializedEqualsCache.computeIfAbsent(irClass) { return specializedEqualsCache.computeIfAbsent(irClass) {
irFactory.buildFun { irFactory.buildFun {
name = InlineClassDescriptorResolver.SPECIALIZED_EQUALS_NAME name = InlineClassDescriptorResolver.SPECIALIZED_EQUALS_NAME
@@ -257,9 +257,9 @@ class MemoizedInlineClassReplacements(
modality = Modality.OPEN modality = Modality.OPEN
} }
origin = when { origin = when {
function.origin == IrDeclarationOrigin.GENERATED_INLINE_CLASS_MEMBER -> function.origin == IrDeclarationOrigin.GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER ->
JvmLoweredDeclarationOrigin.INLINE_CLASS_GENERATED_IMPL_METHOD JvmLoweredDeclarationOrigin.INLINE_CLASS_GENERATED_IMPL_METHOD
function is IrConstructor && function.constructedClass.isInline -> function is IrConstructor && function.constructedClass.isSingleFieldValueClass ->
JvmLoweredDeclarationOrigin.STATIC_INLINE_CLASS_CONSTRUCTOR JvmLoweredDeclarationOrigin.STATIC_INLINE_CLASS_CONSTRUCTOR
else -> else ->
replacementOrigin replacementOrigin
@@ -8,10 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.ir
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.backend.jvm.unboxInlineClass import org.jetbrains.kotlin.backend.jvm.unboxInlineClass
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.IrScript
import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
import org.jetbrains.kotlin.ir.declarations.IrTypeParametersContainer
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
@@ -106,7 +103,7 @@ fun IrType.defaultValue(startOffset: Int, endOffset: Int, context: JvmBackendCon
return classifier.owner.representativeUpperBound.defaultValue(startOffset, endOffset, context) return classifier.owner.representativeUpperBound.defaultValue(startOffset, endOffset, context)
} }
if (this !is IrSimpleType || hasQuestionMark || classOrNull?.owner?.isInline != true) if (this !is IrSimpleType || hasQuestionMark || classOrNull?.owner?.isSingleFieldValueClass != true)
return IrConstImpl.defaultValueForType(startOffset, endOffset, this) return IrConstImpl.defaultValueForType(startOffset, endOffset, this)
val underlyingType = unboxInlineClass() val underlyingType = unboxInlineClass()
@@ -119,7 +116,7 @@ fun IrType.defaultValue(startOffset: Int, endOffset: Int, context: JvmBackendCon
} }
fun IrType.isInlineClassType(): Boolean = fun IrType.isInlineClassType(): Boolean =
erasedUpperBound.isInline erasedUpperBound.isSingleFieldValueClass
val IrType.upperBound: IrType val IrType.upperBound: IrType
get() = erasedUpperBound.symbol.starProjectedType get() = erasedUpperBound.symbol.starProjectedType
@@ -17,10 +17,7 @@ import org.jetbrains.kotlin.codegen.state.KotlinTypeMapperBase
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrScriptSymbol import org.jetbrains.kotlin.ir.symbols.IrScriptSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
@@ -121,7 +118,7 @@ class IrTypeMapper(private val context: JvmBackendContext) : KotlinTypeMapperBas
fun boxType(irType: IrType): Type { fun boxType(irType: IrType): Type {
val irClass = irType.classOrNull?.owner val irClass = irType.classOrNull?.owner
if (irClass != null && irClass.isInline) { if (irClass != null && irClass.isSingleFieldValueClass) {
return mapTypeAsDeclaration(irType) return mapTypeAsDeclaration(irType)
} }
val type = AbstractTypeMapper.mapType(this, irType) val type = AbstractTypeMapper.mapType(this, irType)
@@ -216,7 +216,7 @@ class MethodSignatureMapper(private val context: JvmBackendContext) {
} }
private fun isBoxMethodForInlineClass(function: IrFunction): Boolean = private fun isBoxMethodForInlineClass(function: IrFunction): Boolean =
function.parent.let { it is IrClass && it.isInline } && function.parent.let { it is IrClass && it.isSingleFieldValueClass } &&
function.origin == JvmLoweredDeclarationOrigin.SYNTHETIC_INLINE_CLASS_MEMBER && function.origin == JvmLoweredDeclarationOrigin.SYNTHETIC_INLINE_CLASS_MEMBER &&
function.name.asString() == "box-impl" function.name.asString() == "box-impl"
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.ir.expressions.IrSetValue
import org.jetbrains.kotlin.ir.expressions.IrTypeOperator import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl
@@ -151,7 +150,7 @@ class WasmSharedVariablesManager(val context: JsCommonBackendContext, val builtI
isInner = false isInner = false
isData = false isData = false
isExternal = false isExternal = false
isInline = false isValue = false
isExpect = false isExpect = false
isFun = false isFun = false
} }
@@ -61,7 +61,7 @@ internal class KClassProxy(
override val isFun: Boolean override val isFun: Boolean
get() = state.classReference.isFun get() = state.classReference.isFun
override val isValue: Boolean override val isValue: Boolean
get() = state.classReference.isInline get() = state.classReference.isValue
override fun isInstance(value: Any?): Boolean { override fun isInstance(value: Any?): Boolean {
verify(value is State) { "Cannot interpret `isInstance` method for $value" } verify(value is State) { "Cannot interpret `isInstance` method for $value" }
@@ -20,10 +20,6 @@ import org.jetbrains.kotlin.backend.common.CodegenUtil
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.FieldDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.descriptors.IrImplementingDelegateDescriptorImpl import org.jetbrains.kotlin.ir.descriptors.IrImplementingDelegateDescriptorImpl
@@ -41,7 +37,6 @@ import org.jetbrains.kotlin.ir.util.SYNTHETIC_OFFSET
import org.jetbrains.kotlin.ir.util.createIrClassFromDescriptor import org.jetbrains.kotlin.ir.util.createIrClassFromDescriptor
import org.jetbrains.kotlin.ir.util.declareSimpleFunctionWithOverrides import org.jetbrains.kotlin.ir.util.declareSimpleFunctionWithOverrides
import org.jetbrains.kotlin.ir.util.properties import org.jetbrains.kotlin.ir.util.properties
import org.jetbrains.kotlin.ir.util.referenceFunction
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtDelegatedSuperTypeEntry import org.jetbrains.kotlin.psi.KtDelegatedSuperTypeEntry
@@ -55,7 +50,6 @@ import org.jetbrains.kotlin.psi.synthetics.SyntheticClassOrObjectDescriptor
import org.jetbrains.kotlin.psi.synthetics.findClassDescriptor import org.jetbrains.kotlin.psi.synthetics.findClassDescriptor
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DelegationResolver import org.jetbrains.kotlin.resolve.DelegationResolver
import org.jetbrains.kotlin.resolve.DescriptorFactory
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.propertyIfAccessor import org.jetbrains.kotlin.resolve.descriptorUtil.propertyIfAccessor
import org.jetbrains.kotlin.resolve.descriptorUtil.setSingleOverridden import org.jetbrains.kotlin.resolve.descriptorUtil.setSingleOverridden
@@ -112,19 +106,23 @@ class ClassGenerator(
generateFakeOverrideMemberDeclarations(irClass, ktClassOrObject) generateFakeOverrideMemberDeclarations(irClass, ktClassOrObject)
if (irClass.isInline && ktClassOrObject is KtClassOrObject) { if (irClass.isSingleFieldValueClass && ktClassOrObject is KtClassOrObject) {
val representation = classDescriptor.inlineClassRepresentation val representation = classDescriptor.inlineClassRepresentation
?: error("Unknown representation for inline class: $classDescriptor") ?: error("Unknown representation for inline class: $classDescriptor")
irClass.inlineClassRepresentation = representation.mapUnderlyingType { type -> irClass.inlineClassRepresentation = representation.mapUnderlyingType { type ->
type.toIrType() as? IrSimpleType ?: error("Inline class underlying type is not a simple type: $classDescriptor") type.toIrType() as? IrSimpleType ?: error("Inline class underlying type is not a simple type: $classDescriptor")
} }
generateAdditionalMembersForInlineClasses(irClass, ktClassOrObject) generateAdditionalMembersForSingleFieldValueClasses(irClass, ktClassOrObject)
} }
if (irClass.isData && ktClassOrObject is KtClassOrObject) { if (irClass.isData && ktClassOrObject is KtClassOrObject) {
generateAdditionalMembersForDataClass(irClass, ktClassOrObject) generateAdditionalMembersForDataClass(irClass, ktClassOrObject)
} }
if (irClass.isMultiFieldValueClass && ktClassOrObject is KtClassOrObject) {
generateAdditionalMembersForMultiFieldValueClasses(irClass, ktClassOrObject)
}
if (DescriptorUtils.isEnumClass(classDescriptor)) { if (DescriptorUtils.isEnumClass(classDescriptor)) {
generateAdditionalMembersForEnumClass(irClass) generateAdditionalMembersForEnumClass(irClass)
} }
@@ -422,8 +420,12 @@ class ClassGenerator(
return typeArguments return typeArguments
} }
private fun generateAdditionalMembersForInlineClasses(irClass: IrClass, ktClassOrObject: KtClassOrObject) { private fun generateAdditionalMembersForSingleFieldValueClasses(irClass: IrClass, ktClassOrObject: KtClassOrObject) {
DataClassMembersGenerator(declarationGenerator).generateInlineClassMembers(ktClassOrObject, irClass) DataClassMembersGenerator(declarationGenerator).generateSingleFieldValueClassMembers(ktClassOrObject, irClass)
}
private fun generateAdditionalMembersForMultiFieldValueClasses(irClass: IrClass, ktClassOrObject: KtClassOrObject) {
DataClassMembersGenerator(declarationGenerator).generateMultiFieldValueClassMembers(ktClassOrObject, irClass)
} }
private fun generateAdditionalMembersForDataClass(irClass: IrClass, ktClassOrObject: KtClassOrObject) { private fun generateAdditionalMembersForDataClass(irClass: IrClass, ktClassOrObject: KtClassOrObject) {
@@ -45,8 +45,12 @@ class DataClassMembersGenerator(
declarationGenerator: DeclarationGenerator declarationGenerator: DeclarationGenerator
) : DeclarationGeneratorExtension(declarationGenerator) { ) : DeclarationGeneratorExtension(declarationGenerator) {
fun generateInlineClassMembers(ktClassOrObject: KtClassOrObject, irClass: IrClass) { fun generateSingleFieldValueClassMembers(ktClassOrObject: KtClassOrObject, irClass: IrClass) {
MyDataClassMethodGenerator(ktClassOrObject, irClass, IrDeclarationOrigin.GENERATED_INLINE_CLASS_MEMBER).generate() MyDataClassMethodGenerator(ktClassOrObject, irClass, IrDeclarationOrigin.GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER).generate()
}
fun generateMultiFieldValueClassMembers(ktClassOrObject: KtClassOrObject, irClass: IrClass) {
MyDataClassMethodGenerator(ktClassOrObject, irClass, IrDeclarationOrigin.GENERATED_MULTI_FIELD_VALUE_CLASS_MEMBER).generate()
} }
fun generateDataClassMembers(ktClassOrObject: KtClassOrObject, irClass: IrClass) { fun generateDataClassMembers(ktClassOrObject: KtClassOrObject, irClass: IrClass) {
@@ -38,7 +38,7 @@ open class IrClassImpl(
override var isInner: Boolean = false, override var isInner: Boolean = false,
override val isData: Boolean = false, override val isData: Boolean = false,
override val isExternal: Boolean = false, override val isExternal: Boolean = false,
override val isInline: Boolean = false, override val isValue: Boolean = false,
override val isExpect: Boolean = false, override val isExpect: Boolean = false,
override val isFun: Boolean = false, override val isFun: Boolean = false,
override val source: SourceElement = SourceElement.NO_SOURCE, override val source: SourceElement = SourceElement.NO_SOURCE,
@@ -47,14 +47,14 @@ abstract class AbstractIrFactoryImpl : IrFactory {
isInner: Boolean, isInner: Boolean,
isData: Boolean, isData: Boolean,
isExternal: Boolean, isExternal: Boolean,
isInline: Boolean, isValue: Boolean,
isExpect: Boolean, isExpect: Boolean,
isFun: Boolean, isFun: Boolean,
source: SourceElement, source: SourceElement,
): IrClass = ): IrClass =
IrClassImpl( IrClassImpl(
startOffset, endOffset, origin, symbol, name, kind, visibility, modality, startOffset, endOffset, origin, symbol, name, kind, visibility, modality,
isCompanion, isInner, isData, isExternal, isInline, isExpect, isFun, source, isCompanion, isInner, isData, isExternal, isValue, isExpect, isFun, source,
factory = this factory = this
) )
@@ -58,7 +58,7 @@ class IrFactoryImplForJsIC(override val stageController: StageController) : Abst
isInner: Boolean, isInner: Boolean,
isData: Boolean, isData: Boolean,
isExternal: Boolean, isExternal: Boolean,
isInline: Boolean, isValue: Boolean,
isExpect: Boolean, isExpect: Boolean,
isFun: Boolean, isFun: Boolean,
source: SourceElement source: SourceElement
@@ -76,7 +76,7 @@ class IrFactoryImplForJsIC(override val stageController: StageController) : Abst
isInner, isInner,
isData, isData,
isExternal, isExternal,
isInline, isValue,
isExpect, isExpect,
isFun, isFun,
source, source,
@@ -17,7 +17,7 @@ class IrClassBuilder : IrDeclarationBuilder() {
var isInner: Boolean = false var isInner: Boolean = false
var isData: Boolean = false var isData: Boolean = false
var isExternal: Boolean = false var isExternal: Boolean = false
var isInline: Boolean = false var isValue: Boolean = false
var isExpect: Boolean = false var isExpect: Boolean = false
var isFun: Boolean = false var isFun: Boolean = false
@@ -30,7 +30,7 @@ class IrClassBuilder : IrDeclarationBuilder() {
isInner = from.isInner isInner = from.isInner
isData = from.isData isData = from.isData
isExternal = from.isExternal isExternal = from.isExternal
isInline = from.isInline isValue = from.isValue
isExpect = from.isExpect isExpect = from.isExpect
isFun = from.isFun isFun = from.isFun
} }
@@ -21,8 +21,9 @@ import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.types.IrSimpleType import org.jetbrains.kotlin.ir.types.IrSimpleType
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.transformInPlace import org.jetbrains.kotlin.ir.util.primaryConstructor
import org.jetbrains.kotlin.ir.util.transformIfNeeded import org.jetbrains.kotlin.ir.util.transformIfNeeded
import org.jetbrains.kotlin.ir.util.transformInPlace
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -39,7 +40,7 @@ abstract class IrClass :
abstract val isCompanion: Boolean abstract val isCompanion: Boolean
abstract val isInner: Boolean abstract val isInner: Boolean
abstract val isData: Boolean abstract val isData: Boolean
abstract val isInline: Boolean abstract val isValue: Boolean
abstract val isExpect: Boolean abstract val isExpect: Boolean
abstract val isFun: Boolean abstract val isFun: Boolean
@@ -69,6 +70,12 @@ abstract class IrClass :
} }
} }
val IrClass.isSingleFieldValueClass
get() = this.isValue && (this.inlineClassRepresentation != null || this.primaryConstructor?.valueParameters?.size == 1)
val IrClass.isMultiFieldValueClass
get() = this.isValue && !isSingleFieldValueClass
fun IrClass.addMember(member: IrDeclaration) { fun IrClass.addMember(member: IrDeclaration) {
declarations.add(member) declarations.add(member)
} }
@@ -49,7 +49,8 @@ interface IrDeclarationOrigin {
object SCRIPT_PROVIDED_PROPERTY : IrDeclarationOriginImpl("SCRIPT_PROVIDED_PROPERTY") object SCRIPT_PROVIDED_PROPERTY : IrDeclarationOriginImpl("SCRIPT_PROVIDED_PROPERTY")
object SCRIPT_RESULT_PROPERTY : IrDeclarationOriginImpl("SCRIPT_RESULT_PROPERTY") object SCRIPT_RESULT_PROPERTY : IrDeclarationOriginImpl("SCRIPT_RESULT_PROPERTY")
object GENERATED_DATA_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_DATA_CLASS_MEMBER") object GENERATED_DATA_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_DATA_CLASS_MEMBER")
object GENERATED_INLINE_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_INLINE_CLASS_MEMBER") object GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER")
object GENERATED_MULTI_FIELD_VALUE_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_MULTI_FIELD_VALUE_CLASS_MEMBER")
object LOCAL_FUNCTION : IrDeclarationOriginImpl("LOCAL_FUNCTION") object LOCAL_FUNCTION : IrDeclarationOriginImpl("LOCAL_FUNCTION")
object LOCAL_FUNCTION_FOR_LAMBDA : IrDeclarationOriginImpl("LOCAL_FUNCTION_FOR_LAMBDA") object LOCAL_FUNCTION_FOR_LAMBDA : IrDeclarationOriginImpl("LOCAL_FUNCTION_FOR_LAMBDA")
object CATCH_PARAMETER : IrDeclarationOriginImpl("CATCH_PARAMETER") object CATCH_PARAMETER : IrDeclarationOriginImpl("CATCH_PARAMETER")
@@ -40,7 +40,7 @@ interface IrFactory {
isInner: Boolean = false, isInner: Boolean = false,
isData: Boolean = false, isData: Boolean = false,
isExternal: Boolean = false, isExternal: Boolean = false,
isInline: Boolean = false, isValue: Boolean = false,
isExpect: Boolean = false, isExpect: Boolean = false,
isFun: Boolean = false, isFun: Boolean = false,
source: SourceElement = SourceElement.NO_SOURCE, source: SourceElement = SourceElement.NO_SOURCE,
@@ -33,7 +33,7 @@ class IrLazyClass(
override val isInner: Boolean, override val isInner: Boolean,
override val isData: Boolean, override val isData: Boolean,
override val isExternal: Boolean, override val isExternal: Boolean,
override val isInline: Boolean, override val isValue: Boolean,
override val isExpect: Boolean, override val isExpect: Boolean,
override val isFun: Boolean, override val isFun: Boolean,
override val stubGenerator: DeclarationStubGenerator, override val stubGenerator: DeclarationStubGenerator,
@@ -33,7 +33,7 @@ class LazyIrFactory(
isInner: Boolean, isInner: Boolean,
isData: Boolean, isData: Boolean,
isExternal: Boolean, isExternal: Boolean,
isInline: Boolean, isValue: Boolean,
isExpect: Boolean, isExpect: Boolean,
isFun: Boolean, isFun: Boolean,
source: SourceElement source: SourceElement
@@ -42,7 +42,7 @@ class LazyIrFactory(
else else
delegate.createClass( delegate.createClass(
startOffset, endOffset, origin, symbol, name, kind, visibility, modality, startOffset, endOffset, origin, symbol, name, kind, visibility, modality,
isCompanion, isInner, isData, isExternal, isInline, isExpect, isFun, source isCompanion, isInner, isData, isExternal, isValue, isExpect, isFun, source
) )
override fun createConstructor( override fun createConstructor(
@@ -604,12 +604,11 @@ open class IrBasedClassDescriptor(owner: IrClass) : ClassDescriptor, IrBasedDecl
override fun isData() = owner.isData override fun isData() = owner.isData
override fun isInline() = owner.isInline override fun isInline() = owner.isSingleFieldValueClass
override fun isFun() = owner.isFun override fun isFun() = owner.isFun
// In IR, inline and value are synonyms override fun isValue() = owner.isValue
override fun isValue() = owner.isInline
override fun getThisAsReceiverParameter() = owner.thisReceiver?.toIrBasedDescriptor() as ReceiverParameterDescriptor override fun getThisAsReceiverParameter() = owner.thisReceiver?.toIrBasedDescriptor() as ReceiverParameterDescriptor
@@ -457,7 +457,7 @@ interface IrTypeSystemContext : TypeSystemContext, TypeSystemCommonSuperTypesCon
this as? IrTypeParameterSymbol this as? IrTypeParameterSymbol
override fun TypeConstructorMarker.isInlineClass(): Boolean = override fun TypeConstructorMarker.isInlineClass(): Boolean =
(this as? IrClassSymbol)?.owner?.isInline == true (this as? IrClassSymbol)?.owner?.isSingleFieldValueClass == true
override fun TypeConstructorMarker.isInnerClass(): Boolean = override fun TypeConstructorMarker.isInnerClass(): Boolean =
(this as? IrClassSymbol)?.owner?.isInner == true (this as? IrClassSymbol)?.owner?.isInner == true
@@ -128,7 +128,7 @@ abstract class DataClassMembersGenerator(
fun generateEqualsMethodBody(properties: List<IrProperty>) { fun generateEqualsMethodBody(properties: List<IrProperty>) {
val irType = irClass.defaultType val irType = irClass.defaultType
if (!irClass.isInline) { if (!irClass.isSingleFieldValueClass) {
+irIfThenReturnTrue(irEqeqeq(irThis(), irOther())) +irIfThenReturnTrue(irEqeqeq(irThis(), irOther()))
} }
+irIfThenReturnFalse(irNotIs(irOther(), irType)) +irIfThenReturnFalse(irNotIs(irOther(), irType))
@@ -30,7 +30,7 @@ import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.resolve.isInlineClass import org.jetbrains.kotlin.resolve.isInlineOrValueClass
import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
@@ -269,7 +269,7 @@ abstract class DeclarationStubGenerator(
isInner = descriptor.isInner, isInner = descriptor.isInner,
isData = descriptor.isData, isData = descriptor.isData,
isExternal = descriptor.isEffectivelyExternal(), isExternal = descriptor.isEffectivelyExternal(),
isInline = descriptor.isInlineClass(), isValue = descriptor.isInlineOrValueClass(),
isExpect = descriptor.isExpect, isExpect = descriptor.isExpect,
isFun = descriptor.isFun, isFun = descriptor.isFun,
stubGenerator = this, stubGenerator = this,
@@ -147,7 +147,7 @@ open class DeepCopyIrTreeWithSymbols(
isInner = declaration.isInner, isInner = declaration.isInner,
isData = declaration.isData, isData = declaration.isData,
isExternal = declaration.isExternal, isExternal = declaration.isExternal,
isInline = declaration.isInline, isValue = declaration.isValue,
isExpect = declaration.isExpect, isExpect = declaration.isExpect,
isFun = declaration.isFun isFun = declaration.isFun
).apply { ).apply {
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.ir.declarations.IrFactory
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.resolve.isInlineClass import org.jetbrains.kotlin.resolve.isInlineOrValueClass
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
val ParameterDescriptor.indexOrMinusOne: Int val ParameterDescriptor.indexOrMinusOne: Int
@@ -39,5 +39,5 @@ fun IrFactory.createIrClassFromDescriptor(
): IrClass = createClass( ): IrClass = createClass(
startOffset, endOffset, origin, symbol, name, descriptor.kind, visibility, modality, startOffset, endOffset, origin, symbol, name, descriptor.kind, visibility, modality,
descriptor.isCompanionObject, descriptor.isInner, descriptor.isData, descriptor.isEffectivelyExternal(), descriptor.isCompanionObject, descriptor.isInner, descriptor.isData, descriptor.isEffectivelyExternal(),
descriptor.isInlineClass(), descriptor.isExpect, descriptor.isFun, descriptor.source descriptor.isInlineOrValueClass(), descriptor.isExpect, descriptor.isFun, descriptor.source
) )
@@ -475,7 +475,7 @@ class RenderIrElementVisitor(private val normalizeNames: Boolean = false, privat
"inner".takeIf { isInner }, "inner".takeIf { isInner },
"data".takeIf { isData }, "data".takeIf { isData },
"external".takeIf { isExternal }, "external".takeIf { isExternal },
"inline".takeIf { isInline }, "value".takeIf { isValue },
"expect".takeIf { isExpect }, "expect".takeIf { isExpect },
"fun".takeIf { isFun } "fun".takeIf { isFun }
) )
@@ -194,7 +194,8 @@ private class KotlinLikeDumper(val p: Printer, val options: KotlinLikeDumpOption
isVararg = INAPPLICABLE, isVararg = INAPPLICABLE,
isSuspend = INAPPLICABLE, isSuspend = INAPPLICABLE,
isInner, isInner,
isInline, isInline = false,
isValue,
isData, isData,
isCompanion, isCompanion,
isFun, isFun,
@@ -254,6 +255,7 @@ private class KotlinLikeDumper(val p: Printer, val options: KotlinLikeDumpOption
enum / annotation / fun // as a modifier in `fun interface` enum / annotation / fun // as a modifier in `fun interface`
companion companion
inline inline
value
infix infix
operator operator
data data
@@ -271,6 +273,7 @@ private class KotlinLikeDumper(val p: Printer, val options: KotlinLikeDumpOption
isSuspend: Boolean, isSuspend: Boolean,
isInner: Boolean, isInner: Boolean,
isInline: Boolean, isInline: Boolean,
isValue: Boolean,
isData: Boolean, isData: Boolean,
isCompanion: Boolean, isCompanion: Boolean,
isFunInterface: Boolean, isFunInterface: Boolean,
@@ -305,6 +308,7 @@ private class KotlinLikeDumper(val p: Printer, val options: KotlinLikeDumpOption
p(isSuspend, "suspend") p(isSuspend, "suspend")
p(isInner, "inner") p(isInner, "inner")
p(isInline, "inline") p(isInline, "inline")
p(isValue, "value")
p(isData, "data") p(isData, "data")
p(isCompanion, "companion") p(isCompanion, "companion")
p(isFunInterface, "fun") p(isFunInterface, "fun")
@@ -542,6 +546,7 @@ private class KotlinLikeDumper(val p: Printer, val options: KotlinLikeDumpOption
isSuspend = INAPPLICABLE, isSuspend = INAPPLICABLE,
isInner = INAPPLICABLE, isInner = INAPPLICABLE,
isInline, isInline,
isValue = INAPPLICABLE,
isData = INAPPLICABLE, isData = INAPPLICABLE,
isCompanion = INAPPLICABLE, isCompanion = INAPPLICABLE,
isFunInterface = INAPPLICABLE, isFunInterface = INAPPLICABLE,
@@ -597,6 +602,7 @@ private class KotlinLikeDumper(val p: Printer, val options: KotlinLikeDumpOption
isSuspend, isSuspend,
isInner = INAPPLICABLE, isInner = INAPPLICABLE,
isInline, isInline,
isValue = INAPPLICABLE,
isData = INAPPLICABLE, isData = INAPPLICABLE,
isCompanion = INAPPLICABLE, isCompanion = INAPPLICABLE,
isFunInterface = INAPPLICABLE, isFunInterface = INAPPLICABLE,
@@ -707,8 +713,9 @@ private class KotlinLikeDumper(val p: Printer, val options: KotlinLikeDumpOption
isVararg = INAPPLICABLE, isVararg = INAPPLICABLE,
isSuspend = getter?.isSuspend == true, isSuspend = getter?.isSuspend == true,
isInner = INAPPLICABLE, isInner = INAPPLICABLE,
// could be used on property if all all accessors have same state, otherwise must be defined on each accessor // could be used on property if all accessors have same state, otherwise must be defined on each accessor
isInline = false, isInline = false,
isValue = INAPPLICABLE,
isData = INAPPLICABLE, isData = INAPPLICABLE,
isCompanion = INAPPLICABLE, isCompanion = INAPPLICABLE,
isFunInterface = INAPPLICABLE, isFunInterface = INAPPLICABLE,
@@ -797,6 +804,7 @@ private class KotlinLikeDumper(val p: Printer, val options: KotlinLikeDumpOption
isSuspend = INAPPLICABLE, isSuspend = INAPPLICABLE,
isInner = INAPPLICABLE, isInner = INAPPLICABLE,
isInline = INAPPLICABLE, isInline = INAPPLICABLE,
isValue = INAPPLICABLE,
isData = INAPPLICABLE, isData = INAPPLICABLE,
isCompanion = INAPPLICABLE, isCompanion = INAPPLICABLE,
isFunInterface = INAPPLICABLE, isFunInterface = INAPPLICABLE,
@@ -311,7 +311,7 @@ class IrDeclarationDeserializer(
flags.isInner, flags.isInner,
flags.isData, flags.isData,
flags.isExternal || isEffectivelyExternal, flags.isExternal || isEffectivelyExternal,
flags.isInline, flags.isValue,
flags.isExpect, flags.isExpect,
flags.isFun, flags.isFun,
) )
@@ -331,11 +331,13 @@ class IrDeclarationDeserializer(
thisReceiver = deserializeIrValueParameter(proto.thisReceiver, -1) thisReceiver = deserializeIrValueParameter(proto.thisReceiver, -1)
inlineClassRepresentation = when { inlineClassRepresentation = when {
!flags.isInline -> null !(flags.isValue && primaryConstructor?.valueParameters?.size == 1) -> null
proto.hasInlineClassRepresentation() -> deserializeInlineClassRepresentation(proto.inlineClassRepresentation) proto.hasInlineClassRepresentation() -> deserializeInlineClassRepresentation(proto.inlineClassRepresentation)
else -> computeMissingInlineClassRepresentationForCompatibility(this) else -> computeMissingInlineClassRepresentationForCompatibility(this)
} }
// todo something when value classes
sealedSubclasses = proto.sealedSubclassList.map { deserializeIrSymbol(it) as IrClassSymbol } sealedSubclasses = proto.sealedSubclassList.map { deserializeIrSymbol(it) as IrClassSymbol }
fakeOverrideBuilder.enqueueClass(this, signature, compatibilityMode) fakeOverrideBuilder.enqueueClass(this, signature, compatibilityMode)
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.backend.common.serialization.encodings
import org.jetbrains.kotlin.backend.common.serialization.IrFlags import org.jetbrains.kotlin.backend.common.serialization.IrFlags
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.DescriptorVisibility import org.jetbrains.kotlin.descriptors.DescriptorVisibility
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags
@@ -27,7 +27,7 @@ value class ClassFlags(val flags: Long) {
val isCompanion: Boolean get() = IrFlags.CLASS_KIND.get(flags.toInt()) == ProtoBuf.Class.Kind.COMPANION_OBJECT val isCompanion: Boolean get() = IrFlags.CLASS_KIND.get(flags.toInt()) == ProtoBuf.Class.Kind.COMPANION_OBJECT
val isInner: Boolean get() = IrFlags.IS_INNER.get(flags.toInt()) val isInner: Boolean get() = IrFlags.IS_INNER.get(flags.toInt())
val isData: Boolean get() = IrFlags.IS_DATA.get(flags.toInt()) val isData: Boolean get() = IrFlags.IS_DATA.get(flags.toInt())
val isInline: Boolean get() = IrFlags.IS_INLINE_CLASS.get(flags.toInt()) val isValue: Boolean get() = IrFlags.IS_VALUE_CLASS.get(flags.toInt())
val isExpect: Boolean get() = IrFlags.IS_EXPECT_CLASS.get(flags.toInt()) val isExpect: Boolean get() = IrFlags.IS_EXPECT_CLASS.get(flags.toInt())
val isExternal: Boolean get() = IrFlags.IS_EXTERNAL_CLASS.get(flags.toInt()) val isExternal: Boolean get() = IrFlags.IS_EXTERNAL_CLASS.get(flags.toInt())
val isFun: Boolean get() = IrFlags.IS_FUN_INTERFACE.get(flags.toInt()) val isFun: Boolean get() = IrFlags.IS_FUN_INTERFACE.get(flags.toInt())
@@ -40,8 +40,9 @@ value class ClassFlags(val flags: Long) {
val modality = ProtoEnumFlags.modality(modality) val modality = ProtoEnumFlags.modality(modality)
val kind = ProtoEnumFlags.classKind(kind, isCompanion) val kind = ProtoEnumFlags.classKind(kind, isCompanion)
val flags = val flags = IrFlags.getClassFlags(
IrFlags.getClassFlags(hasAnnotation, visibility, modality, kind, isInner, isData, isExternal, isExpect, isInline, isFun) hasAnnotation, visibility, modality, kind, isInner, isData, isExternal, isExpect, isValue, isFun
)
flags.toLong() flags.toLong()
} }
@@ -92,7 +92,7 @@ class DescriptorSerializer private constructor(
ProtoEnumFlags.modality(classDescriptor.modality), ProtoEnumFlags.modality(classDescriptor.modality),
ProtoEnumFlags.classKind(classDescriptor.kind, classDescriptor.isCompanionObject), ProtoEnumFlags.classKind(classDescriptor.kind, classDescriptor.isCompanionObject),
classDescriptor.isInner, classDescriptor.isData, classDescriptor.isExternal, classDescriptor.isExpect, classDescriptor.isInner, classDescriptor.isData, classDescriptor.isExternal, classDescriptor.isExpect,
classDescriptor.isInlineClass(), classDescriptor.isFun classDescriptor.isInlineOrValueClass(), classDescriptor.isFun
) )
if (flags != builder.flags) { if (flags != builder.flags) {
builder.flags = flags builder.flags = flags
+6 -6
View File
@@ -49,7 +49,7 @@ fun box(): String {
val f5 = F5(UInt.MAX_VALUE.dec()) val f5 = F5(UInt.MAX_VALUE.dec())
val f6 = F6("678") val f6 = F6("678")
val a1 = A(f1, f2, f3, f4, f5, f6, 9, UInt.MAX_VALUE - 2U, "0") val a1 = A(f1, f2, f3, f4, f5, f6, 9, UInt.MAX_VALUE - 2U, "0")
val a2 = a1 val a2 = A(f1, f2, f3, f4, f5, f6, 9, UInt.MAX_VALUE - 2U, "0")
val b = B(a1, a2) val b = B(a1, a2)
assert(f1.x == 1) assert(f1.x == 1)
@@ -181,17 +181,17 @@ fun box(): String {
assert(b.toString() == b.toString()) assert(b.toString() == b.toString())
assert(b.hashCode() == b.hashCode()) assert(b.hashCode() == b.hashCode())
fun String.assertGoodBasicToString(expected: String) = assert(matches(Regex("^([_a-zA-Z]+[.])*$expected@[0-9a-f]+$"))) { this }
assert(f1.toString() == "F1(x=1)") { f1.toString() } assert(f1.toString() == "F1(x=1)") { f1.toString() }
assert(f2.toString() == "F2(x=4294967295)") { f2.toString() } assert(f2.toString() == "F2(x=4294967295)") { f2.toString() }
f3.toString().assertGoodBasicToString("F3") // not data class yet assert(f3.toString() == "F3(x=F1(x=1), y=F2(x=4294967295))") { f3.toString() }
assert(f4.toString() == "F4(x=5)") { f4.toString() } assert(f4.toString() == "F4(x=5)") { f4.toString() }
assert(f5.toString() == "F5(x=4294967294)") { f5.toString() } assert(f5.toString() == "F5(x=4294967294)") { f5.toString() }
assert(f6.toString() == "F6(x=678)") { f6.toString() } assert(f6.toString() == "F6(x=678)") { f6.toString() }
a1.toString().assertGoodBasicToString("A") // not data class yet val aStr = "A(f1=F1(x=1), f2=F2(x=4294967295), f3=F3(x=F1(x=1), y=F2(x=4294967295)), f4=F4(x=5), f5=F5(x=4294967294), f6=F6(x=678), f7=9, f8=4294967293, f9=0)"
a2.toString().assertGoodBasicToString("A") // not data class yet assert(a1.toString() == aStr) { a1.toString() }
assert(b.toString() == "OverridenBToString(a1 = $a1, a2 = $a2)") { b.toString() } assert(a2.toString() == aStr) { a2.toString() }
assert(b.toString() == "OverridenBToString(a1 = $aStr, a2 = $aStr)") { b.toString() }
return "OK" return "OK"
} }
@@ -46,9 +46,9 @@ package
public constructor A4(/*0*/ x: B4, /*1*/ y: B4) public constructor A4(/*0*/ x: B4, /*1*/ y: B4)
public final val x: B4 public final val x: B4
public final val y: B4 public final val y: B4
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class A5</*0*/ T : A5<T>> { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class A5</*0*/ T : A5<T>> {
@@ -63,27 +63,27 @@ package
public constructor A6</*0*/ T : B6<T>>(/*0*/ x: T, /*1*/ y: T) public constructor A6</*0*/ T : B6<T>>(/*0*/ x: T, /*1*/ y: T)
public final val x: T public final val x: T
public final val y: T public final val y: T
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class A7</*0*/ T : B7<T>> { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class A7</*0*/ T : B7<T>> {
public constructor A7</*0*/ T : B7<T>>(/*0*/ x: T, /*1*/ y: T) public constructor A7</*0*/ T : B7<T>>(/*0*/ x: T, /*1*/ y: T)
public final val x: T public final val x: T
public final val y: T public final val y: T
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class A8</*0*/ T : B8<T>> { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class A8</*0*/ T : B8<T>> {
public constructor A8</*0*/ T : B8<T>>(/*0*/ x: T?, /*1*/ y: T?) public constructor A8</*0*/ T : B8<T>>(/*0*/ x: T?, /*1*/ y: T?)
public final val x: T? public final val x: T?
public final val y: T? public final val y: T?
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B : I1, I2 { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B : I1, I2 {
@@ -99,18 +99,18 @@ package
public constructor B1(/*0*/ x: B1, /*1*/ y: B1) public constructor B1(/*0*/ x: B1, /*1*/ y: B1)
public final val x: B1 public final val x: B1
public final val y: B1 public final val y: B1
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B2 { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B2 {
public constructor B2(/*0*/ x: A2, /*1*/ y: A2) public constructor B2(/*0*/ x: A2, /*1*/ y: A2)
public final val x: A2 public final val x: A2
public final val y: A2 public final val y: A2
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B3 { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B3 {
@@ -125,18 +125,18 @@ package
public constructor B4(/*0*/ x: A4, /*1*/ y: A4) public constructor B4(/*0*/ x: A4, /*1*/ y: A4)
public final val x: A4 public final val x: A4
public final val y: A4 public final val y: A4
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B5</*0*/ T : B5<T>> { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B5</*0*/ T : B5<T>> {
public constructor B5</*0*/ T : B5<T>>(/*0*/ x: T, /*1*/ y: T) public constructor B5</*0*/ T : B5<T>>(/*0*/ x: T, /*1*/ y: T)
public final val x: T public final val x: T
public final val y: T public final val y: T
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B6</*0*/ T : A6<T>> { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B6</*0*/ T : A6<T>> {
@@ -151,18 +151,18 @@ package
public constructor B7</*0*/ T : A7<T>>(/*0*/ x: T, /*1*/ y: T) public constructor B7</*0*/ T : A7<T>>(/*0*/ x: T, /*1*/ y: T)
public final val x: T public final val x: T
public final val y: T public final val y: T
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B8</*0*/ T : A8<T>> { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class B8</*0*/ T : A8<T>> {
public constructor B8</*0*/ T : A8<T>>(/*0*/ x: T?, /*1*/ y: T?) public constructor B8</*0*/ T : A8<T>>(/*0*/ x: T?, /*1*/ y: T?)
public final val x: T? public final val x: T?
public final val y: T? public final val y: T?
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class C { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class C {
@@ -178,36 +178,36 @@ package
public constructor C4(/*0*/ x: D4?, /*1*/ y: D4?) public constructor C4(/*0*/ x: D4?, /*1*/ y: D4?)
public final val x: D4? public final val x: D4?
public final val y: D4? public final val y: D4?
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class D4 { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class D4 {
public constructor D4(/*0*/ x: D4?, /*1*/ y: C4?) public constructor D4(/*0*/ x: D4?, /*1*/ y: C4?)
public final val x: D4? public final val x: D4?
public final val y: C4? public final val y: C4?
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class E4 { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class E4 {
public constructor E4(/*0*/ x: E4?, /*1*/ y: kotlin.Int) public constructor E4(/*0*/ x: E4?, /*1*/ y: kotlin.Int)
public final val x: E4? public final val x: E4?
public final val y: kotlin.Int public final val y: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class F4 { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class F4 {
public constructor F4(/*0*/ x: kotlin.Int, /*1*/ y: F4?) public constructor F4(/*0*/ x: kotlin.Int, /*1*/ y: F4?)
public final val x: kotlin.Int public final val x: kotlin.Int
public final val y: F4? public final val y: F4?
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
public interface I1 { public interface I1 {
@@ -45,17 +45,17 @@ package kotlin {
public constructor A5(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.Int) public constructor A5(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.Int)
public final val x: kotlin.Int public final val x: kotlin.Int
public final val y: kotlin.Int public final val y: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.jvm.JvmInline public final value class A6 { @kotlin.jvm.JvmInline public final value class A6 {
public constructor A6(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.Int) public constructor A6(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.Int)
public final val y: kotlin.Int public final val y: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.jvm.JvmInline public final value class A7 { @kotlin.jvm.JvmInline public final value class A7 {
@@ -4,54 +4,54 @@ package
public constructor Bar(/*0*/ u: kotlin.Unit, /*1*/ y: kotlin.Unit) public constructor Bar(/*0*/ u: kotlin.Unit, /*1*/ y: kotlin.Unit)
public final val u: kotlin.Unit public final val u: kotlin.Unit
public final val y: kotlin.Unit public final val y: kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class BarNullable { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class BarNullable {
public constructor BarNullable(/*0*/ u: kotlin.Unit?, /*1*/ y: kotlin.Unit?) public constructor BarNullable(/*0*/ u: kotlin.Unit?, /*1*/ y: kotlin.Unit?)
public final val u: kotlin.Unit? public final val u: kotlin.Unit?
public final val y: kotlin.Unit? public final val y: kotlin.Unit?
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class Baz { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class Baz {
public constructor Baz(/*0*/ u: kotlin.Nothing, /*1*/ y: kotlin.Nothing) public constructor Baz(/*0*/ u: kotlin.Nothing, /*1*/ y: kotlin.Nothing)
public final val u: kotlin.Nothing public final val u: kotlin.Nothing
public final val y: kotlin.Nothing public final val y: kotlin.Nothing
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class Baz1 { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class Baz1 {
public constructor Baz1(/*0*/ u: kotlin.Nothing, /*1*/ y: kotlin.Int) public constructor Baz1(/*0*/ u: kotlin.Nothing, /*1*/ y: kotlin.Int)
public final val u: kotlin.Nothing public final val u: kotlin.Nothing
public final val y: kotlin.Int public final val y: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class Baz2 { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class Baz2 {
public constructor Baz2(/*0*/ u: kotlin.Int, /*1*/ y: kotlin.Nothing) public constructor Baz2(/*0*/ u: kotlin.Int, /*1*/ y: kotlin.Nothing)
public final val u: kotlin.Int public final val u: kotlin.Int
public final val y: kotlin.Nothing public final val y: kotlin.Nothing
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class BazNullable { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class BazNullable {
public constructor BazNullable(/*0*/ u: kotlin.Nothing?, /*1*/ y: kotlin.Nothing?) public constructor BazNullable(/*0*/ u: kotlin.Nothing?, /*1*/ y: kotlin.Nothing?)
public final val u: kotlin.Nothing? public final val u: kotlin.Nothing?
public final val y: kotlin.Nothing? public final val y: kotlin.Nothing?
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class Empty</*0*/ T> { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class Empty</*0*/ T> {
@@ -65,53 +65,53 @@ package
public constructor Foo</*0*/ T>(/*0*/ x: T, /*1*/ y: T) public constructor Foo</*0*/ T>(/*0*/ x: T, /*1*/ y: T)
public final val x: T public final val x: T
public final val y: T public final val y: T
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class FooGenericArray</*0*/ T> { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class FooGenericArray</*0*/ T> {
public constructor FooGenericArray</*0*/ T>(/*0*/ x: kotlin.Array<T>, /*1*/ y: kotlin.Array<T>) public constructor FooGenericArray</*0*/ T>(/*0*/ x: kotlin.Array<T>, /*1*/ y: kotlin.Array<T>)
public final val x: kotlin.Array<T> public final val x: kotlin.Array<T>
public final val y: kotlin.Array<T> public final val y: kotlin.Array<T>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class FooGenericArray2</*0*/ T> { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class FooGenericArray2</*0*/ T> {
public constructor FooGenericArray2</*0*/ T>(/*0*/ x: kotlin.Array<kotlin.Array<T>>, /*1*/ y: kotlin.Array<kotlin.Array<T>>) public constructor FooGenericArray2</*0*/ T>(/*0*/ x: kotlin.Array<kotlin.Array<T>>, /*1*/ y: kotlin.Array<kotlin.Array<T>>)
public final val x: kotlin.Array<kotlin.Array<T>> public final val x: kotlin.Array<kotlin.Array<T>>
public final val y: kotlin.Array<kotlin.Array<T>> public final val y: kotlin.Array<kotlin.Array<T>>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class FooNullable</*0*/ T> { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class FooNullable</*0*/ T> {
public constructor FooNullable</*0*/ T>(/*0*/ x: T?, /*1*/ y: T?) public constructor FooNullable</*0*/ T>(/*0*/ x: T?, /*1*/ y: T?)
public final val x: T? public final val x: T?
public final val y: T? public final val y: T?
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class FooStarProjectedArray { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class FooStarProjectedArray {
public constructor FooStarProjectedArray(/*0*/ x: kotlin.Array<*>, /*1*/ y: kotlin.Array<*>) public constructor FooStarProjectedArray(/*0*/ x: kotlin.Array<*>, /*1*/ y: kotlin.Array<*>)
public final val x: kotlin.Array<*> public final val x: kotlin.Array<*>
public final val y: kotlin.Array<*> public final val y: kotlin.Array<*>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class FooStarProjectedArray2 { @kotlin.Suppress(names = {"OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE"}) @kotlin.jvm.JvmInline public final value class FooStarProjectedArray2 {
public constructor FooStarProjectedArray2(/*0*/ x: kotlin.Array<kotlin.Array<*>>, /*1*/ y: kotlin.Array<kotlin.Array<*>>) public constructor FooStarProjectedArray2(/*0*/ x: kotlin.Array<kotlin.Array<*>>, /*1*/ y: kotlin.Array<kotlin.Array<*>>)
public final val x: kotlin.Array<kotlin.Array<*>> public final val x: kotlin.Array<kotlin.Array<*>>
public final val y: kotlin.Array<kotlin.Array<*>> public final val y: kotlin.Array<kotlin.Array<*>>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String
} }
@@ -97,13 +97,13 @@ FILE fqName:<root> fileName:/kt31649.kt
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:nn type:kotlin.Nothing? visibility:private [final]' type=kotlin.Nothing? origin=null GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:nn type:kotlin.Nothing? visibility:private [final]' type=kotlin.Nothing? origin=null
receiver: GET_VAR '<this>: <root>.TestData declared in <root>.TestData.toString' type=<root>.TestData origin=null receiver: GET_VAR '<this>: <root>.TestData declared in <root>.TestData.toString' type=<root>.TestData origin=null
CONST String type=kotlin.String value=")" CONST String type=kotlin.String value=")"
CLASS CLASS name:TestInline modality:FINAL visibility:public [inline] superTypes:[kotlin.Any] CLASS CLASS name:TestInline modality:FINAL visibility:public [value] superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.TestInline $this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.TestInline
CONSTRUCTOR visibility:public <> (nn:kotlin.Nothing?) returnType:<root>.TestInline [primary] CONSTRUCTOR visibility:public <> (nn:kotlin.Nothing?) returnType:<root>.TestInline [primary]
VALUE_PARAMETER name:nn index:0 type:kotlin.Nothing? VALUE_PARAMETER name:nn index:0 type:kotlin.Nothing?
BLOCK_BODY BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any' DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:TestInline modality:FINAL visibility:public [inline] superTypes:[kotlin.Any]' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:TestInline modality:FINAL visibility:public [value] superTypes:[kotlin.Any]'
PROPERTY name:nn visibility:public modality:FINAL [val] PROPERTY name:nn visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:nn type:kotlin.Nothing? visibility:private [final] FIELD PROPERTY_BACKING_FIELD name:nn type:kotlin.Nothing? visibility:private [final]
EXPRESSION_BODY EXPRESSION_BODY
@@ -115,11 +115,11 @@ FILE fqName:<root> fileName:/kt31649.kt
RETURN type=kotlin.Nothing from='public final fun <get-nn> (): kotlin.Nothing? declared in <root>.TestInline' RETURN type=kotlin.Nothing from='public final fun <get-nn> (): kotlin.Nothing? declared in <root>.TestInline'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:nn type:kotlin.Nothing? visibility:private [final]' type=kotlin.Nothing? origin=null GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:nn type:kotlin.Nothing? visibility:private [final]' type=kotlin.Nothing? origin=null
receiver: GET_VAR '<this>: <root>.TestInline declared in <root>.TestInline.<get-nn>' type=<root>.TestInline origin=null receiver: GET_VAR '<this>: <root>.TestInline declared in <root>.TestInline.<get-nn>' type=<root>.TestInline origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.TestInline, other:kotlin.Any?) returnType:kotlin.Boolean FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.TestInline, other:kotlin.Any?) returnType:kotlin.Boolean
overridden: overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
$this: VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:<this> type:<root>.TestInline $this: VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:<this> type:<root>.TestInline
VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:other index:0 type:kotlin.Any? VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:other index:0 type:kotlin.Any?
BLOCK_BODY BLOCK_BODY
WHEN type=kotlin.Unit origin=null WHEN type=kotlin.Unit origin=null
BRANCH BRANCH
@@ -142,10 +142,10 @@ FILE fqName:<root> fileName:/kt31649.kt
CONST Boolean type=kotlin.Boolean value=false CONST Boolean type=kotlin.Boolean value=false
RETURN type=kotlin.Nothing from='public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in <root>.TestInline' RETURN type=kotlin.Nothing from='public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in <root>.TestInline'
CONST Boolean type=kotlin.Boolean value=true CONST Boolean type=kotlin.Boolean value=true
FUN GENERATED_INLINE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.TestInline) returnType:kotlin.Int FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.TestInline) returnType:kotlin.Int
overridden: overridden:
public open fun hashCode (): kotlin.Int declared in kotlin.Any public open fun hashCode (): kotlin.Int declared in kotlin.Any
$this: VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:<this> type:<root>.TestInline $this: VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:<this> type:<root>.TestInline
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing from='public open fun hashCode (): kotlin.Int declared in <root>.TestInline' RETURN type=kotlin.Nothing from='public open fun hashCode (): kotlin.Int declared in <root>.TestInline'
WHEN type=kotlin.Int origin=null WHEN type=kotlin.Int origin=null
@@ -160,10 +160,10 @@ FILE fqName:<root> fileName:/kt31649.kt
then: CALL 'public open fun hashCode (): kotlin.Int declared in kotlin.Any' type=kotlin.Int origin=null then: CALL 'public open fun hashCode (): kotlin.Int declared in kotlin.Any' type=kotlin.Int origin=null
$this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:nn type:kotlin.Nothing? visibility:private [final]' type=kotlin.Nothing? origin=null $this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:nn type:kotlin.Nothing? visibility:private [final]' type=kotlin.Nothing? origin=null
receiver: GET_VAR '<this>: <root>.TestInline declared in <root>.TestInline.hashCode' type=<root>.TestInline origin=null receiver: GET_VAR '<this>: <root>.TestInline declared in <root>.TestInline.hashCode' type=<root>.TestInline origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.TestInline) returnType:kotlin.String FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.TestInline) returnType:kotlin.String
overridden: overridden:
public open fun toString (): kotlin.String declared in kotlin.Any public open fun toString (): kotlin.String declared in kotlin.Any
$this: VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:<this> type:<root>.TestInline $this: VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:<this> type:<root>.TestInline
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing from='public open fun toString (): kotlin.String declared in <root>.TestInline' RETURN type=kotlin.Nothing from='public open fun toString (): kotlin.String declared in <root>.TestInline'
STRING_CONCATENATION type=kotlin.String STRING_CONCATENATION type=kotlin.String
@@ -44,7 +44,7 @@ data class TestData {
} }
inline class TestInline { value class TestInline {
constructor(nn: Nothing?) /* primary */ { constructor(nn: Nothing?) /* primary */ {
super/*Any*/() super/*Any*/()
/* <init>() */ /* <init>() */
@@ -78,3 +78,4 @@ inline class TestInline {
} }
} }
@@ -97,13 +97,13 @@ FILE fqName:<root> fileName:/kt31649.kt
CONST Boolean type=kotlin.Boolean value=false CONST Boolean type=kotlin.Boolean value=false
RETURN type=kotlin.Nothing from='public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in <root>.TestData' RETURN type=kotlin.Nothing from='public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in <root>.TestData'
CONST Boolean type=kotlin.Boolean value=true CONST Boolean type=kotlin.Boolean value=true
CLASS CLASS name:TestInline modality:FINAL visibility:public [inline] superTypes:[kotlin.Any] CLASS CLASS name:TestInline modality:FINAL visibility:public [value] superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.TestInline $this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.TestInline
CONSTRUCTOR visibility:public <> (nn:kotlin.Nothing?) returnType:<root>.TestInline [primary] CONSTRUCTOR visibility:public <> (nn:kotlin.Nothing?) returnType:<root>.TestInline [primary]
VALUE_PARAMETER name:nn index:0 type:kotlin.Nothing? VALUE_PARAMETER name:nn index:0 type:kotlin.Nothing?
BLOCK_BODY BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any' DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:TestInline modality:FINAL visibility:public [inline] superTypes:[kotlin.Any]' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:TestInline modality:FINAL visibility:public [value] superTypes:[kotlin.Any]'
PROPERTY name:nn visibility:public modality:FINAL [val] PROPERTY name:nn visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:nn type:kotlin.Nothing? visibility:private [final] FIELD PROPERTY_BACKING_FIELD name:nn type:kotlin.Nothing? visibility:private [final]
EXPRESSION_BODY EXPRESSION_BODY
@@ -115,7 +115,7 @@ FILE fqName:<root> fileName:/kt31649.kt
RETURN type=kotlin.Nothing from='public final fun <get-nn> (): kotlin.Nothing? declared in <root>.TestInline' RETURN type=kotlin.Nothing from='public final fun <get-nn> (): kotlin.Nothing? declared in <root>.TestInline'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:nn type:kotlin.Nothing? visibility:private [final]' type=kotlin.Nothing? origin=null GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:nn type:kotlin.Nothing? visibility:private [final]' type=kotlin.Nothing? origin=null
receiver: GET_VAR '<this>: <root>.TestInline declared in <root>.TestInline.<get-nn>' type=<root>.TestInline origin=null receiver: GET_VAR '<this>: <root>.TestInline declared in <root>.TestInline.<get-nn>' type=<root>.TestInline origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.TestInline) returnType:kotlin.String FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.TestInline) returnType:kotlin.String
overridden: overridden:
public open fun toString (): kotlin.String declared in kotlin.Any public open fun toString (): kotlin.String declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:<root>.TestInline $this: VALUE_PARAMETER name:<this> type:<root>.TestInline
@@ -127,7 +127,7 @@ FILE fqName:<root> fileName:/kt31649.kt
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:nn type:kotlin.Nothing? visibility:private [final]' type=kotlin.Nothing? origin=null GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:nn type:kotlin.Nothing? visibility:private [final]' type=kotlin.Nothing? origin=null
receiver: GET_VAR '<this>: <root>.TestInline declared in <root>.TestInline.toString' type=<root>.TestInline origin=null receiver: GET_VAR '<this>: <root>.TestInline declared in <root>.TestInline.toString' type=<root>.TestInline origin=null
CONST String type=kotlin.String value=")" CONST String type=kotlin.String value=")"
FUN GENERATED_INLINE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.TestInline) returnType:kotlin.Int FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.TestInline) returnType:kotlin.Int
overridden: overridden:
public open fun hashCode (): kotlin.Int declared in kotlin.Any public open fun hashCode (): kotlin.Int declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:<root>.TestInline $this: VALUE_PARAMETER name:<this> type:<root>.TestInline
@@ -145,7 +145,7 @@ FILE fqName:<root> fileName:/kt31649.kt
then: CALL 'public open fun hashCode (): kotlin.Int declared in kotlin.Any' type=kotlin.Int origin=null then: CALL 'public open fun hashCode (): kotlin.Int declared in kotlin.Any' type=kotlin.Int origin=null
$this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:nn type:kotlin.Nothing? visibility:private [final]' type=kotlin.Nothing? origin=null $this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:nn type:kotlin.Nothing? visibility:private [final]' type=kotlin.Nothing? origin=null
receiver: GET_VAR '<this>: <root>.TestInline declared in <root>.TestInline.hashCode' type=<root>.TestInline origin=null receiver: GET_VAR '<this>: <root>.TestInline declared in <root>.TestInline.hashCode' type=<root>.TestInline origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.TestInline, other:kotlin.Any?) returnType:kotlin.Boolean [operator] FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.TestInline, other:kotlin.Any?) returnType:kotlin.Boolean [operator]
overridden: overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:<root>.TestInline $this: VALUE_PARAMETER name:<this> type:<root>.TestInline
@@ -44,7 +44,7 @@ data class TestData {
} }
inline class TestInline { value class TestInline {
constructor(nn: Nothing?) /* primary */ { constructor(nn: Nothing?) /* primary */ {
super/*Any*/() super/*Any*/()
/* <init>() */ /* <init>() */
@@ -78,3 +78,4 @@ inline class TestInline {
} }
} }
+9 -9
View File
@@ -1,11 +1,11 @@
FILE fqName:<root> fileName:/inlineClass.kt FILE fqName:<root> fileName:/inlineClass.kt
CLASS CLASS name:Test modality:FINAL visibility:public [inline] superTypes:[kotlin.Any] CLASS CLASS name:Test modality:FINAL visibility:public [value] superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.Test $this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.Test
CONSTRUCTOR visibility:public <> (x:kotlin.Int) returnType:<root>.Test [primary] CONSTRUCTOR visibility:public <> (x:kotlin.Int) returnType:<root>.Test [primary]
VALUE_PARAMETER name:x index:0 type:kotlin.Int VALUE_PARAMETER name:x index:0 type:kotlin.Int
BLOCK_BODY BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any' DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Test modality:FINAL visibility:public [inline] superTypes:[kotlin.Any]' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Test modality:FINAL visibility:public [value] superTypes:[kotlin.Any]'
PROPERTY name:x visibility:public modality:FINAL [val] PROPERTY name:x visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final] FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]
EXPRESSION_BODY EXPRESSION_BODY
@@ -17,11 +17,11 @@ FILE fqName:<root> fileName:/inlineClass.kt
RETURN type=kotlin.Nothing from='public final fun <get-x> (): kotlin.Int declared in <root>.Test' RETURN type=kotlin.Nothing from='public final fun <get-x> (): kotlin.Int declared in <root>.Test'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.Test declared in <root>.Test.<get-x>' type=<root>.Test origin=null receiver: GET_VAR '<this>: <root>.Test declared in <root>.Test.<get-x>' type=<root>.Test origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.Test, other:kotlin.Any?) returnType:kotlin.Boolean FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.Test, other:kotlin.Any?) returnType:kotlin.Boolean
overridden: overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
$this: VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:<this> type:<root>.Test $this: VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:<this> type:<root>.Test
VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:other index:0 type:kotlin.Any? VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:other index:0 type:kotlin.Any?
BLOCK_BODY BLOCK_BODY
WHEN type=kotlin.Unit origin=null WHEN type=kotlin.Unit origin=null
BRANCH BRANCH
@@ -44,19 +44,19 @@ FILE fqName:<root> fileName:/inlineClass.kt
CONST Boolean type=kotlin.Boolean value=false CONST Boolean type=kotlin.Boolean value=false
RETURN type=kotlin.Nothing from='public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in <root>.Test' RETURN type=kotlin.Nothing from='public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in <root>.Test'
CONST Boolean type=kotlin.Boolean value=true CONST Boolean type=kotlin.Boolean value=true
FUN GENERATED_INLINE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.Test) returnType:kotlin.Int FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.Test) returnType:kotlin.Int
overridden: overridden:
public open fun hashCode (): kotlin.Int declared in kotlin.Any public open fun hashCode (): kotlin.Int declared in kotlin.Any
$this: VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:<this> type:<root>.Test $this: VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:<this> type:<root>.Test
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing from='public open fun hashCode (): kotlin.Int declared in <root>.Test' RETURN type=kotlin.Nothing from='public open fun hashCode (): kotlin.Int declared in <root>.Test'
CALL 'public open fun hashCode (): kotlin.Int [fake_override] declared in kotlin.Int' type=kotlin.Int origin=null CALL 'public open fun hashCode (): kotlin.Int [fake_override] declared in kotlin.Int' type=kotlin.Int origin=null
$this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null $this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.Test declared in <root>.Test.hashCode' type=<root>.Test origin=null receiver: GET_VAR '<this>: <root>.Test declared in <root>.Test.hashCode' type=<root>.Test origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.Test) returnType:kotlin.String FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.Test) returnType:kotlin.String
overridden: overridden:
public open fun toString (): kotlin.String declared in kotlin.Any public open fun toString (): kotlin.String declared in kotlin.Any
$this: VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:<this> type:<root>.Test $this: VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:<this> type:<root>.Test
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing from='public open fun toString (): kotlin.String declared in <root>.Test' RETURN type=kotlin.Nothing from='public open fun toString (): kotlin.String declared in <root>.Test'
STRING_CONCATENATION type=kotlin.String STRING_CONCATENATION type=kotlin.String
+2 -1
View File
@@ -1,4 +1,4 @@
inline class Test { value class Test {
constructor(x: Int) /* primary */ { constructor(x: Int) /* primary */ {
super/*Any*/() super/*Any*/()
/* <init>() */ /* <init>() */
@@ -29,3 +29,4 @@ inline class Test {
} }
} }
+5 -5
View File
@@ -1,11 +1,11 @@
FILE fqName:<root> fileName:/inlineClass.kt FILE fqName:<root> fileName:/inlineClass.kt
CLASS CLASS name:Test modality:FINAL visibility:public [inline] superTypes:[kotlin.Any] CLASS CLASS name:Test modality:FINAL visibility:public [value] superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.Test $this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.Test
CONSTRUCTOR visibility:public <> (x:kotlin.Int) returnType:<root>.Test [primary] CONSTRUCTOR visibility:public <> (x:kotlin.Int) returnType:<root>.Test [primary]
VALUE_PARAMETER name:x index:0 type:kotlin.Int VALUE_PARAMETER name:x index:0 type:kotlin.Int
BLOCK_BODY BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any' DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Test modality:FINAL visibility:public [inline] superTypes:[kotlin.Any]' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Test modality:FINAL visibility:public [value] superTypes:[kotlin.Any]'
PROPERTY name:x visibility:public modality:FINAL [val] PROPERTY name:x visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final] FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]
EXPRESSION_BODY EXPRESSION_BODY
@@ -17,7 +17,7 @@ FILE fqName:<root> fileName:/inlineClass.kt
RETURN type=kotlin.Nothing from='public final fun <get-x> (): kotlin.Int declared in <root>.Test' RETURN type=kotlin.Nothing from='public final fun <get-x> (): kotlin.Int declared in <root>.Test'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.Test declared in <root>.Test.<get-x>' type=<root>.Test origin=null receiver: GET_VAR '<this>: <root>.Test declared in <root>.Test.<get-x>' type=<root>.Test origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.Test) returnType:kotlin.String FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.Test) returnType:kotlin.String
overridden: overridden:
public open fun toString (): kotlin.String declared in kotlin.Any public open fun toString (): kotlin.String declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:<root>.Test $this: VALUE_PARAMETER name:<this> type:<root>.Test
@@ -29,7 +29,7 @@ FILE fqName:<root> fileName:/inlineClass.kt
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.Test declared in <root>.Test.toString' type=<root>.Test origin=null receiver: GET_VAR '<this>: <root>.Test declared in <root>.Test.toString' type=<root>.Test origin=null
CONST String type=kotlin.String value=")" CONST String type=kotlin.String value=")"
FUN GENERATED_INLINE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.Test) returnType:kotlin.Int FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.Test) returnType:kotlin.Int
overridden: overridden:
public open fun hashCode (): kotlin.Int declared in kotlin.Any public open fun hashCode (): kotlin.Int declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:<root>.Test $this: VALUE_PARAMETER name:<this> type:<root>.Test
@@ -38,7 +38,7 @@ FILE fqName:<root> fileName:/inlineClass.kt
CALL 'public open fun hashCode (): kotlin.Int [fake_override] declared in kotlin.Int' type=kotlin.Int origin=null CALL 'public open fun hashCode (): kotlin.Int [fake_override] declared in kotlin.Int' type=kotlin.Int origin=null
$this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null $this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.Test declared in <root>.Test.hashCode' type=<root>.Test origin=null receiver: GET_VAR '<this>: <root>.Test declared in <root>.Test.hashCode' type=<root>.Test origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.Test, other:kotlin.Any?) returnType:kotlin.Boolean [operator] FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.Test, other:kotlin.Any?) returnType:kotlin.Boolean [operator]
overridden: overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:<root>.Test $this: VALUE_PARAMETER name:<this> type:<root>.Test
+2 -1
View File
@@ -1,4 +1,4 @@
inline class Test { value class Test {
constructor(x: Int) /* primary */ { constructor(x: Int) /* primary */ {
super/*Any*/() super/*Any*/()
/* <init>() */ /* <init>() */
@@ -29,3 +29,4 @@ inline class Test {
} }
} }
@@ -36,14 +36,14 @@ FILE fqName:<root> fileName:/inlineClassSyntheticMethods.kt
overridden: overridden:
public open fun toString (): kotlin.String declared in kotlin.Any public open fun toString (): kotlin.String declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:kotlin.Any $this: VALUE_PARAMETER name:<this> type:kotlin.Any
CLASS CLASS name:IC modality:FINAL visibility:public [inline] superTypes:[kotlin.Any] CLASS CLASS name:IC modality:FINAL visibility:public [value] superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.IC<TT of <root>.IC> $this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.IC<TT of <root>.IC>
TYPE_PARAMETER name:TT index:0 variance: superTypes:[kotlin.Any?] TYPE_PARAMETER name:TT index:0 variance: superTypes:[kotlin.Any?]
CONSTRUCTOR visibility:public <> (c:<root>.C<TT of <root>.IC>) returnType:<root>.IC<TT of <root>.IC> [primary] CONSTRUCTOR visibility:public <> (c:<root>.C<TT of <root>.IC>) returnType:<root>.IC<TT of <root>.IC> [primary]
VALUE_PARAMETER name:c index:0 type:<root>.C<TT of <root>.IC> VALUE_PARAMETER name:c index:0 type:<root>.C<TT of <root>.IC>
BLOCK_BODY BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any' DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:IC modality:FINAL visibility:public [inline] superTypes:[kotlin.Any]' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:IC modality:FINAL visibility:public [value] superTypes:[kotlin.Any]'
PROPERTY name:c visibility:public modality:FINAL [val] PROPERTY name:c visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:c type:<root>.C<TT of <root>.IC> visibility:private [final] FIELD PROPERTY_BACKING_FIELD name:c type:<root>.C<TT of <root>.IC> visibility:private [final]
EXPRESSION_BODY EXPRESSION_BODY
@@ -62,11 +62,11 @@ FILE fqName:<root> fileName:/inlineClassSyntheticMethods.kt
CALL 'public final fun hashCode (): kotlin.Int declared in <root>.C' type=kotlin.Int origin=null CALL 'public final fun hashCode (): kotlin.Int declared in <root>.C' type=kotlin.Int origin=null
$this: CALL 'public final fun <get-c> (): <root>.C<TT of <root>.IC> declared in <root>.IC' type=<root>.C<TT of <root>.IC> origin=GET_PROPERTY $this: CALL 'public final fun <get-c> (): <root>.C<TT of <root>.IC> declared in <root>.IC' type=<root>.C<TT of <root>.IC> origin=GET_PROPERTY
$this: GET_VAR '<this>: <root>.IC<TT of <root>.IC> declared in <root>.IC.foo' type=<root>.IC<TT of <root>.IC> origin=null $this: GET_VAR '<this>: <root>.IC<TT of <root>.IC> declared in <root>.IC.foo' type=<root>.IC<TT of <root>.IC> origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.IC<TT of <root>.IC>, other:kotlin.Any?) returnType:kotlin.Boolean FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.IC<TT of <root>.IC>, other:kotlin.Any?) returnType:kotlin.Boolean
overridden: overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
$this: VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:<this> type:<root>.IC<TT of <root>.IC> $this: VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:<this> type:<root>.IC<TT of <root>.IC>
VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:other index:0 type:kotlin.Any? VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:other index:0 type:kotlin.Any?
BLOCK_BODY BLOCK_BODY
WHEN type=kotlin.Unit origin=null WHEN type=kotlin.Unit origin=null
BRANCH BRANCH
@@ -89,19 +89,19 @@ FILE fqName:<root> fileName:/inlineClassSyntheticMethods.kt
CONST Boolean type=kotlin.Boolean value=false CONST Boolean type=kotlin.Boolean value=false
RETURN type=kotlin.Nothing from='public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in <root>.IC' RETURN type=kotlin.Nothing from='public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in <root>.IC'
CONST Boolean type=kotlin.Boolean value=true CONST Boolean type=kotlin.Boolean value=true
FUN GENERATED_INLINE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.IC<TT of <root>.IC>) returnType:kotlin.Int FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.IC<TT of <root>.IC>) returnType:kotlin.Int
overridden: overridden:
public open fun hashCode (): kotlin.Int declared in kotlin.Any public open fun hashCode (): kotlin.Int declared in kotlin.Any
$this: VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:<this> type:<root>.IC<TT of <root>.IC> $this: VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:<this> type:<root>.IC<TT of <root>.IC>
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing from='public open fun hashCode (): kotlin.Int declared in <root>.IC' RETURN type=kotlin.Nothing from='public open fun hashCode (): kotlin.Int declared in <root>.IC'
CALL 'public final fun hashCode (): kotlin.Int declared in <root>.C' type=kotlin.Int origin=null CALL 'public final fun hashCode (): kotlin.Int declared in <root>.C' type=kotlin.Int origin=null
$this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:c type:<root>.C<TT of <root>.IC> visibility:private [final]' type=<root>.C<TT of <root>.IC> origin=null $this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:c type:<root>.C<TT of <root>.IC> visibility:private [final]' type=<root>.C<TT of <root>.IC> origin=null
receiver: GET_VAR '<this>: <root>.IC<TT of <root>.IC> declared in <root>.IC.hashCode' type=<root>.IC<TT of <root>.IC> origin=null receiver: GET_VAR '<this>: <root>.IC<TT of <root>.IC> declared in <root>.IC.hashCode' type=<root>.IC<TT of <root>.IC> origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.IC<TT of <root>.IC>) returnType:kotlin.String FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.IC<TT of <root>.IC>) returnType:kotlin.String
overridden: overridden:
public open fun toString (): kotlin.String declared in kotlin.Any public open fun toString (): kotlin.String declared in kotlin.Any
$this: VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:<this> type:<root>.IC<TT of <root>.IC> $this: VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:<this> type:<root>.IC<TT of <root>.IC>
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing from='public open fun toString (): kotlin.String declared in <root>.IC' RETURN type=kotlin.Nothing from='public open fun toString (): kotlin.String declared in <root>.IC'
STRING_CONCATENATION type=kotlin.String STRING_CONCATENATION type=kotlin.String
@@ -15,7 +15,7 @@ class C<T : Any?> {
} }
inline class IC<TT : Any?> { value class IC<TT : Any?> {
constructor(c: C<TT>) /* primary */ { constructor(c: C<TT>) /* primary */ {
super/*Any*/() super/*Any*/()
/* <init>() */ /* <init>() */
@@ -58,3 +58,4 @@ fun box(): String {
} }
return "OK" return "OK"
} }
@@ -36,14 +36,14 @@ FILE fqName:<root> fileName:/inlineClassSyntheticMethods.kt
overridden: overridden:
public open fun toString (): kotlin.String declared in kotlin.Any public open fun toString (): kotlin.String declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:kotlin.Any $this: VALUE_PARAMETER name:<this> type:kotlin.Any
CLASS CLASS name:IC modality:FINAL visibility:public [inline] superTypes:[kotlin.Any] CLASS CLASS name:IC modality:FINAL visibility:public [value] superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.IC<TT of <root>.IC> $this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.IC<TT of <root>.IC>
TYPE_PARAMETER name:TT index:0 variance: superTypes:[kotlin.Any?] TYPE_PARAMETER name:TT index:0 variance: superTypes:[kotlin.Any?]
CONSTRUCTOR visibility:public <> (c:<root>.C<TT of <root>.IC>) returnType:<root>.IC<TT of <root>.IC> [primary] CONSTRUCTOR visibility:public <> (c:<root>.C<TT of <root>.IC>) returnType:<root>.IC<TT of <root>.IC> [primary]
VALUE_PARAMETER name:c index:0 type:<root>.C<TT of <root>.IC> VALUE_PARAMETER name:c index:0 type:<root>.C<TT of <root>.IC>
BLOCK_BODY BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any' DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:IC modality:FINAL visibility:public [inline] superTypes:[kotlin.Any]' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:IC modality:FINAL visibility:public [value] superTypes:[kotlin.Any]'
PROPERTY name:c visibility:public modality:FINAL [val] PROPERTY name:c visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:c type:<root>.C<TT of <root>.IC> visibility:private [final] FIELD PROPERTY_BACKING_FIELD name:c type:<root>.C<TT of <root>.IC> visibility:private [final]
EXPRESSION_BODY EXPRESSION_BODY
@@ -62,7 +62,7 @@ FILE fqName:<root> fileName:/inlineClassSyntheticMethods.kt
CALL 'public open fun hashCode (): kotlin.Int declared in <root>.C' type=kotlin.Int origin=null CALL 'public open fun hashCode (): kotlin.Int declared in <root>.C' type=kotlin.Int origin=null
$this: CALL 'public final fun <get-c> (): <root>.C<TT of <root>.IC> declared in <root>.IC' type=<root>.C<TT of <root>.IC> origin=GET_PROPERTY $this: CALL 'public final fun <get-c> (): <root>.C<TT of <root>.IC> declared in <root>.IC' type=<root>.C<TT of <root>.IC> origin=GET_PROPERTY
$this: GET_VAR '<this>: <root>.IC<TT of <root>.IC> declared in <root>.IC.foo' type=<root>.IC<TT of <root>.IC> origin=null $this: GET_VAR '<this>: <root>.IC<TT of <root>.IC> declared in <root>.IC.foo' type=<root>.IC<TT of <root>.IC> origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.IC<TT of <root>.IC>) returnType:kotlin.String FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.IC<TT of <root>.IC>) returnType:kotlin.String
overridden: overridden:
public open fun toString (): kotlin.String declared in kotlin.Any public open fun toString (): kotlin.String declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:<root>.IC<TT of <root>.IC> $this: VALUE_PARAMETER name:<this> type:<root>.IC<TT of <root>.IC>
@@ -74,7 +74,7 @@ FILE fqName:<root> fileName:/inlineClassSyntheticMethods.kt
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:c type:<root>.C<TT of <root>.IC> visibility:private [final]' type=<root>.C<TT of <root>.IC> origin=null GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:c type:<root>.C<TT of <root>.IC> visibility:private [final]' type=<root>.C<TT of <root>.IC> origin=null
receiver: GET_VAR '<this>: <root>.IC<TT of <root>.IC> declared in <root>.IC.toString' type=<root>.IC<TT of <root>.IC> origin=null receiver: GET_VAR '<this>: <root>.IC<TT of <root>.IC> declared in <root>.IC.toString' type=<root>.IC<TT of <root>.IC> origin=null
CONST String type=kotlin.String value=")" CONST String type=kotlin.String value=")"
FUN GENERATED_INLINE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.IC<TT of <root>.IC>) returnType:kotlin.Int FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.IC<TT of <root>.IC>) returnType:kotlin.Int
overridden: overridden:
public open fun hashCode (): kotlin.Int declared in kotlin.Any public open fun hashCode (): kotlin.Int declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:<root>.IC<TT of <root>.IC> $this: VALUE_PARAMETER name:<this> type:<root>.IC<TT of <root>.IC>
@@ -83,7 +83,7 @@ FILE fqName:<root> fileName:/inlineClassSyntheticMethods.kt
CALL 'public open fun hashCode (): kotlin.Int declared in <root>.C' type=kotlin.Int origin=null CALL 'public open fun hashCode (): kotlin.Int declared in <root>.C' type=kotlin.Int origin=null
$this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:c type:<root>.C<TT of <root>.IC> visibility:private [final]' type=<root>.C<TT of <root>.IC> origin=null $this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:c type:<root>.C<TT of <root>.IC> visibility:private [final]' type=<root>.C<TT of <root>.IC> origin=null
receiver: GET_VAR '<this>: <root>.IC<TT of <root>.IC> declared in <root>.IC.hashCode' type=<root>.IC<TT of <root>.IC> origin=null receiver: GET_VAR '<this>: <root>.IC<TT of <root>.IC> declared in <root>.IC.hashCode' type=<root>.IC<TT of <root>.IC> origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.IC<TT of <root>.IC>, other:kotlin.Any?) returnType:kotlin.Boolean [operator] FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.IC<TT of <root>.IC>, other:kotlin.Any?) returnType:kotlin.Boolean [operator]
overridden: overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:<root>.IC<TT of <root>.IC> $this: VALUE_PARAMETER name:<this> type:<root>.IC<TT of <root>.IC>
@@ -15,7 +15,7 @@ class C<T : Any?> {
} }
inline class IC<TT : Any?> { value class IC<TT : Any?> {
constructor(c: C<TT>) /* primary */ { constructor(c: C<TT>) /* primary */ {
super/*Any*/() super/*Any*/()
/* <init>() */ /* <init>() */
@@ -58,3 +58,4 @@ fun box(): String {
} }
return "OK" return "OK"
} }
@@ -1,11 +1,11 @@
FILE fqName:<root> fileName:/inlineCollectionOfInlineClass.kt FILE fqName:<root> fileName:/inlineCollectionOfInlineClass.kt
CLASS CLASS name:IT modality:FINAL visibility:public [inline] superTypes:[kotlin.Any] CLASS CLASS name:IT modality:FINAL visibility:public [value] superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.IT $this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.IT
CONSTRUCTOR visibility:public <> (x:kotlin.Int) returnType:<root>.IT [primary] CONSTRUCTOR visibility:public <> (x:kotlin.Int) returnType:<root>.IT [primary]
VALUE_PARAMETER name:x index:0 type:kotlin.Int VALUE_PARAMETER name:x index:0 type:kotlin.Int
BLOCK_BODY BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any' DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:IT modality:FINAL visibility:public [inline] superTypes:[kotlin.Any]' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:IT modality:FINAL visibility:public [value] superTypes:[kotlin.Any]'
PROPERTY name:x visibility:public modality:FINAL [val] PROPERTY name:x visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final] FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]
EXPRESSION_BODY EXPRESSION_BODY
@@ -17,11 +17,11 @@ FILE fqName:<root> fileName:/inlineCollectionOfInlineClass.kt
RETURN type=kotlin.Nothing from='public final fun <get-x> (): kotlin.Int declared in <root>.IT' RETURN type=kotlin.Nothing from='public final fun <get-x> (): kotlin.Int declared in <root>.IT'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.IT declared in <root>.IT.<get-x>' type=<root>.IT origin=null receiver: GET_VAR '<this>: <root>.IT declared in <root>.IT.<get-x>' type=<root>.IT origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.IT, other:kotlin.Any?) returnType:kotlin.Boolean FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.IT, other:kotlin.Any?) returnType:kotlin.Boolean
overridden: overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
$this: VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:<this> type:<root>.IT $this: VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:<this> type:<root>.IT
VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:other index:0 type:kotlin.Any? VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:other index:0 type:kotlin.Any?
BLOCK_BODY BLOCK_BODY
WHEN type=kotlin.Unit origin=null WHEN type=kotlin.Unit origin=null
BRANCH BRANCH
@@ -44,19 +44,19 @@ FILE fqName:<root> fileName:/inlineCollectionOfInlineClass.kt
CONST Boolean type=kotlin.Boolean value=false CONST Boolean type=kotlin.Boolean value=false
RETURN type=kotlin.Nothing from='public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in <root>.IT' RETURN type=kotlin.Nothing from='public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in <root>.IT'
CONST Boolean type=kotlin.Boolean value=true CONST Boolean type=kotlin.Boolean value=true
FUN GENERATED_INLINE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.IT) returnType:kotlin.Int FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.IT) returnType:kotlin.Int
overridden: overridden:
public open fun hashCode (): kotlin.Int declared in kotlin.Any public open fun hashCode (): kotlin.Int declared in kotlin.Any
$this: VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:<this> type:<root>.IT $this: VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:<this> type:<root>.IT
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing from='public open fun hashCode (): kotlin.Int declared in <root>.IT' RETURN type=kotlin.Nothing from='public open fun hashCode (): kotlin.Int declared in <root>.IT'
CALL 'public open fun hashCode (): kotlin.Int [fake_override] declared in kotlin.Int' type=kotlin.Int origin=null CALL 'public open fun hashCode (): kotlin.Int [fake_override] declared in kotlin.Int' type=kotlin.Int origin=null
$this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null $this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.IT declared in <root>.IT.hashCode' type=<root>.IT origin=null receiver: GET_VAR '<this>: <root>.IT declared in <root>.IT.hashCode' type=<root>.IT origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.IT) returnType:kotlin.String FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.IT) returnType:kotlin.String
overridden: overridden:
public open fun toString (): kotlin.String declared in kotlin.Any public open fun toString (): kotlin.String declared in kotlin.Any
$this: VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:<this> type:<root>.IT $this: VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:<this> type:<root>.IT
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing from='public open fun toString (): kotlin.String declared in <root>.IT' RETURN type=kotlin.Nothing from='public open fun toString (): kotlin.String declared in <root>.IT'
STRING_CONCATENATION type=kotlin.String STRING_CONCATENATION type=kotlin.String
@@ -65,13 +65,13 @@ FILE fqName:<root> fileName:/inlineCollectionOfInlineClass.kt
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.IT declared in <root>.IT.toString' type=<root>.IT origin=null receiver: GET_VAR '<this>: <root>.IT declared in <root>.IT.toString' type=<root>.IT origin=null
CONST String type=kotlin.String value=")" CONST String type=kotlin.String value=")"
CLASS CLASS name:InlineMutableSet modality:FINAL visibility:public [inline] superTypes:[kotlin.collections.MutableSet<<root>.IT>] CLASS CLASS name:InlineMutableSet modality:FINAL visibility:public [value] superTypes:[kotlin.collections.MutableSet<<root>.IT>]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.InlineMutableSet $this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.InlineMutableSet
CONSTRUCTOR visibility:public <> (ms:kotlin.collections.MutableSet<<root>.IT>) returnType:<root>.InlineMutableSet [primary] CONSTRUCTOR visibility:public <> (ms:kotlin.collections.MutableSet<<root>.IT>) returnType:<root>.InlineMutableSet [primary]
VALUE_PARAMETER name:ms index:0 type:kotlin.collections.MutableSet<<root>.IT> VALUE_PARAMETER name:ms index:0 type:kotlin.collections.MutableSet<<root>.IT>
BLOCK_BODY BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any' DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:InlineMutableSet modality:FINAL visibility:public [inline] superTypes:[kotlin.collections.MutableSet<<root>.IT>]' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:InlineMutableSet modality:FINAL visibility:public [value] superTypes:[kotlin.collections.MutableSet<<root>.IT>]'
PROPERTY name:ms visibility:private modality:FINAL [val] PROPERTY name:ms visibility:private modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:ms type:kotlin.collections.MutableSet<<root>.IT> visibility:private [final] FIELD PROPERTY_BACKING_FIELD name:ms type:kotlin.collections.MutableSet<<root>.IT> visibility:private [final]
EXPRESSION_BODY EXPRESSION_BODY
@@ -199,11 +199,11 @@ FILE fqName:<root> fileName:/inlineCollectionOfInlineClass.kt
$this: CALL 'private final fun <get-ms> (): kotlin.collections.MutableSet<<root>.IT> declared in <root>.InlineMutableSet' type=kotlin.collections.MutableSet<<root>.IT> origin=GET_PROPERTY $this: CALL 'private final fun <get-ms> (): kotlin.collections.MutableSet<<root>.IT> declared in <root>.InlineMutableSet' type=kotlin.collections.MutableSet<<root>.IT> origin=GET_PROPERTY
$this: GET_VAR '<this>: <root>.InlineMutableSet declared in <root>.InlineMutableSet.retainAll' type=<root>.InlineMutableSet origin=null $this: GET_VAR '<this>: <root>.InlineMutableSet declared in <root>.InlineMutableSet.retainAll' type=<root>.InlineMutableSet origin=null
elements: GET_VAR 'elements: kotlin.collections.Collection<<root>.IT> declared in <root>.InlineMutableSet.retainAll' type=kotlin.collections.Collection<<root>.IT> origin=null elements: GET_VAR 'elements: kotlin.collections.Collection<<root>.IT> declared in <root>.InlineMutableSet.retainAll' type=kotlin.collections.Collection<<root>.IT> origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.InlineMutableSet, other:kotlin.Any?) returnType:kotlin.Boolean FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.InlineMutableSet, other:kotlin.Any?) returnType:kotlin.Boolean
overridden: overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
$this: VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:<this> type:<root>.InlineMutableSet $this: VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:<this> type:<root>.InlineMutableSet
VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:other index:0 type:kotlin.Any? VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:other index:0 type:kotlin.Any?
BLOCK_BODY BLOCK_BODY
WHEN type=kotlin.Unit origin=null WHEN type=kotlin.Unit origin=null
BRANCH BRANCH
@@ -226,19 +226,19 @@ FILE fqName:<root> fileName:/inlineCollectionOfInlineClass.kt
CONST Boolean type=kotlin.Boolean value=false CONST Boolean type=kotlin.Boolean value=false
RETURN type=kotlin.Nothing from='public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in <root>.InlineMutableSet' RETURN type=kotlin.Nothing from='public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in <root>.InlineMutableSet'
CONST Boolean type=kotlin.Boolean value=true CONST Boolean type=kotlin.Boolean value=true
FUN GENERATED_INLINE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.InlineMutableSet) returnType:kotlin.Int FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.InlineMutableSet) returnType:kotlin.Int
overridden: overridden:
public open fun hashCode (): kotlin.Int declared in kotlin.Any public open fun hashCode (): kotlin.Int declared in kotlin.Any
$this: VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:<this> type:<root>.InlineMutableSet $this: VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:<this> type:<root>.InlineMutableSet
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing from='public open fun hashCode (): kotlin.Int declared in <root>.InlineMutableSet' RETURN type=kotlin.Nothing from='public open fun hashCode (): kotlin.Int declared in <root>.InlineMutableSet'
CALL 'public open fun hashCode (): kotlin.Int [fake_override] declared in kotlin.collections.MutableSet' type=kotlin.Int origin=null CALL 'public open fun hashCode (): kotlin.Int [fake_override] declared in kotlin.collections.MutableSet' type=kotlin.Int origin=null
$this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:ms type:kotlin.collections.MutableSet<<root>.IT> visibility:private [final]' type=kotlin.collections.MutableSet<<root>.IT> origin=null $this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:ms type:kotlin.collections.MutableSet<<root>.IT> visibility:private [final]' type=kotlin.collections.MutableSet<<root>.IT> origin=null
receiver: GET_VAR '<this>: <root>.InlineMutableSet declared in <root>.InlineMutableSet.hashCode' type=<root>.InlineMutableSet origin=null receiver: GET_VAR '<this>: <root>.InlineMutableSet declared in <root>.InlineMutableSet.hashCode' type=<root>.InlineMutableSet origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.InlineMutableSet) returnType:kotlin.String FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.InlineMutableSet) returnType:kotlin.String
overridden: overridden:
public open fun toString (): kotlin.String declared in kotlin.Any public open fun toString (): kotlin.String declared in kotlin.Any
$this: VALUE_PARAMETER GENERATED_INLINE_CLASS_MEMBER name:<this> type:<root>.InlineMutableSet $this: VALUE_PARAMETER GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:<this> type:<root>.InlineMutableSet
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing from='public open fun toString (): kotlin.String declared in <root>.InlineMutableSet' RETURN type=kotlin.Nothing from='public open fun toString (): kotlin.String declared in <root>.InlineMutableSet'
STRING_CONCATENATION type=kotlin.String STRING_CONCATENATION type=kotlin.String
@@ -1,4 +1,4 @@
inline class IT { value class IT {
constructor(x: Int) /* primary */ { constructor(x: Int) /* primary */ {
super/*Any*/() super/*Any*/()
/* <init>() */ /* <init>() */
@@ -30,7 +30,7 @@ inline class IT {
} }
inline class InlineMutableSet : MutableSet<IT> { value class InlineMutableSet : MutableSet<IT> {
constructor(ms: MutableSet<IT>) /* primary */ { constructor(ms: MutableSet<IT>) /* primary */ {
super/*Any*/() super/*Any*/()
/* <init>() */ /* <init>() */
@@ -106,3 +106,4 @@ inline class InlineMutableSet : MutableSet<IT> {
} }
} }
@@ -1,11 +1,11 @@
FILE fqName:<root> fileName:/inlineCollectionOfInlineClass.kt FILE fqName:<root> fileName:/inlineCollectionOfInlineClass.kt
CLASS CLASS name:IT modality:FINAL visibility:public [inline] superTypes:[kotlin.Any] CLASS CLASS name:IT modality:FINAL visibility:public [value] superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.IT $this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.IT
CONSTRUCTOR visibility:public <> (x:kotlin.Int) returnType:<root>.IT [primary] CONSTRUCTOR visibility:public <> (x:kotlin.Int) returnType:<root>.IT [primary]
VALUE_PARAMETER name:x index:0 type:kotlin.Int VALUE_PARAMETER name:x index:0 type:kotlin.Int
BLOCK_BODY BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any' DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:IT modality:FINAL visibility:public [inline] superTypes:[kotlin.Any]' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:IT modality:FINAL visibility:public [value] superTypes:[kotlin.Any]'
PROPERTY name:x visibility:public modality:FINAL [val] PROPERTY name:x visibility:public modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final] FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]
EXPRESSION_BODY EXPRESSION_BODY
@@ -17,7 +17,7 @@ FILE fqName:<root> fileName:/inlineCollectionOfInlineClass.kt
RETURN type=kotlin.Nothing from='public final fun <get-x> (): kotlin.Int declared in <root>.IT' RETURN type=kotlin.Nothing from='public final fun <get-x> (): kotlin.Int declared in <root>.IT'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.IT declared in <root>.IT.<get-x>' type=<root>.IT origin=null receiver: GET_VAR '<this>: <root>.IT declared in <root>.IT.<get-x>' type=<root>.IT origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.IT) returnType:kotlin.String FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.IT) returnType:kotlin.String
overridden: overridden:
public open fun toString (): kotlin.String declared in kotlin.Any public open fun toString (): kotlin.String declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:<root>.IT $this: VALUE_PARAMETER name:<this> type:<root>.IT
@@ -29,7 +29,7 @@ FILE fqName:<root> fileName:/inlineCollectionOfInlineClass.kt
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.IT declared in <root>.IT.toString' type=<root>.IT origin=null receiver: GET_VAR '<this>: <root>.IT declared in <root>.IT.toString' type=<root>.IT origin=null
CONST String type=kotlin.String value=")" CONST String type=kotlin.String value=")"
FUN GENERATED_INLINE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.IT) returnType:kotlin.Int FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.IT) returnType:kotlin.Int
overridden: overridden:
public open fun hashCode (): kotlin.Int declared in kotlin.Any public open fun hashCode (): kotlin.Int declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:<root>.IT $this: VALUE_PARAMETER name:<this> type:<root>.IT
@@ -38,7 +38,7 @@ FILE fqName:<root> fileName:/inlineCollectionOfInlineClass.kt
CALL 'public open fun hashCode (): kotlin.Int [fake_override] declared in kotlin.Int' type=kotlin.Int origin=null CALL 'public open fun hashCode (): kotlin.Int [fake_override] declared in kotlin.Int' type=kotlin.Int origin=null
$this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null $this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.IT declared in <root>.IT.hashCode' type=<root>.IT origin=null receiver: GET_VAR '<this>: <root>.IT declared in <root>.IT.hashCode' type=<root>.IT origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.IT, other:kotlin.Any?) returnType:kotlin.Boolean [operator] FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.IT, other:kotlin.Any?) returnType:kotlin.Boolean [operator]
overridden: overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:<root>.IT $this: VALUE_PARAMETER name:<this> type:<root>.IT
@@ -65,13 +65,13 @@ FILE fqName:<root> fileName:/inlineCollectionOfInlineClass.kt
CONST Boolean type=kotlin.Boolean value=false CONST Boolean type=kotlin.Boolean value=false
RETURN type=kotlin.Nothing from='public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in <root>.IT' RETURN type=kotlin.Nothing from='public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in <root>.IT'
CONST Boolean type=kotlin.Boolean value=true CONST Boolean type=kotlin.Boolean value=true
CLASS CLASS name:InlineMutableSet modality:FINAL visibility:public [inline] superTypes:[kotlin.collections.MutableSet<<root>.IT>] CLASS CLASS name:InlineMutableSet modality:FINAL visibility:public [value] superTypes:[kotlin.collections.MutableSet<<root>.IT>]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.InlineMutableSet $this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.InlineMutableSet
CONSTRUCTOR visibility:public <> (ms:kotlin.collections.MutableSet<<root>.IT>) returnType:<root>.InlineMutableSet [primary] CONSTRUCTOR visibility:public <> (ms:kotlin.collections.MutableSet<<root>.IT>) returnType:<root>.InlineMutableSet [primary]
VALUE_PARAMETER name:ms index:0 type:kotlin.collections.MutableSet<<root>.IT> VALUE_PARAMETER name:ms index:0 type:kotlin.collections.MutableSet<<root>.IT>
BLOCK_BODY BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any' DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [primary] declared in kotlin.Any'
INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:InlineMutableSet modality:FINAL visibility:public [inline] superTypes:[kotlin.collections.MutableSet<<root>.IT>]' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:InlineMutableSet modality:FINAL visibility:public [value] superTypes:[kotlin.collections.MutableSet<<root>.IT>]'
PROPERTY name:ms visibility:private modality:FINAL [val] PROPERTY name:ms visibility:private modality:FINAL [val]
FIELD PROPERTY_BACKING_FIELD name:ms type:kotlin.collections.MutableSet<<root>.IT> visibility:private [final] FIELD PROPERTY_BACKING_FIELD name:ms type:kotlin.collections.MutableSet<<root>.IT> visibility:private [final]
EXPRESSION_BODY EXPRESSION_BODY
@@ -199,7 +199,7 @@ FILE fqName:<root> fileName:/inlineCollectionOfInlineClass.kt
$this: CALL 'private final fun <get-ms> (): kotlin.collections.MutableSet<<root>.IT> declared in <root>.InlineMutableSet' type=kotlin.collections.MutableSet<<root>.IT> origin=GET_PROPERTY $this: CALL 'private final fun <get-ms> (): kotlin.collections.MutableSet<<root>.IT> declared in <root>.InlineMutableSet' type=kotlin.collections.MutableSet<<root>.IT> origin=GET_PROPERTY
$this: GET_VAR '<this>: <root>.InlineMutableSet declared in <root>.InlineMutableSet.retainAll' type=<root>.InlineMutableSet origin=null $this: GET_VAR '<this>: <root>.InlineMutableSet declared in <root>.InlineMutableSet.retainAll' type=<root>.InlineMutableSet origin=null
elements: GET_VAR 'elements: kotlin.collections.Collection<<root>.IT> declared in <root>.InlineMutableSet.retainAll' type=kotlin.collections.Collection<<root>.IT> origin=null elements: GET_VAR 'elements: kotlin.collections.Collection<<root>.IT> declared in <root>.InlineMutableSet.retainAll' type=kotlin.collections.Collection<<root>.IT> origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.InlineMutableSet) returnType:kotlin.String FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:toString visibility:public modality:OPEN <> ($this:<root>.InlineMutableSet) returnType:kotlin.String
overridden: overridden:
public open fun toString (): kotlin.String [fake_override] declared in kotlin.collections.MutableSet public open fun toString (): kotlin.String [fake_override] declared in kotlin.collections.MutableSet
$this: VALUE_PARAMETER name:<this> type:<root>.InlineMutableSet $this: VALUE_PARAMETER name:<this> type:<root>.InlineMutableSet
@@ -211,7 +211,7 @@ FILE fqName:<root> fileName:/inlineCollectionOfInlineClass.kt
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:ms type:kotlin.collections.MutableSet<<root>.IT> visibility:private [final]' type=kotlin.collections.MutableSet<<root>.IT> origin=null GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:ms type:kotlin.collections.MutableSet<<root>.IT> visibility:private [final]' type=kotlin.collections.MutableSet<<root>.IT> origin=null
receiver: GET_VAR '<this>: <root>.InlineMutableSet declared in <root>.InlineMutableSet.toString' type=<root>.InlineMutableSet origin=null receiver: GET_VAR '<this>: <root>.InlineMutableSet declared in <root>.InlineMutableSet.toString' type=<root>.InlineMutableSet origin=null
CONST String type=kotlin.String value=")" CONST String type=kotlin.String value=")"
FUN GENERATED_INLINE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.InlineMutableSet) returnType:kotlin.Int FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:hashCode visibility:public modality:OPEN <> ($this:<root>.InlineMutableSet) returnType:kotlin.Int
overridden: overridden:
public open fun hashCode (): kotlin.Int [fake_override] declared in kotlin.collections.MutableSet public open fun hashCode (): kotlin.Int [fake_override] declared in kotlin.collections.MutableSet
$this: VALUE_PARAMETER name:<this> type:<root>.InlineMutableSet $this: VALUE_PARAMETER name:<this> type:<root>.InlineMutableSet
@@ -220,7 +220,7 @@ FILE fqName:<root> fileName:/inlineCollectionOfInlineClass.kt
CALL 'public open fun hashCode (): kotlin.Int [fake_override] declared in kotlin.collections.MutableSet' type=kotlin.Int origin=null CALL 'public open fun hashCode (): kotlin.Int [fake_override] declared in kotlin.collections.MutableSet' type=kotlin.Int origin=null
$this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:ms type:kotlin.collections.MutableSet<<root>.IT> visibility:private [final]' type=kotlin.collections.MutableSet<<root>.IT> origin=null $this: GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:ms type:kotlin.collections.MutableSet<<root>.IT> visibility:private [final]' type=kotlin.collections.MutableSet<<root>.IT> origin=null
receiver: GET_VAR '<this>: <root>.InlineMutableSet declared in <root>.InlineMutableSet.hashCode' type=<root>.InlineMutableSet origin=null receiver: GET_VAR '<this>: <root>.InlineMutableSet declared in <root>.InlineMutableSet.hashCode' type=<root>.InlineMutableSet origin=null
FUN GENERATED_INLINE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.InlineMutableSet, other:kotlin.Any?) returnType:kotlin.Boolean [operator] FUN GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER name:equals visibility:public modality:OPEN <> ($this:<root>.InlineMutableSet, other:kotlin.Any?) returnType:kotlin.Boolean [operator]
overridden: overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in kotlin.collections.MutableSet public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in kotlin.collections.MutableSet
$this: VALUE_PARAMETER name:<this> type:<root>.InlineMutableSet $this: VALUE_PARAMETER name:<this> type:<root>.InlineMutableSet
@@ -1,4 +1,4 @@
inline class IT { value class IT {
constructor(x: Int) /* primary */ { constructor(x: Int) /* primary */ {
super/*Any*/() super/*Any*/()
/* <init>() */ /* <init>() */
@@ -30,7 +30,7 @@ inline class IT {
} }
inline class InlineMutableSet : MutableSet<IT> { value class InlineMutableSet : MutableSet<IT> {
constructor(ms: MutableSet<IT>) /* primary */ { constructor(ms: MutableSet<IT>) /* primary */ {
super/*Any*/() super/*Any*/()
/* <init>() */ /* <init>() */
@@ -106,3 +106,4 @@ inline class InlineMutableSet : MutableSet<IT> {
} }
} }
@@ -22,7 +22,7 @@ val JVM_INLINE_ANNOTATION_CLASS_ID = ClassId.topLevel(JVM_INLINE_ANNOTATION_FQ_N
fun DeclarationDescriptor.isInlineClass(): Boolean = when { fun DeclarationDescriptor.isInlineClass(): Boolean = when {
this !is ClassDescriptor -> false this !is ClassDescriptor -> false
isInline -> true isInline -> true
else -> isValue && (unsubstitutedPrimaryConstructor?.valueParameters?.size?.let { it == 1 } ?: true) else -> isValue && unsubstitutedPrimaryConstructor?.valueParameters?.size == 1
} }
fun DeclarationDescriptor.isValueClass(): Boolean = fun DeclarationDescriptor.isValueClass(): Boolean =
@@ -23,14 +23,9 @@ import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.resolve.scopes.StaticScopeForKotlinEnum import org.jetbrains.kotlin.resolve.scopes.StaticScopeForKotlinEnum
import org.jetbrains.kotlin.resolve.scopes.receivers.ContextClassReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ContextClassReceiver
import org.jetbrains.kotlin.serialization.deserialization.* import org.jetbrains.kotlin.serialization.deserialization.*
import org.jetbrains.kotlin.types.AbstractClassTypeConstructor import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.SimpleType
import org.jetbrains.kotlin.types.TypeConstructor
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
import org.jetbrains.kotlin.types.TypeRefinement
import org.jetbrains.kotlin.utils.addToStdlib.flatMapToNullable import org.jetbrains.kotlin.utils.addToStdlib.flatMapToNullable
import java.util.*
class DeserializedClassDescriptor( class DeserializedClassDescriptor(
outerContext: DeserializationContext, outerContext: DeserializationContext,
@@ -98,7 +93,7 @@ class DeserializedClassDescriptor(
override fun isData() = Flags.IS_DATA.get(classProto.flags) override fun isData() = Flags.IS_DATA.get(classProto.flags)
override fun isInline() = Flags.IS_INLINE_CLASS.get(classProto.flags) && metadataVersion.isAtMost(1, 4, 1) override fun isInline() = Flags.IS_VALUE_CLASS.get(classProto.flags) && metadataVersion.isAtMost(1, 4, 1)
override fun isExpect() = Flags.IS_EXPECT_CLASS.get(classProto.flags) override fun isExpect() = Flags.IS_EXPECT_CLASS.get(classProto.flags)
@@ -108,7 +103,7 @@ class DeserializedClassDescriptor(
override fun isFun() = Flags.IS_FUN_INTERFACE.get(classProto.flags) override fun isFun() = Flags.IS_FUN_INTERFACE.get(classProto.flags)
override fun isValue() = Flags.IS_INLINE_CLASS.get(classProto.flags) && metadataVersion.isAtLeast(1, 4, 2) override fun isValue() = Flags.IS_VALUE_CLASS.get(classProto.flags) && metadataVersion.isAtLeast(1, 4, 2)
override fun getUnsubstitutedMemberScope(kotlinTypeRefiner: KotlinTypeRefiner): MemberScope = override fun getUnsubstitutedMemberScope(kotlinTypeRefiner: KotlinTypeRefiner): MemberScope =
memberScopeHolder.getScope(kotlinTypeRefiner) memberScopeHolder.getScope(kotlinTypeRefiner)
@@ -30,8 +30,8 @@ public class Flags {
public static final BooleanFlagField IS_DATA = FlagField.booleanAfter(IS_INNER); public static final BooleanFlagField IS_DATA = FlagField.booleanAfter(IS_INNER);
public static final BooleanFlagField IS_EXTERNAL_CLASS = FlagField.booleanAfter(IS_DATA); public static final BooleanFlagField IS_EXTERNAL_CLASS = FlagField.booleanAfter(IS_DATA);
public static final BooleanFlagField IS_EXPECT_CLASS = FlagField.booleanAfter(IS_EXTERNAL_CLASS); public static final BooleanFlagField IS_EXPECT_CLASS = FlagField.booleanAfter(IS_EXTERNAL_CLASS);
public static final BooleanFlagField IS_INLINE_CLASS = FlagField.booleanAfter(IS_EXPECT_CLASS); public static final BooleanFlagField IS_VALUE_CLASS = FlagField.booleanAfter(IS_EXPECT_CLASS);
public static final BooleanFlagField IS_FUN_INTERFACE = FlagField.booleanAfter(IS_INLINE_CLASS); public static final BooleanFlagField IS_FUN_INTERFACE = FlagField.booleanAfter(IS_VALUE_CLASS);
// Constructors // Constructors
@@ -99,7 +99,7 @@ public class Flags {
boolean isData, boolean isData,
boolean isExternal, boolean isExternal,
boolean isExpect, boolean isExpect,
boolean isInline, boolean isValue,
boolean isFun boolean isFun
) { ) {
return HAS_ANNOTATIONS.toFlags(hasAnnotations) return HAS_ANNOTATIONS.toFlags(hasAnnotations)
@@ -110,7 +110,7 @@ public class Flags {
| IS_DATA.toFlags(isData) | IS_DATA.toFlags(isData)
| IS_EXTERNAL_CLASS.toFlags(isExternal) | IS_EXTERNAL_CLASS.toFlags(isExternal)
| IS_EXPECT_CLASS.toFlags(isExpect) | IS_EXPECT_CLASS.toFlags(isExpect)
| IS_INLINE_CLASS.toFlags(isInline) | IS_VALUE_CLASS.toFlags(isValue)
| IS_FUN_INTERFACE.toFlags(isFun) | IS_FUN_INTERFACE.toFlags(isFun)
; ;
} }
@@ -139,62 +139,62 @@ internal class EnumSpecialDeclarationsFactory(val context: Context) {
val endOffset = enumClass.endOffset val endOffset = enumClass.endOffset
val implObject = val implObject =
IrClassImpl( IrClassImpl(
startOffset, endOffset, startOffset, endOffset,
DECLARATION_ORIGIN_ENUM, DECLARATION_ORIGIN_ENUM,
IrClassSymbolImpl(), IrClassSymbolImpl(),
"OBJECT".synthesizedName, "OBJECT".synthesizedName,
ClassKind.OBJECT, ClassKind.OBJECT,
DescriptorVisibilities.PUBLIC, DescriptorVisibilities.PUBLIC,
Modality.FINAL, Modality.FINAL,
isCompanion = false, isCompanion = false,
isInner = false, isInner = false,
isData = false, isData = false,
isExternal = false, isExternal = false,
isInline = false, isValue = false,
isExpect = false, isExpect = false,
isFun = false isFun = false
).apply { ).apply {
parent = enumClass parent = enumClass
createParameterDeclarations() createParameterDeclarations()
} }
val valuesType = valuesArrayType(enumClass) val valuesType = valuesArrayType(enumClass)
val valuesField = val valuesField =
IrFieldImpl( IrFieldImpl(
startOffset, endOffset, startOffset, endOffset,
DECLARATION_ORIGIN_ENUM, DECLARATION_ORIGIN_ENUM,
IrFieldSymbolImpl(), IrFieldSymbolImpl(),
"VALUES".synthesizedName, "VALUES".synthesizedName,
valuesType, valuesType,
DescriptorVisibilities.PRIVATE, DescriptorVisibilities.PRIVATE,
isFinal = true, isFinal = true,
isExternal = false, isExternal = false,
isStatic = false, isStatic = false,
).apply { ).apply {
parent = implObject parent = implObject
} }
val valuesGetter = val valuesGetter =
IrFunctionImpl( IrFunctionImpl(
startOffset, endOffset, startOffset, endOffset,
DECLARATION_ORIGIN_ENUM, DECLARATION_ORIGIN_ENUM,
IrSimpleFunctionSymbolImpl(), IrSimpleFunctionSymbolImpl(),
"get-VALUES".synthesizedName, "get-VALUES".synthesizedName,
DescriptorVisibilities.PUBLIC, DescriptorVisibilities.PUBLIC,
Modality.FINAL, Modality.FINAL,
valuesType, valuesType,
isInline = false, isInline = false,
isExternal = false, isExternal = false,
isTailrec = false, isTailrec = false,
isSuspend = false, isSuspend = false,
isExpect = false, isExpect = false,
isFakeOverride = false, isFakeOverride = false,
isOperator = false, isOperator = false,
isInfix = false isInfix = false
).apply { ).apply {
parent = implObject parent = implObject
} }
val constructorOfAny = context.irBuiltIns.anyClass.owner.constructors.first() val constructorOfAny = context.irBuiltIns.anyClass.owner.constructors.first()
implObject.addSimpleDelegatingConstructor( implObject.addSimpleDelegatingConstructor(
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.declarations.IrProperty
import org.jetbrains.kotlin.ir.declarations.isSingleFieldValueClass
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
@@ -293,7 +294,7 @@ internal object IrTypeInlineClassesSupport : InlineClassesSupport<IrClass, IrTyp
} }
} }
override fun hasInlineModifier(clazz: IrClass): Boolean = clazz.isInline override fun hasInlineModifier(clazz: IrClass): Boolean = clazz.isSingleFieldValueClass
override fun getNativePointedSuperclass(clazz: IrClass): IrClass? { override fun getNativePointedSuperclass(clazz: IrClass): IrClass? {
var superClass: IrClass? = clazz var superClass: IrClass? = clazz
@@ -9,7 +9,10 @@ import org.jetbrains.kotlin.backend.common.lower.irNot
import org.jetbrains.kotlin.backend.konan.PrimitiveBinaryType import org.jetbrains.kotlin.backend.konan.PrimitiveBinaryType
import org.jetbrains.kotlin.backend.konan.RuntimeNames import org.jetbrains.kotlin.backend.konan.RuntimeNames
import org.jetbrains.kotlin.backend.konan.getObjCMethodInfo import org.jetbrains.kotlin.backend.konan.getObjCMethodInfo
import org.jetbrains.kotlin.backend.konan.ir.* import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
import org.jetbrains.kotlin.backend.konan.ir.buildSimpleAnnotation
import org.jetbrains.kotlin.backend.konan.ir.getAnnotationArgumentValue
import org.jetbrains.kotlin.backend.konan.ir.konanLibrary
import org.jetbrains.kotlin.backend.konan.isObjCMetaClass import org.jetbrains.kotlin.backend.konan.isObjCMetaClass
import org.jetbrains.kotlin.backend.konan.lower.FunctionReferenceLowering import org.jetbrains.kotlin.backend.konan.lower.FunctionReferenceLowering
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
@@ -1106,7 +1109,7 @@ private class ObjCBlockPointerValuePassing(
Name.identifier(stubs.getUniqueKotlinFunctionReferenceClassName("BlockFunctionImpl")), Name.identifier(stubs.getUniqueKotlinFunctionReferenceClassName("BlockFunctionImpl")),
ClassKind.CLASS, DescriptorVisibilities.PRIVATE, Modality.FINAL, ClassKind.CLASS, DescriptorVisibilities.PRIVATE, Modality.FINAL,
isCompanion = false, isInner = false, isData = false, isExternal = false, isCompanion = false, isInner = false, isData = false, isExternal = false,
isInline = false, isExpect = false, isFun = false isValue = false, isExpect = false, isFun = false
) )
irClass.createParameterDeclarations() irClass.createParameterDeclarations()
@@ -7,8 +7,10 @@ package org.jetbrains.kotlin.backend.konan.ir
import org.jetbrains.kotlin.backend.common.ir.copyTo import org.jetbrains.kotlin.backend.common.ir.copyTo
import org.jetbrains.kotlin.backend.common.ir.createDispatchReceiverParameter import org.jetbrains.kotlin.backend.common.ir.createDispatchReceiverParameter
import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.BinaryType
import org.jetbrains.kotlin.backend.konan.KonanBackendContext import org.jetbrains.kotlin.backend.konan.KonanBackendContext
import org.jetbrains.kotlin.backend.konan.KonanFqNames
import org.jetbrains.kotlin.backend.konan.computeBinaryType
import org.jetbrains.kotlin.backend.konan.descriptors.getAnnotationStringValue import org.jetbrains.kotlin.backend.konan.descriptors.getAnnotationStringValue
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
@@ -16,10 +18,13 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.addMember import org.jetbrains.kotlin.ir.declarations.addMember
import org.jetbrains.kotlin.ir.declarations.isSingleFieldValueClass
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
import org.jetbrains.kotlin.ir.types.defaultType import org.jetbrains.kotlin.ir.types.defaultType
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
import org.jetbrains.kotlin.ir.util.functions
import org.jetbrains.kotlin.ir.util.isAnnotationWithEqualFqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
@@ -64,7 +69,7 @@ internal class FunctionsWithoutBoundCheckGenerator(val context: KonanBackendCont
fun generate() { fun generate() {
symbols.arrays.forEach { classSymbol -> symbols.arrays.forEach { classSymbol ->
val underlyingClass = (classSymbol.defaultType.computeBinaryType() as BinaryType.Reference) val underlyingClass = (classSymbol.defaultType.computeBinaryType() as BinaryType.Reference)
.types.single().takeIf { classSymbol.owner.isInline } .types.single().takeIf { classSymbol.owner.isSingleFieldValueClass }
val setFunction = classSymbol.owner.functions.single { it.name == OperatorNameConventions.SET } val setFunction = classSymbol.owner.functions.single { it.name == OperatorNameConventions.SET }
val setDelegatingToFunction = underlyingClass?.functions?.single { it.name == OperatorNameConventions.SET } val setDelegatingToFunction = underlyingClass?.functions?.single { it.name == OperatorNameConventions.SET }
classSymbol.owner.addMember(generateFunction(setFunction, setDelegatingToFunction, KonanNameConventions.setWithoutBoundCheck)) classSymbol.owner.addMember(generateFunction(setFunction, setDelegatingToFunction, KonanNameConventions.setWithoutBoundCheck))
@@ -13,21 +13,19 @@ import org.jetbrains.kotlin.backend.common.lower.at
import org.jetbrains.kotlin.backend.common.lower.irNot import org.jetbrains.kotlin.backend.common.lower.irNot
import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.*
import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.isSingleFieldValueClass
import org.jetbrains.kotlin.ir.descriptors.IrBuiltinOperatorDescriptor import org.jetbrains.kotlin.ir.descriptors.IrBuiltinOperatorDescriptor
import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrTypeOperatorCall import org.jetbrains.kotlin.ir.expressions.IrTypeOperatorCall
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.builders.irGet
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.util.defaultOrNullableType
import org.jetbrains.kotlin.ir.util.isNullConst
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
/** /**
@@ -125,7 +123,7 @@ internal class BuiltinOperatorLowering(val context: Context) : FileLoweringPass,
} }
private fun inlinedClassHasDefaultEquals(irClass: IrClass): Boolean { private fun inlinedClassHasDefaultEquals(irClass: IrClass): Boolean {
if (!irClass.isInline) { if (!irClass.isSingleFieldValueClass) {
// Implicitly-inlined class, e.g. primitive one. // Implicitly-inlined class, e.g. primitive one.
return true return true
} }
@@ -133,7 +131,7 @@ internal class BuiltinOperatorLowering(val context: Context) : FileLoweringPass,
val equals = irClass.simpleFunctions() val equals = irClass.simpleFunctions()
.single { it.name.asString() == "equals" && it.valueParameters.size == 1 && it.overrides(anyEquals) } .single { it.name.asString() == "equals" && it.valueParameters.size == 1 && it.overrides(anyEquals) }
return equals.origin == IrDeclarationOrigin.GENERATED_INLINE_CLASS_MEMBER return equals.origin == IrDeclarationOrigin.GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER
} }
fun IrBuilderWithScope.genInlineClassEquals( fun IrBuilderWithScope.genInlineClassEquals(
@@ -14,7 +14,9 @@ import org.jetbrains.kotlin.backend.common.push
import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.Context
import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName
import org.jetbrains.kotlin.backend.konan.llvm.computeFullName import org.jetbrains.kotlin.backend.konan.llvm.computeFullName
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.*
@@ -35,7 +37,7 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
internal class FunctionReferenceLowering(val context: Context): FileLoweringPass { internal class FunctionReferenceLowering(val context: Context) : FileLoweringPass {
private object DECLARATION_ORIGIN_FUNCTION_REFERENCE_IMPL : IrDeclarationOriginImpl("FUNCTION_REFERENCE_IMPL") private object DECLARATION_ORIGIN_FUNCTION_REFERENCE_IMPL : IrDeclarationOriginImpl("FUNCTION_REFERENCE_IMPL")
@@ -46,7 +48,7 @@ internal class FunctionReferenceLowering(val context: Context): FileLoweringPass
override fun lower(irFile: IrFile) { override fun lower(irFile: IrFile) {
var generatedClasses = mutableListOf<IrClass>() var generatedClasses = mutableListOf<IrClass>()
irFile.transform(object: IrElementTransformerVoidWithContext() { irFile.transform(object : IrElementTransformerVoidWithContext() {
private val stack = mutableListOf<IrElement>() private val stack = mutableListOf<IrElement>()
@@ -167,6 +169,7 @@ internal class FunctionReferenceLowering(val context: Context): FileLoweringPass
val samSuperType: IrType? = null, val samSuperType: IrType? = null,
) { ) {
data class BuiltFunctionReference(val functionReferenceClass: IrClass, val functionReferenceExpression: IrExpression) data class BuiltFunctionReference(val functionReferenceClass: IrClass, val functionReferenceExpression: IrExpression)
private val irBuiltIns = context.irBuiltIns private val irBuiltIns = context.irBuiltIns
private val symbols = context.ir.symbols private val symbols = context.ir.symbols
private val getContinuationSymbol = symbols.getContinuation private val getContinuationSymbol = symbols.getContinuation
@@ -193,28 +196,28 @@ internal class FunctionReferenceLowering(val context: Context): FileLoweringPass
private val functionReferenceTarget = adaptedReferenceOriginalTarget ?: referencedFunction private val functionReferenceTarget = adaptedReferenceOriginalTarget ?: referencedFunction
private val functionReferenceClass: IrClass = private val functionReferenceClass: IrClass =
IrClassImpl( IrClassImpl(
startOffset,endOffset, startOffset, endOffset,
DECLARATION_ORIGIN_FUNCTION_REFERENCE_IMPL, DECLARATION_ORIGIN_FUNCTION_REFERENCE_IMPL,
IrClassSymbolImpl(), IrClassSymbolImpl(),
"${functionReferenceTarget.name}\$FUNCTION_REFERENCE\$${context.functionReferenceCount++}".synthesizedName, "${functionReferenceTarget.name}\$FUNCTION_REFERENCE\$${context.functionReferenceCount++}".synthesizedName,
ClassKind.CLASS, ClassKind.CLASS,
DescriptorVisibilities.PRIVATE, DescriptorVisibilities.PRIVATE,
Modality.FINAL, Modality.FINAL,
isCompanion = false, isCompanion = false,
isInner = false, isInner = false,
isData = false, isData = false,
isExternal = false, isExternal = false,
isInline = false, isValue = false,
isExpect = false, isExpect = false,
isFun = false isFun = false
).apply { ).apply {
parent = this@FunctionReferenceBuilder.parent parent = this@FunctionReferenceBuilder.parent
createParameterDeclarations() createParameterDeclarations()
// copy the generated name for IrClass, partially solves KT-47194 // copy the generated name for IrClass, partially solves KT-47194
context.copyLocalClassName(functionReference, this) context.copyLocalClassName(functionReference, this)
} }
private val functionReferenceThis = functionReferenceClass.thisReceiver!! private val functionReferenceThis = functionReferenceClass.thisReceiver!!
@@ -7,13 +7,16 @@ package org.jetbrains.kotlin.backend.konan.lower
import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.FileLoweringPass
import org.jetbrains.kotlin.backend.common.lower.IrBuildingTransformer
import org.jetbrains.kotlin.backend.common.lower.* import org.jetbrains.kotlin.backend.common.lower.at
import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.backend.konan.Context
import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.irCall
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.visitors.* import org.jetbrains.kotlin.ir.declarations.isSingleFieldValueClass
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
/** /**
@@ -39,7 +42,7 @@ private class InlineClassAccessorsTransformer(private val context: Context) : Ir
val property = expression.symbol.owner.correspondingPropertySymbol?.owner ?: return expression val property = expression.symbol.owner.correspondingPropertySymbol?.owner ?: return expression
property.parent.let { property.parent.let {
if (it is IrClass && it.isInline && property.backingField != null) { if (it is IrClass && it.isSingleFieldValueClass && property.backingField != null) {
expression.dispatchReceiver?.let { receiver -> expression.dispatchReceiver?.let { receiver ->
return builder.at(expression) return builder.at(expression)
.irCall(symbols.reinterpret, expression.type, listOf(receiver.type, expression.type)) .irCall(symbols.reinterpret, expression.type, listOf(receiver.type, expression.type))
@@ -491,7 +491,7 @@ internal class TestProcessor (val context: Context) {
isInner = false, isInner = false,
isData = false, isData = false,
isExternal = false, isExternal = false,
isInline = false, isValue = false,
isExpect = false, isExpect = false,
isFun = false isFun = false
).apply { ).apply {
@@ -6,8 +6,8 @@
package kotlinx.metadata package kotlinx.metadata
import org.jetbrains.kotlin.metadata.ProtoBuf.* import org.jetbrains.kotlin.metadata.ProtoBuf.*
import org.jetbrains.kotlin.metadata.deserialization.Flags as F
import org.jetbrains.kotlin.metadata.ProtoBuf.Class.Kind as ClassKind import org.jetbrains.kotlin.metadata.ProtoBuf.Class.Kind as ClassKind
import org.jetbrains.kotlin.metadata.deserialization.Flags as F
/** /**
* Represents a boolean flag that is either present or not in a Kotlin declaration. A "flag" is a boolean trait that is either present * Represents a boolean flag that is either present or not in a Kotlin declaration. A "flag" is a boolean trait that is either present
@@ -208,13 +208,13 @@ class Flag(private val offset: Int, private val bitWidth: Int, private val value
level = DeprecationLevel.ERROR level = DeprecationLevel.ERROR
) )
@Suppress("unused") @Suppress("unused")
val IS_INLINE = Flag(F.IS_INLINE_CLASS) val IS_INLINE = Flag(F.IS_VALUE_CLASS)
/** /**
* Signifies that the corresponding class is either a pre-Kotlin-1.5 `inline` class, or a 1.5+ `value` class. * Signifies that the corresponding class is either a pre-Kotlin-1.5 `inline` class, or a 1.5+ `value` class.
*/ */
@JvmField @JvmField
val IS_VALUE = Flag(F.IS_INLINE_CLASS) val IS_VALUE = Flag(F.IS_VALUE_CLASS)
/** /**
* Signifies that the corresponding class is a functional interface, i.e. marked with the keyword `fun`. * Signifies that the corresponding class is a functional interface, i.e. marked with the keyword `fun`.
@@ -22,7 +22,6 @@ import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.defaultType import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.parcelize.ParcelizeNames
import org.jetbrains.kotlin.parcelize.ParcelizeNames.CREATE_FROM_PARCEL_NAME import org.jetbrains.kotlin.parcelize.ParcelizeNames.CREATE_FROM_PARCEL_NAME
import org.jetbrains.kotlin.parcelize.ParcelizeNames.NEW_ARRAY_NAME import org.jetbrains.kotlin.parcelize.ParcelizeNames.NEW_ARRAY_NAME
import org.jetbrains.kotlin.parcelize.ParcelizeNames.WRITE_TO_PARCEL_NAME import org.jetbrains.kotlin.parcelize.ParcelizeNames.WRITE_TO_PARCEL_NAME
@@ -521,12 +520,12 @@ class AndroidSymbols(
shortName: String, shortName: String,
classKind: ClassKind, classKind: ClassKind,
classModality: Modality, classModality: Modality,
isInlineClass: Boolean = false isValueClass: Boolean = false,
): IrClassSymbol = irFactory.buildClass { ): IrClassSymbol = irFactory.buildClass {
name = Name.identifier(shortName) name = Name.identifier(shortName)
kind = classKind kind = classKind
modality = classModality modality = classModality
isInline = isInlineClass isValue = isValueClass
}.apply { }.apply {
parent = irPackage parent = irPackage
createImplicitParameterDeclarationWithWrappedDescriptor() createImplicitParameterDeclarationWithWrappedDescriptor()