[IR] Correct work of the new MFVC lowering classes
#KT-1179
This commit is contained in:
committed by
teamcity
parent
8ba20bee5b
commit
6f94af80ab
+3
-3
@@ -50202,9 +50202,9 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("MFVCFieldInitializationOrder.kt")
|
@TestMetadata("MfvcFieldInitializationOrder.kt")
|
||||||
public void testMFVCFieldInitializationOrder() throws Exception {
|
public void testMfvcFieldInitializationOrder() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/valueClasses/MFVCFieldInitializationOrder.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
runTest("compiler/testData/codegen/box/valueClasses/MfvcFieldInitializationOrder.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
+22
-24
@@ -11,11 +11,9 @@ import org.jetbrains.kotlin.backend.common.lower.VariableRemapper
|
|||||||
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
||||||
import org.jetbrains.kotlin.backend.common.lower.irNot
|
import org.jetbrains.kotlin.backend.common.lower.irNot
|
||||||
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
import org.jetbrains.kotlin.backend.jvm.*
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.MemoizedMultiFieldValueClassReplacements.RemappedParameter.MultiFieldValueClassMapping
|
import org.jetbrains.kotlin.backend.jvm.MemoizedMultiFieldValueClassReplacements.RemappedParameter.MultiFieldValueClassMapping
|
||||||
import org.jetbrains.kotlin.backend.jvm.MemoizedMultiFieldValueClassReplacements.RemappedParameter.RegularMapping
|
import org.jetbrains.kotlin.backend.jvm.MemoizedMultiFieldValueClassReplacements.RemappedParameter.RegularMapping
|
||||||
import org.jetbrains.kotlin.backend.jvm.SpecialBridge
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.ir.*
|
import org.jetbrains.kotlin.backend.jvm.ir.*
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil
|
import org.jetbrains.kotlin.codegen.AsmUtil
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
@@ -623,8 +621,8 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass
|
|||||||
target: IrSimpleFunction,
|
target: IrSimpleFunction,
|
||||||
superQualifierSymbol: IrClassSymbol? = null
|
superQualifierSymbol: IrClassSymbol? = null
|
||||||
) =
|
) =
|
||||||
irCastIfNeeded(
|
irCastIfNeeded(irBlock {
|
||||||
irCall(target, origin = IrStatementOrigin.BRIDGE_DELEGATION, superQualifierSymbol = superQualifierSymbol).apply {
|
+irReturn(irCall(target, origin = IrStatementOrigin.BRIDGE_DELEGATION, superQualifierSymbol = superQualifierSymbol).apply {
|
||||||
|
|
||||||
val targetStructure = run {
|
val targetStructure = run {
|
||||||
val mfvcOrOriginal =
|
val mfvcOrOriginal =
|
||||||
@@ -656,7 +654,7 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass
|
|||||||
bridgeStructure.size == targetStructure.size &&
|
bridgeStructure.size == targetStructure.size &&
|
||||||
(targetStructure zip bridgeStructure).none { (targetParameter, bridgeParameter) ->
|
(targetStructure zip bridgeStructure).none { (targetParameter, bridgeParameter) ->
|
||||||
targetParameter is MultiFieldValueClassMapping && bridgeParameter is MultiFieldValueClassMapping &&
|
targetParameter is MultiFieldValueClassMapping && bridgeParameter is MultiFieldValueClassMapping &&
|
||||||
targetParameter.declarations != bridgeParameter.declarations
|
targetParameter.rootMfvcNode != bridgeParameter.rootMfvcNode
|
||||||
}) { "Incompatible structures: $bridgeStructure and $targetStructure" }
|
}) { "Incompatible structures: $bridgeStructure and $targetStructure" }
|
||||||
|
|
||||||
fun irGetOrCast(bridgeParameter: IrValueParameter, targetParameter: IrValueParameter) =
|
fun irGetOrCast(bridgeParameter: IrValueParameter, targetParameter: IrValueParameter) =
|
||||||
@@ -678,7 +676,7 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass
|
|||||||
when (targetRemappedParameter) {
|
when (targetRemappedParameter) {
|
||||||
is MultiFieldValueClassMapping -> when (bridgeRemappedParameter) {
|
is MultiFieldValueClassMapping -> when (bridgeRemappedParameter) {
|
||||||
is MultiFieldValueClassMapping -> {
|
is MultiFieldValueClassMapping -> {
|
||||||
require(bridgeRemappedParameter.declarations == targetRemappedParameter.declarations) {
|
require(bridgeRemappedParameter.rootMfvcNode == targetRemappedParameter.rootMfvcNode) {
|
||||||
"Incompatible parameters: $bridgeRemappedParameter, $targetRemappedParameter"
|
"Incompatible parameters: $bridgeRemappedParameter, $targetRemappedParameter"
|
||||||
}
|
}
|
||||||
repeat(bridgeRemappedParameter.valueParameters.size) {
|
repeat(bridgeRemappedParameter.valueParameters.size) {
|
||||||
@@ -687,34 +685,35 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass
|
|||||||
putArgument(targetParameter, irGetOrCast(bridgeParameter, targetParameter))
|
putArgument(targetParameter, irGetOrCast(bridgeParameter, targetParameter))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
is RegularMapping, null -> {
|
is RegularMapping, null -> {
|
||||||
val bridgeParameter = bridgeExplicitParameters[bridgeIndex++]
|
val bridgeParameter = bridgeExplicitParameters[bridgeIndex++]
|
||||||
val newArguments = targetRemappedParameter.declarations.unboxMethods.map { unboxFunction ->
|
val targetParameterType = targetRemappedParameter.rootMfvcNode.mfvc.defaultType
|
||||||
irCall(unboxFunction).apply {
|
val instance = targetRemappedParameter.rootMfvcNode.createInstanceFromBox(
|
||||||
val targetParameterType = targetRemappedParameter.declarations.valueClass.defaultType
|
this@irBlock,
|
||||||
dispatchReceiver = irCastIfNeeded(irGet(bridgeParameter), targetParameterType)
|
irCastIfNeeded(irGet(bridgeParameter), targetParameterType),
|
||||||
}
|
hasAccessToPrivateMembersOf(target, targetRemappedParameter.rootMfvcNode.mfvc)
|
||||||
}
|
) { error("Not applicable") }
|
||||||
|
val newArguments = instance.makeFlattenedGetterExpressions()
|
||||||
for (newArgument in newArguments) {
|
for (newArgument in newArguments) {
|
||||||
putArgument(targetExplicitParameters[targetIndex++], newArgument)
|
putArgument(targetExplicitParameters[targetIndex++], newArgument)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
is RegularMapping, null -> {
|
is RegularMapping, null -> {
|
||||||
val targetParameter = targetExplicitParameters[targetIndex]
|
val targetParameter = targetExplicitParameters[targetIndex]
|
||||||
when (bridgeRemappedParameter) {
|
when (bridgeRemappedParameter) {
|
||||||
is MultiFieldValueClassMapping -> {
|
is MultiFieldValueClassMapping -> {
|
||||||
val count = bridgeRemappedParameter.declarations.fields.size
|
val valueArguments = List(bridgeRemappedParameter.rootMfvcNode.leavesCount) {
|
||||||
val boxCall = irCall(bridgeRemappedParameter.declarations.boxMethod).apply {
|
irGet(bridgeExplicitParameters[bridgeIndex++])
|
||||||
bridgeRemappedParameter.boxedType.arguments.forEachIndexed { index, argument ->
|
|
||||||
putTypeArgument(index, argument.typeOrNull)
|
|
||||||
}
|
|
||||||
for (i in 0 until count) {
|
|
||||||
putValueArgument(i, irGet(bridgeExplicitParameters[bridgeIndex++]))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
val boxCall = bridgeRemappedParameter.rootMfvcNode.makeBoxedExpression(
|
||||||
|
this@irBlock, bridgeRemappedParameter.typeArguments, valueArguments
|
||||||
|
)
|
||||||
putArgument(targetParameter, irCastIfNeeded(boxCall, targetParameter.type.upperBound))
|
putArgument(targetParameter, irCastIfNeeded(boxCall, targetParameter.type.upperBound))
|
||||||
}
|
}
|
||||||
|
|
||||||
is RegularMapping, null -> {
|
is RegularMapping, null -> {
|
||||||
val bridgeParameter = bridgeExplicitParameters[bridgeIndex++]
|
val bridgeParameter = bridgeExplicitParameters[bridgeIndex++]
|
||||||
putArgument(targetParameter, irGetOrCast(bridgeParameter, targetParameter))
|
putArgument(targetParameter, irGetOrCast(bridgeParameter, targetParameter))
|
||||||
@@ -734,9 +733,8 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass
|
|||||||
require((bridgeStructure == null || structureIndex == bridgeStructure.size)) {
|
require((bridgeStructure == null || structureIndex == bridgeStructure.size)) {
|
||||||
"Invalid structure index $structureIndex for $bridgeStructure"
|
"Invalid structure index $structureIndex for $bridgeStructure"
|
||||||
}
|
}
|
||||||
},
|
})
|
||||||
bridge.returnType.upperBound
|
}.unwrap(), bridge.returnType.upperBound)
|
||||||
)
|
|
||||||
|
|
||||||
private fun IrBuilderWithScope.irCastIfNeeded(expression: IrExpression, to: IrType): IrExpression =
|
private fun IrBuilderWithScope.irCastIfNeeded(expression: IrExpression, to: IrType): IrExpression =
|
||||||
if (expression.type == to || to.isAny() || to.isNullableAny()) expression else irImplicitCast(expression, to)
|
if (expression.type == to || to.isAny() || to.isNullableAny()) expression else irImplicitCast(expression, to)
|
||||||
|
|||||||
+11
-11
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.backend.jvm.MemoizedMultiFieldValueClassReplacements
|
|||||||
import org.jetbrains.kotlin.backend.jvm.MemoizedMultiFieldValueClassReplacements.RemappedParameter.RegularMapping
|
import org.jetbrains.kotlin.backend.jvm.MemoizedMultiFieldValueClassReplacements.RemappedParameter.RegularMapping
|
||||||
import org.jetbrains.kotlin.backend.jvm.fullValueParameterList
|
import org.jetbrains.kotlin.backend.jvm.fullValueParameterList
|
||||||
import org.jetbrains.kotlin.backend.jvm.ir.*
|
import org.jetbrains.kotlin.backend.jvm.ir.*
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.makeBoxedExpression
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames
|
import org.jetbrains.kotlin.builtins.StandardNames
|
||||||
import org.jetbrains.kotlin.config.JvmDefaultMode
|
import org.jetbrains.kotlin.config.JvmDefaultMode
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
@@ -32,7 +33,6 @@ import org.jetbrains.kotlin.ir.expressions.IrExpression
|
|||||||
import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
|
import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
import org.jetbrains.kotlin.ir.types.typeOrNull
|
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.ir.visitors.*
|
import org.jetbrains.kotlin.ir.visitors.*
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||||
@@ -134,16 +134,16 @@ private class InheritedDefaultMethodsOnClassesLowering(val context: JvmBackendCo
|
|||||||
var flattenedIndex = 0
|
var flattenedIndex = 0
|
||||||
for (i in 1 until structure.size) {
|
for (i in 1 until structure.size) {
|
||||||
when (val remappedParameter = structure[i]) {
|
when (val remappedParameter = structure[i]) {
|
||||||
is MultiFieldValueClassMapping ->
|
is MultiFieldValueClassMapping -> {
|
||||||
putValueArgument(i, irCall(remappedParameter.declarations.boxMethod).apply {
|
val valueArguments = (0 until remappedParameter.valueParameters.size).map {
|
||||||
remappedParameter.boxedType.arguments.forEachIndexed { index, argument ->
|
irGet(sourceFullValueParameterList[flattenedIndex++])
|
||||||
putTypeArgument(index, argument.typeOrNull)
|
}
|
||||||
}
|
val boxedExpression = remappedParameter.rootMfvcNode.makeBoxedExpression(
|
||||||
val boxArgumentsCount = remappedParameter.valueParameters.size
|
this@irBlockBody, remappedParameter.typeArguments, valueArguments
|
||||||
for (boxArgumentIndex in 0 until boxArgumentsCount) {
|
)
|
||||||
putValueArgument(boxArgumentIndex, irGet(sourceFullValueParameterList[flattenedIndex++]))
|
putValueArgument(i, boxedExpression)
|
||||||
}
|
}
|
||||||
})
|
|
||||||
is RegularMapping -> putValueArgument(i, irGet(sourceFullValueParameterList[flattenedIndex++]))
|
is RegularMapping -> putValueArgument(i, irGet(sourceFullValueParameterList[flattenedIndex++]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-2
@@ -83,7 +83,9 @@ private class JvmInlineClassLowering(context: JvmBackendContext) : JvmValueClass
|
|||||||
|
|
||||||
override fun IrClass.isSpecificLoweringLogicApplicable(): Boolean = isSingleFieldValueClass
|
override fun IrClass.isSpecificLoweringLogicApplicable(): Boolean = isSingleFieldValueClass
|
||||||
|
|
||||||
override fun IrFunction.isFieldGetterToRemove(): Boolean = isInlineClassFieldGetter
|
override val specificMangle: SpecificMangle
|
||||||
|
get() = SpecificMangle.Inline
|
||||||
|
|
||||||
override fun visitClassNew(declaration: IrClass): IrStatement {
|
override fun visitClassNew(declaration: IrClass): IrStatement {
|
||||||
// The arguments to the primary constructor are in scope in the initializers of IrFields.
|
// The arguments to the primary constructor are in scope in the initializers of IrFields.
|
||||||
|
|
||||||
@@ -113,7 +115,7 @@ private class JvmInlineClassLowering(context: JvmBackendContext) : JvmValueClass
|
|||||||
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 {
|
||||||
it == irConstructor || (it is IrFunction && it.isFieldGetterToRemove() && !it.visibility.isPublicAPI)
|
it == irConstructor || (it is IrFunction && it.isInlineClassFieldGetter && !it.visibility.isPublicAPI)
|
||||||
}
|
}
|
||||||
buildPrimaryInlineClassConstructor(declaration, irConstructor)
|
buildPrimaryInlineClassConstructor(declaration, irConstructor)
|
||||||
buildBoxFunction(declaration)
|
buildBoxFunction(declaration)
|
||||||
|
|||||||
+786
-681
File diff suppressed because it is too large
Load Diff
+13
-10
@@ -31,8 +31,6 @@ internal abstract class JvmValueClassAbstractLowering(val context: JvmBackendCon
|
|||||||
|
|
||||||
abstract fun IrClass.isSpecificLoweringLogicApplicable(): Boolean
|
abstract fun IrClass.isSpecificLoweringLogicApplicable(): Boolean
|
||||||
|
|
||||||
abstract fun IrFunction.isFieldGetterToRemove(): Boolean
|
|
||||||
|
|
||||||
abstract override fun visitClassNew(declaration: IrClass): IrStatement
|
abstract override fun visitClassNew(declaration: IrClass): IrStatement
|
||||||
|
|
||||||
abstract fun handleSpecificNewClass(declaration: IrClass)
|
abstract fun handleSpecificNewClass(declaration: IrClass)
|
||||||
@@ -46,7 +44,7 @@ internal abstract class JvmValueClassAbstractLowering(val context: JvmBackendCon
|
|||||||
|
|
||||||
if (replacement == null) {
|
if (replacement == null) {
|
||||||
if (function is IrConstructor) {
|
if (function is IrConstructor) {
|
||||||
val constructorReplacement = replacements.getReplacementRegularClassConstructor(function)
|
val constructorReplacement = replacements.getReplacementForRegularClassConstructor(function)
|
||||||
if (constructorReplacement != null) {
|
if (constructorReplacement != null) {
|
||||||
addBindingsFor(function, constructorReplacement)
|
addBindingsFor(function, constructorReplacement)
|
||||||
return transformFlattenedConstructor(function, constructorReplacement)
|
return transformFlattenedConstructor(function, constructorReplacement)
|
||||||
@@ -107,7 +105,7 @@ internal abstract class JvmValueClassAbstractLowering(val context: JvmBackendCon
|
|||||||
it.transformChildrenVoid()
|
it.transformChildrenVoid()
|
||||||
it.defaultValue?.patchDeclarationParents(replacement)
|
it.defaultValue?.patchDeclarationParents(replacement)
|
||||||
}
|
}
|
||||||
allScopes.push(createScope(function))
|
allScopes.push(createScope(replacement))
|
||||||
replacement.body = function.body?.transform(this, null)?.patchDeclarationParents(replacement)
|
replacement.body = function.body?.transform(this, null)?.patchDeclarationParents(replacement)
|
||||||
allScopes.pop()
|
allScopes.pop()
|
||||||
replacement.copyAttributes(function)
|
replacement.copyAttributes(function)
|
||||||
@@ -127,7 +125,9 @@ internal abstract class JvmValueClassAbstractLowering(val context: JvmBackendCon
|
|||||||
if (suffix != null && target.name.asString().endsWith(suffix))
|
if (suffix != null && target.name.asString().endsWith(suffix))
|
||||||
return super.visitReturn(expression)
|
return super.visitReturn(expression)
|
||||||
|
|
||||||
replacements.getReplacementFunction(target)?.let {
|
replacements.run {
|
||||||
|
getReplacementFunction(target) ?: if (target is IrConstructor) getReplacementForRegularClassConstructor(target) else null
|
||||||
|
}?.let {
|
||||||
return context.createIrBuilder(it.symbol, expression.startOffset, expression.endOffset).irReturn(
|
return context.createIrBuilder(it.symbol, expression.startOffset, expression.endOffset).irReturn(
|
||||||
expression.value.transform(this, null)
|
expression.value.transform(this, null)
|
||||||
)
|
)
|
||||||
@@ -145,12 +145,12 @@ internal abstract class JvmValueClassAbstractLowering(val context: JvmBackendCon
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitContainerExpression(expression: IrContainerExpression): IrExpression {
|
final override fun visitContainerExpression(expression: IrContainerExpression): IrExpression {
|
||||||
visitStatementContainer(expression)
|
visitStatementContainer(expression)
|
||||||
return expression
|
return expression
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitBlockBody(body: IrBlockBody): IrBody {
|
final override fun visitBlockBody(body: IrBlockBody): IrBody {
|
||||||
visitStatementContainer(body)
|
visitStatementContainer(body)
|
||||||
return body
|
return body
|
||||||
}
|
}
|
||||||
@@ -164,6 +164,8 @@ internal abstract class JvmValueClassAbstractLowering(val context: JvmBackendCon
|
|||||||
|
|
||||||
protected abstract fun addBindingsFor(original: IrFunction, replacement: IrFunction)
|
protected abstract fun addBindingsFor(original: IrFunction, replacement: IrFunction)
|
||||||
|
|
||||||
|
protected enum class SpecificMangle { Inline, MultiField }
|
||||||
|
protected abstract val specificMangle: SpecificMangle
|
||||||
private fun createBridgeFunction(
|
private fun createBridgeFunction(
|
||||||
function: IrSimpleFunction,
|
function: IrSimpleFunction,
|
||||||
replacement: IrSimpleFunction
|
replacement: IrSimpleFunction
|
||||||
@@ -173,9 +175,10 @@ internal abstract class JvmValueClassAbstractLowering(val context: JvmBackendCon
|
|||||||
replacement,
|
replacement,
|
||||||
when {
|
when {
|
||||||
// If the original function has signature which need mangling we still need to replace it with a mangled version.
|
// If the original function has signature which need mangling we still need to replace it with a mangled version.
|
||||||
(!function.isFakeOverride || function.findInterfaceImplementation(context.state.jvmDefaultMode) != null) &&
|
(!function.isFakeOverride || function.findInterfaceImplementation(context.state.jvmDefaultMode) != null) && when (specificMangle) {
|
||||||
function.signatureRequiresMangling() ->
|
SpecificMangle.Inline -> function.signatureRequiresMangling(includeInline = true, includeMFVC = false)
|
||||||
replacement.name
|
SpecificMangle.MultiField -> function.signatureRequiresMangling(includeInline = false, includeMFVC = true)
|
||||||
|
} -> replacement.name
|
||||||
// Since we remove the corresponding property symbol from the bridge we need to resolve getter/setter
|
// Since we remove the corresponding property symbol from the bridge we need to resolve getter/setter
|
||||||
// names at this point.
|
// names at this point.
|
||||||
replacement.isGetter ->
|
replacement.isGetter ->
|
||||||
|
|||||||
-202
@@ -1,202 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.backend.jvm.lower
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.MultiFieldValueClassSpecificDeclarations
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.MultiFieldValueClassTree
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound
|
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
|
|
||||||
import org.jetbrains.kotlin.ir.types.IrSimpleType
|
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
|
||||||
import org.jetbrains.kotlin.ir.types.typeOrNull
|
|
||||||
import org.jetbrains.kotlin.ir.util.defaultType
|
|
||||||
import org.jetbrains.kotlin.ir.util.render
|
|
||||||
import org.jetbrains.kotlin.ir.util.substitute
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
|
|
||||||
typealias TypeArguments = Map<IrTypeParameterSymbol, IrType>
|
|
||||||
|
|
||||||
sealed interface MFVCRepresentation<Leaf : MFVCLeafRepresentation> {
|
|
||||||
operator fun get(name: Name): MFVCRepresentation<Leaf>?
|
|
||||||
fun IrBuilderWithScope.makeGetter(): IrExpression
|
|
||||||
val type: IrSimpleType
|
|
||||||
val children: List<Pair<Name, MFVCRepresentation<Leaf>>>
|
|
||||||
val leaves: List<Leaf>
|
|
||||||
}
|
|
||||||
|
|
||||||
sealed interface MutableMFVCRepresentation<Leaf : MFVCLeafRepresentation> : MFVCRepresentation<Leaf>
|
|
||||||
sealed interface RecursivelyMutableMFVCRepresentation<Leaf : MFVCLeafRepresentation> : MutableMFVCRepresentation<Leaf>
|
|
||||||
|
|
||||||
interface MFVCLeafRepresentation : MFVCRepresentation<Nothing> {
|
|
||||||
override fun get(name: Name): Nothing? = null
|
|
||||||
override val children: List<Pair<Name, MFVCRepresentation<Nothing>>>
|
|
||||||
get() = emptyList()
|
|
||||||
override val leaves: List<Nothing>
|
|
||||||
get() = emptyList()
|
|
||||||
}
|
|
||||||
|
|
||||||
interface MutableMFVCLeafRepresentation : MFVCLeafRepresentation, RecursivelyMutableMFVCRepresentation<Nothing> {
|
|
||||||
fun IrBuilderWithScope.makeSetter(value: IrExpression): IrExpression
|
|
||||||
}
|
|
||||||
|
|
||||||
sealed class ValueDeclarationLeafRepresentation(open val valueDeclaration: IrValueDeclaration) : MFVCLeafRepresentation {
|
|
||||||
override fun IrBuilderWithScope.makeGetter(): IrExpression = irGet(valueDeclaration)
|
|
||||||
override val type: IrSimpleType
|
|
||||||
get() = valueDeclaration.type as IrSimpleType
|
|
||||||
}
|
|
||||||
|
|
||||||
data class VariableLeafRepresentation(override val valueDeclaration: IrVariable) : ValueDeclarationLeafRepresentation(valueDeclaration),
|
|
||||||
MutableMFVCLeafRepresentation {
|
|
||||||
override fun IrBuilderWithScope.makeSetter(value: IrExpression): IrExpression = irSet(valueDeclaration, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
data class ValueParameterLeafRepresentation(override val valueDeclaration: IrValueParameter) :
|
|
||||||
ValueDeclarationLeafRepresentation(valueDeclaration)
|
|
||||||
|
|
||||||
sealed class ReceiverBasedLeafRepresentation(open val receiver: IrValueDeclaration) : MFVCLeafRepresentation {
|
|
||||||
protected fun makeTypeParametersMapping(): Map<IrTypeParameterSymbol, IrType> {
|
|
||||||
val type = receiver.type as IrSimpleType
|
|
||||||
return (type.erasedUpperBound.typeParameters zip type.arguments)
|
|
||||||
.mapNotNull { (parameter, argument) -> argument.typeOrNull?.let { parameter.symbol to it } }.toMap()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data class FieldAccessLeafRepresentation(override val receiver: IrValueDeclaration, val field: IrField) :
|
|
||||||
ReceiverBasedLeafRepresentation(receiver), MutableMFVCLeafRepresentation {
|
|
||||||
override fun IrBuilderWithScope.makeGetter(): IrExpression = irGetField(irGet(receiver), field)
|
|
||||||
override fun IrBuilderWithScope.makeSetter(value: IrExpression): IrExpression = irSetField(irGet(receiver), field, value)
|
|
||||||
override val type: IrSimpleType = field.type.substitute(makeTypeParametersMapping()) as IrSimpleType
|
|
||||||
}
|
|
||||||
|
|
||||||
data class GetterLeafRepresentation(override val receiver: IrValueDeclaration, val getter: IrFunction) :
|
|
||||||
ReceiverBasedLeafRepresentation(receiver) {
|
|
||||||
init {
|
|
||||||
require(getter.typeParameters.isEmpty()) { "Getter ${getter.render()} must have no type parameters" }
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun IrBuilderWithScope.makeGetter(): IrExpression = irCall(getter).apply {
|
|
||||||
dispatchReceiver = irGet(receiver)
|
|
||||||
}
|
|
||||||
|
|
||||||
override val type: IrSimpleType = getter.returnType.substitute(makeTypeParametersMapping()) as IrSimpleType
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getChildType(
|
|
||||||
declarations: MultiFieldValueClassSpecificDeclarations,
|
|
||||||
typeMapping: Map<IrTypeParameterSymbol, IrSimpleType>,
|
|
||||||
name: Name,
|
|
||||||
): IrSimpleType? = declarations.loweringRepresentation[name]?.type?.substitute(typeMapping) as IrSimpleType?
|
|
||||||
|
|
||||||
|
|
||||||
private fun <T : MFVCRepresentation<Leaf>, Leaf : T, InternalNode : T> makeTree(
|
|
||||||
node: MultiFieldValueClassTree,
|
|
||||||
typeArguments: TypeArguments,
|
|
||||||
createInternalNode: (type: IrSimpleType, typeArguments: TypeArguments, node: MultiFieldValueClassTree, children: List<Pair<Name, T>>) -> InternalNode,
|
|
||||||
createLeaf: (type: IrType, node: MultiFieldValueClassTree) -> Leaf,
|
|
||||||
): T = when (node) {
|
|
||||||
is MultiFieldValueClassTree.InternalNode -> {
|
|
||||||
val type = node.type.substitute(typeArguments) as IrSimpleType
|
|
||||||
val children = node.fields.map { it.name to makeTree(it.node, typeArguments, createInternalNode, createLeaf) }
|
|
||||||
createInternalNode(type, typeArguments, node, children)
|
|
||||||
}
|
|
||||||
is MultiFieldValueClassTree.Leaf -> createLeaf(node.type.substitute(typeArguments), node)
|
|
||||||
}
|
|
||||||
|
|
||||||
sealed interface InternalNodeRepresentation<Leaf : MFVCLeafRepresentation> : MFVCRepresentation<Leaf>
|
|
||||||
|
|
||||||
abstract class InternalNodeRepresentationImpl<Leaf : MFVCLeafRepresentation>(
|
|
||||||
val declarations: MultiFieldValueClassSpecificDeclarations,
|
|
||||||
val typeArguments: TypeArguments,
|
|
||||||
final override val children: List<Pair<Name, MFVCRepresentation<Leaf>>>,
|
|
||||||
) : InternalNodeRepresentation<Leaf> {
|
|
||||||
final override val type: IrSimpleType = declarations.valueClass.defaultType.substitute(typeArguments) as IrSimpleType
|
|
||||||
|
|
||||||
final override val leaves: List<Leaf> = children.flatMap { (_, node) -> node.leaves }
|
|
||||||
|
|
||||||
private val childrenMap = children.toMap()
|
|
||||||
|
|
||||||
final override fun get(name: Name): MFVCRepresentation<Leaf>? = childrenMap[name]
|
|
||||||
|
|
||||||
final override fun IrBuilderWithScope.makeGetter(): IrExpression = irCall(declarations.boxMethod).apply {
|
|
||||||
declarations.valueClass.typeParameters.forEachIndexed { index, typeParameter ->
|
|
||||||
typeArguments[typeParameter.symbol]?.let { putTypeArgument(index, it) }
|
|
||||||
}
|
|
||||||
leaves.forEachIndexed { index, leaf -> putValueArgument(index, leaf.run { makeGetter() }) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class MutableInternalNodeRepresentation<Leaf : MFVCLeafRepresentation>(
|
|
||||||
declarations: MultiFieldValueClassSpecificDeclarations,
|
|
||||||
typeArguments: TypeArguments,
|
|
||||||
children: List<Pair<Name, MFVCRepresentation<Leaf>>>
|
|
||||||
) : InternalNodeRepresentationImpl<Leaf>(declarations, typeArguments, children), MutableMFVCRepresentation<Leaf> {
|
|
||||||
abstract fun IrBuilderWithScope.makeSetter(values: List<IrExpression>): IrExpression
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class RecursivelyMutableInternalNodeRepresentation<Leaf : MutableMFVCLeafRepresentation>(
|
|
||||||
declarations: MultiFieldValueClassSpecificDeclarations,
|
|
||||||
typeArguments: TypeArguments,
|
|
||||||
children: List<Pair<Name, MFVCRepresentation<Leaf>>>,
|
|
||||||
) : MutableInternalNodeRepresentation<Leaf>(declarations, typeArguments, children), RecursivelyMutableMFVCRepresentation<Leaf> {
|
|
||||||
final override fun IrBuilderWithScope.makeSetter(values: List<IrExpression>): IrExpression {
|
|
||||||
require(values.size == leaves.size) { "Expected ${leaves.size} expressions but found ${values.size} of them" }
|
|
||||||
return irComposite {
|
|
||||||
for ((leaf, value) in leaves zip values) {
|
|
||||||
+leaf.run { makeSetter(value) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sealed interface ValueDeclarationInternalNodeRepresentation<Leaf : ValueDeclarationLeafRepresentation> : InternalNodeRepresentation<Leaf>
|
|
||||||
|
|
||||||
class MutableValueDeclarationInternalNodeRepresentation(
|
|
||||||
declarations: MultiFieldValueClassSpecificDeclarations,
|
|
||||||
typeArguments: TypeArguments,
|
|
||||||
children: List<Pair<Name, RecursivelyMutableMFVCRepresentation<VariableLeafRepresentation>>>,
|
|
||||||
) : ValueDeclarationInternalNodeRepresentation<VariableLeafRepresentation>,
|
|
||||||
RecursivelyMutableInternalNodeRepresentation<VariableLeafRepresentation>(declarations, typeArguments, children)
|
|
||||||
|
|
||||||
class FieldAccessInternalNodeRepresentation(
|
|
||||||
declarations: MultiFieldValueClassSpecificDeclarations,
|
|
||||||
typeArguments: TypeArguments,
|
|
||||||
children: List<Pair<Name, RecursivelyMutableMFVCRepresentation<FieldAccessLeafRepresentation>>>,
|
|
||||||
) : RecursivelyMutableInternalNodeRepresentation<FieldAccessLeafRepresentation>(declarations, typeArguments, children)
|
|
||||||
|
|
||||||
class RegularClassMFVCInternalNodeRepresentation(
|
|
||||||
declarations: MultiFieldValueClassSpecificDeclarations,
|
|
||||||
typeArguments: TypeArguments,
|
|
||||||
children: List<Pair<Name, MFVCRepresentation<ReceiverBasedLeafRepresentation>>>,
|
|
||||||
) : InternalNodeRepresentationImpl<ReceiverBasedLeafRepresentation>(declarations, typeArguments, children) {
|
|
||||||
init {
|
|
||||||
leaves.verifyEqualReceivers()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun List<ReceiverBasedLeafRepresentation>.verifyEqualReceivers() {
|
|
||||||
val receiver = this[0].receiver
|
|
||||||
require(all { it.receiver == receiver }) { "Different receivers found in leaves" }
|
|
||||||
}
|
|
||||||
|
|
||||||
class MutableRegularClassMFVCInternalNodeRepresentation(
|
|
||||||
declarations: MultiFieldValueClassSpecificDeclarations,
|
|
||||||
val setter: IrFunction,
|
|
||||||
typeArguments: TypeArguments,
|
|
||||||
children: List<Pair<Name, MFVCRepresentation<ReceiverBasedLeafRepresentation>>>,
|
|
||||||
) : MutableInternalNodeRepresentation<ReceiverBasedLeafRepresentation>(declarations, typeArguments, children) {
|
|
||||||
init {
|
|
||||||
leaves.verifyEqualReceivers()
|
|
||||||
require(setter.typeParameters.isEmpty()) { "No type parameters are expected for ${setter.render()}" }
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun IrBuilderWithScope.makeSetter(values: List<IrExpression>): IrExpression = irCall(setter).apply {
|
|
||||||
dispatchReceiver = irGet(leaves[0].receiver)
|
|
||||||
values.forEachIndexed { index, value -> putValueArgument(index, value) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -157,7 +157,7 @@ val IrFunction.isInlineClassFieldGetter: Boolean
|
|||||||
get() = (parent as? IrClass)?.isSingleFieldValueClass == 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
|
||||||
|
|
||||||
val IrFunction.isMultiFieldValueClassOriginalFieldGetter: Boolean
|
val IrFunction.isMultiFieldValueClassFieldGetter: Boolean
|
||||||
get() = (parent as? IrClass)?.isMultiFieldValueClass == true && this is IrSimpleFunction && extensionReceiverParameter == null &&
|
get() = (parent as? IrClass)?.isMultiFieldValueClass == true && this is IrSimpleFunction && extensionReceiverParameter == null &&
|
||||||
correspondingPropertySymbol?.let {
|
correspondingPropertySymbol?.let {
|
||||||
val multiFieldValueClassRepresentation = parentAsClass.multiFieldValueClassRepresentation
|
val multiFieldValueClassRepresentation = parentAsClass.multiFieldValueClassRepresentation
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
|||||||
import org.jetbrains.kotlin.ir.symbols.*
|
import org.jetbrains.kotlin.ir.symbols.*
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
import org.jetbrains.kotlin.ir.types.IrTypeSystemContext
|
import org.jetbrains.kotlin.ir.types.IrTypeSystemContext
|
||||||
import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl
|
|
||||||
import org.jetbrains.kotlin.ir.types.defaultType
|
import org.jetbrains.kotlin.ir.types.defaultType
|
||||||
import org.jetbrains.kotlin.ir.util.SymbolTable
|
import org.jetbrains.kotlin.ir.util.SymbolTable
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
@@ -145,7 +144,7 @@ class JvmBackendContext(
|
|||||||
val inlineClassReplacements = MemoizedInlineClassReplacements(state.functionsWithInlineClassReturnTypesMangled, irFactory, this)
|
val inlineClassReplacements = MemoizedInlineClassReplacements(state.functionsWithInlineClassReturnTypesMangled, irFactory, this)
|
||||||
|
|
||||||
val multiFieldValueClassReplacements =
|
val multiFieldValueClassReplacements =
|
||||||
MemoizedMultiFieldValueClassReplacements(irFactory, this, IrTypeSystemContextImpl(irBuiltIns))
|
MemoizedMultiFieldValueClassReplacements(irFactory, this)
|
||||||
|
|
||||||
val continuationClassesVarsCountByType: MutableMap<IrAttributeContainer, Map<Type, Int>> = hashMapOf()
|
val continuationClassesVarsCountByType: MutableMap<IrAttributeContainer, Map<Type, Int>> = hashMapOf()
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -252,7 +252,7 @@ class MemoizedInlineClassReplacements(
|
|||||||
name = InlineClassAbi.mangledNameFor(function, mangleReturnTypes, useOldManglingScheme)
|
name = InlineClassAbi.mangledNameFor(function, mangleReturnTypes, useOldManglingScheme)
|
||||||
}
|
}
|
||||||
|
|
||||||
override val getReplacementRegularClassConstructor: (IrConstructor) -> IrConstructor? = alwaysNull()
|
override val getReplacementForRegularClassConstructor: (IrConstructor) -> IrConstructor? = alwaysNull()
|
||||||
|
|
||||||
override val replaceOverriddenSymbols: (IrSimpleFunction) -> List<IrSimpleFunctionSymbol> =
|
override val replaceOverriddenSymbols: (IrSimpleFunction) -> List<IrSimpleFunctionSymbol> =
|
||||||
storageManager.createMemoizedFunction { irSimpleFunction ->
|
storageManager.createMemoizedFunction { irSimpleFunction ->
|
||||||
|
|||||||
+139
-142
@@ -6,14 +6,19 @@
|
|||||||
package org.jetbrains.kotlin.backend.jvm
|
package org.jetbrains.kotlin.backend.jvm
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.MemoizedMultiFieldValueClassReplacements.RemappedParameter.MultiFieldValueClassMapping
|
import org.jetbrains.kotlin.backend.jvm.MemoizedMultiFieldValueClassReplacements.RemappedParameter.MultiFieldValueClassMapping
|
||||||
import org.jetbrains.kotlin.backend.jvm.ir.*
|
import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.ir.extensionReceiverName
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.ir.findSuperDeclaration
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.ir.isStaticValueClassReplacement
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
|
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||||
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.IrSimpleType
|
||||||
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
|
import org.jetbrains.kotlin.ir.types.defaultType
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||||
@@ -25,8 +30,7 @@ import java.util.concurrent.ConcurrentHashMap
|
|||||||
*/
|
*/
|
||||||
class MemoizedMultiFieldValueClassReplacements(
|
class MemoizedMultiFieldValueClassReplacements(
|
||||||
irFactory: IrFactory,
|
irFactory: IrFactory,
|
||||||
context: JvmBackendContext,
|
context: JvmBackendContext
|
||||||
private val typeSystemContext: IrTypeSystemContext
|
|
||||||
) : MemoizedValueClassAbstractReplacements(irFactory, context) {
|
) : MemoizedValueClassAbstractReplacements(irFactory, context) {
|
||||||
private val storageManager = LockBasedStorageManager("multi-field-value-class-replacements")
|
private val storageManager = LockBasedStorageManager("multi-field-value-class-replacements")
|
||||||
|
|
||||||
@@ -34,78 +38,47 @@ class MemoizedMultiFieldValueClassReplacements(
|
|||||||
val originalFunctionForMethodReplacement: MutableMap<IrFunction, IrFunction> = ConcurrentHashMap()
|
val originalFunctionForMethodReplacement: MutableMap<IrFunction, IrFunction> = ConcurrentHashMap()
|
||||||
private val originalConstructorForConstructorReplacement: MutableMap<IrConstructor, IrConstructor> = ConcurrentHashMap()
|
private val originalConstructorForConstructorReplacement: MutableMap<IrConstructor, IrConstructor> = ConcurrentHashMap()
|
||||||
|
|
||||||
val getDeclarations: (IrClass) -> MultiFieldValueClassSpecificDeclarations? =
|
private fun IrValueParameter.grouped(
|
||||||
storageManager.createMemoizedFunctionWithNullableValues {
|
name: String?,
|
||||||
if (it.isMultiFieldValueClass)
|
|
||||||
MultiFieldValueClassSpecificDeclarations(it, typeSystemContext, irFactory, context, this)
|
|
||||||
else
|
|
||||||
null
|
|
||||||
}
|
|
||||||
|
|
||||||
val getOldMFVCProperties: (IrClass) -> List<IrProperty> = storageManager.createMemoizedFunction { irClass ->
|
|
||||||
require(irClass.isMultiFieldValueClass) { "No need to save data for non MFVC" }
|
|
||||||
(irClass.properties.toList().filter { it.getter?.isMultiFieldValueClassOriginalFieldGetter == true }.takeIf { it.isNotEmpty() }
|
|
||||||
?: irClass.fields.mapNotNull { it.correspondingPropertySymbol?.owner }.toList().takeIf { it.isNotEmpty() }
|
|
||||||
?: error("No properties found: ${irClass.render()}"))
|
|
||||||
}
|
|
||||||
|
|
||||||
fun commitMFVCOldProperties(irClass: IrClass) {
|
|
||||||
getOldMFVCProperties(irClass)
|
|
||||||
}
|
|
||||||
|
|
||||||
class ValueParameterTemplate(
|
|
||||||
val name: String,
|
|
||||||
val type: IrType,
|
|
||||||
val origin: IrDeclarationOrigin?,
|
|
||||||
val defaultValue: IrExpressionBody?,
|
|
||||||
val original: IrValueParameter, // todo don't use it as it is not always correct
|
|
||||||
) {
|
|
||||||
|
|
||||||
constructor(valueParameter: IrValueParameter, origin: IrDeclarationOrigin?) : this(
|
|
||||||
name = valueParameter.name.asString(),
|
|
||||||
type = valueParameter.type,
|
|
||||||
origin = origin,
|
|
||||||
defaultValue = valueParameter.defaultValue,
|
|
||||||
original = valueParameter,
|
|
||||||
)
|
|
||||||
|
|
||||||
fun toParameter(irFunction: IrFunction, index: Int): IrValueParameter = original.copyTo(
|
|
||||||
irFunction = irFunction,
|
|
||||||
index = index,
|
|
||||||
name = Name.guessByFirstCharacter(name),
|
|
||||||
origin = origin ?: original.origin,
|
|
||||||
defaultValue = null,
|
|
||||||
type = type,
|
|
||||||
).also {
|
|
||||||
// Assuming that constructors and non-override functions are always replaced with the unboxed
|
|
||||||
// equivalent, deep-copying the value here is unnecessary.
|
|
||||||
it.defaultValue = defaultValue?.patchDeclarationParents(irFunction)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun IrFunction.makeValueParametersFromTemplate(newFlattenedParameters: List<RemappedParameter>) = newFlattenedParameters
|
|
||||||
.flatMap { it.valueParameters }.mapIndexed { index: Int, template -> template.toParameter(this, index) }
|
|
||||||
|
|
||||||
private fun List<ValueParameterTemplate>.grouped(
|
|
||||||
substitutionMap: Map<IrTypeParameterSymbol, IrType>,
|
substitutionMap: Map<IrTypeParameterSymbol, IrType>,
|
||||||
originWhenFlattenedAndNotSpecified: IrDeclarationOrigin? = IrDeclarationOrigin.GENERATED_MULTI_FIELD_VALUE_CLASS_PARAMETER
|
targetFunction: IrFunction,
|
||||||
): List<RemappedParameter> = map { parameter ->
|
originWhenFlattened: IrDeclarationOrigin,
|
||||||
val declarations = parameter.type.takeIf { !it.isNullable() }?.erasedUpperBound?.let { getDeclarations(it) }
|
): RemappedParameter {
|
||||||
?: return@map RemappedParameter.RegularMapping(parameter)
|
if (!type.needsMfvcFlattening()) return RemappedParameter.RegularMapping(
|
||||||
require(!parameter.original.hasDefaultValue()) { "Default parameters values are not supported for multi-field value classes" }
|
targetFunction.addValueParameter {
|
||||||
val localSubstitutionMap = declarations.valueClass.typeParameters.zip((parameter.type as IrSimpleType).arguments)
|
updateFrom(this@grouped)
|
||||||
.mapNotNull { (parameter, argument) -> if (argument is IrSimpleType) parameter.symbol to argument.type else null}.toMap()
|
this.name = this@grouped.name
|
||||||
MultiFieldValueClassMapping(declarations, parameter.type.substitute(substitutionMap) as IrSimpleType, declarations.leaves.map { leaf ->
|
index = targetFunction.valueParameters.size
|
||||||
ValueParameterTemplate(
|
}.apply {
|
||||||
name = "${parameter.name}$${declarations.nodeFullNames[leaf]!!}",
|
copyAnnotationsFrom(this@grouped)
|
||||||
type = leaf.type.substitute(localSubstitutionMap),
|
}
|
||||||
origin = parameter.origin ?: originWhenFlattenedAndNotSpecified,
|
)
|
||||||
defaultValue = null,
|
val rootMfvcNode = this@MemoizedMultiFieldValueClassReplacements.getRootMfvcNode(type.erasedUpperBound)!!
|
||||||
original = parameter.original,
|
require(!hasDefaultValue()) { "Default parameters values are not supported for multi-field value classes" }
|
||||||
)
|
val newType = type.substitute(substitutionMap) as IrSimpleType
|
||||||
})
|
val localSubstitutionMap = makeTypeArgumentsFromType(newType)
|
||||||
|
val valueParameters = rootMfvcNode.mapLeaves { leaf ->
|
||||||
|
targetFunction.addValueParameter {
|
||||||
|
updateFrom(this@grouped)
|
||||||
|
this.name = Name.identifier("${name ?: this@grouped.name}-${leaf.fullFieldName}")
|
||||||
|
type = leaf.type.substitute(localSubstitutionMap)
|
||||||
|
origin = originWhenFlattened
|
||||||
|
index = targetFunction.valueParameters.size
|
||||||
|
}.apply {
|
||||||
|
defaultValue = null
|
||||||
|
copyAnnotationsFrom(this@grouped)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return MultiFieldValueClassMapping(rootMfvcNode, newType, valueParameters)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun List<IrValueParameter>.grouped(
|
||||||
|
name: String?,
|
||||||
|
substitutionMap: Map<IrTypeParameterSymbol, IrType>,
|
||||||
|
targetFunction: IrFunction,
|
||||||
|
originWhenFlattened: IrDeclarationOrigin,
|
||||||
|
): List<RemappedParameter> = map { it.grouped(name, substitutionMap, targetFunction, originWhenFlattened) }
|
||||||
|
|
||||||
private fun buildReplacement(
|
private fun buildReplacement(
|
||||||
function: IrFunction,
|
function: IrFunction,
|
||||||
replacementOrigin: IrDeclarationOrigin,
|
replacementOrigin: IrDeclarationOrigin,
|
||||||
@@ -115,71 +88,78 @@ class MemoizedMultiFieldValueClassReplacements(
|
|||||||
origin = when {
|
origin = when {
|
||||||
function.origin == IrDeclarationOrigin.GENERATED_MULTI_FIELD_VALUE_CLASS_MEMBER ->
|
function.origin == IrDeclarationOrigin.GENERATED_MULTI_FIELD_VALUE_CLASS_MEMBER ->
|
||||||
JvmLoweredDeclarationOrigin.MULTI_FIELD_VALUE_CLASS_GENERATED_IMPL_METHOD
|
JvmLoweredDeclarationOrigin.MULTI_FIELD_VALUE_CLASS_GENERATED_IMPL_METHOD
|
||||||
|
|
||||||
function is IrConstructor && function.constructedClass.isMultiFieldValueClass ->
|
function is IrConstructor && function.constructedClass.isMultiFieldValueClass ->
|
||||||
JvmLoweredDeclarationOrigin.STATIC_MULTI_FIELD_VALUE_CLASS_CONSTRUCTOR
|
JvmLoweredDeclarationOrigin.STATIC_MULTI_FIELD_VALUE_CLASS_CONSTRUCTOR
|
||||||
|
|
||||||
else -> replacementOrigin
|
else -> replacementOrigin
|
||||||
}
|
}
|
||||||
name = InlineClassAbi.mangledNameFor(function, mangleReturnTypes = false, useOldMangleRules = false)
|
name = InlineClassAbi.mangledNameFor(function, mangleReturnTypes = false, useOldMangleRules = false)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun makeGroupedValueParametersFrom(
|
private fun makeAndAddGroupedValueParametersFrom(
|
||||||
function: IrFunction, includeDispatcherReceiver: Boolean, substitutionMap: Map<IrTypeParameterSymbol, IrType>
|
sourceFunction: IrFunction,
|
||||||
|
includeDispatcherReceiver: Boolean,
|
||||||
|
substitutionMap: Map<IrTypeParameterSymbol, IrType>,
|
||||||
|
targetFunction: IrFunction,
|
||||||
): List<RemappedParameter> {
|
): List<RemappedParameter> {
|
||||||
val newFlattenedParameters = mutableListOf<RemappedParameter>()
|
val newFlattenedParameters = mutableListOf<RemappedParameter>()
|
||||||
if (function.dispatchReceiverParameter != null && includeDispatcherReceiver) {
|
if (sourceFunction.dispatchReceiverParameter != null && includeDispatcherReceiver) {
|
||||||
val template = ValueParameterTemplate(
|
newFlattenedParameters.add(
|
||||||
name = "\$dispatchReceiver",
|
sourceFunction.parentAsClass.thisReceiver!!.grouped(
|
||||||
type = function.parentAsClass.defaultType,
|
"\$dispatchReceiver",
|
||||||
origin = IrDeclarationOrigin.MOVED_DISPATCH_RECEIVER,
|
substitutionMap,
|
||||||
defaultValue = null,
|
targetFunction,
|
||||||
original = function.parentAsClass.thisReceiver!!,
|
IrDeclarationOrigin.MOVED_DISPATCH_RECEIVER,
|
||||||
|
)
|
||||||
)
|
)
|
||||||
newFlattenedParameters.addAll(listOf(template).grouped(substitutionMap))
|
|
||||||
}
|
}
|
||||||
val contextReceivers = function.valueParameters.take(function.contextReceiverParametersCount)
|
val contextReceivers = sourceFunction.valueParameters.take(sourceFunction.contextReceiverParametersCount)
|
||||||
.mapIndexed { index: Int, valueParameter: IrValueParameter ->
|
.mapIndexed { index: Int, valueParameter: IrValueParameter ->
|
||||||
ValueParameterTemplate(
|
valueParameter.grouped(
|
||||||
name = "contextReceiver$index",
|
"contextReceiver$index",
|
||||||
origin = IrDeclarationOrigin.MOVED_CONTEXT_RECEIVER,
|
substitutionMap,
|
||||||
type = valueParameter.type,
|
targetFunction,
|
||||||
defaultValue = valueParameter.defaultValue,
|
IrDeclarationOrigin.MOVED_CONTEXT_RECEIVER,
|
||||||
original = valueParameter,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
.grouped(substitutionMap)
|
|
||||||
newFlattenedParameters.addAll(contextReceivers)
|
newFlattenedParameters.addAll(contextReceivers)
|
||||||
function.extensionReceiverParameter?.let {
|
sourceFunction.extensionReceiverParameter?.let {
|
||||||
val template = ValueParameterTemplate(
|
val newParameters = it.grouped(
|
||||||
name = Name.identifier(function.extensionReceiverName(context.state)).asString(),
|
sourceFunction.extensionReceiverName(context.state),
|
||||||
origin = IrDeclarationOrigin.MOVED_EXTENSION_RECEIVER,
|
substitutionMap,
|
||||||
type = it.type,
|
targetFunction,
|
||||||
defaultValue = it.defaultValue,
|
IrDeclarationOrigin.MOVED_EXTENSION_RECEIVER,
|
||||||
original = it,
|
|
||||||
)
|
)
|
||||||
newFlattenedParameters.addAll(listOf(template).grouped(substitutionMap))
|
newFlattenedParameters.add(newParameters)
|
||||||
}
|
}
|
||||||
newFlattenedParameters += function.valueParameters.drop(function.contextReceiverParametersCount).map {
|
newFlattenedParameters += sourceFunction.valueParameters.drop(sourceFunction.contextReceiverParametersCount)
|
||||||
ValueParameterTemplate(it, origin = null)
|
.grouped(name = null, substitutionMap, targetFunction, IrDeclarationOrigin.GENERATED_MULTI_FIELD_VALUE_CLASS_PARAMETER)
|
||||||
}.grouped(substitutionMap)
|
|
||||||
return newFlattenedParameters
|
return newFlattenedParameters
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed class RemappedParameter {
|
sealed class RemappedParameter {
|
||||||
data class RegularMapping(val valueParameter: ValueParameterTemplate) : RemappedParameter() {
|
|
||||||
override val valueParameters: List<ValueParameterTemplate> = listOf(valueParameter)
|
abstract val valueParameters: List<IrValueParameter>
|
||||||
|
|
||||||
|
data class RegularMapping(val valueParameter: IrValueParameter) : RemappedParameter() {
|
||||||
|
override val valueParameters: List<IrValueParameter> = listOf(valueParameter)
|
||||||
}
|
}
|
||||||
|
|
||||||
data class MultiFieldValueClassMapping(
|
data class MultiFieldValueClassMapping(
|
||||||
val declarations: MultiFieldValueClassSpecificDeclarations,
|
val rootMfvcNode: RootMfvcNode,
|
||||||
val boxedType: IrSimpleType,
|
val typeArguments: TypeArguments,
|
||||||
override val valueParameters: List<ValueParameterTemplate>,
|
override val valueParameters: List<IrValueParameter>,
|
||||||
) : RemappedParameter() {
|
) : RemappedParameter() {
|
||||||
init {
|
init {
|
||||||
require(valueParameters.size > 1) { "MFVC must have > 1 fields" }
|
require(valueParameters.size > 1) { "MFVC must have > 1 fields" }
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
abstract val valueParameters: List<ValueParameterTemplate>
|
constructor(rootMfvcNode: RootMfvcNode, type: IrSimpleType, valueParameters: List<IrValueParameter>) :
|
||||||
|
this(rootMfvcNode, makeTypeArgumentsFromType(type), valueParameters)
|
||||||
|
|
||||||
|
val boxedType: IrSimpleType = rootMfvcNode.type.substitute(typeArguments) as IrSimpleType
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val bindingOldFunctionToParameterTemplateStructure: MutableMap<IrFunction, List<RemappedParameter>> = ConcurrentHashMap()
|
val bindingOldFunctionToParameterTemplateStructure: MutableMap<IrFunction, List<RemappedParameter>> = ConcurrentHashMap()
|
||||||
@@ -192,7 +172,7 @@ class MemoizedMultiFieldValueClassReplacements(
|
|||||||
return super.put(key, value)
|
return super.put(key, value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// todo inline classes pass type arguments correctly
|
|
||||||
override fun createStaticReplacement(function: IrFunction): IrSimpleFunction =
|
override fun createStaticReplacement(function: IrFunction): IrSimpleFunction =
|
||||||
buildReplacement(function, JvmLoweredDeclarationOrigin.STATIC_MULTI_FIELD_VALUE_CLASS_REPLACEMENT, noFakeOverride = true) {
|
buildReplacement(function, JvmLoweredDeclarationOrigin.STATIC_MULTI_FIELD_VALUE_CLASS_REPLACEMENT, noFakeOverride = true) {
|
||||||
originalFunctionForStaticReplacement[this] = function
|
originalFunctionForStaticReplacement[this] = function
|
||||||
@@ -200,8 +180,8 @@ class MemoizedMultiFieldValueClassReplacements(
|
|||||||
copyTypeParametersFrom(function.parentAsClass)
|
copyTypeParametersFrom(function.parentAsClass)
|
||||||
val substitutionMap = function.parentAsClass.typeParameters.map { it.symbol }.zip(typeParameters.map { it.defaultType }).toMap()
|
val substitutionMap = function.parentAsClass.typeParameters.map { it.symbol }.zip(typeParameters.map { it.defaultType }).toMap()
|
||||||
copyTypeParametersFrom(function, parameterMap = (function.parentAsClass.typeParameters zip typeParameters).toMap())
|
copyTypeParametersFrom(function, parameterMap = (function.parentAsClass.typeParameters zip typeParameters).toMap())
|
||||||
val newFlattenedParameters = makeGroupedValueParametersFrom(function, includeDispatcherReceiver = true, substitutionMap)
|
val newFlattenedParameters =
|
||||||
valueParameters = makeValueParametersFromTemplate(newFlattenedParameters)
|
makeAndAddGroupedValueParametersFrom(function, includeDispatcherReceiver = true, substitutionMap, this)
|
||||||
bindingOldFunctionToParameterTemplateStructure[function] = newFlattenedParameters
|
bindingOldFunctionToParameterTemplateStructure[function] = newFlattenedParameters
|
||||||
bindingNewFunctionToParameterTemplateStructure[this] = newFlattenedParameters
|
bindingNewFunctionToParameterTemplateStructure[this] = newFlattenedParameters
|
||||||
}
|
}
|
||||||
@@ -209,49 +189,32 @@ class MemoizedMultiFieldValueClassReplacements(
|
|||||||
override fun createMethodReplacement(function: IrFunction): IrSimpleFunction = buildReplacement(function, function.origin) {
|
override fun createMethodReplacement(function: IrFunction): IrSimpleFunction = buildReplacement(function, function.origin) {
|
||||||
originalFunctionForMethodReplacement[this] = function
|
originalFunctionForMethodReplacement[this] = function
|
||||||
dispatchReceiverParameter = function.dispatchReceiverParameter?.copyTo(this, index = -1)
|
dispatchReceiverParameter = function.dispatchReceiverParameter?.copyTo(this, index = -1)
|
||||||
val newFlattenedParameters = makeGroupedValueParametersFrom(function, includeDispatcherReceiver = false, mapOf())
|
val newFlattenedParameters = makeAndAddGroupedValueParametersFrom(function, includeDispatcherReceiver = false, mapOf(), this)
|
||||||
val receiver = dispatchReceiverParameter
|
val receiver = dispatchReceiverParameter
|
||||||
val receiverTemplate = if (receiver != null) ValueParameterTemplate(receiver, origin = receiver.origin) else null
|
|
||||||
val remappedParameters =
|
val remappedParameters =
|
||||||
if (receiverTemplate != null) listOf(RemappedParameter.RegularMapping(receiverTemplate)) + newFlattenedParameters else newFlattenedParameters
|
if (receiver != null) listOf(RemappedParameter.RegularMapping(receiver)) + newFlattenedParameters else newFlattenedParameters
|
||||||
valueParameters = makeValueParametersFromTemplate(newFlattenedParameters)
|
|
||||||
bindingOldFunctionToParameterTemplateStructure[function] = remappedParameters
|
bindingOldFunctionToParameterTemplateStructure[function] = remappedParameters
|
||||||
bindingNewFunctionToParameterTemplateStructure[this] = remappedParameters
|
bindingNewFunctionToParameterTemplateStructure[this] = remappedParameters
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createConstructorReplacement(@Suppress("UNUSED_PARAMETER") constructor: IrConstructor): IrConstructor {
|
private fun createConstructorReplacement(constructor: IrConstructor): IrConstructor {
|
||||||
val newFlattenedParameters = makeGroupedValueParametersFrom(constructor, includeDispatcherReceiver = false, mapOf())
|
|
||||||
bindingOldFunctionToParameterTemplateStructure[constructor] = newFlattenedParameters
|
|
||||||
val newConstructor = irFactory.buildConstructor {
|
val newConstructor = irFactory.buildConstructor {
|
||||||
updateFrom(constructor)
|
updateFrom(constructor)
|
||||||
returnType = constructor.returnType
|
returnType = constructor.returnType
|
||||||
}.apply {
|
}.apply {
|
||||||
|
val newFlattenedParameters = makeAndAddGroupedValueParametersFrom(constructor, includeDispatcherReceiver = false, mapOf(), this)
|
||||||
|
bindingOldFunctionToParameterTemplateStructure[constructor] = newFlattenedParameters
|
||||||
parent = constructor.parent
|
parent = constructor.parent
|
||||||
copyTypeParametersFrom(constructor)
|
copyTypeParametersFrom(constructor)
|
||||||
valueParameters = makeValueParametersFromTemplate(newFlattenedParameters)
|
|
||||||
annotations = constructor.annotations
|
annotations = constructor.annotations
|
||||||
originalConstructorForConstructorReplacement[this] = constructor
|
originalConstructorForConstructorReplacement[this] = constructor
|
||||||
|
bindingNewFunctionToParameterTemplateStructure[this] = newFlattenedParameters
|
||||||
}
|
}
|
||||||
bindingNewFunctionToParameterTemplateStructure[newConstructor] = newFlattenedParameters
|
|
||||||
return newConstructor
|
return newConstructor
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createGetterReplacement(function: IrFunction): IrSimpleFunction {
|
|
||||||
val declarations = getDeclarations(function.parentAsClass)!!
|
|
||||||
val name = (function as IrSimpleFunction).correspondingPropertySymbol!!.owner.name
|
|
||||||
val node = declarations.loweringRepresentation[name]!!.node
|
|
||||||
val newGetter = declarations.properties[node]!!.getter!!
|
|
||||||
originalFunctionForMethodReplacement[newGetter] = function
|
|
||||||
val receiver = function.dispatchReceiverParameter!!
|
|
||||||
val receiverTemplate = ValueParameterTemplate(receiver, origin = receiver.origin)
|
|
||||||
val parameterRemapping = listOf(RemappedParameter.RegularMapping(receiverTemplate))
|
|
||||||
bindingOldFunctionToParameterTemplateStructure[function] = parameterRemapping
|
|
||||||
bindingNewFunctionToParameterTemplateStructure[newGetter] = parameterRemapping
|
|
||||||
return newGetter
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a replacement for a function or a constructor.
|
* Get a function replacement for a function or a constructor.
|
||||||
*/
|
*/
|
||||||
override val getReplacementFunction: (IrFunction) -> IrSimpleFunction? =
|
override val getReplacementFunction: (IrFunction) -> IrSimpleFunction? =
|
||||||
storageManager.createMemoizedFunctionWithNullableValues { function ->
|
storageManager.createMemoizedFunctionWithNullableValues { function ->
|
||||||
@@ -262,33 +225,38 @@ class MemoizedMultiFieldValueClassReplacements(
|
|||||||
function.origin == IrDeclarationOrigin.GENERATED_MULTI_FIELD_VALUE_CLASS_MEMBER && function.isAccessor ||
|
function.origin == IrDeclarationOrigin.GENERATED_MULTI_FIELD_VALUE_CLASS_MEMBER && function.isAccessor ||
|
||||||
function.origin == JvmLoweredDeclarationOrigin.MULTI_FIELD_VALUE_CLASS_GENERATED_IMPL_METHOD ||
|
function.origin == JvmLoweredDeclarationOrigin.MULTI_FIELD_VALUE_CLASS_GENERATED_IMPL_METHOD ||
|
||||||
function.origin.isSynthetic && function.origin != IrDeclarationOrigin.SYNTHETIC_GENERATED_SAM_IMPLEMENTATION -> null
|
function.origin.isSynthetic && function.origin != IrDeclarationOrigin.SYNTHETIC_GENERATED_SAM_IMPLEMENTATION -> null
|
||||||
function.isMultiFieldValueClassOriginalFieldGetter -> createGetterReplacement(function)
|
|
||||||
function.parent.safeAs<IrClass>()?.isMultiFieldValueClass == true -> when {
|
function.parent.safeAs<IrClass>()?.isMultiFieldValueClass == true -> when {
|
||||||
function.isRemoveAtSpecialBuiltinStub() ->
|
function.isRemoveAtSpecialBuiltinStub() ->
|
||||||
null
|
null
|
||||||
|
|
||||||
function.isValueClassMemberFakeOverriddenFromJvmDefaultInterfaceMethod() ||
|
function.isValueClassMemberFakeOverriddenFromJvmDefaultInterfaceMethod() ||
|
||||||
function.origin == IrDeclarationOrigin.IR_BUILTINS_STUB ->
|
function.origin == IrDeclarationOrigin.IR_BUILTINS_STUB ->
|
||||||
createMethodReplacement(function)
|
createMethodReplacement(function)
|
||||||
|
|
||||||
else ->
|
else ->
|
||||||
createStaticReplacement(function)
|
createStaticReplacement(function)
|
||||||
}
|
}
|
||||||
|
|
||||||
function is IrSimpleFunction && !function.isFromJava() &&
|
function is IrSimpleFunction && !function.isFromJava() &&
|
||||||
function.fullValueParameterList.any { it.type.isMultiFieldValueClassType() && !it.type.isNullable() } &&
|
function.fullValueParameterList.any { it.type.needsMfvcFlattening() } &&
|
||||||
(!function.isFakeOverride ||
|
(!function.isFakeOverride ||
|
||||||
findSuperDeclaration(function, false, context.state.jvmDefaultMode)
|
findSuperDeclaration(function, false, context.state.jvmDefaultMode)
|
||||||
in bindingOldFunctionToParameterTemplateStructure) ->
|
in bindingOldFunctionToParameterTemplateStructure) ->
|
||||||
createMethodReplacement(function)
|
createMethodReplacement(function)
|
||||||
|
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override val getReplacementRegularClassConstructor: (IrConstructor) -> IrConstructor? =
|
override val getReplacementForRegularClassConstructor: (IrConstructor) -> IrConstructor? =
|
||||||
storageManager.createMemoizedFunctionWithNullableValues { constructor ->
|
storageManager.createMemoizedFunctionWithNullableValues { constructor ->
|
||||||
when {
|
when {
|
||||||
constructor.constructedClass.isMultiFieldValueClass -> null
|
constructor.constructedClass.isMultiFieldValueClass -> null
|
||||||
constructor.isFromJava() -> null
|
constructor.isFromJava() -> null
|
||||||
constructor.fullValueParameterList.any { !it.type.isNullable() && it.type.isMultiFieldValueClassType() } ->
|
constructor.fullValueParameterList.any { it.type.needsMfvcFlattening() } ->
|
||||||
createConstructorReplacement(constructor)
|
createConstructorReplacement(constructor)
|
||||||
|
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -300,5 +268,34 @@ class MemoizedMultiFieldValueClassReplacements(
|
|||||||
computeOverrideReplacement(it.owner).symbol
|
computeOverrideReplacement(it.owner).symbol
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
val getRootMfvcNode: (IrClass) -> RootMfvcNode? = storageManager.createMemoizedFunctionWithNullableValues {
|
||||||
|
if (it.defaultType.needsMfvcFlattening()) getRootNode(context, it) else null
|
||||||
|
}
|
||||||
|
|
||||||
|
val getRegularClassMfvcPropertyNode: (IrProperty) -> IntermediateMfvcNode? =
|
||||||
|
storageManager.createMemoizedFunctionWithNullableValues { property: IrProperty ->
|
||||||
|
val parent = property.parent
|
||||||
|
when {
|
||||||
|
parent !is IrClass -> null
|
||||||
|
property.isFakeOverride -> null
|
||||||
|
useRootNode(parent, property) -> null
|
||||||
|
property.run { backingField?.type ?: getter?.returnType }?.needsMfvcFlattening() != true -> null
|
||||||
|
else -> createIntermediateNodeForMfvcPropertyOfRegularClass(parent, context, property)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getMfvcPropertyNode(property: IrProperty): NameableMfvcNode? {
|
||||||
|
val parent = property.parent
|
||||||
|
return when {
|
||||||
|
parent !is IrClass -> null
|
||||||
|
useRootNode(parent, property) -> getRootMfvcNode(parent)!![property.name]
|
||||||
|
else -> getRegularClassMfvcPropertyNode(property)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun useRootNode(
|
||||||
|
parent: IrClass,
|
||||||
|
property: IrProperty
|
||||||
|
) = parent.isMultiFieldValueClass && (property.getter?.isStatic ?: property.backingField?.isStatic) == false
|
||||||
|
}
|
||||||
|
|||||||
+1
-1
@@ -108,7 +108,7 @@ abstract class MemoizedValueClassAbstractReplacements(protected val irFactory: I
|
|||||||
|
|
||||||
abstract val replaceOverriddenSymbols: (IrSimpleFunction) -> List<IrSimpleFunctionSymbol>
|
abstract val replaceOverriddenSymbols: (IrSimpleFunction) -> List<IrSimpleFunctionSymbol>
|
||||||
|
|
||||||
abstract val getReplacementRegularClassConstructor: (IrConstructor) -> IrConstructor?
|
abstract val getReplacementForRegularClassConstructor: (IrConstructor) -> IrConstructor?
|
||||||
|
|
||||||
protected fun computeOverrideReplacement(function: IrSimpleFunction): IrSimpleFunction =
|
protected fun computeOverrideReplacement(function: IrSimpleFunction): IrSimpleFunction =
|
||||||
getReplacementFunction(function) ?: function.also {
|
getReplacementFunction(function) ?: function.also {
|
||||||
|
|||||||
@@ -0,0 +1,474 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.backend.jvm
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.ir.isMultiFieldValueClassType
|
||||||
|
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
||||||
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
|
import org.jetbrains.kotlin.ir.builders.IrBlockBuilder
|
||||||
|
import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope
|
||||||
|
import org.jetbrains.kotlin.ir.builders.irCall
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrGetField
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrReturn
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
|
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
typealias TypeArguments = Map<IrTypeParameterSymbol, IrType>
|
||||||
|
|
||||||
|
sealed interface MfvcNode {
|
||||||
|
val type: IrType
|
||||||
|
val leavesCount: Int
|
||||||
|
|
||||||
|
fun createInstanceFromBox(
|
||||||
|
scope: IrBlockBuilder,
|
||||||
|
typeArguments: TypeArguments,
|
||||||
|
receiver: IrExpression?,
|
||||||
|
isPrivateAccess: Boolean,
|
||||||
|
saveVariable: (IrVariable) -> Unit,
|
||||||
|
): ReceiverBasedMfvcNodeInstance
|
||||||
|
}
|
||||||
|
|
||||||
|
fun MfvcNode.createInstanceFromBox(
|
||||||
|
scope: IrBlockBuilder,
|
||||||
|
receiver: IrExpression,
|
||||||
|
isPrivateAccess: Boolean,
|
||||||
|
saveVariable: (IrVariable) -> Unit
|
||||||
|
) =
|
||||||
|
createInstanceFromBox(scope, makeTypeArgumentsFromType(receiver.type as IrSimpleType), receiver, isPrivateAccess, saveVariable)
|
||||||
|
|
||||||
|
fun MfvcNode.createInstanceFromValueDeclarationsAndBoxType(
|
||||||
|
scope: IrBuilderWithScope, type: IrSimpleType, name: Name, saveVariable: (IrVariable) -> Unit,
|
||||||
|
): ValueDeclarationMfvcNodeInstance = createInstanceFromValueDeclarations(scope, makeTypeArgumentsFromType(type), name, saveVariable)
|
||||||
|
|
||||||
|
fun MfvcNode.createInstanceFromValueDeclarations(
|
||||||
|
scope: IrBuilderWithScope, typeArguments: TypeArguments, name: Name, saveVariable: (IrVariable) -> Unit,
|
||||||
|
): ValueDeclarationMfvcNodeInstance {
|
||||||
|
val valueDeclarations = mapLeaves {
|
||||||
|
scope.savableStandaloneVariable(
|
||||||
|
type = it.type,
|
||||||
|
name = listOf(name, it.fullFieldName).joinToString("-"),
|
||||||
|
origin = IrDeclarationOrigin.MULTI_FIELD_VALUE_CLASS_REPRESENTATION_VARIABLE,
|
||||||
|
saveVariable = saveVariable
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return ValueDeclarationMfvcNodeInstance(scope, this, typeArguments, valueDeclarations, listOf())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun MfvcNode.createInstanceFromValueDeclarationsAndBoxType(
|
||||||
|
scope: IrBuilderWithScope, type: IrSimpleType, fieldValues: List<IrValueDeclaration>, initializationStatements: List<IrStatement>
|
||||||
|
): ValueDeclarationMfvcNodeInstance =
|
||||||
|
ValueDeclarationMfvcNodeInstance(scope, this, makeTypeArgumentsFromType(type), fieldValues, initializationStatements)
|
||||||
|
|
||||||
|
fun makeTypeArgumentsFromType(type: IrSimpleType): TypeArguments {
|
||||||
|
if (type.classifierOrNull !is IrClassSymbol) return mapOf()
|
||||||
|
val parameters = type.erasedUpperBound.typeParameters
|
||||||
|
val arguments = type.arguments
|
||||||
|
require(parameters.size == arguments.size) {
|
||||||
|
"Number of type parameters (${parameters.joinToString { it.render() }}) is not equal to number of type arguments (${arguments.joinToString { it.render() }})."
|
||||||
|
}
|
||||||
|
return parameters.zip(arguments) { parameter, argument -> parameter.symbol to (argument.typeOrNull ?: parameter.defaultType) }.toMap()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun <Scope, IrElement, Instance> MfvcNode.createInstanceFromBoxTypeImpl(
|
||||||
|
scope: Scope,
|
||||||
|
boxType: IrSimpleType,
|
||||||
|
fieldValues: List<IrElement>,
|
||||||
|
gen: (Scope, MfvcNode, TypeArguments, List<IrElement>) -> Instance
|
||||||
|
): Instance {
|
||||||
|
val typeArguments = makeTypeArgumentsFromType(boxType)
|
||||||
|
return gen(scope, this, typeArguments, fieldValues)
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed interface NameableMfvcNode : MfvcNode {
|
||||||
|
val namedNodeImpl: NameableMfvcNodeImpl
|
||||||
|
}
|
||||||
|
|
||||||
|
val NameableMfvcNode.nameParts: List<IndexedNamePart>
|
||||||
|
get() = namedNodeImpl.nameParts
|
||||||
|
val NameableMfvcNode.name: Name
|
||||||
|
get() = nameParts.last().name
|
||||||
|
val NameableMfvcNode.index: Int
|
||||||
|
get() = nameParts.last().index
|
||||||
|
val NameableMfvcNode.unboxMethod: IrSimpleFunction
|
||||||
|
get() = namedNodeImpl.unboxMethod
|
||||||
|
val NameableMfvcNode.fullMethodName: Name
|
||||||
|
get() = namedNodeImpl.fullMethodName
|
||||||
|
val NameableMfvcNode.fullFieldName: Name
|
||||||
|
get() = namedNodeImpl.fullFieldName
|
||||||
|
val NameableMfvcNode.hasPureUnboxMethod: Boolean
|
||||||
|
get() = namedNodeImpl.hasPureUnboxMethod
|
||||||
|
|
||||||
|
|
||||||
|
data class IndexedNamePart(val index: Int, val name: Name)
|
||||||
|
|
||||||
|
class NameableMfvcNodeImpl(
|
||||||
|
rootPropertyName: String?,
|
||||||
|
val nameParts: List<IndexedNamePart>,
|
||||||
|
val unboxMethod: IrSimpleFunction,
|
||||||
|
val hasPureUnboxMethod: Boolean,
|
||||||
|
) {
|
||||||
|
val fullMethodName = makeFullMethodName(rootPropertyName, nameParts)
|
||||||
|
val fullFieldName = makeFullFieldName(rootPropertyName, nameParts)
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@JvmStatic
|
||||||
|
fun makeFullMethodName(rootPropertyName: String?, nameParts: List<IndexedNamePart>): Name = if (rootPropertyName == null) {
|
||||||
|
val restJoined = nameParts.joinToString("-") { it.index.toString() }
|
||||||
|
Name.identifier("${KotlinTypeMapper.UNBOX_JVM_METHOD_NAME}-$restJoined")
|
||||||
|
} else {
|
||||||
|
val wholeName = (listOf(JvmAbi.getterName(rootPropertyName)) + nameParts.map { it.index.toString() }).joinToString("-")
|
||||||
|
Name.identifier(wholeName)
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun makeFullFieldName(rootPropertyName: String?, nameParts: List<IndexedNamePart>): Name {
|
||||||
|
val joined = (listOf(rootPropertyName ?: "field") + nameParts.map { it.index.toString() }).joinToString("-")
|
||||||
|
return Name.identifier(joined)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun MfvcNode.getSubnodeAndIndices(name: Name): Pair<NameableMfvcNode, IntRange>? {
|
||||||
|
val node = (this as? MfvcNodeWithSubnodes)?.get(name) ?: return null
|
||||||
|
val indices = subnodeIndices[node] ?: error("existing node without indices")
|
||||||
|
return node to indices
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed interface MfvcNodeWithSubnodes : MfvcNode {
|
||||||
|
abstract override val type: IrSimpleType
|
||||||
|
val boxMethod: IrSimpleFunction
|
||||||
|
val leavesUnboxMethods: List<IrSimpleFunction>?
|
||||||
|
val subnodesImpl: MfvcNodeWithSubnodesImpl
|
||||||
|
}
|
||||||
|
|
||||||
|
fun MfvcNodeWithSubnodes.makeBoxedExpression(
|
||||||
|
scope: IrBuilderWithScope, typeArguments: TypeArguments, valueArguments: List<IrExpression>
|
||||||
|
): IrExpression = scope.irCall(boxMethod).apply {
|
||||||
|
val resultType = type.substitute(typeArguments) as IrSimpleType
|
||||||
|
require(resultType.erasedUpperBound == type.erasedUpperBound) { "Substitution of $type led to $resultType" }
|
||||||
|
for ((index, typeArgument) in resultType.arguments.withIndex()) {
|
||||||
|
putTypeArgument(index, typeArgument.typeOrNull ?: resultType.erasedUpperBound.typeParameters[index].defaultType)
|
||||||
|
}
|
||||||
|
for ((index, valueArgument) in valueArguments.withIndex()) {
|
||||||
|
putValueArgument(index, valueArgument)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
operator fun MfvcNodeWithSubnodes.get(names: List<Name>): MfvcNode? {
|
||||||
|
var cur: MfvcNode = this
|
||||||
|
for (name in names) {
|
||||||
|
cur = (cur as? MfvcNodeWithSubnodes)?.get(name) ?: return null
|
||||||
|
}
|
||||||
|
return cur
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun List<Any>.allEqual() = all { it == first() }
|
||||||
|
|
||||||
|
class MfvcNodeWithSubnodesImpl(val subnodes: List<NameableMfvcNode>, unboxMethod: IrSimpleFunction?) {
|
||||||
|
init {
|
||||||
|
require(subnodes.isNotEmpty())
|
||||||
|
require(subnodes.map { it.nameParts.dropLast(1) }.allEqual())
|
||||||
|
require(subnodes.map { it.index } == subnodes.indices.toList())
|
||||||
|
}
|
||||||
|
|
||||||
|
private val mapping = subnodes.associateBy { it.name }.also { mapping ->
|
||||||
|
require(mapping.size == subnodes.size) {
|
||||||
|
subnodes
|
||||||
|
.groupBy { it.name }
|
||||||
|
.filterValues { it.size > 1 }
|
||||||
|
.entries.joinToString(prefix = "Repeating node names found: ") { (name, nodes) -> "${nodes.size} nodes with name '$name'" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
operator fun get(name: Name): NameableMfvcNode? = mapping[name]
|
||||||
|
val leaves: List<LeafMfvcNode> = mapLeaves { it }
|
||||||
|
val fields: List<IrField>? = mapLeaves { it.field }.run {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
when {
|
||||||
|
all { it == null } -> null
|
||||||
|
all { it != null } -> this as List<IrField>
|
||||||
|
else -> error("IrFields can either exist all or none for MFVC property")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val allInnerUnboxMethods: List<IrSimpleFunction> = subnodes.flatMap { subnode ->
|
||||||
|
when (subnode) {
|
||||||
|
is MfvcNodeWithSubnodes -> subnode.allUnboxMethods
|
||||||
|
is LeafMfvcNode -> listOf(subnode.unboxMethod)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val allUnboxMethods = allInnerUnboxMethods + listOfNotNull(unboxMethod)
|
||||||
|
|
||||||
|
val indices: IntRange = leaves.indices
|
||||||
|
|
||||||
|
val subnodeIndices: Map<NameableMfvcNode, IntRange> = buildMap {
|
||||||
|
var offset = 0
|
||||||
|
for (node in subnodes) {
|
||||||
|
when (node) {
|
||||||
|
is IntermediateMfvcNode -> {
|
||||||
|
val nodeSize = node.leavesCount
|
||||||
|
put(node, offset until offset + nodeSize)
|
||||||
|
putAll(node.subnodeIndices.mapValues { (_, v) -> (v.first + offset)..(v.last + offset) })
|
||||||
|
offset += nodeSize
|
||||||
|
}
|
||||||
|
|
||||||
|
is LeafMfvcNode -> {
|
||||||
|
put(node, offset..offset)
|
||||||
|
offset++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val MfvcNodeWithSubnodes.subnodes: List<NameableMfvcNode>
|
||||||
|
get() = subnodesImpl.subnodes
|
||||||
|
|
||||||
|
operator fun MfvcNodeWithSubnodes.get(name: Name): NameableMfvcNode? = subnodesImpl[name]
|
||||||
|
val MfvcNodeWithSubnodes.leaves: List<LeafMfvcNode>
|
||||||
|
get() = subnodesImpl.leaves
|
||||||
|
val MfvcNodeWithSubnodes.fields: List<IrField>?
|
||||||
|
get() = subnodesImpl.fields
|
||||||
|
val RootMfvcNode.fields: List<IrField>
|
||||||
|
get() = subnodesImpl.fields!!
|
||||||
|
val MfvcNodeWithSubnodes.indices: IntRange
|
||||||
|
get() = subnodesImpl.indices
|
||||||
|
val MfvcNodeWithSubnodes.subnodeIndices: Map<NameableMfvcNode, IntRange>
|
||||||
|
get() = subnodesImpl.subnodeIndices
|
||||||
|
val MfvcNodeWithSubnodes.allUnboxMethods: List<IrSimpleFunction>
|
||||||
|
get() = subnodesImpl.allUnboxMethods
|
||||||
|
val MfvcNodeWithSubnodes.allInnerUnboxMethods: List<IrSimpleFunction>
|
||||||
|
get() = subnodesImpl.allInnerUnboxMethods
|
||||||
|
|
||||||
|
inline fun <R> MfvcNode.mapLeaves(crossinline f: (LeafMfvcNode) -> R): List<R> = flatMapLeaves { listOf(f(it)) }
|
||||||
|
|
||||||
|
fun <R> MfvcNode.flatMapLeaves(f: (LeafMfvcNode) -> List<R>): List<R> = when (this) {
|
||||||
|
is MfvcNodeWithSubnodes -> subnodes.flatMap { it.flatMapLeaves(f) }
|
||||||
|
is LeafMfvcNode -> f(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <R> MfvcNodeWithSubnodesImpl.mapLeaves(crossinline f: (LeafMfvcNode) -> R): List<R> = subnodes.flatMap { it.mapLeaves(f) }
|
||||||
|
|
||||||
|
|
||||||
|
private fun requireSameClasses(vararg classes: IrClass?) {
|
||||||
|
val notNulls = classes.filterNotNull()
|
||||||
|
require(notNulls.zipWithNext { a, b -> a == b }.all { it }) {
|
||||||
|
"Found different classes: ${notNulls.joinToString("\n") { it.render() }}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun requireSameTypes(vararg types: List<IrType>) {
|
||||||
|
require(types.asList().zipWithNext { a, b -> a == b }.all { it }) {
|
||||||
|
"Found different types: ${types.joinToString("\n") { list -> list.map { it.render() }.toString() }}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun requireSameSizes(vararg sizes: Int) {
|
||||||
|
require(sizes.asList().zipWithNext { a, b -> a == b }.all { it }) {
|
||||||
|
"Found different sizes: ${sizes.joinToString()}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun validateGettingAccessorParameters(function: IrSimpleFunction) {
|
||||||
|
require(function.valueParameters.isEmpty()) { "Value parameters are not expected for ${function.render()}" }
|
||||||
|
require(function.extensionReceiverParameter == null) { "Extension receiver is not expected for ${function.render()}" }
|
||||||
|
require(function.contextReceiverParametersCount == 0) { "Context receivers is not expected for ${function.render()}" }
|
||||||
|
require(function.typeParameters.isEmpty()) { "Type parameters are not expected for ${function.render()}" }
|
||||||
|
}
|
||||||
|
|
||||||
|
class LeafMfvcNode(
|
||||||
|
override val type: IrType,
|
||||||
|
rootPropertyName: String?,
|
||||||
|
nameParts: List<IndexedNamePart>,
|
||||||
|
val field: IrField?,
|
||||||
|
unboxMethod: IrSimpleFunction,
|
||||||
|
hasPureUnboxMethod: Boolean,
|
||||||
|
) : NameableMfvcNode {
|
||||||
|
override val namedNodeImpl: NameableMfvcNodeImpl = NameableMfvcNodeImpl(rootPropertyName, nameParts, unboxMethod, hasPureUnboxMethod)
|
||||||
|
|
||||||
|
override val leavesCount: Int
|
||||||
|
get() = 1
|
||||||
|
|
||||||
|
init {
|
||||||
|
requireSameClasses(
|
||||||
|
field?.parentAsClass?.takeUnless { unboxMethod.parentAsClass.isCompanion },
|
||||||
|
unboxMethod.parentAsClass,
|
||||||
|
(unboxMethod.dispatchReceiverParameter?.type as? IrSimpleType)?.erasedUpperBound,
|
||||||
|
)
|
||||||
|
validateGettingAccessorParameters(unboxMethod)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun createInstanceFromBox(
|
||||||
|
scope: IrBlockBuilder,
|
||||||
|
typeArguments: TypeArguments,
|
||||||
|
receiver: IrExpression?,
|
||||||
|
isPrivateAccess: Boolean,
|
||||||
|
saveVariable: (IrVariable) -> Unit,
|
||||||
|
) = ReceiverBasedMfvcNodeInstance(
|
||||||
|
scope, this, typeArguments, receiver, field?.let(::listOf), unboxMethod, isPrivateAccess, saveVariable
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun toString(): String = "$fullFieldName: ${type.render()}"
|
||||||
|
}
|
||||||
|
|
||||||
|
val MfvcNode.fields
|
||||||
|
get() = when (this) {
|
||||||
|
is MfvcNodeWithSubnodes -> this.fields
|
||||||
|
is LeafMfvcNode -> field?.let(::listOf)
|
||||||
|
}
|
||||||
|
|
||||||
|
class IntermediateMfvcNode(
|
||||||
|
override val type: IrSimpleType,
|
||||||
|
rootPropertyName: String?,
|
||||||
|
nameParts: List<IndexedNamePart>,
|
||||||
|
subnodes: List<NameableMfvcNode>,
|
||||||
|
unboxMethod: IrSimpleFunction,
|
||||||
|
hasPureUnboxMethod: Boolean,
|
||||||
|
val rootNode: RootMfvcNode, // root node corresponding type of the node
|
||||||
|
) : NameableMfvcNode, MfvcNodeWithSubnodes {
|
||||||
|
override val namedNodeImpl: NameableMfvcNodeImpl = NameableMfvcNodeImpl(rootPropertyName, nameParts, unboxMethod, hasPureUnboxMethod)
|
||||||
|
override val subnodesImpl: MfvcNodeWithSubnodesImpl = MfvcNodeWithSubnodesImpl(subnodes, unboxMethod)
|
||||||
|
override val leavesCount
|
||||||
|
get() = leaves.size
|
||||||
|
|
||||||
|
init {
|
||||||
|
require(type.needsMfvcFlattening()) { "MFVC type expected but got% ${type.render()}" }
|
||||||
|
require(type.erasedUpperBound == rootNode.mfvc) {
|
||||||
|
"Root node must point at the RootNode of class ${type.erasedUpperBound.render()} but points at ${rootNode.mfvc.render()}"
|
||||||
|
}
|
||||||
|
requireSameClasses(
|
||||||
|
unboxMethod.parentAsClass,
|
||||||
|
(unboxMethod.dispatchReceiverParameter?.type as IrSimpleType?)?.erasedUpperBound,
|
||||||
|
)
|
||||||
|
validateGettingAccessorParameters(unboxMethod)
|
||||||
|
}
|
||||||
|
|
||||||
|
override val boxMethod: IrSimpleFunction
|
||||||
|
get() = rootNode.boxMethod
|
||||||
|
|
||||||
|
override val leavesUnboxMethods: List<IrSimpleFunction> = collectLeavesUnboxMethods()
|
||||||
|
|
||||||
|
override fun createInstanceFromBox(
|
||||||
|
scope: IrBlockBuilder,
|
||||||
|
typeArguments: TypeArguments,
|
||||||
|
receiver: IrExpression?,
|
||||||
|
isPrivateAccess: Boolean,
|
||||||
|
saveVariable: (IrVariable) -> Unit,
|
||||||
|
) = ReceiverBasedMfvcNodeInstance(
|
||||||
|
scope, this, typeArguments, receiver, fields, unboxMethod, isPrivateAccess, saveVariable
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun toString(): String =
|
||||||
|
"$fullFieldName: ${type.render()}\n${subnodes.joinToString("\n").prependIndent(" ")}"
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun MfvcNodeWithSubnodes.collectLeavesUnboxMethods() = mapLeaves { it.unboxMethod }
|
||||||
|
|
||||||
|
fun IrSimpleFunction.isDefaultGetter(expectedField: IrField? = null): Boolean {
|
||||||
|
if (!isGetter) return false
|
||||||
|
if (expectedField != null && correspondingPropertySymbol?.owner?.backingField != expectedField) return false
|
||||||
|
val statement = (body?.statements?.singleOrNull() as? IrReturn)?.value as? IrGetField ?: return false
|
||||||
|
val actualField = statement.symbol.owner
|
||||||
|
return expectedField == null || actualField == expectedField || parentAsClass.isCompanion && actualField.correspondingPropertySymbol == correspondingPropertySymbol
|
||||||
|
}
|
||||||
|
|
||||||
|
fun IrSimpleFunction.getGetterField(): IrField? {
|
||||||
|
if (!isGetter) return null
|
||||||
|
val statement = (body?.statements?.singleOrNull() as? IrReturn)?.value as? IrGetField ?: return null
|
||||||
|
return statement.symbol.owner
|
||||||
|
}
|
||||||
|
|
||||||
|
class RootMfvcNode internal constructor(
|
||||||
|
val mfvc: IrClass,
|
||||||
|
subnodes: List<NameableMfvcNode>,
|
||||||
|
val oldPrimaryConstructor: IrConstructor,
|
||||||
|
val newPrimaryConstructor: IrConstructor,
|
||||||
|
val primaryConstructorImpl: IrSimpleFunction,
|
||||||
|
override val boxMethod: IrSimpleFunction,
|
||||||
|
val specializedEqualsMethod: IrSimpleFunction,
|
||||||
|
) : MfvcNodeWithSubnodes {
|
||||||
|
override val subnodesImpl: MfvcNodeWithSubnodesImpl = MfvcNodeWithSubnodesImpl(subnodes, null)
|
||||||
|
override val type: IrSimpleType = mfvc.defaultType
|
||||||
|
|
||||||
|
override val leavesCount: Int
|
||||||
|
get() = leaves.size
|
||||||
|
|
||||||
|
override val leavesUnboxMethods: List<IrSimpleFunction> = collectLeavesUnboxMethods()
|
||||||
|
|
||||||
|
init {
|
||||||
|
require(type.needsMfvcFlattening()) { "MFVC type expected but got% ${type.render()}" }
|
||||||
|
for (constructor in listOf(oldPrimaryConstructor, newPrimaryConstructor)) {
|
||||||
|
require(constructor.isPrimary) { "Expected a primary constructor but got:\n${constructor.dump()}" }
|
||||||
|
}
|
||||||
|
requireSameClasses(
|
||||||
|
mfvc,
|
||||||
|
oldPrimaryConstructor.parentAsClass,
|
||||||
|
newPrimaryConstructor.parentAsClass,
|
||||||
|
primaryConstructorImpl.parentAsClass,
|
||||||
|
boxMethod.parentAsClass,
|
||||||
|
specializedEqualsMethod.parentAsClass,
|
||||||
|
oldPrimaryConstructor.constructedClass,
|
||||||
|
newPrimaryConstructor.constructedClass,
|
||||||
|
boxMethod.returnType.erasedUpperBound,
|
||||||
|
)
|
||||||
|
require(primaryConstructorImpl.returnType.isUnit()) {
|
||||||
|
"Constructor-impl must return Unit but returns ${primaryConstructorImpl.returnType.render()}"
|
||||||
|
}
|
||||||
|
require(specializedEqualsMethod.returnType.isBoolean()) {
|
||||||
|
"Specialized equals method must return Boolean but returns ${primaryConstructorImpl.returnType.render()}"
|
||||||
|
}
|
||||||
|
require(oldPrimaryConstructor.typeParameters.isEmpty() && newPrimaryConstructor.typeParameters.isEmpty()) {
|
||||||
|
"Constructors do not support type parameters yet"
|
||||||
|
}
|
||||||
|
requireSameSizes(
|
||||||
|
mfvc.typeParameters.size,
|
||||||
|
boxMethod.typeParameters.size,
|
||||||
|
primaryConstructorImpl.typeParameters.size,
|
||||||
|
)
|
||||||
|
require(specializedEqualsMethod.typeParameters.size == 2 * mfvc.typeParameters.size) {
|
||||||
|
"Specialized equals method must contain twice more type parameters than corresponding MFVC ${mfvc.typeParameters.map { it.defaultType.render() }} but has ${specializedEqualsMethod.typeParameters.map { it.defaultType.render() }}"
|
||||||
|
}
|
||||||
|
requireSameSizes(oldPrimaryConstructor.valueParameters.size, subnodes.size)
|
||||||
|
requireSameSizes(
|
||||||
|
leavesCount,
|
||||||
|
newPrimaryConstructor.valueParameters.size,
|
||||||
|
primaryConstructorImpl.valueParameters.size,
|
||||||
|
boxMethod.valueParameters.size,
|
||||||
|
)
|
||||||
|
require(specializedEqualsMethod.valueParameters.size == 2 * leavesCount) {
|
||||||
|
"Specialized equals method must contain twice more value parameters than corresponding primary constructor of the MFVC ${mfvc.typeParameters.map { it.defaultType.render() }} but has ${specializedEqualsMethod.typeParameters.map { it.defaultType.render() }}"
|
||||||
|
}
|
||||||
|
for (function in listOf(oldPrimaryConstructor, newPrimaryConstructor, primaryConstructorImpl, boxMethod, specializedEqualsMethod)) {
|
||||||
|
require(function.extensionReceiverParameter == null) { "Extension receiver is not expected for ${function.render()}" }
|
||||||
|
require(function.contextReceiverParametersCount == 0) { "Context receivers are not expected for ${function.render()}" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun createInstanceFromBox(
|
||||||
|
scope: IrBlockBuilder,
|
||||||
|
typeArguments: TypeArguments,
|
||||||
|
receiver: IrExpression?,
|
||||||
|
isPrivateAccess: Boolean,
|
||||||
|
saveVariable: (IrVariable) -> Unit,
|
||||||
|
) = ReceiverBasedMfvcNodeInstance(scope, this, typeArguments, receiver, fields, null, isPrivateAccess, saveVariable)
|
||||||
|
|
||||||
|
override fun toString(): String =
|
||||||
|
"${type.render()}\n${subnodes.joinToString("\n").prependIndent(" ")}"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun IrType.needsMfvcFlattening(): Boolean = isMultiFieldValueClassType() && !isNullable() ||
|
||||||
|
classifierOrNull.let { classifier ->
|
||||||
|
classifier is IrTypeParameterSymbol && classifier.owner.superTypes.any { it.needsMfvcFlattening() }
|
||||||
|
} // add not is annotated as @UseBox etc
|
||||||
@@ -0,0 +1,486 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.backend.jvm
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
||||||
|
import org.jetbrains.kotlin.backend.common.lower.irBlockBody
|
||||||
|
import org.jetbrains.kotlin.backend.common.lower.parents
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.ir.createJvmIrBuilder
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound
|
||||||
|
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
||||||
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
|
import org.jetbrains.kotlin.descriptors.MultiFieldValueClassRepresentation
|
||||||
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.buildField
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.ir.deepCopyWithVariables
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
|
import org.jetbrains.kotlin.ir.types.IrSimpleType
|
||||||
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
|
import org.jetbrains.kotlin.ir.types.defaultType
|
||||||
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
|
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.resolve.InlineClassDescriptorResolver
|
||||||
|
|
||||||
|
fun createLeafMfvcNode(
|
||||||
|
parent: IrDeclarationContainer,
|
||||||
|
context: JvmBackendContext,
|
||||||
|
type: IrType,
|
||||||
|
rootPropertyName: String?,
|
||||||
|
nameParts: List<IndexedNamePart>,
|
||||||
|
fieldAnnotations: List<IrConstructorCall>,
|
||||||
|
static: Boolean,
|
||||||
|
overriddenNode: LeafMfvcNode?,
|
||||||
|
defaultMethodsImplementationSourceNode: Pair<IrSimpleFunction?, LeafMfvcNode>?, // used if the getter was custom and need to call it.
|
||||||
|
oldGetter: IrSimpleFunction?,
|
||||||
|
modality: Modality,
|
||||||
|
oldPropertyBackingField: IrField?,
|
||||||
|
): LeafMfvcNode {
|
||||||
|
require(!type.needsMfvcFlattening()) { "${type.render()} requires flattening" }
|
||||||
|
|
||||||
|
val fullMethodName = NameableMfvcNodeImpl.makeFullMethodName(rootPropertyName, nameParts)
|
||||||
|
val fullFieldName = NameableMfvcNodeImpl.makeFullFieldName(rootPropertyName, nameParts)
|
||||||
|
|
||||||
|
val field = oldPropertyBackingField?.let { oldBackingField ->
|
||||||
|
context.irFactory.buildField {
|
||||||
|
updateFrom(oldBackingField)
|
||||||
|
this.name = fullFieldName
|
||||||
|
this.type = type
|
||||||
|
this.visibility = DescriptorVisibilities.PRIVATE
|
||||||
|
this.metadata = null
|
||||||
|
}.apply {
|
||||||
|
this.parent = oldBackingField.parent
|
||||||
|
this.annotations = fieldAnnotations.map { it.deepCopyWithVariables() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val unboxMethod = makeUnboxMethod(
|
||||||
|
context,
|
||||||
|
fullMethodName,
|
||||||
|
type,
|
||||||
|
parent,
|
||||||
|
overriddenNode,
|
||||||
|
static,
|
||||||
|
defaultMethodsImplementationSourceNode,
|
||||||
|
oldGetter,
|
||||||
|
modality,
|
||||||
|
) { receiver -> irGetField(if (field!!.isStatic) null else irGet(receiver!!), field) }
|
||||||
|
|
||||||
|
return LeafMfvcNode(type, rootPropertyName, nameParts, field, unboxMethod, defaultMethodsImplementationSourceNode.isPure())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun Pair<IrSimpleFunction?, NameableMfvcNode>?.isPure(): Boolean {
|
||||||
|
val (outer, inner) = this ?: return true
|
||||||
|
return outer == null && inner.hasPureUnboxMethod
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun makeUnboxMethod(
|
||||||
|
context: JvmBackendContext,
|
||||||
|
fullMethodName: Name,
|
||||||
|
type: IrType,
|
||||||
|
parent: IrDeclarationParent,
|
||||||
|
overriddenNode: NameableMfvcNode?,
|
||||||
|
static: Boolean,
|
||||||
|
defaultMethodsImplementationSourceNode: Pair<IrSimpleFunction?, NameableMfvcNode>?,
|
||||||
|
oldGetter: IrSimpleFunction?,
|
||||||
|
modality: Modality,
|
||||||
|
makeOptimizedExpression: IrBuilderWithScope.(receiver: IrValueDeclaration?) -> IrExpression,
|
||||||
|
): IrSimpleFunction {
|
||||||
|
val res = oldGetter ?: context.irFactory.buildFun {
|
||||||
|
this.name = fullMethodName
|
||||||
|
this.origin = JvmLoweredDeclarationOrigin.SYNTHETIC_MULTI_FIELD_VALUE_CLASS_MEMBER
|
||||||
|
this.returnType = type
|
||||||
|
this.modality = modality
|
||||||
|
}.apply {
|
||||||
|
this.parent = parent
|
||||||
|
overriddenSymbols = overriddenNode?.let { it.unboxMethod.overriddenSymbols + it.unboxMethod.symbol } ?: listOf()
|
||||||
|
if (!static) {
|
||||||
|
createDispatchReceiverParameter()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res.apply {
|
||||||
|
body = with(context.createJvmIrBuilder(this.symbol)) {
|
||||||
|
val receiver = dispatchReceiverParameter
|
||||||
|
if (defaultMethodsImplementationSourceNode == null) {
|
||||||
|
irExprBody(makeOptimizedExpression(receiver))
|
||||||
|
} else {
|
||||||
|
val (outer, inner) = defaultMethodsImplementationSourceNode
|
||||||
|
val receiverExpression = receiver?.let { irGet(it) }
|
||||||
|
val outerCall = if (outer == null) receiverExpression else irCall(outer).apply { dispatchReceiver = receiverExpression }
|
||||||
|
val innerCall = irCall(inner.unboxMethod).apply { dispatchReceiver = outerCall }
|
||||||
|
irExprBody(innerCall)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createNameableMfvcNodes(
|
||||||
|
parent: IrDeclarationContainer,
|
||||||
|
context: JvmBackendContext,
|
||||||
|
type: IrSimpleType,
|
||||||
|
typeArguments: TypeArguments,
|
||||||
|
rootPropertyName: String?,
|
||||||
|
nameParts: List<IndexedNamePart>,
|
||||||
|
fieldAnnotations: List<IrConstructorCall>,
|
||||||
|
static: Boolean,
|
||||||
|
overriddenNode: NameableMfvcNode?,
|
||||||
|
defaultMethodsImplementationSourceNode: Pair<IrSimpleFunction?, NameableMfvcNode>?, // used if the getter was custom and need to call it.
|
||||||
|
oldGetter: IrSimpleFunction?,
|
||||||
|
modality: Modality,
|
||||||
|
oldPropertyBackingField: IrField?,
|
||||||
|
): NameableMfvcNode = if (type.needsMfvcFlattening()) createIntermediateMfvcNode(
|
||||||
|
parent,
|
||||||
|
context,
|
||||||
|
type,
|
||||||
|
typeArguments,
|
||||||
|
rootPropertyName,
|
||||||
|
nameParts,
|
||||||
|
fieldAnnotations,
|
||||||
|
static,
|
||||||
|
overriddenNode as IntermediateMfvcNode?,
|
||||||
|
defaultMethodsImplementationSourceNode?.let { (outer, inner) -> outer to (inner as IntermediateMfvcNode) },
|
||||||
|
oldGetter,
|
||||||
|
modality,
|
||||||
|
oldPropertyBackingField,
|
||||||
|
) else createLeafMfvcNode(
|
||||||
|
parent,
|
||||||
|
context,
|
||||||
|
type,
|
||||||
|
rootPropertyName,
|
||||||
|
nameParts,
|
||||||
|
fieldAnnotations,
|
||||||
|
static,
|
||||||
|
overriddenNode as LeafMfvcNode?,
|
||||||
|
defaultMethodsImplementationSourceNode?.let { (outer, inner) -> outer to (inner as LeafMfvcNode) },
|
||||||
|
oldGetter,
|
||||||
|
modality,
|
||||||
|
oldPropertyBackingField
|
||||||
|
)
|
||||||
|
|
||||||
|
fun createIntermediateMfvcNode(
|
||||||
|
parent: IrDeclarationContainer,
|
||||||
|
context: JvmBackendContext,
|
||||||
|
type: IrSimpleType,
|
||||||
|
typeArguments: TypeArguments,
|
||||||
|
rootPropertyName: String?,
|
||||||
|
nameParts: List<IndexedNamePart>,
|
||||||
|
fieldAnnotations: List<IrConstructorCall>,
|
||||||
|
static: Boolean,
|
||||||
|
overriddenNode: IntermediateMfvcNode?,
|
||||||
|
defaultMethodsImplementationSourceNode: Pair<IrSimpleFunction?, IntermediateMfvcNode>?, // used if the getter was custom and need to call it.
|
||||||
|
oldGetter: IrSimpleFunction?,
|
||||||
|
modality: Modality,
|
||||||
|
oldPropertyBackingField: IrField?,
|
||||||
|
): IntermediateMfvcNode {
|
||||||
|
require(type.needsMfvcFlattening()) { "${type.render()} does not require flattening" }
|
||||||
|
val valueClass = type.erasedUpperBound
|
||||||
|
val representation = valueClass.multiFieldValueClassRepresentation!!
|
||||||
|
|
||||||
|
val replacements = context.multiFieldValueClassReplacements
|
||||||
|
val rootNode = replacements.getRootMfvcNode(valueClass)!!
|
||||||
|
|
||||||
|
val oldField = oldGetter?.correspondingPropertySymbol?.owner?.backingField
|
||||||
|
|
||||||
|
val shadowBackingFieldProperty = if (oldField == null) oldGetter?.getGetterField()?.correspondingPropertySymbol?.owner else null
|
||||||
|
val useOldGetter = oldGetter != null && (oldField == null || !oldGetter.isDefaultGetter(oldField))
|
||||||
|
|
||||||
|
val subnodes = representation.underlyingPropertyNamesToTypes.mapIndexed { index, (name, type) ->
|
||||||
|
val newType = type.substitute(typeArguments) as IrSimpleType
|
||||||
|
val newTypeArguments = typeArguments.toMutableMap().apply { putAll(makeTypeArgumentsFromType(newType)) }
|
||||||
|
val newDefaultMethodsImplementationSourceNode = when {
|
||||||
|
defaultMethodsImplementationSourceNode != null -> {
|
||||||
|
val (outer, inner) = defaultMethodsImplementationSourceNode
|
||||||
|
require(!useOldGetter) { "Multiple non-default getters:\n\n${outer?.dump()}\n\n${oldGetter?.dump()}" }
|
||||||
|
outer to inner[name]!!
|
||||||
|
}
|
||||||
|
|
||||||
|
shadowBackingFieldProperty != null -> null to replacements.getMfvcPropertyNode(shadowBackingFieldProperty)!!
|
||||||
|
useOldGetter -> oldGetter!! to rootNode[name]!!
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
createNameableMfvcNodes(
|
||||||
|
parent,
|
||||||
|
context,
|
||||||
|
newType,
|
||||||
|
newTypeArguments,
|
||||||
|
rootPropertyName,
|
||||||
|
nameParts + IndexedNamePart(index, name),
|
||||||
|
fieldAnnotations,
|
||||||
|
static,
|
||||||
|
overriddenNode?.let { it[name]!! },
|
||||||
|
newDefaultMethodsImplementationSourceNode,
|
||||||
|
null,
|
||||||
|
modality,
|
||||||
|
oldPropertyBackingField,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val fullMethodName = NameableMfvcNodeImpl.makeFullMethodName(rootPropertyName, nameParts)
|
||||||
|
|
||||||
|
val unboxMethod = if (useOldGetter) oldGetter!! else makeUnboxMethod(
|
||||||
|
context, fullMethodName, type, parent, overriddenNode, static, defaultMethodsImplementationSourceNode, oldGetter, modality
|
||||||
|
) { receiver ->
|
||||||
|
val valueArguments = subnodes.flatMap { it.fields!! }.map { field -> irGetField(if (field.isStatic) null else irGet(receiver!!), field) }
|
||||||
|
rootNode.makeBoxedExpression(this, typeArguments, valueArguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
return IntermediateMfvcNode(
|
||||||
|
type, rootPropertyName, nameParts, subnodes, unboxMethod, defaultMethodsImplementationSourceNode.isPure(), rootNode
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun collectPropertiesAfterLowering(irClass: IrClass) = LinkedHashSet<IrProperty>().apply {
|
||||||
|
for (element in irClass.declarations) {
|
||||||
|
if (element is IrField) {
|
||||||
|
element.correspondingPropertySymbol?.owner?.let { add(it) }
|
||||||
|
} else if (element is IrSimpleFunction) {
|
||||||
|
element.correspondingPropertySymbol?.owner?.let { add(it) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun IrProperty.isStatic(currentContainer: IrDeclarationContainer) =
|
||||||
|
getterIfDeclared(currentContainer)?.isStatic ?: backingField?.isStatic ?: error("Property without both getter and backing field")
|
||||||
|
|
||||||
|
fun getRootNode(context: JvmBackendContext, mfvc: IrClass): RootMfvcNode {
|
||||||
|
require(mfvc.isMultiFieldValueClass) { "${mfvc.defaultType.render()} does not require flattening" }
|
||||||
|
val oldPrimaryConstructor = mfvc.primaryConstructor!!
|
||||||
|
val representation = mfvc.multiFieldValueClassRepresentation!!
|
||||||
|
val properties = collectPropertiesAfterLowering(mfvc).associateBy { it.isStatic(mfvc) to it.name }
|
||||||
|
|
||||||
|
val subnodes = makeRootMfvcNodeSubnodes(representation, properties, context, mfvc)
|
||||||
|
|
||||||
|
val mfvcNodeWithSubnodesImpl = MfvcNodeWithSubnodesImpl(subnodes, null)
|
||||||
|
val leaves = mfvcNodeWithSubnodesImpl.leaves
|
||||||
|
val fields = mfvcNodeWithSubnodesImpl.fields!!
|
||||||
|
|
||||||
|
val newPrimaryConstructor = makeMfvcPrimaryConstructor(context, oldPrimaryConstructor, mfvc, leaves, fields)
|
||||||
|
val primaryConstructorImpl = makePrimaryConstructorImpl(context, oldPrimaryConstructor, mfvc, leaves)
|
||||||
|
val boxMethod = makeBoxMethod(context, mfvc, leaves, newPrimaryConstructor)
|
||||||
|
val specializedEqualsMethod = makeSpecializedEqualsMethod(context, mfvc, leaves)
|
||||||
|
|
||||||
|
return RootMfvcNode(
|
||||||
|
mfvc, subnodes, oldPrimaryConstructor, newPrimaryConstructor, primaryConstructorImpl, boxMethod, specializedEqualsMethod
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun makeSpecializedEqualsMethod(
|
||||||
|
context: JvmBackendContext,
|
||||||
|
mfvc: IrClass,
|
||||||
|
leaves: List<LeafMfvcNode>
|
||||||
|
) = context.irFactory.buildFun {
|
||||||
|
name = InlineClassDescriptorResolver.SPECIALIZED_EQUALS_NAME
|
||||||
|
// TODO: Revisit this once we allow user defined equals methods in value classes.
|
||||||
|
origin = JvmLoweredDeclarationOrigin.MULTI_FIELD_VALUE_CLASS_GENERATED_IMPL_METHOD
|
||||||
|
returnType = context.irBuiltIns.booleanType
|
||||||
|
}.apply {
|
||||||
|
parent = mfvc
|
||||||
|
copyTypeParametersFrom(mfvc)
|
||||||
|
val typeParametersHalf1 = typeParameters.apply {
|
||||||
|
for (it in this) {
|
||||||
|
it.name = Name.guessByFirstCharacter("${it.name.asString()}1")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
copyTypeParametersFrom(mfvc)
|
||||||
|
val typeParametersHalf2 = typeParameters.drop(typeParametersHalf1.size).apply {
|
||||||
|
for (it in this) {
|
||||||
|
it.name = Name.guessByFirstCharacter("${it.name.asString()}2")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val valueParametersHalf1 = leaves.map { leaf ->
|
||||||
|
addValueParameter {
|
||||||
|
this.name = Name.guessByFirstCharacter(
|
||||||
|
"${InlineClassDescriptorResolver.SPECIALIZED_EQUALS_FIRST_PARAMETER_NAME}$${leaf.fullFieldName}"
|
||||||
|
)
|
||||||
|
this.type = leaf.type.substitute(mfvc.typeParameters, typeParametersHalf1.map { it.defaultType })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val valueParametersHalf2 = leaves.map { leaf ->
|
||||||
|
addValueParameter {
|
||||||
|
this.name = Name.guessByFirstCharacter(
|
||||||
|
"${InlineClassDescriptorResolver.SPECIALIZED_EQUALS_SECOND_PARAMETER_NAME}$${leaf.fullFieldName}"
|
||||||
|
)
|
||||||
|
this.type = leaf.type.substitute(mfvc.typeParameters, typeParametersHalf2.map { it.defaultType })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
body = with(context.createJvmIrBuilder(this.symbol)) {
|
||||||
|
val conjunctions = valueParametersHalf1.zip(valueParametersHalf2) { f1, f2 -> irEquals(irGet(f1), irGet(f2)) }
|
||||||
|
irExprBody(conjunctions.reduce { acc, current ->
|
||||||
|
irCall(context.irBuiltIns.andandSymbol).apply {
|
||||||
|
putValueArgument(0, acc)
|
||||||
|
putValueArgument(1, current)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun makeBoxMethod(
|
||||||
|
context: JvmBackendContext,
|
||||||
|
mfvc: IrClass,
|
||||||
|
leaves: List<LeafMfvcNode>,
|
||||||
|
newPrimaryConstructor: IrConstructor
|
||||||
|
) = context.irFactory.buildFun {
|
||||||
|
name = Name.identifier(KotlinTypeMapper.BOX_JVM_METHOD_NAME)
|
||||||
|
origin = JvmLoweredDeclarationOrigin.SYNTHETIC_MULTI_FIELD_VALUE_CLASS_MEMBER
|
||||||
|
returnType = mfvc.defaultType
|
||||||
|
}.apply {
|
||||||
|
parent = mfvc
|
||||||
|
copyTypeParametersFrom(mfvc)
|
||||||
|
val mapping = mfvc.typeParameters.zip(typeParameters) { classTypeParameter, functionTypeParameter ->
|
||||||
|
classTypeParameter.symbol to functionTypeParameter.defaultType
|
||||||
|
}.toMap()
|
||||||
|
returnType = returnType.substitute(mapping)
|
||||||
|
val parameters = leaves.map { leaf -> addValueParameter(leaf.fullFieldName, leaf.type.substitute(mapping)) }
|
||||||
|
body = with(context.createJvmIrBuilder(this.symbol)) {
|
||||||
|
irExprBody(irCall(newPrimaryConstructor).apply {
|
||||||
|
for ((index, parameter) in parameters.withIndex()) {
|
||||||
|
putValueArgument(index, irGet(parameter))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun makePrimaryConstructorImpl(
|
||||||
|
context: JvmBackendContext,
|
||||||
|
oldPrimaryConstructor: IrConstructor,
|
||||||
|
mfvc: IrClass,
|
||||||
|
leaves: List<LeafMfvcNode>
|
||||||
|
) = context.irFactory.buildFun {
|
||||||
|
name = InlineClassAbi.mangledNameFor(oldPrimaryConstructor, false, false)
|
||||||
|
visibility = oldPrimaryConstructor.visibility
|
||||||
|
origin = JvmLoweredDeclarationOrigin.STATIC_MULTI_FIELD_VALUE_CLASS_CONSTRUCTOR
|
||||||
|
returnType = context.irBuiltIns.unitType
|
||||||
|
modality = Modality.FINAL
|
||||||
|
}.apply {
|
||||||
|
parent = mfvc
|
||||||
|
copyTypeParametersFrom(mfvc)
|
||||||
|
for (leaf in leaves) {
|
||||||
|
addValueParameter(leaf.fullFieldName, leaf.type.substitute(mfvc.typeParameters, typeParameters.map { it.defaultType }))
|
||||||
|
}
|
||||||
|
// body is added in the Lowering file as it needs to be lowered
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun makeMfvcPrimaryConstructor(
|
||||||
|
context: JvmBackendContext,
|
||||||
|
oldPrimaryConstructor: IrConstructor,
|
||||||
|
mfvc: IrClass,
|
||||||
|
leaves: List<LeafMfvcNode>,
|
||||||
|
fields: List<IrField>
|
||||||
|
) = context.irFactory.buildConstructor {
|
||||||
|
updateFrom(oldPrimaryConstructor)
|
||||||
|
visibility = DescriptorVisibilities.PRIVATE
|
||||||
|
origin = JvmLoweredDeclarationOrigin.SYNTHETIC_MULTI_FIELD_VALUE_CLASS_MEMBER
|
||||||
|
returnType = oldPrimaryConstructor.returnType
|
||||||
|
}.apply {
|
||||||
|
require(oldPrimaryConstructor.typeParameters.isEmpty()) {
|
||||||
|
"Constructors do not support type parameters yet"
|
||||||
|
}
|
||||||
|
this.parent = mfvc
|
||||||
|
val parameters = leaves.map { addValueParameter(it.fullFieldName, it.type) }
|
||||||
|
val irConstructor = this@apply
|
||||||
|
body = context.createIrBuilder(irConstructor.symbol).irBlockBody(irConstructor) {
|
||||||
|
+irDelegatingConstructorCall(context.irBuiltIns.anyClass.owner.constructors.single())
|
||||||
|
for ((field, parameter) in fields zip parameters) {
|
||||||
|
+irSetField(irGet(mfvc.thisReceiver!!), field, irGet(parameter))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun makeRootMfvcNodeSubnodes(
|
||||||
|
representation: MultiFieldValueClassRepresentation<IrSimpleType>,
|
||||||
|
properties: Map<Pair<Boolean, Name>, IrProperty>,
|
||||||
|
context: JvmBackendContext,
|
||||||
|
mfvc: IrClass
|
||||||
|
) = representation.underlyingPropertyNamesToTypes.mapIndexed { index, (name, type) ->
|
||||||
|
val typeArguments = makeTypeArgumentsFromType(type)
|
||||||
|
val oldProperty = properties[false to name]!!
|
||||||
|
val oldBackingField = oldProperty.backingField
|
||||||
|
val oldGetter = oldProperty.getterIfDeclared(mfvc)
|
||||||
|
val overriddenNode = oldGetter?.let { getOverriddenNode(context.multiFieldValueClassReplacements, it) as IntermediateMfvcNode? }
|
||||||
|
val static = oldProperty.isStatic(mfvc)
|
||||||
|
createNameableMfvcNodes(
|
||||||
|
mfvc,
|
||||||
|
context,
|
||||||
|
type,
|
||||||
|
typeArguments,
|
||||||
|
null,
|
||||||
|
listOf(IndexedNamePart(index, name)),
|
||||||
|
oldBackingField?.annotations ?: listOf(),
|
||||||
|
static,
|
||||||
|
overriddenNode,
|
||||||
|
null,
|
||||||
|
oldGetter.takeIf { static },
|
||||||
|
Modality.FINAL,
|
||||||
|
oldBackingField,
|
||||||
|
).also {
|
||||||
|
updateAnnotationsAndPropertyFromOldProperty(oldProperty)
|
||||||
|
it.unboxMethod.overriddenSymbols = listOf() // the getter is saved so it overrides itself
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateAnnotationsAndPropertyFromOldProperty(
|
||||||
|
oldProperty: IrProperty
|
||||||
|
) {
|
||||||
|
oldProperty.setter?.apply {
|
||||||
|
name = Name.identifier(JvmAbi.setterName(oldProperty.name.asString()))
|
||||||
|
correspondingPropertySymbol = null
|
||||||
|
origin = IrDeclarationOrigin.DEFINED
|
||||||
|
}
|
||||||
|
oldProperty.setter = null
|
||||||
|
oldProperty.backingField = null
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createIntermediateNodeForMfvcPropertyOfRegularClass(
|
||||||
|
parent: IrDeclarationContainer,
|
||||||
|
context: JvmBackendContext,
|
||||||
|
oldProperty: IrProperty,
|
||||||
|
): IntermediateMfvcNode {
|
||||||
|
val oldGetter = oldProperty.getterIfDeclared(parent)
|
||||||
|
val oldField = oldProperty.backingField
|
||||||
|
val type = oldProperty.getter?.returnType ?: oldField?.type ?: error("Either getter or field must exist")
|
||||||
|
require(type is IrSimpleType && type.needsMfvcFlattening()) { "Expected MFVC but got ${type.render()}" }
|
||||||
|
val fieldAnnotations = oldField?.annotations ?: listOf()
|
||||||
|
val static = oldProperty.isStatic(parent)
|
||||||
|
val overriddenNode = oldGetter?.let { getOverriddenNode(context.multiFieldValueClassReplacements, it) as IntermediateMfvcNode? }
|
||||||
|
val modality = if (oldGetter == null || oldGetter.modality == Modality.FINAL) Modality.FINAL else oldGetter.modality
|
||||||
|
return createIntermediateMfvcNode(
|
||||||
|
parent, context, type, makeTypeArgumentsFromType(type), oldProperty.name.asString(), listOf(),
|
||||||
|
fieldAnnotations, static, overriddenNode, null, oldGetter, modality, oldField
|
||||||
|
).also {
|
||||||
|
updateAnnotationsAndPropertyFromOldProperty(oldProperty)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getOverriddenNode(replacements: MemoizedMultiFieldValueClassReplacements, getter: IrSimpleFunction): NameableMfvcNode? =
|
||||||
|
getter.overriddenSymbols
|
||||||
|
.firstOrNull { !it.owner.isFakeOverride }
|
||||||
|
?.let { replacements.getMfvcPropertyNode(it.owner.correspondingPropertySymbol!!.owner) }
|
||||||
|
|
||||||
|
fun hasAccessToPrivateMembersOf(currentElement: IrElement?, parent: IrClass): Boolean {
|
||||||
|
val declaration = currentElement as? IrDeclaration ?: return false
|
||||||
|
for (cur in declaration.parents.filterIsInstance<IrClass>()) {
|
||||||
|
return when {
|
||||||
|
cur == parent -> true
|
||||||
|
cur.isInner -> continue
|
||||||
|
else -> false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun IrProperty.getterIfDeclared(parent: IrDeclarationContainer): IrSimpleFunction? = getter?.takeIf { it in parent.declarations }
|
||||||
@@ -0,0 +1,270 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
package org.jetbrains.kotlin.backend.jvm
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound
|
||||||
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl
|
||||||
|
import org.jetbrains.kotlin.ir.types.IrSimpleType
|
||||||
|
import org.jetbrains.kotlin.ir.types.IrType
|
||||||
|
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
|
||||||
|
import org.jetbrains.kotlin.ir.util.dump
|
||||||
|
import org.jetbrains.kotlin.ir.util.render
|
||||||
|
import org.jetbrains.kotlin.ir.util.substitute
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
interface MfvcNodeInstance {
|
||||||
|
val scope: IrBuilderWithScope
|
||||||
|
val node: MfvcNode
|
||||||
|
val typeArguments: TypeArguments
|
||||||
|
val type: IrSimpleType
|
||||||
|
val initializationStatements: List<IrStatement>
|
||||||
|
|
||||||
|
fun makeFlattenedGetterExpressions(): List<IrExpression>
|
||||||
|
fun makeGetterExpression(): IrExpression
|
||||||
|
operator fun get(name: Name): MfvcNodeInstance?
|
||||||
|
fun makeStatements(values: List<IrExpression>): List<IrStatement>
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun makeTypeFromMfvcNodeAndTypeArguments(node: MfvcNode, typeArguments: TypeArguments) =
|
||||||
|
node.type.substitute(typeArguments) as IrSimpleType
|
||||||
|
|
||||||
|
fun MfvcNodeInstance.addSetterStatements(scope: IrBlockBuilder, values: List<IrExpression>) = with(scope) {
|
||||||
|
for (statement in makeStatements(values)) {
|
||||||
|
+statement
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun MfvcNodeInstance.makeSetterExpressions(values: List<IrExpression>): IrExpression = scope.irBlock {
|
||||||
|
addSetterStatements(this, values)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun MfvcNodeInstance.checkValuesCount(values: List<IrExpression>) {
|
||||||
|
require(values.size == node.leavesCount) { "Node $node requires ${node.leavesCount} values but got ${values.map { it.render() }}" }
|
||||||
|
}
|
||||||
|
|
||||||
|
class ValueDeclarationMfvcNodeInstance(
|
||||||
|
override val scope: IrBuilderWithScope,
|
||||||
|
override val node: MfvcNode,
|
||||||
|
override val typeArguments: TypeArguments,
|
||||||
|
val valueDeclarations: List<IrValueDeclaration>,
|
||||||
|
override val initializationStatements: List<IrStatement>,
|
||||||
|
) : MfvcNodeInstance {
|
||||||
|
init {
|
||||||
|
require(valueDeclarations.size == size) { "Expected value declarations list of size $size but got of size ${valueDeclarations.size}" }
|
||||||
|
}
|
||||||
|
|
||||||
|
override val type: IrSimpleType = makeTypeFromMfvcNodeAndTypeArguments(node, typeArguments)
|
||||||
|
|
||||||
|
override fun makeFlattenedGetterExpressions(): List<IrExpression> = valueDeclarations.map { scope.irGet(it) }
|
||||||
|
|
||||||
|
override fun makeGetterExpression(): IrExpression = when (node) {
|
||||||
|
is LeafMfvcNode -> makeFlattenedGetterExpressions().single()
|
||||||
|
is MfvcNodeWithSubnodes -> node.makeBoxedExpression(scope, typeArguments, makeFlattenedGetterExpressions())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun get(name: Name): ValueDeclarationMfvcNodeInstance? {
|
||||||
|
val (newNode, indices) = node.getSubnodeAndIndices(name) ?: return null
|
||||||
|
return ValueDeclarationMfvcNodeInstance(scope, newNode, typeArguments, valueDeclarations.slice(indices), initializationStatements)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun makeStatements(values: List<IrExpression>): List<IrStatement> {
|
||||||
|
checkValuesCount(values)
|
||||||
|
return valueDeclarations.zip(values) { declaration, value -> scope.irSet(declaration, value) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class ExpressionCopierImpl(
|
||||||
|
expression: IrExpression?,
|
||||||
|
private val scope: IrBlockBuilder,
|
||||||
|
private val saveVariable: (IrVariable) -> Unit,
|
||||||
|
private val saveReceiverSetter: (IrSetValue) -> Unit
|
||||||
|
) {
|
||||||
|
private sealed interface CopyableExpression {
|
||||||
|
fun makeExpression(scope: IrBuilderWithScope): IrExpression
|
||||||
|
}
|
||||||
|
|
||||||
|
private class SavedToVariable(val variable: IrVariable) : CopyableExpression {
|
||||||
|
override fun makeExpression(scope: IrBuilderWithScope): IrExpression = scope.irGet(variable)
|
||||||
|
}
|
||||||
|
|
||||||
|
private class PureExpression(val expression: IrExpression) : CopyableExpression {
|
||||||
|
override fun makeExpression(scope: IrBuilderWithScope): IrExpression = expression.deepCopyWithSymbols()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun IrExpression.orSavedToVariable(): CopyableExpression =
|
||||||
|
if (isRepeatableGetter()) {
|
||||||
|
PureExpression(this)
|
||||||
|
} else SavedToVariable(
|
||||||
|
scope.savableStandaloneVariableWithSetter(
|
||||||
|
this@orSavedToVariable,
|
||||||
|
origin = IrDeclarationOrigin.TEMPORARY_MULTI_FIELD_VALUE_CLASS_VARIABLE,
|
||||||
|
saveVariable = saveVariable,
|
||||||
|
isTemporary = true,
|
||||||
|
saveSetter = saveReceiverSetter,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
private val copyableExpression = expression?.orSavedToVariable()
|
||||||
|
|
||||||
|
fun makeCopy() = copyableExpression?.makeExpression(scope)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun IrExpression?.isRepeatableGetter(): Boolean = when (this) {
|
||||||
|
null -> true
|
||||||
|
is IrConst<*> -> true
|
||||||
|
is IrGetValue -> true
|
||||||
|
is IrGetField -> receiver.isRepeatableGetter()
|
||||||
|
is IrTypeOperatorCallImpl -> this.argument.isRepeatableGetter()
|
||||||
|
is IrContainerExpression -> statements.all { it is IrExpression && it.isRepeatableGetter() || it is IrVariable }
|
||||||
|
else -> false
|
||||||
|
}
|
||||||
|
|
||||||
|
fun IrExpression?.isRepeatableSetter(): Boolean = when (this) {
|
||||||
|
null -> true
|
||||||
|
is IrConst<*> -> true
|
||||||
|
is IrSetValue -> value.isRepeatableGetter()
|
||||||
|
is IrSetField -> receiver.isRepeatableGetter() && value.isRepeatableGetter()
|
||||||
|
is IrTypeOperatorCallImpl -> this.argument.isRepeatableSetter()
|
||||||
|
is IrContainerExpression -> statements.dropLast(1).all { it is IrExpression && it.isRepeatableGetter() || it is IrVariable } &&
|
||||||
|
statements.lastOrNull().let { it is IrExpression? && it.isRepeatableSetter() }
|
||||||
|
|
||||||
|
else -> false
|
||||||
|
}
|
||||||
|
|
||||||
|
fun IrExpression?.isRepeatableAccessor(): Boolean = isRepeatableGetter() || isRepeatableSetter()
|
||||||
|
|
||||||
|
class ReceiverBasedMfvcNodeInstance(
|
||||||
|
override val scope: IrBlockBuilder,
|
||||||
|
override val node: MfvcNode,
|
||||||
|
override val typeArguments: TypeArguments,
|
||||||
|
receiver: IrExpression?,
|
||||||
|
val fields: List<IrField>?,
|
||||||
|
val unboxMethod: IrSimpleFunction?,
|
||||||
|
val isPrivateAccess: Boolean,
|
||||||
|
private val saveVariable: (IrVariable) -> Unit,
|
||||||
|
) : MfvcNodeInstance {
|
||||||
|
override val type: IrSimpleType = makeTypeFromMfvcNodeAndTypeArguments(node, typeArguments)
|
||||||
|
|
||||||
|
override val initializationStatements: List<IrStatement> = mutableListOf()
|
||||||
|
private val receiverCopier = ExpressionCopierImpl(
|
||||||
|
receiver, scope, saveVariable, saveReceiverSetter = { (initializationStatements as MutableList).add(it) }
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun makeReceiverCopy() = receiverCopier.makeCopy()
|
||||||
|
|
||||||
|
init {
|
||||||
|
require(fields == null || fields.isNotEmpty()) { "Empty list of fields" }
|
||||||
|
require(node is RootMfvcNode == (unboxMethod == null)) { "Only root node has node getter" }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun makeFlattenedGetterExpressions(): List<IrExpression> = when (node) {
|
||||||
|
is LeafMfvcNode -> listOf(makeGetterExpression())
|
||||||
|
is MfvcNodeWithSubnodes -> when {
|
||||||
|
node is IntermediateMfvcNode && isPrivateAccess && fields != null -> fields.map { scope.irGetField(makeReceiverCopy(), it) }
|
||||||
|
node is IntermediateMfvcNode && !node.hasPureUnboxMethod -> {
|
||||||
|
val value = makeGetterExpression()
|
||||||
|
val asVariable = scope.savableStandaloneVariableWithSetter(
|
||||||
|
value,
|
||||||
|
origin = IrDeclarationOrigin.GENERATED_MULTI_FIELD_VALUE_CLASS_PARAMETER,
|
||||||
|
saveVariable = saveVariable,
|
||||||
|
isTemporary = true,
|
||||||
|
)
|
||||||
|
val root = node.rootNode
|
||||||
|
val variableInstance =
|
||||||
|
root.createInstanceFromBox(scope, typeArguments, scope.irGet(asVariable), isPrivateAccess = false, saveVariable)
|
||||||
|
variableInstance.makeFlattenedGetterExpressions()
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> node.subnodes.flatMap { get(it.name)!!.makeFlattenedGetterExpressions() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun makeGetterExpression(): IrExpression = with(scope) {
|
||||||
|
when {
|
||||||
|
node is LeafMfvcNode && isPrivateAccess && fields != null -> irGetField(makeReceiverCopy(), fields.single())
|
||||||
|
node is IntermediateMfvcNode && isPrivateAccess && fields != null -> node.makeBoxedExpression(
|
||||||
|
this, typeArguments, fields.map { irGetField(makeReceiverCopy(), it) }
|
||||||
|
)
|
||||||
|
unboxMethod != null -> irCall(unboxMethod).apply {
|
||||||
|
val dispatchReceiverParameter = unboxMethod.dispatchReceiverParameter
|
||||||
|
if (dispatchReceiverParameter != null) {
|
||||||
|
dispatchReceiver = makeReceiverCopy() ?: run {
|
||||||
|
val erasedUpperBound = dispatchReceiverParameter.type.erasedUpperBound
|
||||||
|
require(erasedUpperBound.isCompanion) { "Expected a dispatch receiver for:\n${unboxMethod.dump()}" }
|
||||||
|
irGetObject(erasedUpperBound.symbol)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
node is RootMfvcNode -> makeReceiverCopy()!!
|
||||||
|
else -> error("Unbox method must exist for $node")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun get(name: Name): ReceiverBasedMfvcNodeInstance? {
|
||||||
|
val (newNode, _) = node.getSubnodeAndIndices(name) ?: return null
|
||||||
|
return newNode.createInstanceFromBox(scope, typeArguments, makeReceiverCopy(), isPrivateAccess, saveVariable)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun makeStatements(values: List<IrExpression>): List<IrStatement> {
|
||||||
|
checkValuesCount(values)
|
||||||
|
require(fields != null) { "$node is immutable as it has custom getter and so no backing fields" }
|
||||||
|
return fields.zip(values) { field, expr -> scope.irSetField(makeReceiverCopy(), field, expr) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val MfvcNodeInstance.size: Int
|
||||||
|
get() = node.leavesCount
|
||||||
|
|
||||||
|
fun IrContainerExpression.unwrap(): IrExpression = statements.singleOrNull() as? IrExpression ?: this
|
||||||
|
|
||||||
|
fun IrBuilderWithScope.savableStandaloneVariable(
|
||||||
|
type: IrType,
|
||||||
|
name: String? = null,
|
||||||
|
isMutable: Boolean = false,
|
||||||
|
origin: IrDeclarationOrigin,
|
||||||
|
isTemporary: Boolean = origin == IrDeclarationOrigin.IR_TEMPORARY_VARIABLE,
|
||||||
|
saveVariable: (IrVariable) -> Unit,
|
||||||
|
): IrVariable {
|
||||||
|
val variable = if (isTemporary || name == null) scope.createTemporaryVariableDeclaration(
|
||||||
|
type, name, isMutable,
|
||||||
|
startOffset = startOffset,
|
||||||
|
endOffset = endOffset,
|
||||||
|
origin = origin,
|
||||||
|
) else IrVariableImpl(
|
||||||
|
startOffset = startOffset,
|
||||||
|
endOffset = endOffset,
|
||||||
|
origin = origin,
|
||||||
|
symbol = IrVariableSymbolImpl(),
|
||||||
|
name = Name.identifier(name),
|
||||||
|
type = type,
|
||||||
|
isVar = isMutable,
|
||||||
|
isConst = false,
|
||||||
|
isLateinit = false
|
||||||
|
).apply {
|
||||||
|
parent = this@savableStandaloneVariable.scope.getLocalDeclarationParent()
|
||||||
|
}
|
||||||
|
saveVariable(variable)
|
||||||
|
return variable
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T : IrElement> IrStatementsBuilder<T>.savableStandaloneVariableWithSetter(
|
||||||
|
expression: IrExpression,
|
||||||
|
name: String? = null,
|
||||||
|
isMutable: Boolean = false,
|
||||||
|
origin: IrDeclarationOrigin,
|
||||||
|
isTemporary: Boolean = origin == IrDeclarationOrigin.IR_TEMPORARY_VARIABLE,
|
||||||
|
saveSetter: (IrSetValue) -> Unit = {},
|
||||||
|
saveVariable: (IrVariable) -> Unit,
|
||||||
|
) = savableStandaloneVariable(expression.type, name, isMutable, origin, isTemporary, saveVariable).also {
|
||||||
|
+irSet(it, expression).also(saveSetter)
|
||||||
|
}
|
||||||
-527
@@ -1,527 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.backend.jvm
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
|
||||||
import org.jetbrains.kotlin.backend.common.lower.irBlockBody
|
|
||||||
import org.jetbrains.kotlin.backend.common.pop
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.MultiFieldValueClassTree.InternalNode
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.MultiFieldValueClassTree.Leaf
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.ir.isMultiFieldValueClassType
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.ir.upperBound
|
|
||||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
|
||||||
import org.jetbrains.kotlin.descriptors.MultiFieldValueClassRepresentation
|
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.*
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrGetField
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
|
|
||||||
import org.jetbrains.kotlin.ir.types.*
|
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
import org.jetbrains.kotlin.renderer.render
|
|
||||||
import org.jetbrains.kotlin.resolve.InlineClassDescriptorResolver
|
|
||||||
|
|
||||||
sealed class MultiFieldValueClassTree {
|
|
||||||
abstract val type: IrType
|
|
||||||
val irClass: IrClass
|
|
||||||
get() = type.erasedUpperBound
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
@JvmStatic
|
|
||||||
fun create(type: IrSimpleType, replacements: MemoizedMultiFieldValueClassReplacements, descriptorVisibility: DescriptorVisibility) =
|
|
||||||
if (!type.isNullable() && type.isMultiFieldValueClassType()) InternalNode(type, descriptorVisibility, replacements)
|
|
||||||
else Leaf(type)
|
|
||||||
}
|
|
||||||
|
|
||||||
class Leaf(override val type: IrType) : MultiFieldValueClassTree() {
|
|
||||||
init {
|
|
||||||
require(type.isNullable() || !type.isMultiFieldValueClassType())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class InternalNode internal constructor(
|
|
||||||
override val type: IrSimpleType, val fields: List<TreeField>
|
|
||||||
) : MultiFieldValueClassTree() {
|
|
||||||
constructor(
|
|
||||||
type: IrSimpleType, visibility: DescriptorVisibility,
|
|
||||||
replacements: MemoizedMultiFieldValueClassReplacements
|
|
||||||
) : this(type, 0.let {
|
|
||||||
val valueClassRepresentation = type.erasedUpperBound.valueClassRepresentation as MultiFieldValueClassRepresentation
|
|
||||||
val primaryConstructor = type.erasedUpperBound.primaryConstructor!!
|
|
||||||
val propertiesByName = replacements.getOldMFVCProperties(primaryConstructor.constructedClass).associateBy { it.name }
|
|
||||||
val typeArguments: List<IrTypeArgument> = type.arguments
|
|
||||||
val typeParameters = type.erasedUpperBound.typeParameters
|
|
||||||
val substitutionMap = typeParameters.map { it.symbol }.zip(typeArguments)
|
|
||||||
.mapNotNull { (param, arg) -> if (arg is IrSimpleType) param to arg else null }.toMap()
|
|
||||||
valueClassRepresentation.underlyingPropertyNamesToTypes.map { (name, representationType) ->
|
|
||||||
val property = propertiesByName[name]!!
|
|
||||||
val innerVisibility = property.visibility
|
|
||||||
val newVisibility = minVisibility(visibility, innerVisibility)
|
|
||||||
TreeField(
|
|
||||||
name,
|
|
||||||
representationType.substitute(substitutionMap) as IrSimpleType,
|
|
||||||
newVisibility,
|
|
||||||
property.annotations,
|
|
||||||
replacements
|
|
||||||
)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
class TreeField(
|
|
||||||
val name: Name, val type: IrType, val visibility: DescriptorVisibility, val annotations: List<IrConstructorCall>,
|
|
||||||
val node: MultiFieldValueClassTree
|
|
||||||
) {
|
|
||||||
constructor(
|
|
||||||
name: Name,
|
|
||||||
type: IrSimpleType,
|
|
||||||
visibility: DescriptorVisibility,
|
|
||||||
annotations: List<IrConstructorCall>,
|
|
||||||
replacements: MemoizedMultiFieldValueClassReplacements
|
|
||||||
) : this(name, type, visibility, annotations, create(type, replacements, visibility))
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
|
||||||
require(!type.isNullable() && type.isMultiFieldValueClassType())
|
|
||||||
}
|
|
||||||
|
|
||||||
private val fieldByName = fields.associateBy { it.name }
|
|
||||||
|
|
||||||
operator fun get(name: Name) = fieldByName[name]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun minVisibility(
|
|
||||||
visibility1: DescriptorVisibility,
|
|
||||||
visibility2: DescriptorVisibility
|
|
||||||
): DescriptorVisibility {
|
|
||||||
val comparison = visibility1.compareTo(visibility2)
|
|
||||||
?: error("Expected comparable visibilities but got $visibility1 and $visibility2")
|
|
||||||
return if (comparison < 0) visibility1 else visibility2
|
|
||||||
}
|
|
||||||
|
|
||||||
fun MultiFieldValueClassTree.render(): String = type.render() + when (this) {
|
|
||||||
is InternalNode -> "\n" + fields.joinToString("\n") { "${it.name.render()}: ${it.node.render().prependIndent(" ")}" }
|
|
||||||
is Leaf -> ""
|
|
||||||
}
|
|
||||||
|
|
||||||
class MultiFieldValueClassSpecificDeclarations(
|
|
||||||
val valueClass: IrClass,
|
|
||||||
private val typeSystemContext: IrTypeSystemContext,
|
|
||||||
private val irFactory: IrFactory,
|
|
||||||
private val context: JvmBackendContext,
|
|
||||||
private val replacements: MemoizedMultiFieldValueClassReplacements,
|
|
||||||
) {
|
|
||||||
init {
|
|
||||||
require(valueClass.isMultiFieldValueClass) { "Cannot build ${this::class.simpleName} for not multi-field value class: $valueClass" }
|
|
||||||
}
|
|
||||||
|
|
||||||
val loweringRepresentation =
|
|
||||||
MultiFieldValueClassTree.create(valueClass.defaultType, replacements, DescriptorVisibilities.PUBLIC) as InternalNode
|
|
||||||
|
|
||||||
val leaves: List<Leaf> = ArrayList<Leaf>().apply {
|
|
||||||
fun proceed(node: MultiFieldValueClassTree) {
|
|
||||||
when (node) {
|
|
||||||
is InternalNode -> node.fields.forEach { proceed(it.node) }
|
|
||||||
is Leaf -> add(node)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
proceed(loweringRepresentation)
|
|
||||||
if (size <= 1) {
|
|
||||||
error("${this@MultiFieldValueClassSpecificDeclarations::class.qualifiedName} for $valueClass must have multiple leaves")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val nodeFullNames: Map<MultiFieldValueClassTree, Name> =
|
|
||||||
mutableMapOf<MultiFieldValueClassTree, Name>().apply {
|
|
||||||
val parts = mutableListOf<String>()
|
|
||||||
fun makeName() = Name.guessByFirstCharacter(parts.joinToString("$"))
|
|
||||||
fun proceed(node: MultiFieldValueClassTree) {
|
|
||||||
when (node) {
|
|
||||||
is InternalNode -> {
|
|
||||||
if (parts.isNotEmpty()) {
|
|
||||||
put(node, makeName())
|
|
||||||
}
|
|
||||||
for (field in node.fields) {
|
|
||||||
parts.add(field.name.asString())
|
|
||||||
proceed(field.node)
|
|
||||||
parts.removeLast()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
is Leaf -> put(node, makeName())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
proceed(loweringRepresentation)
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
|
||||||
require(nodeFullNames.size == nodeFullNames.values.distinct().size) { "Ambiguous names found: ${nodeFullNames.values}" }
|
|
||||||
}
|
|
||||||
|
|
||||||
val indexByLeaf = leaves.withIndex().associate { it.value to it.index }
|
|
||||||
val indexesByInternalNode = mutableMapOf<InternalNode, IntRange>().apply {
|
|
||||||
var index = 0
|
|
||||||
fun proceed(node: MultiFieldValueClassTree) {
|
|
||||||
when (node) {
|
|
||||||
is InternalNode -> {
|
|
||||||
val start = index
|
|
||||||
node.fields.forEach { proceed(it.node) }
|
|
||||||
val finish = index
|
|
||||||
val range = start until finish
|
|
||||||
if (finish - start <= 1) {
|
|
||||||
error("Invalid multi-field value class indexes range for class $valueClass: ${range}")
|
|
||||||
}
|
|
||||||
put(node, range)
|
|
||||||
}
|
|
||||||
is Leaf -> index++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
proceed(loweringRepresentation)
|
|
||||||
}
|
|
||||||
|
|
||||||
val oldPrimaryConstructor = valueClass.primaryConstructor ?: error("Value classes have primary constructors")
|
|
||||||
|
|
||||||
val oldProperties = replacements.getOldMFVCProperties(valueClass).associateBy { it.name }
|
|
||||||
|
|
||||||
val fields = leaves.map { leaf ->
|
|
||||||
irFactory.buildField {
|
|
||||||
this.name = nodeFullNames[leaf]!!
|
|
||||||
this.type = leaf.type
|
|
||||||
visibility = DescriptorVisibilities.PRIVATE
|
|
||||||
}.apply {
|
|
||||||
parent = valueClass
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val gettersVisibilities = mutableMapOf<MultiFieldValueClassTree, DescriptorVisibility>().apply {
|
|
||||||
val stack = mutableListOf<DescriptorVisibility>()
|
|
||||||
fun proceed(node: MultiFieldValueClassTree) {
|
|
||||||
when (node) {
|
|
||||||
is InternalNode -> {
|
|
||||||
if (stack.isNotEmpty()) {
|
|
||||||
put(node, stack.last())
|
|
||||||
}
|
|
||||||
for (field in node.fields) {
|
|
||||||
stack.add(field.visibility)
|
|
||||||
proceed(field.node)
|
|
||||||
stack.pop()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
is Leaf -> put(node, stack.last())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
proceed(loweringRepresentation)
|
|
||||||
}
|
|
||||||
|
|
||||||
private val gettersAnnotations = mutableMapOf<MultiFieldValueClassTree, List<IrConstructorCall>>().apply {
|
|
||||||
val stack = mutableListOf<List<IrConstructorCall>>()
|
|
||||||
|
|
||||||
fun proceed(node: MultiFieldValueClassTree) {
|
|
||||||
when (node) {
|
|
||||||
is InternalNode -> {
|
|
||||||
if (stack.isNotEmpty()) {
|
|
||||||
put(node, stack.last())
|
|
||||||
}
|
|
||||||
for (field in node.fields) {
|
|
||||||
stack.add(field.annotations)
|
|
||||||
proceed(field.node)
|
|
||||||
stack.pop()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
is Leaf -> put(node, stack.last())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
proceed(loweringRepresentation)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun IrBuilderWithScope.fieldGetter(receiver: IrValueParameter, field: IrField): IrGetField =
|
|
||||||
irGetField(irGet(receiver), field)
|
|
||||||
|
|
||||||
private fun IrFunction.fieldGetter(field: IrField): IrBuilderWithScope.() -> IrGetField =
|
|
||||||
{ fieldGetter(dispatchReceiverParameter!!, field) }
|
|
||||||
|
|
||||||
val primaryConstructor: IrConstructor = irFactory.buildConstructor {
|
|
||||||
updateFrom(oldPrimaryConstructor)
|
|
||||||
visibility = DescriptorVisibilities.PRIVATE
|
|
||||||
origin = JvmLoweredDeclarationOrigin.SYNTHETIC_MULTI_FIELD_VALUE_CLASS_MEMBER
|
|
||||||
returnType = oldPrimaryConstructor.returnType
|
|
||||||
}.apply {
|
|
||||||
require(oldPrimaryConstructor.typeParameters.isEmpty()) {
|
|
||||||
"Constructors do not support type parameters yet"
|
|
||||||
}
|
|
||||||
addFlattenedClassRepresentationToParameters(mapOf())
|
|
||||||
val irConstructor = this@apply
|
|
||||||
parent = valueClass
|
|
||||||
body = context.createIrBuilder(irConstructor.symbol).irBlockBody(irConstructor) {
|
|
||||||
+irDelegatingConstructorCall(context.irBuiltIns.anyClass.owner.constructors.single())
|
|
||||||
for (i in leaves.indices) {
|
|
||||||
+irSetField(
|
|
||||||
receiver = irGet(valueClass.thisReceiver!!),
|
|
||||||
field = fields[i],
|
|
||||||
value = irGet(irConstructor.valueParameters[i])
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val primaryConstructorImpl: IrSimpleFunction = irFactory.buildFun {
|
|
||||||
name = InlineClassAbi.mangledNameFor(oldPrimaryConstructor, false, false)
|
|
||||||
visibility = oldPrimaryConstructor.visibility
|
|
||||||
origin = JvmLoweredDeclarationOrigin.STATIC_MULTI_FIELD_VALUE_CLASS_CONSTRUCTOR
|
|
||||||
returnType = context.irBuiltIns.unitType
|
|
||||||
modality = Modality.FINAL
|
|
||||||
}.apply {
|
|
||||||
parent = valueClass
|
|
||||||
copyTypeParametersFrom(valueClass)
|
|
||||||
addFlattenedClassRepresentationToParameters(classToFunctionTypeParametersMapping())
|
|
||||||
// body is added in Lowering file
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun IrSimpleFunction.classToFunctionTypeParametersMapping() =
|
|
||||||
valueClass.typeParameters.map { it.symbol }.zip(typeParameters.map { it.defaultType }).toMap()
|
|
||||||
|
|
||||||
val boxMethod = irFactory.buildFun {
|
|
||||||
name = Name.identifier(KotlinTypeMapper.BOX_JVM_METHOD_NAME)
|
|
||||||
origin = JvmLoweredDeclarationOrigin.SYNTHETIC_MULTI_FIELD_VALUE_CLASS_MEMBER
|
|
||||||
returnType = valueClass.defaultType
|
|
||||||
}.apply {
|
|
||||||
parent = valueClass
|
|
||||||
copyTypeParametersFrom(valueClass)
|
|
||||||
addFlattenedClassRepresentationToParameters(classToFunctionTypeParametersMapping())
|
|
||||||
// body is added in Lowering file
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun IrFunction.addFlattenedClassRepresentationToParameters(substitutionMap: Map<IrTypeParameterSymbol, IrType>) {
|
|
||||||
for (leaf in leaves) {
|
|
||||||
addValueParameter {
|
|
||||||
this.name = nodeFullNames[leaf]!!
|
|
||||||
this.type = leaf.type.substitute(substitutionMap)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val specializedEqualsMethod = irFactory.buildFun {
|
|
||||||
name = InlineClassDescriptorResolver.SPECIALIZED_EQUALS_NAME
|
|
||||||
// TODO: Revisit this once we allow user defined equals methods in value classes.
|
|
||||||
origin = JvmLoweredDeclarationOrigin.MULTI_FIELD_VALUE_CLASS_GENERATED_IMPL_METHOD
|
|
||||||
returnType = context.irBuiltIns.booleanType
|
|
||||||
}.apply {
|
|
||||||
parent = valueClass
|
|
||||||
copyTypeParametersFrom(valueClass)
|
|
||||||
val typeParametersHalf1 = typeParameters.apply {
|
|
||||||
for (it in this) {
|
|
||||||
it.name = Name.guessByFirstCharacter("${it.name.asString()}1")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val substitutionMapHalf1 = (valueClass.typeParameters.map { it.symbol } zip typeParametersHalf1.map { it.defaultType }).toMap()
|
|
||||||
copyTypeParametersFrom(valueClass)
|
|
||||||
val typeParametersHalf2 = typeParameters.drop(typeParametersHalf1.size).apply {
|
|
||||||
for (it in this) {
|
|
||||||
it.name = Name.guessByFirstCharacter("${it.name.asString()}2")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val substitutionMapHalf2 = (valueClass.typeParameters.map { it.symbol } zip typeParametersHalf2.map { it.defaultType }).toMap()
|
|
||||||
for (leaf in leaves) {
|
|
||||||
addValueParameter {
|
|
||||||
this.name = Name.guessByFirstCharacter(
|
|
||||||
"${InlineClassDescriptorResolver.SPECIALIZED_EQUALS_FIRST_PARAMETER_NAME}$${nodeFullNames[leaf]!!.asString()}"
|
|
||||||
)
|
|
||||||
this.type = leaf.type.substitute(substitutionMapHalf1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (leaf in leaves) {
|
|
||||||
addValueParameter {
|
|
||||||
this.name = Name.guessByFirstCharacter(
|
|
||||||
"${InlineClassDescriptorResolver.SPECIALIZED_EQUALS_SECOND_PARAMETER_NAME}$${nodeFullNames[leaf]!!.asString()}"
|
|
||||||
)
|
|
||||||
this.type = leaf.type.substitute(substitutionMapHalf2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// body is added in Lowering file
|
|
||||||
}
|
|
||||||
|
|
||||||
val unboxMethods = fields.mapIndexed { index: Int, field: IrField ->
|
|
||||||
irFactory.buildFun {
|
|
||||||
name = Name.identifier(KotlinTypeMapper.UNBOX_JVM_METHOD_NAME + index)
|
|
||||||
origin = JvmLoweredDeclarationOrigin.SYNTHETIC_MULTI_FIELD_VALUE_CLASS_MEMBER
|
|
||||||
returnType = field.type
|
|
||||||
}.apply {
|
|
||||||
parent = valueClass
|
|
||||||
createDispatchReceiverParameter()
|
|
||||||
body = with(context.createIrBuilder(this.symbol)) {
|
|
||||||
irExprBody(fieldGetter(field)())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val properties: Map<MultiFieldValueClassTree, IrProperty> = run {
|
|
||||||
val nodes2expressions: Map<MultiFieldValueClassTree, IrBuilderWithScope.(function: IrFunction) -> IrExpression> =
|
|
||||||
makeNodes2FieldExpressions(fields)
|
|
||||||
nodeFullNames.mapValues { (node, propertyName) ->
|
|
||||||
val overrideable = oldProperties[propertyName]
|
|
||||||
val descriptorVisibility = gettersVisibilities[node]!!
|
|
||||||
irFactory.buildProperty {
|
|
||||||
name = propertyName
|
|
||||||
origin = IrDeclarationOrigin.GENERATED_MULTI_FIELD_VALUE_CLASS_MEMBER
|
|
||||||
visibility = descriptorVisibility
|
|
||||||
}.apply {
|
|
||||||
annotations = gettersAnnotations[node]!!
|
|
||||||
overrideable?.overriddenSymbols?.let { overriddenSymbols = it }
|
|
||||||
parent = valueClass
|
|
||||||
addGetter {
|
|
||||||
returnType = node.type
|
|
||||||
origin = IrDeclarationOrigin.GENERATED_MULTI_FIELD_VALUE_CLASS_MEMBER
|
|
||||||
visibility = descriptorVisibility
|
|
||||||
}.apply {
|
|
||||||
val function = this
|
|
||||||
overrideable?.getter?.overriddenSymbols?.let { overriddenSymbols = it }
|
|
||||||
createDispatchReceiverParameter()
|
|
||||||
body = with(context.createIrBuilder(this.symbol)) {
|
|
||||||
irExprBody(nodes2expressions[node]!!.invoke(this, function))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
private fun IrFunctionAccessExpression.copyTypeArgumentsFromType(
|
|
||||||
type: IrSimpleType, valueClass: IrClass, substitutionMap: Map<IrTypeParameterSymbol, IrType>
|
|
||||||
) {
|
|
||||||
require(type.erasedUpperBound == valueClass) {
|
|
||||||
"Illegal bound ${type.erasedUpperBound.render()} instead of ${valueClass.render()}"
|
|
||||||
}
|
|
||||||
require(type.arguments.size == valueClass.typeParameters.size) {
|
|
||||||
"Unexpected number of type arguments: ${type.arguments.size} for ${valueClass.typeParameters.size} parameters"
|
|
||||||
}
|
|
||||||
require(type.arguments.size == symbol.owner.typeParameters.size) {
|
|
||||||
"Unexpected number of type arguments: ${type.arguments.size} for ${symbol.owner.typeParameters.size} parameters"
|
|
||||||
}
|
|
||||||
for (i in valueClass.typeParameters.indices) {
|
|
||||||
putTypeArgument(i, type.arguments[i].typeOrNull?.substitute(substitutionMap))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun makeNodes2FieldExpressions(fields: List<IrField>): Map<MultiFieldValueClassTree, IrBuilderWithScope.(IrFunction) -> IrExpression> {
|
|
||||||
fun proceed(node: MultiFieldValueClassTree): Map<MultiFieldValueClassTree, IrBuilderWithScope.(function: IrFunction) -> IrExpression> =
|
|
||||||
when (node) {
|
|
||||||
is InternalNode -> buildMap {
|
|
||||||
val innerDeclarations =
|
|
||||||
if (node.irClass == valueClass) this@MultiFieldValueClassSpecificDeclarations
|
|
||||||
else replacements.getDeclarations(node.irClass)!!
|
|
||||||
put(node) { function ->
|
|
||||||
irCall(innerDeclarations.boxMethod).apply {
|
|
||||||
copyTypeArgumentsFromType(node.type, node.irClass, mapOf())
|
|
||||||
indexesByInternalNode[node]!!.forEachIndexed { index, nodeIndex ->
|
|
||||||
putValueArgument(index, fieldGetter(function.dispatchReceiverParameter!!, fields[nodeIndex]))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
node.fields.forEach { putAll(proceed(it.node)) }
|
|
||||||
}
|
|
||||||
is Leaf -> mapOf(node to { fieldGetter(it.dispatchReceiverParameter!!, fields[indexByLeaf[node]!!]) })
|
|
||||||
}
|
|
||||||
return proceed(loweringRepresentation)
|
|
||||||
}
|
|
||||||
|
|
||||||
data class VirtualProperty(
|
|
||||||
val type: IrType,
|
|
||||||
val makeGetter: ExpressionGenerator,
|
|
||||||
val assigner: ExpressionSupplier?,
|
|
||||||
val symbol: IrValueSymbol?
|
|
||||||
) {
|
|
||||||
constructor(declaration: IrValueDeclaration) : this(
|
|
||||||
declaration.type,
|
|
||||||
{ irGet(declaration) },
|
|
||||||
if (declaration.isAssignable) { value -> irSet(declaration, value) } else null,
|
|
||||||
declaration.symbol,
|
|
||||||
)
|
|
||||||
|
|
||||||
val isAssignable: Boolean
|
|
||||||
get() = assigner != null
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Multi-field value class instance can be not only a standalone instance but also:
|
|
||||||
* 1. A slice of fields in another multi-field class instance;
|
|
||||||
* 2. A slice of fields in another regular class instance;
|
|
||||||
* 3. Virtual instance constructed with local variables;
|
|
||||||
* 4. Virtual instance constructed with local parameters;
|
|
||||||
* 5. Virtual instance constructed with local fields;
|
|
||||||
* 6. Some mix of the above ones.
|
|
||||||
*/
|
|
||||||
inner class ImplementationAgnostic constructor(val type: IrSimpleType, val virtualFields: List<VirtualProperty>) {
|
|
||||||
val regularDeclarations = this@MultiFieldValueClassSpecificDeclarations
|
|
||||||
val symbols = virtualFields.map { it.symbol }
|
|
||||||
private val substitutionMap = valueClass.typeParameters.map { it.symbol }.zip(type.arguments.map { it.typeOrNull })
|
|
||||||
.mapNotNull { (parameter, type) -> if (type != null) parameter to type else null }.toMap()
|
|
||||||
|
|
||||||
init {
|
|
||||||
require(virtualFields.size == leaves.size) { "Wrong symbols number given for $leaves, got $virtualFields" }
|
|
||||||
for ((actual, expected) in virtualFields.map { it.type } zip leaves.map { it.type }) {
|
|
||||||
require(actual.upperBound.isSubtypeOf(expected.upperBound, typeSystemContext)) {
|
|
||||||
"${actual.render()} is not a subtype of ${expected.render()} for MFVC ${valueClass.render()}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private val nodeToSymbols = indexesByInternalNode.mapValues { (_, indexes) -> virtualFields.slice(indexes) } +
|
|
||||||
indexByLeaf.mapValues { (_, index) -> listOf(virtualFields[index]) }
|
|
||||||
|
|
||||||
private val internalNodeToExpressionGetters: Map<InternalNode, ExpressionGenerator> =
|
|
||||||
indexesByInternalNode.mapValues { (node, indexes) ->
|
|
||||||
{
|
|
||||||
val arguments = virtualFields.slice(indexes).map { it.makeGetter(this) }
|
|
||||||
val innerDeclarations = replacements.getDeclarations(node.irClass)!!
|
|
||||||
irCall(innerDeclarations.boxMethod).apply {
|
|
||||||
copyTypeArgumentsFromType(node.type, node.irClass, substitutionMap)
|
|
||||||
for (i in arguments.indices) {
|
|
||||||
putValueArgument(i, arguments[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private val leavesToExpressionGetters: Map<Leaf, ExpressionGenerator> =
|
|
||||||
indexByLeaf.mapValues { (_, index) -> { virtualFields[index].makeGetter(this) } }
|
|
||||||
|
|
||||||
val nodeToExpressionGetters: Map<MultiFieldValueClassTree, ExpressionGenerator> =
|
|
||||||
internalNodeToExpressionGetters + leavesToExpressionGetters
|
|
||||||
|
|
||||||
operator fun get(name: Name): Pair<ExpressionGenerator, ImplementationAgnostic?>? =
|
|
||||||
when (val field = loweringRepresentation[name]) {
|
|
||||||
null -> null
|
|
||||||
else -> nodeToExpressionGetters[field.node]!! to when (field.node) {
|
|
||||||
is Leaf -> null
|
|
||||||
is InternalNode -> {
|
|
||||||
val irClass = field.node.irClass
|
|
||||||
val declarations = replacements.getDeclarations(irClass)!!
|
|
||||||
declarations.ImplementationAgnostic(field.type as IrSimpleType, nodeToSymbols[field.node]!!)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val boxedExpression = nodeToExpressionGetters[loweringRepresentation]!!
|
|
||||||
|
|
||||||
// todo default parameters
|
|
||||||
// todo annotations etc.
|
|
||||||
// todo visibilities etc.
|
|
||||||
// todo regenerate tests for not only jvm
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
typealias ExpressionGenerator = IrBuilderWithScope.() -> IrExpression
|
|
||||||
typealias ExpressionSupplier = IrBuilderWithScope.(IrExpression) -> IrStatement
|
|
||||||
@@ -8,10 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.ir
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.backend.common.lower.at
|
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.jvm.CachedFieldsForObjectInstances
|
import org.jetbrains.kotlin.backend.jvm.*
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmSymbols
|
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames
|
import org.jetbrains.kotlin.builtins.StandardNames
|
||||||
import org.jetbrains.kotlin.codegen.ASSERTIONS_DISABLED_FIELD_NAME
|
import org.jetbrains.kotlin.codegen.ASSERTIONS_DISABLED_FIELD_NAME
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil
|
import org.jetbrains.kotlin.codegen.AsmUtil
|
||||||
@@ -246,6 +243,8 @@ fun IrSimpleFunction.copyCorrespondingPropertyFrom(source: IrSimpleFunction) {
|
|||||||
fun IrProperty.needsAccessor(accessor: IrSimpleFunction): Boolean = when {
|
fun IrProperty.needsAccessor(accessor: IrSimpleFunction): Boolean = when {
|
||||||
// Properties in annotation classes become abstract methods named after the property.
|
// Properties in annotation classes become abstract methods named after the property.
|
||||||
(parent as? IrClass)?.kind == ClassKind.ANNOTATION_CLASS -> true
|
(parent as? IrClass)?.kind == ClassKind.ANNOTATION_CLASS -> true
|
||||||
|
// Multi-field value class getters must always be added. Getters for properties of MFVC itself follow general rules.
|
||||||
|
accessor.isGetter && !accessor.parent.let { it is IrClass && it.isMultiFieldValueClass } && accessor.returnType.needsMfvcFlattening() -> true
|
||||||
// @JvmField properties have no getters/setters
|
// @JvmField properties have no getters/setters
|
||||||
resolveFakeOverride()?.backingField?.hasAnnotation(JvmAbi.JVM_FIELD_ANNOTATION_FQ_NAME) == true -> false
|
resolveFakeOverride()?.backingField?.hasAnnotation(JvmAbi.JVM_FIELD_ANNOTATION_FQ_NAME) == true -> false
|
||||||
// We do not produce default accessors for private fields
|
// We do not produce default accessors for private fields
|
||||||
|
|||||||
@@ -53,11 +53,13 @@ fun <T : IrElement> IrStatementsBuilder<T>.irTemporary(
|
|||||||
nameHint: String? = null,
|
nameHint: String? = null,
|
||||||
irType: IrType = value?.type!!, // either value or irType should be supplied at callsite
|
irType: IrType = value?.type!!, // either value or irType should be supplied at callsite
|
||||||
isMutable: Boolean = false,
|
isMutable: Boolean = false,
|
||||||
|
origin: IrDeclarationOrigin = IrDeclarationOrigin.IR_TEMPORARY_VARIABLE,
|
||||||
): IrVariable {
|
): IrVariable {
|
||||||
val temporary = scope.createTemporaryVariableDeclaration(
|
val temporary = scope.createTemporaryVariableDeclaration(
|
||||||
irType, nameHint, isMutable,
|
irType, nameHint, isMutable,
|
||||||
startOffset = startOffset,
|
startOffset = startOffset,
|
||||||
endOffset = endOffset
|
endOffset = endOffset,
|
||||||
|
origin = origin,
|
||||||
)
|
)
|
||||||
value?.let { temporary.initializer = it }
|
value?.let { temporary.initializer = it }
|
||||||
+temporary
|
+temporary
|
||||||
|
|||||||
@@ -44,6 +44,8 @@ interface IrDeclarationOrigin {
|
|||||||
object GENERATED_SINGLE_FIELD_VALUE_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_SINGLE_FIELD_VALUE_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 GENERATED_MULTI_FIELD_VALUE_CLASS_MEMBER : IrDeclarationOriginImpl("GENERATED_MULTI_FIELD_VALUE_CLASS_MEMBER")
|
||||||
object GENERATED_MULTI_FIELD_VALUE_CLASS_PARAMETER : IrDeclarationOriginImpl("GENERATED_MULTI_FIELD_VALUE_CLASS_PARAMETER")
|
object GENERATED_MULTI_FIELD_VALUE_CLASS_PARAMETER : IrDeclarationOriginImpl("GENERATED_MULTI_FIELD_VALUE_CLASS_PARAMETER")
|
||||||
|
object TEMPORARY_MULTI_FIELD_VALUE_CLASS_VARIABLE : IrDeclarationOriginImpl("TEMPORARY_MULTI_FIELD_VALUE_CLASS_VARIABLE")
|
||||||
|
object MULTI_FIELD_VALUE_CLASS_REPRESENTATION_VARIABLE : IrDeclarationOriginImpl("MULTI_FIELD_VALUE_CLASS_REPRESENTATION_VARIABLE")
|
||||||
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")
|
||||||
|
|||||||
+27
-27
@@ -1,61 +1,61 @@
|
|||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class A {
|
public final class A {
|
||||||
// source: 'MFVCFieldInitializationOrder.kt'
|
// source: 'MfvcFieldInitializationOrder.kt'
|
||||||
private field x$x: double
|
private field x-0: double
|
||||||
private field x$y: double
|
private field x-1: double
|
||||||
public method <init>(p0: double, p1: double): void
|
public method <init>(p0: double, p1: double): void
|
||||||
public final method getX$x(): double
|
|
||||||
public final method getX$y(): double
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getX(): DPoint
|
public final @org.jetbrains.annotations.NotNull method getX(): DPoint
|
||||||
|
public synthetic final method getX-0(): double
|
||||||
|
public synthetic final method getX-1(): double
|
||||||
public final method setX-sUp7gFk(p0: double, p1: double): void
|
public final method setX-sUp7gFk(p0: double, p1: double): void
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class B {
|
public final class B {
|
||||||
// source: 'MFVCFieldInitializationOrder.kt'
|
// source: 'MfvcFieldInitializationOrder.kt'
|
||||||
private field a$x: double
|
private field a-0: double
|
||||||
private field a$y: double
|
private field a-1: double
|
||||||
private field b$x: double
|
private final field b-0: double
|
||||||
private field b$y: double
|
private final field b-1: double
|
||||||
private field c$x: double
|
private final field c-0: double
|
||||||
private field c$y: double
|
private final field c-1: double
|
||||||
public method <init>(): void
|
public method <init>(): void
|
||||||
public final method getA$x(): double
|
|
||||||
public final method getA$y(): double
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getA(): DPoint
|
public final @org.jetbrains.annotations.NotNull method getA(): DPoint
|
||||||
public final method getB$x(): double
|
public synthetic final method getA-0(): double
|
||||||
public final method getB$y(): double
|
public synthetic final method getA-1(): double
|
||||||
public final @org.jetbrains.annotations.NotNull method getB(): DPoint
|
public final @org.jetbrains.annotations.NotNull method getB(): DPoint
|
||||||
public final method getC$x(): double
|
public synthetic final method getB-0(): double
|
||||||
public final method getC$y(): double
|
public synthetic final method getB-1(): double
|
||||||
public final @org.jetbrains.annotations.NotNull method getC(): DPoint
|
public final @org.jetbrains.annotations.NotNull method getC(): DPoint
|
||||||
|
public synthetic final method getC-0(): double
|
||||||
|
public synthetic final method getC-1(): double
|
||||||
public final method setA-sUp7gFk(p0: double, p1: double): void
|
public final method setA-sUp7gFk(p0: double, p1: double): void
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class DPoint {
|
public final class DPoint {
|
||||||
// source: 'MFVCFieldInitializationOrder.kt'
|
// source: 'MfvcFieldInitializationOrder.kt'
|
||||||
private field x: double
|
private final field field-0: double
|
||||||
private field y: double
|
private final field field-1: double
|
||||||
private synthetic method <init>(p0: double, p1: double): void
|
private synthetic method <init>(p0: double, p1: double): void
|
||||||
public synthetic final static method box-impl(p0: double, p1: double): DPoint
|
public synthetic final static method box-impl(p0: double, p1: double): DPoint
|
||||||
public final static method constructor-impl(p0: double, p1: double): void
|
public final static method constructor-impl(p0: double, p1: double): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: double, p1: double, p2: java.lang.Object): boolean
|
public static method equals-impl(p0: double, p1: double, p2: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: double, p1: double, p2: double, p3: double): boolean
|
public final static method equals-impl0(p0: double, p1: double, p2: double, p3: double): boolean
|
||||||
public final method getX(): double
|
public final static method getX-impl(p0: double, p1: double): double
|
||||||
public final method getY(): double
|
public final static method getY-impl(p0: double, p1: double): double
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: double, p1: double): int
|
public static method hashCode-impl(p0: double, p1: double): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: double, p1: double): java.lang.String
|
public static method toString-impl(p0: double, p1: double): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): double
|
public synthetic final method unbox-impl-0(): double
|
||||||
public synthetic final method unbox-impl1(): double
|
public synthetic final method unbox-impl-1(): double
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class MFVCFieldInitializationOrderKt {
|
public final class MfvcFieldInitializationOrderKt {
|
||||||
// source: 'MFVCFieldInitializationOrder.kt'
|
// source: 'MfvcFieldInitializationOrder.kt'
|
||||||
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
|
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
// TARGET_BACKEND: JVM_IR
|
// TARGET_BACKEND: JVM_IR
|
||||||
// WORKS_WHEN_VALUE_CLASS
|
// WORKS_WHEN_VALUE_CLASS
|
||||||
// LANGUAGE: +ValueClasses
|
// LANGUAGE: +ValueClasses
|
||||||
|
// CHECK_BYTECODE_LISTING
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class IC(val x: UInt)
|
value class IC(val x: UInt)
|
||||||
@@ -18,4 +19,12 @@ value class GreaterMFVC(val x: SimpleMFVC, val y: IC, val z: SimpleMFVC)
|
|||||||
|
|
||||||
fun gmfvc(ic: IC, x: GreaterMFVC, ic1: UInt) = smfvc(ic, x.x, 0U) + ic(x.y) + smfvc(IC(0U), x.z, ic1)
|
fun gmfvc(ic: IC, x: GreaterMFVC, ic1: UInt) = smfvc(ic, x.x, 0U) + ic(x.y) + smfvc(IC(0U), x.z, ic1)
|
||||||
|
|
||||||
fun box() = "OK" // todo real test
|
fun box(): String {
|
||||||
|
val o1 = IC(2U)
|
||||||
|
require(ic(o1) == 2U)
|
||||||
|
val o2 = SimpleMFVC(1U, o1, "3")
|
||||||
|
require(smfvc(IC(4U), o2, 5U) == 12U)
|
||||||
|
val o3 = GreaterMFVC(o2, IC(6U), SimpleMFVC(7U, IC(8U), "9"))
|
||||||
|
require(gmfvc(IC(10U), o3, 11U) == 45U)
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
@kotlin.Metadata
|
||||||
|
public final class ClassFlatteningKt {
|
||||||
|
// source: 'classFlattening.kt'
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
|
||||||
|
public final static method gmfvc-Ket90g4(p0: int, p1: int, p2: int, @org.jetbrains.annotations.NotNull p3: java.lang.String, p4: int, p5: int, p6: int, @org.jetbrains.annotations.NotNull p7: java.lang.String, p8: int): int
|
||||||
|
public final static method ic-K5cTq2M(p0: int): int
|
||||||
|
public final static method smfvc-Ket90g4(p0: int, p1: int, p2: int, @org.jetbrains.annotations.NotNull p3: java.lang.String, p4: int): int
|
||||||
|
}
|
||||||
|
|
||||||
|
@kotlin.jvm.JvmInline
|
||||||
|
@kotlin.Metadata
|
||||||
|
public final class GreaterMFVC {
|
||||||
|
// source: 'classFlattening.kt'
|
||||||
|
private final field field-0-0: int
|
||||||
|
private final field field-0-1: int
|
||||||
|
private final @org.jetbrains.annotations.NotNull field field-0-2: java.lang.String
|
||||||
|
private final field field-1: int
|
||||||
|
private final field field-2-0: int
|
||||||
|
private final field field-2-1: int
|
||||||
|
private final @org.jetbrains.annotations.NotNull field field-2-2: java.lang.String
|
||||||
|
private synthetic method <init>(p0: int, p1: int, p2: java.lang.String, p3: int, p4: int, p5: int, p6: java.lang.String): void
|
||||||
|
public synthetic final static method box-impl(p0: int, p1: int, p2: java.lang.String, p3: int, p4: int, p5: int, p6: java.lang.String): GreaterMFVC
|
||||||
|
public final static method constructor-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String): void
|
||||||
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.String, p3: int, p4: int, p5: int, p6: java.lang.String, p7: java.lang.Object): boolean
|
||||||
|
public final static method equals-impl0(p0: int, p1: int, p2: java.lang.String, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String, p10: int, p11: int, p12: int, p13: java.lang.String): boolean
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getX-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String): SimpleMFVC
|
||||||
|
public final static method getY-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String): int
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getZ-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String): SimpleMFVC
|
||||||
|
public method hashCode(): int
|
||||||
|
public static method hashCode-impl(p0: int, p1: int, p2: java.lang.String, p3: int, p4: int, p5: int, p6: java.lang.String): int
|
||||||
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
|
public static method toString-impl(p0: int, p1: int, p2: java.lang.String, p3: int, p4: int, p5: int, p6: java.lang.String): java.lang.String
|
||||||
|
public synthetic final method unbox-impl-0(): SimpleMFVC
|
||||||
|
public synthetic final method unbox-impl-0-0(): int
|
||||||
|
public synthetic final method unbox-impl-0-1(): int
|
||||||
|
public synthetic final method unbox-impl-0-2(): java.lang.String
|
||||||
|
public synthetic final method unbox-impl-1(): int
|
||||||
|
public synthetic final method unbox-impl-2(): SimpleMFVC
|
||||||
|
public synthetic final method unbox-impl-2-0(): int
|
||||||
|
public synthetic final method unbox-impl-2-1(): int
|
||||||
|
public synthetic final method unbox-impl-2-2(): java.lang.String
|
||||||
|
}
|
||||||
|
|
||||||
|
@kotlin.jvm.JvmInline
|
||||||
|
@kotlin.Metadata
|
||||||
|
public final class IC {
|
||||||
|
// source: 'classFlattening.kt'
|
||||||
|
private final field x: int
|
||||||
|
private synthetic method <init>(p0: int): void
|
||||||
|
public synthetic final static method box-impl(p0: int): IC
|
||||||
|
public static method constructor-impl(p0: int): int
|
||||||
|
public method equals(p0: java.lang.Object): boolean
|
||||||
|
public static method equals-impl(p0: int, p1: java.lang.Object): boolean
|
||||||
|
public final static method equals-impl0(p0: int, p1: int): boolean
|
||||||
|
public final method getX-pVg5ArA(): int
|
||||||
|
public method hashCode(): int
|
||||||
|
public static method hashCode-impl(p0: int): int
|
||||||
|
public method toString(): java.lang.String
|
||||||
|
public static method toString-impl(p0: int): java.lang.String
|
||||||
|
public synthetic final method unbox-impl(): int
|
||||||
|
}
|
||||||
|
|
||||||
|
@kotlin.jvm.JvmInline
|
||||||
|
@kotlin.Metadata
|
||||||
|
public final class SimpleMFVC {
|
||||||
|
// source: 'classFlattening.kt'
|
||||||
|
private final field field-0: int
|
||||||
|
private final field field-1: int
|
||||||
|
private final @org.jetbrains.annotations.NotNull field field-2: java.lang.String
|
||||||
|
private synthetic method <init>(p0: int, p1: int, p2: java.lang.String): void
|
||||||
|
public synthetic final static method box-impl(p0: int, p1: int, p2: java.lang.String): SimpleMFVC
|
||||||
|
public final static method constructor-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): void
|
||||||
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.String, p3: java.lang.Object): boolean
|
||||||
|
public final static method equals-impl0(p0: int, p1: int, p2: java.lang.String, p3: int, p4: int, p5: java.lang.String): boolean
|
||||||
|
public final static method getX-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): int
|
||||||
|
public final static method getY-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): int
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getZ-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): java.lang.String
|
||||||
|
public method hashCode(): int
|
||||||
|
public static method hashCode-impl(p0: int, p1: int, p2: java.lang.String): int
|
||||||
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
|
public static method toString-impl(p0: int, p1: int, p2: java.lang.String): java.lang.String
|
||||||
|
public synthetic final method unbox-impl-0(): int
|
||||||
|
public synthetic final method unbox-impl-1(): int
|
||||||
|
public synthetic final method unbox-impl-2(): java.lang.String
|
||||||
|
}
|
||||||
+139
-78
@@ -40,6 +40,15 @@ public final class B {
|
|||||||
public final class Base1$DefaultImpls {
|
public final class Base1$DefaultImpls {
|
||||||
// source: 'complex.kt'
|
// source: 'complex.kt'
|
||||||
public static @org.jetbrains.annotations.NotNull method getFakeOverrideMFVC(@org.jetbrains.annotations.NotNull p0: Base1): R
|
public static @org.jetbrains.annotations.NotNull method getFakeOverrideMFVC(@org.jetbrains.annotations.NotNull p0: Base1): R
|
||||||
|
public synthetic static method getFakeOverrideMFVC-0(p0: Base1): int
|
||||||
|
public synthetic static method getFakeOverrideMFVC-1(p0: Base1): int
|
||||||
|
public synthetic static method getFakeOverrideMFVC-2(p0: Base1): E
|
||||||
|
public synthetic static method getFakeOverrideMFVC-2-0(p0: Base1): D
|
||||||
|
public synthetic static method getFakeOverrideMFVC-2-0-0(p0: Base1): C
|
||||||
|
public synthetic static method getFakeOverrideMFVC-2-0-0-0(p0: Base1): int
|
||||||
|
public synthetic static method getFakeOverrideMFVC-2-0-0-1(p0: Base1): int
|
||||||
|
public synthetic static method getFakeOverrideMFVC-2-0-0-2(p0: Base1): java.lang.String
|
||||||
|
public synthetic static method getFakeOverrideMFVC-3(p0: Base1): java.util.List
|
||||||
public static method getFakeOverrideRegular(@org.jetbrains.annotations.NotNull p0: Base1): int
|
public static method getFakeOverrideRegular(@org.jetbrains.annotations.NotNull p0: Base1): int
|
||||||
public final inner class Base1$DefaultImpls
|
public final inner class Base1$DefaultImpls
|
||||||
}
|
}
|
||||||
@@ -48,6 +57,15 @@ public final class Base1$DefaultImpls {
|
|||||||
public interface Base1 {
|
public interface Base1 {
|
||||||
// source: 'complex.kt'
|
// source: 'complex.kt'
|
||||||
public abstract @org.jetbrains.annotations.NotNull method getFakeOverrideMFVC(): R
|
public abstract @org.jetbrains.annotations.NotNull method getFakeOverrideMFVC(): R
|
||||||
|
public synthetic abstract method getFakeOverrideMFVC-0(): int
|
||||||
|
public synthetic abstract method getFakeOverrideMFVC-1(): int
|
||||||
|
public synthetic abstract method getFakeOverrideMFVC-2(): E
|
||||||
|
public synthetic abstract method getFakeOverrideMFVC-2-0(): D
|
||||||
|
public synthetic abstract method getFakeOverrideMFVC-2-0-0(): C
|
||||||
|
public synthetic abstract method getFakeOverrideMFVC-2-0-0-0(): int
|
||||||
|
public synthetic abstract method getFakeOverrideMFVC-2-0-0-1(): int
|
||||||
|
public synthetic abstract method getFakeOverrideMFVC-2-0-0-2(): java.lang.String
|
||||||
|
public synthetic abstract method getFakeOverrideMFVC-3(): java.util.List
|
||||||
public abstract method getFakeOverrideRegular(): int
|
public abstract method getFakeOverrideRegular(): int
|
||||||
public final inner class Base1$DefaultImpls
|
public final inner class Base1$DefaultImpls
|
||||||
}
|
}
|
||||||
@@ -56,6 +74,15 @@ public interface Base1 {
|
|||||||
public interface Base2 {
|
public interface Base2 {
|
||||||
// source: 'complex.kt'
|
// source: 'complex.kt'
|
||||||
public abstract @org.jetbrains.annotations.NotNull method getL(): R
|
public abstract @org.jetbrains.annotations.NotNull method getL(): R
|
||||||
|
public synthetic abstract method getL-0(): int
|
||||||
|
public synthetic abstract method getL-1(): int
|
||||||
|
public synthetic abstract method getL-2(): E
|
||||||
|
public synthetic abstract method getL-2-0(): D
|
||||||
|
public synthetic abstract method getL-2-0-0(): C
|
||||||
|
public synthetic abstract method getL-2-0-0-0(): int
|
||||||
|
public synthetic abstract method getL-2-0-0-1(): int
|
||||||
|
public synthetic abstract method getL-2-0-0-2(): java.lang.String
|
||||||
|
public synthetic abstract method getL-3(): java.util.List
|
||||||
public abstract method setL-sUp7gFk(p0: int, p1: int, p2: int, p3: int, @org.jetbrains.annotations.NotNull p4: java.lang.String, @org.jetbrains.annotations.NotNull p5: java.util.List): void
|
public abstract method setL-sUp7gFk(p0: int, p1: int, p2: int, p3: int, @org.jetbrains.annotations.NotNull p4: java.lang.String, @org.jetbrains.annotations.NotNull p5: java.util.List): void
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,6 +90,11 @@ public interface Base2 {
|
|||||||
public interface Base3 {
|
public interface Base3 {
|
||||||
// source: 'complex.kt'
|
// source: 'complex.kt'
|
||||||
public abstract @org.jetbrains.annotations.NotNull method getZ(): E
|
public abstract @org.jetbrains.annotations.NotNull method getZ(): E
|
||||||
|
public synthetic abstract method getZ-0(): D
|
||||||
|
public synthetic abstract method getZ-0-0(): C
|
||||||
|
public synthetic abstract method getZ-0-0-0(): int
|
||||||
|
public synthetic abstract method getZ-0-0-1(): int
|
||||||
|
public synthetic abstract method getZ-0-0-2(): java.lang.String
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
@@ -76,25 +108,25 @@ public interface Base4 {
|
|||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class C {
|
public final class C {
|
||||||
// source: 'complex.kt'
|
// source: 'complex.kt'
|
||||||
private field x: int
|
private final field field-0: int
|
||||||
private field y: int
|
private final field field-1: int
|
||||||
private @org.jetbrains.annotations.NotNull field z: java.lang.String
|
private final @org.jetbrains.annotations.NotNull field field-2: java.lang.String
|
||||||
private synthetic method <init>(p0: int, p1: int, p2: java.lang.String): void
|
private synthetic method <init>(p0: int, p1: int, p2: java.lang.String): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int, p2: java.lang.String): C
|
public synthetic final static method box-impl(p0: int, p1: int, p2: java.lang.String): C
|
||||||
public final static method constructor-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): void
|
public final static method constructor-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: java.lang.String, p3: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.String, p3: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: java.lang.String, p3: int, p4: int, p5: java.lang.String): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: java.lang.String, p3: int, p4: int, p5: java.lang.String): boolean
|
||||||
public final method getX(): int
|
public final static method getX-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): int
|
||||||
public final method getY-GsR9Xnw(): int
|
public final static method getY-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getZ(): java.lang.String
|
public final static @org.jetbrains.annotations.NotNull method getZ-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): java.lang.String
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int, p2: java.lang.String): int
|
public static method hashCode-impl(p0: int, p1: int, p2: java.lang.String): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int, p2: java.lang.String): java.lang.String
|
public static method toString-impl(p0: int, p1: int, p2: java.lang.String): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): int
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-1(): int
|
||||||
public synthetic final method unbox-impl2(): java.lang.String
|
public synthetic final method unbox-impl-2(): java.lang.String
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
@@ -118,9 +150,9 @@ public final class ComplexKt {
|
|||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class D {
|
public final class D {
|
||||||
// source: 'complex.kt'
|
// source: 'complex.kt'
|
||||||
private field x$x: int
|
private final field field-0-0: int
|
||||||
private field x$y: int
|
private final field field-0-1: int
|
||||||
private @org.jetbrains.annotations.NotNull field x$z: java.lang.String
|
private final @org.jetbrains.annotations.NotNull field field-0-2: java.lang.String
|
||||||
private synthetic method <init>(p0: int, p1: int, p2: java.lang.String): void
|
private synthetic method <init>(p0: int, p1: int, p2: java.lang.String): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int, p2: java.lang.String): D
|
public synthetic final static method box-impl(p0: int, p1: int, p2: java.lang.String): D
|
||||||
public final static method constructor-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): void
|
public final static method constructor-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): void
|
||||||
@@ -128,26 +160,24 @@ public final class D {
|
|||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: java.lang.String, p3: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.String, p3: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: java.lang.String, p3: int, p4: int, p5: java.lang.String): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: java.lang.String, p3: int, p4: int, p5: java.lang.String): boolean
|
||||||
public final method getX$x(): int
|
public final static @org.jetbrains.annotations.NotNull method getX-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): C
|
||||||
public final method getX$y-GsR9Xnw(): int
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getX$z(): java.lang.String
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getX(): C
|
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int, p2: java.lang.String): int
|
public static method hashCode-impl(p0: int, p1: int, p2: java.lang.String): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int, p2: java.lang.String): java.lang.String
|
public static method toString-impl(p0: int, p1: int, p2: java.lang.String): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): C
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-0-0(): int
|
||||||
public synthetic final method unbox-impl2(): java.lang.String
|
public synthetic final method unbox-impl-0-1(): int
|
||||||
|
public synthetic final method unbox-impl-0-2(): java.lang.String
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class E {
|
public final class E {
|
||||||
// source: 'complex.kt'
|
// source: 'complex.kt'
|
||||||
private field x$x$x: int
|
private final field field-0-0-0: int
|
||||||
private field x$x$y: int
|
private final field field-0-0-1: int
|
||||||
private @org.jetbrains.annotations.NotNull field x$x$z: java.lang.String
|
private final @org.jetbrains.annotations.NotNull field field-0-0-2: java.lang.String
|
||||||
private synthetic method <init>(p0: int, p1: int, p2: java.lang.String): void
|
private synthetic method <init>(p0: int, p1: int, p2: java.lang.String): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int, p2: java.lang.String): E
|
public synthetic final static method box-impl(p0: int, p1: int, p2: java.lang.String): E
|
||||||
public final static method constructor-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): void
|
public final static method constructor-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): void
|
||||||
@@ -155,61 +185,86 @@ public final class E {
|
|||||||
public static method equals-impl(p0: int, p1: int, p2: java.lang.String, p3: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.String, p3: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: java.lang.String, p3: int, p4: int, p5: java.lang.String): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: java.lang.String, p3: int, p4: int, p5: java.lang.String): boolean
|
||||||
public final static @org.jetbrains.annotations.NotNull method getWithNonTrivialSetters-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): D
|
public final static @org.jetbrains.annotations.NotNull method getWithNonTrivialSetters-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): D
|
||||||
public final method getX$x$x(): int
|
public final static @org.jetbrains.annotations.NotNull method getX-impl(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String): D
|
||||||
public final method getX$x$y-GsR9Xnw(): int
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getX$x$z(): java.lang.String
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getX$x(): C
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getX(): D
|
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int, p2: java.lang.String): int
|
public static method hashCode-impl(p0: int, p1: int, p2: java.lang.String): int
|
||||||
public final static method setWithNonTrivialSetters-sUp7gFk(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String, p3: int, p4: int, @org.jetbrains.annotations.NotNull p5: java.lang.String): void
|
public final static method setWithNonTrivialSetters-sUp7gFk(p0: int, p1: int, @org.jetbrains.annotations.NotNull p2: java.lang.String, p3: int, p4: int, @org.jetbrains.annotations.NotNull p5: java.lang.String): void
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int, p2: java.lang.String): java.lang.String
|
public static method toString-impl(p0: int, p1: int, p2: java.lang.String): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): D
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-0-0(): C
|
||||||
public synthetic final method unbox-impl2(): java.lang.String
|
public synthetic final method unbox-impl-0-0-0(): int
|
||||||
|
public synthetic final method unbox-impl-0-0-1(): int
|
||||||
|
public synthetic final method unbox-impl-0-0-2(): java.lang.String
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class NotInlined {
|
public final class NotInlined {
|
||||||
// source: 'complex.kt'
|
// source: 'complex.kt'
|
||||||
private @org.jetbrains.annotations.NotNull field l$t: java.util.List
|
private field l-0: int
|
||||||
private field l$x: int
|
private field l-1: int
|
||||||
private field l$y: int
|
private field l-2-0-0-0: int
|
||||||
private field l$z$x$x$x: int
|
private field l-2-0-0-1: int
|
||||||
private field l$z$x$x$y: int
|
private @org.jetbrains.annotations.NotNull field l-2-0-0-2: java.lang.String
|
||||||
private @org.jetbrains.annotations.NotNull field l$z$x$x$z: java.lang.String
|
private @org.jetbrains.annotations.NotNull field l-3: java.util.List
|
||||||
private @org.jetbrains.annotations.NotNull field withNonTrivialGettersWithBF$t: java.util.List
|
private final field withNonTrivialGettersWithBF-0: int
|
||||||
private field withNonTrivialGettersWithBF$x: int
|
private final field withNonTrivialGettersWithBF-1: int
|
||||||
private field withNonTrivialGettersWithBF$y: int
|
private final field withNonTrivialGettersWithBF-2-0-0-0: int
|
||||||
private field withNonTrivialGettersWithBF$z$x$x$x: int
|
private final field withNonTrivialGettersWithBF-2-0-0-1: int
|
||||||
private field withNonTrivialGettersWithBF$z$x$x$y: int
|
private final @org.jetbrains.annotations.NotNull field withNonTrivialGettersWithBF-2-0-0-2: java.lang.String
|
||||||
private @org.jetbrains.annotations.NotNull field withNonTrivialGettersWithBF$z$x$x$z: java.lang.String
|
private final @org.jetbrains.annotations.NotNull field withNonTrivialGettersWithBF-3: java.util.List
|
||||||
private @org.jetbrains.annotations.NotNull field withNonTrivialSettersWithBF$t: java.util.List
|
private field withNonTrivialSettersWithBF-0: int
|
||||||
private field withNonTrivialSettersWithBF$x: int
|
private field withNonTrivialSettersWithBF-1: int
|
||||||
private field withNonTrivialSettersWithBF$y: int
|
private field withNonTrivialSettersWithBF-2-0-0-0: int
|
||||||
private field withNonTrivialSettersWithBF$z$x$x$x: int
|
private field withNonTrivialSettersWithBF-2-0-0-1: int
|
||||||
private field withNonTrivialSettersWithBF$z$x$x$y: int
|
private @org.jetbrains.annotations.NotNull field withNonTrivialSettersWithBF-2-0-0-2: java.lang.String
|
||||||
private @org.jetbrains.annotations.NotNull field withNonTrivialSettersWithBF$z$x$x$z: java.lang.String
|
private @org.jetbrains.annotations.NotNull field withNonTrivialSettersWithBF-3: java.util.List
|
||||||
private field y: int
|
private field y: int
|
||||||
private method <init>(p0: int, p1: int, p2: int, p3: int, p4: java.lang.String, p5: java.util.List, p6: int): void
|
private method <init>(p0: int, p1: int, p2: int, p3: int, p4: java.lang.String, p5: java.util.List, p6: int): void
|
||||||
public synthetic method <init>(p0: int, p1: int, p2: int, p3: int, p4: java.lang.String, p5: java.util.List, p6: int, p7: kotlin.jvm.internal.DefaultConstructorMarker): void
|
public synthetic method <init>(p0: int, p1: int, p2: int, p3: int, p4: java.lang.String, p5: java.util.List, p6: int, p7: kotlin.jvm.internal.DefaultConstructorMarker): void
|
||||||
public @org.jetbrains.annotations.NotNull method getFakeOverrideMFVC(): R
|
public @org.jetbrains.annotations.NotNull method getFakeOverrideMFVC(): R
|
||||||
public method getFakeOverrideRegular(): int
|
public method getFakeOverrideRegular(): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getL$t-GKOAj6k(): java.util.List
|
|
||||||
public final method getL$x(): int
|
|
||||||
public final method getL$y-pVg5ArA(): int
|
|
||||||
public final method getL$z$x$x$x(): int
|
|
||||||
public final method getL$z$x$x$y-GsR9Xnw(): int
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getL$z$x$x$z(): java.lang.String
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getL$z$x$x(): C
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getL$z$x(): D
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getL$z(): E
|
|
||||||
public @org.jetbrains.annotations.NotNull method getL(): R
|
public @org.jetbrains.annotations.NotNull method getL(): R
|
||||||
public synthetic bridge method getL(): java.lang.Object
|
public synthetic bridge method getL(): java.lang.Object
|
||||||
|
public synthetic method getL-0(): int
|
||||||
|
public synthetic method getL-1(): int
|
||||||
|
public synthetic method getL-2(): E
|
||||||
|
public synthetic method getL-2-0(): D
|
||||||
|
public synthetic method getL-2-0-0(): C
|
||||||
|
public synthetic method getL-2-0-0-0(): int
|
||||||
|
public synthetic method getL-2-0-0-1(): int
|
||||||
|
public synthetic method getL-2-0-0-2(): java.lang.String
|
||||||
|
public synthetic method getL-3(): java.util.List
|
||||||
public final @org.jetbrains.annotations.NotNull method getWithNonTrivialGettersWithBF(): R
|
public final @org.jetbrains.annotations.NotNull method getWithNonTrivialGettersWithBF(): R
|
||||||
|
public synthetic final method getWithNonTrivialGettersWithBF-0(): int
|
||||||
|
public synthetic final method getWithNonTrivialGettersWithBF-1(): int
|
||||||
|
public synthetic final method getWithNonTrivialGettersWithBF-2(): E
|
||||||
|
public synthetic final method getWithNonTrivialGettersWithBF-2-0(): D
|
||||||
|
public synthetic final method getWithNonTrivialGettersWithBF-2-0-0(): C
|
||||||
|
public synthetic final method getWithNonTrivialGettersWithBF-2-0-0-0(): int
|
||||||
|
public synthetic final method getWithNonTrivialGettersWithBF-2-0-0-1(): int
|
||||||
|
public synthetic final method getWithNonTrivialGettersWithBF-2-0-0-2(): java.lang.String
|
||||||
|
public synthetic final method getWithNonTrivialGettersWithBF-3(): java.util.List
|
||||||
public final @org.jetbrains.annotations.NotNull method getWithNonTrivialSetters(): R
|
public final @org.jetbrains.annotations.NotNull method getWithNonTrivialSetters(): R
|
||||||
|
public synthetic final method getWithNonTrivialSetters-0(): int
|
||||||
|
public synthetic final method getWithNonTrivialSetters-1(): int
|
||||||
|
public synthetic final method getWithNonTrivialSetters-2(): E
|
||||||
|
public synthetic final method getWithNonTrivialSetters-2-0(): D
|
||||||
|
public synthetic final method getWithNonTrivialSetters-2-0-0(): C
|
||||||
|
public synthetic final method getWithNonTrivialSetters-2-0-0-0(): int
|
||||||
|
public synthetic final method getWithNonTrivialSetters-2-0-0-1(): int
|
||||||
|
public synthetic final method getWithNonTrivialSetters-2-0-0-2(): java.lang.String
|
||||||
|
public synthetic final method getWithNonTrivialSetters-3(): java.util.List
|
||||||
public final @org.jetbrains.annotations.NotNull method getWithNonTrivialSettersWithBF(): R
|
public final @org.jetbrains.annotations.NotNull method getWithNonTrivialSettersWithBF(): R
|
||||||
|
public synthetic final method getWithNonTrivialSettersWithBF-0(): int
|
||||||
|
public synthetic final method getWithNonTrivialSettersWithBF-1(): int
|
||||||
|
public synthetic final method getWithNonTrivialSettersWithBF-2(): E
|
||||||
|
public synthetic final method getWithNonTrivialSettersWithBF-2-0(): D
|
||||||
|
public synthetic final method getWithNonTrivialSettersWithBF-2-0-0(): C
|
||||||
|
public synthetic final method getWithNonTrivialSettersWithBF-2-0-0-0(): int
|
||||||
|
public synthetic final method getWithNonTrivialSettersWithBF-2-0-0-1(): int
|
||||||
|
public synthetic final method getWithNonTrivialSettersWithBF-2-0-0-2(): java.lang.String
|
||||||
|
public synthetic final method getWithNonTrivialSettersWithBF-3(): java.util.List
|
||||||
public final method getY(): int
|
public final method getY(): int
|
||||||
public synthetic bridge method setL(p0: java.lang.Object): void
|
public synthetic bridge method setL(p0: java.lang.Object): void
|
||||||
public method setL-sUp7gFk(p0: int, p1: int, p2: int, p3: int, @org.jetbrains.annotations.NotNull p4: java.lang.String, @org.jetbrains.annotations.NotNull p5: java.util.List): void
|
public method setL-sUp7gFk(p0: int, p1: int, p2: int, p3: int, @org.jetbrains.annotations.NotNull p4: java.lang.String, @org.jetbrains.annotations.NotNull p5: java.util.List): void
|
||||||
@@ -218,18 +273,19 @@ public final class NotInlined {
|
|||||||
public final method setY(p0: int): void
|
public final method setY(p0: int): void
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public final method trySetter(): void
|
public final method trySetter(): void
|
||||||
|
public final inner class Base1$DefaultImpls
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class R {
|
public final class R {
|
||||||
// source: 'complex.kt'
|
// source: 'complex.kt'
|
||||||
private @org.jetbrains.annotations.NotNull field t: java.util.List
|
private final field field-0: int
|
||||||
private field x: int
|
private final field field-1: int
|
||||||
private field y: int
|
private final field field-2-0-0-0: int
|
||||||
private field z$x$x$x: int
|
private final field field-2-0-0-1: int
|
||||||
private field z$x$x$y: int
|
private final @org.jetbrains.annotations.NotNull field field-2-0-0-2: java.lang.String
|
||||||
private @org.jetbrains.annotations.NotNull field z$x$x$z: java.lang.String
|
private final @org.jetbrains.annotations.NotNull field field-3: java.util.List
|
||||||
private synthetic method <init>(p0: int, p1: int, p2: int, p3: int, p4: java.lang.String, p5: java.util.List): void
|
private synthetic method <init>(p0: int, p1: int, p2: int, p3: int, p4: java.lang.String, p5: java.util.List): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int, p2: int, p3: int, p4: java.lang.String, p5: java.util.List): R
|
public synthetic final static method box-impl(p0: int, p1: int, p2: int, p3: int, p4: java.lang.String, p5: java.util.List): R
|
||||||
public final static method constructor-impl(p0: int, p1: int, p2: int, p3: int, @org.jetbrains.annotations.NotNull p4: java.lang.String, @org.jetbrains.annotations.NotNull p5: java.util.List): void
|
public final static method constructor-impl(p0: int, p1: int, p2: int, p3: int, @org.jetbrains.annotations.NotNull p4: java.lang.String, @org.jetbrains.annotations.NotNull p5: java.util.List): void
|
||||||
@@ -240,23 +296,28 @@ public final class R {
|
|||||||
public static @org.jetbrains.annotations.NotNull method getFakeOverrideMFVC-impl(p0: int, p1: int, p2: int, p3: int, @org.jetbrains.annotations.NotNull p4: java.lang.String, @org.jetbrains.annotations.NotNull p5: java.util.List): R
|
public static @org.jetbrains.annotations.NotNull method getFakeOverrideMFVC-impl(p0: int, p1: int, p2: int, p3: int, @org.jetbrains.annotations.NotNull p4: java.lang.String, @org.jetbrains.annotations.NotNull p5: java.util.List): R
|
||||||
public method getFakeOverrideRegular(): int
|
public method getFakeOverrideRegular(): int
|
||||||
public static method getFakeOverrideRegular-impl(p0: int, p1: int, p2: int, p3: int, @org.jetbrains.annotations.NotNull p4: java.lang.String, @org.jetbrains.annotations.NotNull p5: java.util.List): int
|
public static method getFakeOverrideRegular-impl(p0: int, p1: int, p2: int, p3: int, @org.jetbrains.annotations.NotNull p4: java.lang.String, @org.jetbrains.annotations.NotNull p5: java.util.List): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getT-GKOAj6k(): java.util.List
|
public final static @org.jetbrains.annotations.NotNull method getT-impl(p0: int, p1: int, p2: int, p3: int, @org.jetbrains.annotations.NotNull p4: java.lang.String, @org.jetbrains.annotations.NotNull p5: java.util.List): java.util.List
|
||||||
public final method getX(): int
|
public final static method getX-impl(p0: int, p1: int, p2: int, p3: int, @org.jetbrains.annotations.NotNull p4: java.lang.String, @org.jetbrains.annotations.NotNull p5: java.util.List): int
|
||||||
public final method getY-pVg5ArA(): int
|
public final static method getY-impl(p0: int, p1: int, p2: int, p3: int, @org.jetbrains.annotations.NotNull p4: java.lang.String, @org.jetbrains.annotations.NotNull p5: java.util.List): int
|
||||||
public final method getZ$x$x$x(): int
|
public @org.jetbrains.annotations.NotNull method getZ(): E
|
||||||
public final method getZ$x$x$y-GsR9Xnw(): int
|
public synthetic bridge method getZ-0(): D
|
||||||
public final @org.jetbrains.annotations.NotNull method getZ$x$x$z(): java.lang.String
|
public synthetic bridge method getZ-0-0(): C
|
||||||
public final @org.jetbrains.annotations.NotNull method getZ$x$x(): C
|
public synthetic bridge method getZ-0-0-0(): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getZ$x(): D
|
public synthetic bridge method getZ-0-0-1(): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getZ(): E
|
public synthetic bridge method getZ-0-0-2(): java.lang.String
|
||||||
|
public static @org.jetbrains.annotations.NotNull method getZ-impl(p0: int, p1: int, p2: int, p3: int, @org.jetbrains.annotations.NotNull p4: java.lang.String, @org.jetbrains.annotations.NotNull p5: java.util.List): E
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int, p2: int, p3: int, p4: java.lang.String, p5: java.util.List): int
|
public static method hashCode-impl(p0: int, p1: int, p2: int, p3: int, p4: java.lang.String, p5: java.util.List): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int, p2: int, p3: int, p4: java.lang.String, p5: java.util.List): java.lang.String
|
public static method toString-impl(p0: int, p1: int, p2: int, p3: int, p4: java.lang.String, p5: java.util.List): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): int
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-1(): int
|
||||||
public synthetic final method unbox-impl2(): int
|
public synthetic final method unbox-impl-2(): E
|
||||||
public synthetic final method unbox-impl3(): int
|
public synthetic final method unbox-impl-2-0(): D
|
||||||
public synthetic final method unbox-impl4(): java.lang.String
|
public synthetic final method unbox-impl-2-0-0(): C
|
||||||
public synthetic final method unbox-impl5(): java.util.List
|
public synthetic final method unbox-impl-2-0-0-0(): int
|
||||||
|
public synthetic final method unbox-impl-2-0-0-1(): int
|
||||||
|
public synthetic final method unbox-impl-2-0-0-2(): java.lang.String
|
||||||
|
public synthetic final method unbox-impl-3(): java.util.List
|
||||||
|
public final inner class Base1$DefaultImpls
|
||||||
}
|
}
|
||||||
|
|||||||
+82
-101
@@ -2,127 +2,108 @@
|
|||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class A {
|
public final class A {
|
||||||
// source: 'equality.kt'
|
// source: 'equality.kt'
|
||||||
private field f1: int
|
private final field field-0: int
|
||||||
private field f2: int
|
private final field field-1: int
|
||||||
private field f3$x: int
|
private final field field-2-0: int
|
||||||
private field f3$y: int
|
private final field field-2-1: int
|
||||||
private field f4: int
|
private final field field-3: int
|
||||||
private field f5: int
|
private final field field-4: int
|
||||||
private @org.jetbrains.annotations.NotNull field f6: java.lang.String
|
private final @org.jetbrains.annotations.NotNull field field-5: java.lang.String
|
||||||
private field f7: int
|
private final field field-6: int
|
||||||
private field f8: int
|
private final field field-7: int
|
||||||
private @org.jetbrains.annotations.NotNull field f9: java.lang.String
|
private final @org.jetbrains.annotations.NotNull field field-8: java.lang.String
|
||||||
private synthetic method <init>(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String): void
|
private synthetic method <init>(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String): A
|
public synthetic final static method box-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String): A
|
||||||
public final static method constructor-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String): void
|
public final static method constructor-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String, p10: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String, p10: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, p16: java.lang.String, p17: int, p18: int, p19: java.lang.String): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, p16: java.lang.String, p17: int, p18: int, p19: java.lang.String): boolean
|
||||||
public final method getF1-DbFnDB4(): int
|
public final static method getF1-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String): int
|
||||||
public final method getF2-ejSTSP4(): int
|
public final static method getF2-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String): int
|
||||||
public final method getF3$x-DbFnDB4(): int
|
public final static @org.jetbrains.annotations.NotNull method getF3-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String): F3
|
||||||
public final method getF3$y-ejSTSP4(): int
|
public final static method getF4-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getF3(): F3
|
public final static method getF5-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String): int
|
||||||
public final method getF4-4yoqybc(): int
|
public final static @org.jetbrains.annotations.NotNull method getF6-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String): java.lang.String
|
||||||
public final method getF5-z3qHWqM(): int
|
public final static method getF7-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getF6-OgMO970(): java.lang.String
|
public final static method getF8-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String): int
|
||||||
public final method getF7(): int
|
public final static @org.jetbrains.annotations.NotNull method getF9-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String): java.lang.String
|
||||||
public final method getF8-pVg5ArA(): int
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getF9(): java.lang.String
|
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String): int
|
public static method hashCode-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String): java.lang.String
|
public static method toString-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): int
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-1(): int
|
||||||
public synthetic final method unbox-impl2(): int
|
public synthetic final method unbox-impl-2(): F3
|
||||||
public synthetic final method unbox-impl3(): int
|
public synthetic final method unbox-impl-2-0(): int
|
||||||
public synthetic final method unbox-impl4(): int
|
public synthetic final method unbox-impl-2-1(): int
|
||||||
public synthetic final method unbox-impl5(): int
|
public synthetic final method unbox-impl-3(): int
|
||||||
public synthetic final method unbox-impl6(): java.lang.String
|
public synthetic final method unbox-impl-4(): int
|
||||||
public synthetic final method unbox-impl7(): int
|
public synthetic final method unbox-impl-5(): java.lang.String
|
||||||
public synthetic final method unbox-impl8(): int
|
public synthetic final method unbox-impl-6(): int
|
||||||
public synthetic final method unbox-impl9(): java.lang.String
|
public synthetic final method unbox-impl-7(): int
|
||||||
|
public synthetic final method unbox-impl-8(): java.lang.String
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class B {
|
public final class B {
|
||||||
// source: 'equality.kt'
|
// source: 'equality.kt'
|
||||||
private field a1$f1: int
|
private final field field-0-0: int
|
||||||
private field a1$f2: int
|
private final field field-0-1: int
|
||||||
private field a1$f3$x: int
|
private final field field-0-2-0: int
|
||||||
private field a1$f3$y: int
|
private final field field-0-2-1: int
|
||||||
private field a1$f4: int
|
private final field field-0-3: int
|
||||||
private field a1$f5: int
|
private final field field-0-4: int
|
||||||
private @org.jetbrains.annotations.NotNull field a1$f6: java.lang.String
|
private final @org.jetbrains.annotations.NotNull field field-0-5: java.lang.String
|
||||||
private field a1$f7: int
|
private final field field-0-6: int
|
||||||
private field a1$f8: int
|
private final field field-0-7: int
|
||||||
private @org.jetbrains.annotations.NotNull field a1$f9: java.lang.String
|
private final @org.jetbrains.annotations.NotNull field field-0-8: java.lang.String
|
||||||
private field a2$f1: int
|
private final field field-1-0: int
|
||||||
private field a2$f2: int
|
private final field field-1-1: int
|
||||||
private field a2$f3$x: int
|
private final field field-1-2-0: int
|
||||||
private field a2$f3$y: int
|
private final field field-1-2-1: int
|
||||||
private field a2$f4: int
|
private final field field-1-3: int
|
||||||
private field a2$f5: int
|
private final field field-1-4: int
|
||||||
private @org.jetbrains.annotations.NotNull field a2$f6: java.lang.String
|
private final @org.jetbrains.annotations.NotNull field field-1-5: java.lang.String
|
||||||
private field a2$f7: int
|
private final field field-1-6: int
|
||||||
private field a2$f8: int
|
private final field field-1-7: int
|
||||||
private @org.jetbrains.annotations.NotNull field a2$f9: java.lang.String
|
private final @org.jetbrains.annotations.NotNull field field-1-8: java.lang.String
|
||||||
private synthetic method <init>(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, p16: java.lang.String, p17: int, p18: int, p19: java.lang.String): void
|
private synthetic method <init>(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, p16: java.lang.String, p17: int, p18: int, p19: java.lang.String): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, p16: java.lang.String, p17: int, p18: int, p19: java.lang.String): B
|
public synthetic final static method box-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, p16: java.lang.String, p17: int, p18: int, p19: java.lang.String): B
|
||||||
public final static method constructor-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, @org.jetbrains.annotations.NotNull p16: java.lang.String, p17: int, p18: int, @org.jetbrains.annotations.NotNull p19: java.lang.String): void
|
public final static method constructor-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, @org.jetbrains.annotations.NotNull p16: java.lang.String, p17: int, p18: int, @org.jetbrains.annotations.NotNull p19: java.lang.String): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, p16: java.lang.String, p17: int, p18: int, p19: java.lang.String, p20: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, p16: java.lang.String, p17: int, p18: int, p19: java.lang.String, p20: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, p16: java.lang.String, p17: int, p18: int, p19: java.lang.String, p20: int, p21: int, p22: int, p23: int, p24: int, p25: int, p26: java.lang.String, p27: int, p28: int, p29: java.lang.String, p30: int, p31: int, p32: int, p33: int, p34: int, p35: int, p36: java.lang.String, p37: int, p38: int, p39: java.lang.String): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, p16: java.lang.String, p17: int, p18: int, p19: java.lang.String, p20: int, p21: int, p22: int, p23: int, p24: int, p25: int, p26: java.lang.String, p27: int, p28: int, p29: java.lang.String, p30: int, p31: int, p32: int, p33: int, p34: int, p35: int, p36: java.lang.String, p37: int, p38: int, p39: java.lang.String): boolean
|
||||||
public final method getA1$f1-DbFnDB4(): int
|
public final static @org.jetbrains.annotations.NotNull method getA1-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, @org.jetbrains.annotations.NotNull p16: java.lang.String, p17: int, p18: int, @org.jetbrains.annotations.NotNull p19: java.lang.String): A
|
||||||
public final method getA1$f2-ejSTSP4(): int
|
public final static @org.jetbrains.annotations.NotNull method getA2-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, @org.jetbrains.annotations.NotNull p16: java.lang.String, p17: int, p18: int, @org.jetbrains.annotations.NotNull p19: java.lang.String): A
|
||||||
public final method getA1$f3$x-DbFnDB4(): int
|
|
||||||
public final method getA1$f3$y-ejSTSP4(): int
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getA1$f3(): F3
|
|
||||||
public final method getA1$f4-4yoqybc(): int
|
|
||||||
public final method getA1$f5-z3qHWqM(): int
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getA1$f6-OgMO970(): java.lang.String
|
|
||||||
public final method getA1$f7(): int
|
|
||||||
public final method getA1$f8-pVg5ArA(): int
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getA1$f9(): java.lang.String
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getA1(): A
|
|
||||||
public final method getA2$f1-DbFnDB4(): int
|
|
||||||
public final method getA2$f2-ejSTSP4(): int
|
|
||||||
public final method getA2$f3$x-DbFnDB4(): int
|
|
||||||
public final method getA2$f3$y-ejSTSP4(): int
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getA2$f3(): F3
|
|
||||||
public final method getA2$f4-4yoqybc(): int
|
|
||||||
public final method getA2$f5-z3qHWqM(): int
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getA2$f6-OgMO970(): java.lang.String
|
|
||||||
public final method getA2$f7(): int
|
|
||||||
public final method getA2$f8-pVg5ArA(): int
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getA2$f9(): java.lang.String
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getA2(): A
|
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, p16: java.lang.String, p17: int, p18: int, p19: java.lang.String): int
|
public static method hashCode-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, p6: java.lang.String, p7: int, p8: int, p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, p16: java.lang.String, p17: int, p18: int, p19: java.lang.String): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static @org.jetbrains.annotations.NotNull method toString-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, @org.jetbrains.annotations.NotNull p16: java.lang.String, p17: int, p18: int, @org.jetbrains.annotations.NotNull p19: java.lang.String): java.lang.String
|
public static @org.jetbrains.annotations.NotNull method toString-impl(p0: int, p1: int, p2: int, p3: int, p4: int, p5: int, @org.jetbrains.annotations.NotNull p6: java.lang.String, p7: int, p8: int, @org.jetbrains.annotations.NotNull p9: java.lang.String, p10: int, p11: int, p12: int, p13: int, p14: int, p15: int, @org.jetbrains.annotations.NotNull p16: java.lang.String, p17: int, p18: int, @org.jetbrains.annotations.NotNull p19: java.lang.String): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): A
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-0-0(): int
|
||||||
public synthetic final method unbox-impl10(): int
|
public synthetic final method unbox-impl-0-1(): int
|
||||||
public synthetic final method unbox-impl11(): int
|
public synthetic final method unbox-impl-0-2(): F3
|
||||||
public synthetic final method unbox-impl12(): int
|
public synthetic final method unbox-impl-0-2-0(): int
|
||||||
public synthetic final method unbox-impl13(): int
|
public synthetic final method unbox-impl-0-2-1(): int
|
||||||
public synthetic final method unbox-impl14(): int
|
public synthetic final method unbox-impl-0-3(): int
|
||||||
public synthetic final method unbox-impl15(): int
|
public synthetic final method unbox-impl-0-4(): int
|
||||||
public synthetic final method unbox-impl16(): java.lang.String
|
public synthetic final method unbox-impl-0-5(): java.lang.String
|
||||||
public synthetic final method unbox-impl17(): int
|
public synthetic final method unbox-impl-0-6(): int
|
||||||
public synthetic final method unbox-impl18(): int
|
public synthetic final method unbox-impl-0-7(): int
|
||||||
public synthetic final method unbox-impl19(): java.lang.String
|
public synthetic final method unbox-impl-0-8(): java.lang.String
|
||||||
public synthetic final method unbox-impl2(): int
|
public synthetic final method unbox-impl-1(): A
|
||||||
public synthetic final method unbox-impl3(): int
|
public synthetic final method unbox-impl-1-0(): int
|
||||||
public synthetic final method unbox-impl4(): int
|
public synthetic final method unbox-impl-1-1(): int
|
||||||
public synthetic final method unbox-impl5(): int
|
public synthetic final method unbox-impl-1-2(): F3
|
||||||
public synthetic final method unbox-impl6(): java.lang.String
|
public synthetic final method unbox-impl-1-2-0(): int
|
||||||
public synthetic final method unbox-impl7(): int
|
public synthetic final method unbox-impl-1-2-1(): int
|
||||||
public synthetic final method unbox-impl8(): int
|
public synthetic final method unbox-impl-1-3(): int
|
||||||
public synthetic final method unbox-impl9(): java.lang.String
|
public synthetic final method unbox-impl-1-4(): int
|
||||||
|
public synthetic final method unbox-impl-1-5(): java.lang.String
|
||||||
|
public synthetic final method unbox-impl-1-6(): int
|
||||||
|
public synthetic final method unbox-impl-1-7(): int
|
||||||
|
public synthetic final method unbox-impl-1-8(): java.lang.String
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
@@ -173,22 +154,22 @@ public final class F2 {
|
|||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class F3 {
|
public final class F3 {
|
||||||
// source: 'equality.kt'
|
// source: 'equality.kt'
|
||||||
private field x: int
|
private final field field-0: int
|
||||||
private field y: int
|
private final field field-1: int
|
||||||
private synthetic method <init>(p0: int, p1: int): void
|
private synthetic method <init>(p0: int, p1: int): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int): F3
|
public synthetic final static method box-impl(p0: int, p1: int): F3
|
||||||
public final static method constructor-impl(p0: int, p1: int): void
|
public final static method constructor-impl(p0: int, p1: int): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
||||||
public final method getX-DbFnDB4(): int
|
public final static method getX-impl(p0: int, p1: int): int
|
||||||
public final method getY-ejSTSP4(): int
|
public final static method getY-impl(p0: int, p1: int): int
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int): int
|
public static method hashCode-impl(p0: int, p1: int): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int): java.lang.String
|
public static method toString-impl(p0: int, p1: int): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): int
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-1(): int
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
|
|||||||
+344
-304
File diff suppressed because it is too large
Load Diff
+344
-304
File diff suppressed because it is too large
Load Diff
+344
-304
File diff suppressed because it is too large
Load Diff
@@ -2,33 +2,33 @@
|
|||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class DPoint {
|
public final class DPoint {
|
||||||
// source: 'throwingMFVCReassignments.kt'
|
// source: 'throwingMFVCReassignments.kt'
|
||||||
private field x: double
|
private final field field-0: double
|
||||||
private field y: double
|
private final field field-1: double
|
||||||
private synthetic method <init>(p0: double, p1: double): void
|
private synthetic method <init>(p0: double, p1: double): void
|
||||||
public synthetic final static method box-impl(p0: double, p1: double): DPoint
|
public synthetic final static method box-impl(p0: double, p1: double): DPoint
|
||||||
public final static method constructor-impl(p0: double, p1: double): void
|
public final static method constructor-impl(p0: double, p1: double): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: double, p1: double, p2: java.lang.Object): boolean
|
public static method equals-impl(p0: double, p1: double, p2: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: double, p1: double, p2: double, p3: double): boolean
|
public final static method equals-impl0(p0: double, p1: double, p2: double, p3: double): boolean
|
||||||
public final method getX(): double
|
public final static method getX-impl(p0: double, p1: double): double
|
||||||
public final method getY(): double
|
public final static method getY-impl(p0: double, p1: double): double
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: double, p1: double): int
|
public static method hashCode-impl(p0: double, p1: double): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: double, p1: double): java.lang.String
|
public static method toString-impl(p0: double, p1: double): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): double
|
public synthetic final method unbox-impl-0(): double
|
||||||
public synthetic final method unbox-impl1(): double
|
public synthetic final method unbox-impl-1(): double
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class PointBox {
|
public final class PointBox {
|
||||||
// source: 'throwingMFVCReassignments.kt'
|
// source: 'throwingMFVCReassignments.kt'
|
||||||
private field value$x: double
|
private field value-0: double
|
||||||
private field value$y: double
|
private field value-1: double
|
||||||
public method <init>(p0: double, p1: double): void
|
public method <init>(p0: double, p1: double): void
|
||||||
public final method getValue$x(): double
|
|
||||||
public final method getValue$y(): double
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getValue(): DPoint
|
public final @org.jetbrains.annotations.NotNull method getValue(): DPoint
|
||||||
|
public synthetic final method getValue-0(): double
|
||||||
|
public synthetic final method getValue-1(): double
|
||||||
public final method setValue-sUp7gFk(p0: double, p1: double): void
|
public final method setValue-sUp7gFk(p0: double, p1: double): void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+171
-22
@@ -1,5 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// https://youtrack.jetbrains.com/issue/KT-52236/Different-modality-in-psi-and-fir
|
|
||||||
// CHECK_BYTECODE_LISTING
|
// CHECK_BYTECODE_LISTING
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
// TARGET_BACKEND: JVM_IR
|
// TARGET_BACKEND: JVM_IR
|
||||||
@@ -9,15 +7,29 @@
|
|||||||
@JvmInline
|
@JvmInline
|
||||||
value class Public(val x: Int, val y: Int) {
|
value class Public(val x: Int, val y: Int) {
|
||||||
companion object {
|
companion object {
|
||||||
// TODO
|
var x: Int = 0
|
||||||
|
val y: Int
|
||||||
|
get() = 1
|
||||||
|
var z: Public = Public(0, 0)
|
||||||
|
val t: Public
|
||||||
|
get() = Public(0, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmInline
|
@JvmInline
|
||||||
value class Internal(internal val x: Int, internal val y: Int) {
|
value class Internal(internal val x: Int, internal val y: Int) {
|
||||||
companion object {
|
companion object {
|
||||||
// @JvmStatic
|
@JvmStatic
|
||||||
// TODO
|
var x: Int = 0
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
val y: Int
|
||||||
|
get() = 1
|
||||||
|
var z: Internal = Internal(0, 0)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
val t: Internal
|
||||||
|
get() = Internal(0, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,11 +72,11 @@ class Regular {
|
|||||||
private set
|
private set
|
||||||
internal var x5: Public = Public(9, 10)
|
internal var x5: Public = Public(9, 10)
|
||||||
private set
|
private set
|
||||||
|
|
||||||
var x6: Public = Public(11, 12)
|
var x6: Public = Public(11, 12)
|
||||||
internal set
|
internal set
|
||||||
|
|
||||||
|
|
||||||
var y1: Internal = Internal(13, 14)
|
var y1: Internal = Internal(13, 14)
|
||||||
internal var y2: Internal = Internal(15, 16)
|
internal var y2: Internal = Internal(15, 16)
|
||||||
private var y3: Internal = Internal(17, 18)
|
private var y3: Internal = Internal(17, 18)
|
||||||
@@ -73,11 +85,11 @@ class Regular {
|
|||||||
private set
|
private set
|
||||||
internal var y5: Internal = Internal(21, 22)
|
internal var y5: Internal = Internal(21, 22)
|
||||||
private set
|
private set
|
||||||
|
|
||||||
var y6: Internal = Internal(23, 24)
|
var y6: Internal = Internal(23, 24)
|
||||||
internal set
|
internal set
|
||||||
|
|
||||||
|
|
||||||
var z1: Private = Private(25, 26)
|
var z1: Private = Private(25, 26)
|
||||||
internal var z2: Private = Private(27, 28)
|
internal var z2: Private = Private(27, 28)
|
||||||
private var z3: Private = Private(29, 30)
|
private var z3: Private = Private(29, 30)
|
||||||
@@ -86,12 +98,11 @@ class Regular {
|
|||||||
private set
|
private set
|
||||||
internal var z5: Private = Private(33, 34)
|
internal var z5: Private = Private(33, 34)
|
||||||
private set
|
private set
|
||||||
|
|
||||||
var z6: Private = Private(35, 36)
|
var z6: Private = Private(35, 36)
|
||||||
internal set
|
internal set
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
// TODO @JvmStatic
|
|
||||||
var staticX1: Public = Public(-1, -2)
|
var staticX1: Public = Public(-1, -2)
|
||||||
internal var staticX2: Public = Public(-3, -4)
|
internal var staticX2: Public = Public(-3, -4)
|
||||||
private var staticX3: Public = Public(-5, -6)
|
private var staticX3: Public = Public(-5, -6)
|
||||||
@@ -129,19 +140,157 @@ class Regular {
|
|||||||
|
|
||||||
var staticZ6: Private = Private(-35, -36)
|
var staticZ6: Private = Private(-35, -36)
|
||||||
internal set
|
internal set
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
var jvmStaticX1: Public = Public(-1, -2)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
internal var jvmStaticX2: Public = Public(-3, -4)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
private var jvmStaticX3: Public = Public(-5, -6)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
var jvmStaticX4: Public = Public(-7, -8)
|
||||||
|
private set
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
internal var jvmStaticX5: Public = Public(-9, -10)
|
||||||
|
private set
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
var jvmStaticX6: Public = Public(-11, -12)
|
||||||
|
internal set
|
||||||
|
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
var jvmStaticY1: Internal = Internal(-13, -14)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
internal var jvmStaticY2: Internal = Internal(-15, -16)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
private var jvmStaticY3: Internal = Internal(-17, -18)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
var jvmStaticY4: Internal = Internal(-19, -20)
|
||||||
|
private set
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
internal var jvmStaticY5: Internal = Internal(-21, -22)
|
||||||
|
private set
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
var jvmStaticY6: Internal = Internal(-23, -24)
|
||||||
|
internal set
|
||||||
|
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
var jvmStaticZ1: Private = Private(-25, -26)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
internal var jvmStaticZ2: Private = Private(-27, -28)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
private var jvmStaticZ3: Private = Private(-29, -30)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
var jvmStaticZ4: Private = Private(-31, -32)
|
||||||
|
private set
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
internal var jvmStaticZ5: Private = Private(-33, -34)
|
||||||
|
private set
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
var jvmStaticZ6: Private = Private(-35, -36)
|
||||||
|
internal set
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO statics
|
|
||||||
fun callAll() {
|
fun callAll() {
|
||||||
z6
|
x1; x2; x3; x4; x5; x6
|
||||||
x3
|
x1.x; x1.y; x2.x; x2.y; x3.x; x3.y; x4.x; x4.y; x5.x; x5.y; x6.x; x6.y
|
||||||
x3.x
|
x1 = x1; x2 = x2; x3 = x3; x4 = x4; x5 = x5; x6 = x6
|
||||||
x3.y
|
|
||||||
|
y1; y2; y3; y4; y5; y6
|
||||||
|
y1.x; y1.y; y2.x; y2.y; y3.x; y3.y; y4.x; y4.y; y5.x; y5.y; y6.x; y6.y
|
||||||
|
y1 = y1; y2 = y2; y3 = y3; y4 = y4; y5 = y5; y6 = y6
|
||||||
|
|
||||||
|
z1; z2; z3; z4; z5; z6
|
||||||
|
z1 = z1; z2 = z2; z3 = z3; z4 = z4; z5 = z5; z6 = z6
|
||||||
|
|
||||||
|
|
||||||
|
staticX1; staticX2; staticX3; staticX4; staticX5; staticX6
|
||||||
|
staticX1.x; staticX1.y; staticX2.x; staticX2.y; staticX3.x; staticX3.y; staticX4.x; staticX4.y; staticX5.x; staticX5.y; staticX6.x; staticX6.y
|
||||||
|
staticX1 = staticX1; staticX2 = staticX2; staticX3 = staticX3; staticX4 = staticX4; staticX5 = staticX5; staticX6 = staticX6
|
||||||
|
|
||||||
|
staticY1; staticY2; staticY3; staticY4; staticY5; staticY6
|
||||||
|
staticY1.x; staticY1.y; staticY2.x; staticY2.y; staticY3.x; staticY3.y; staticY4.x; staticY4.y; staticY5.x; staticY5.y; staticY6.x; staticY6.y
|
||||||
|
staticY1 = staticY1; staticY2 = staticY2; staticY3 = staticY3; staticY4 = staticY4; staticY5 = staticY5; staticY6 = staticY6
|
||||||
|
|
||||||
|
staticZ1; staticZ2; staticZ3; staticZ4; staticZ5; staticZ6
|
||||||
|
staticZ1 = staticZ1; staticZ2 = staticZ2; staticZ3 = staticZ3; staticZ4 = staticZ4; staticZ5 = staticZ5; staticZ6 = staticZ6
|
||||||
|
|
||||||
|
|
||||||
|
jvmStaticX1; jvmStaticX2; jvmStaticX3; jvmStaticX4; jvmStaticX5; jvmStaticX6
|
||||||
|
jvmStaticX1.x; jvmStaticX1.y; jvmStaticX2.x; jvmStaticX2.y; jvmStaticX3.x; jvmStaticX3.y; jvmStaticX4.x; jvmStaticX4.y; jvmStaticX5.x; jvmStaticX5.y; jvmStaticX6.x; jvmStaticX6.y
|
||||||
|
jvmStaticX1 = jvmStaticX1; jvmStaticX2 = jvmStaticX2; jvmStaticX3 = jvmStaticX3; jvmStaticX4 = jvmStaticX4; jvmStaticX5 =
|
||||||
|
jvmStaticX5; jvmStaticX6 = jvmStaticX6
|
||||||
|
|
||||||
|
jvmStaticY1; jvmStaticY2; jvmStaticY3; jvmStaticY4; jvmStaticY5; jvmStaticY6
|
||||||
|
jvmStaticY1.x; jvmStaticY1.y; jvmStaticY2.x; jvmStaticY2.y; jvmStaticY3.x; jvmStaticY3.y; jvmStaticY4.x; jvmStaticY4.y; jvmStaticY5.x; jvmStaticY5.y; jvmStaticY6.x; jvmStaticY6.y
|
||||||
|
jvmStaticY1 = jvmStaticY1; jvmStaticY2 = jvmStaticY2; jvmStaticY3 = jvmStaticY3; jvmStaticY4 = jvmStaticY4; jvmStaticY5 =
|
||||||
|
jvmStaticY5; jvmStaticY6 = jvmStaticY6
|
||||||
|
|
||||||
|
jvmStaticZ1; jvmStaticZ2; jvmStaticZ3; jvmStaticZ4; jvmStaticZ5; jvmStaticZ6
|
||||||
|
jvmStaticZ1 = jvmStaticZ1; jvmStaticZ2 = jvmStaticZ2; jvmStaticZ3 = jvmStaticZ3; jvmStaticZ4 = jvmStaticZ4; jvmStaticZ5 =
|
||||||
|
jvmStaticZ5; jvmStaticZ6 = jvmStaticZ6
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
Regular().callAll()
|
val r = Regular()
|
||||||
|
r.apply {
|
||||||
|
callAll()
|
||||||
|
|
||||||
|
|
||||||
|
x1; x2; x4; x5; x6
|
||||||
|
x1.x; x1.y; x2.x; x2.y; x4.x; x4.y; x5.x; x5.y; x6.x; x6.y
|
||||||
|
x1 = x1; x2 = x2; x6 = x6
|
||||||
|
|
||||||
|
y1; y2; y4; y5; y6
|
||||||
|
y1.x; y1.y; y2.x; y2.y; y4.x; y4.y; y5.x; y5.y; y6.x; y6.y
|
||||||
|
y1 = y1; y2 = y2; y6 = y6
|
||||||
|
|
||||||
|
z1; z2; z4; z5; z6
|
||||||
|
z1 = z1; z2 = z2; z6 = z6
|
||||||
|
}
|
||||||
|
|
||||||
|
Regular.Companion.apply {
|
||||||
|
staticX1; staticX2; staticX4; staticX5; staticX6
|
||||||
|
staticX1.x; staticX1.y; staticX2.x; staticX2.y; staticX4.x; staticX4.y; staticX5.x; staticX5.y; staticX6.x; staticX6.y
|
||||||
|
staticX1 = staticX1; staticX2 = staticX2; staticX6 = staticX6
|
||||||
|
|
||||||
|
staticY1; staticY2; staticY4; staticY5; staticY6
|
||||||
|
staticY1.x; staticY1.y; staticY2.x; staticY2.y; staticY4.x; staticY4.y; staticY5.x; staticY5.y; staticY6.x; staticY6.y
|
||||||
|
staticY1 = staticY1; staticY2 = staticY2; staticY6 = staticY6
|
||||||
|
|
||||||
|
staticZ1; staticZ2; staticZ4; staticZ5; staticZ6
|
||||||
|
staticZ1 = staticZ1; staticZ2 = staticZ2; staticZ6 = staticZ6
|
||||||
|
|
||||||
|
|
||||||
|
jvmStaticX1; jvmStaticX2; jvmStaticX4; jvmStaticX5; jvmStaticX6
|
||||||
|
jvmStaticX1.x; jvmStaticX1.y; jvmStaticX2.x; jvmStaticX2.y; jvmStaticX4.x; jvmStaticX4.y; jvmStaticX5.x; jvmStaticX5.y; jvmStaticX6.x; jvmStaticX6.y
|
||||||
|
jvmStaticX1 = jvmStaticX1; jvmStaticX2 = jvmStaticX2; jvmStaticX6 = jvmStaticX6
|
||||||
|
|
||||||
|
jvmStaticY1; jvmStaticY2; jvmStaticY4; jvmStaticY5; jvmStaticY6
|
||||||
|
jvmStaticY1.x; jvmStaticY1.y; jvmStaticY2.x; jvmStaticY2.y; jvmStaticY4.x; jvmStaticY4.y; jvmStaticY5.x; jvmStaticY5.y; jvmStaticY6.x; jvmStaticY6.y
|
||||||
|
jvmStaticY1 = jvmStaticY1; jvmStaticY2 = jvmStaticY2; jvmStaticY6 = jvmStaticY6
|
||||||
|
|
||||||
|
jvmStaticZ1; jvmStaticZ2; jvmStaticZ4; jvmStaticZ5; jvmStaticZ6
|
||||||
|
jvmStaticZ1 = jvmStaticZ1; jvmStaticZ2 = jvmStaticZ2; jvmStaticZ6 = jvmStaticZ6
|
||||||
|
}
|
||||||
|
|
||||||
return "OK"
|
return "OK"
|
||||||
}
|
}
|
||||||
+557
-146
@@ -1,377 +1,788 @@
|
|||||||
|
@kotlin.Metadata
|
||||||
|
public final class Internal$Companion {
|
||||||
|
// source: 'visibility.kt'
|
||||||
|
private method <init>(): void
|
||||||
|
public synthetic method <init>(p0: kotlin.jvm.internal.DefaultConstructorMarker): void
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getT$annotations(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getT(): Internal
|
||||||
|
public synthetic final method getT-0(): int
|
||||||
|
public synthetic final method getT-1(): int
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getX$annotations(): void
|
||||||
|
public final method getX(): int
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getY$annotations(): void
|
||||||
|
public final method getY(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getZ(): Internal
|
||||||
|
public synthetic final method getZ-0(): int
|
||||||
|
public synthetic final method getZ-1(): int
|
||||||
|
public final method setX(p0: int): void
|
||||||
|
public final method setZ-sUp7gFk(p0: int, p1: int): void
|
||||||
|
public final inner class Internal$Companion
|
||||||
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class Internal {
|
public final class Internal {
|
||||||
// source: 'visibility.kt'
|
// source: 'visibility.kt'
|
||||||
private field x: int
|
public final static @org.jetbrains.annotations.NotNull field Companion: Internal$Companion
|
||||||
private field y: int
|
private final field field-0: int
|
||||||
|
private final field field-1: int
|
||||||
|
static method <clinit>(): void
|
||||||
private synthetic method <init>(p0: int, p1: int): void
|
private synthetic method <init>(p0: int, p1: int): void
|
||||||
|
public synthetic final static method access$getX$cp(): int
|
||||||
|
public synthetic final static method access$getZ-0$cp(): int
|
||||||
|
public synthetic final static method access$getZ-1$cp(): int
|
||||||
|
public synthetic final static method access$setX$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setZ-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setZ-1$cp(p0: int): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int): Internal
|
public synthetic final static method box-impl(p0: int, p1: int): Internal
|
||||||
public final static method constructor-impl(p0: int, p1: int): void
|
public final static method constructor-impl(p0: int, p1: int): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
||||||
public final method getX$main(): int
|
public final static @org.jetbrains.annotations.NotNull method getT(): Internal
|
||||||
public final method getY$main(): int
|
public final static method getX(): int
|
||||||
|
public final static method getX-impl$main(p0: int, p1: int): int
|
||||||
|
public final static method getY(): int
|
||||||
|
public final static method getY-impl$main(p0: int, p1: int): int
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int): int
|
public static method hashCode-impl(p0: int, p1: int): int
|
||||||
|
public final static method setX(p0: int): void
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int): java.lang.String
|
public static method toString-impl(p0: int, p1: int): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): int
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-1(): int
|
||||||
|
public final inner class Internal$Companion
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class InternalInternal {
|
public final class InternalInternal {
|
||||||
// source: 'visibility.kt'
|
// source: 'visibility.kt'
|
||||||
private field value$x: int
|
private final field field-0-0: int
|
||||||
private field value$y: int
|
private final field field-0-1: int
|
||||||
private synthetic method <init>(p0: int, p1: int): void
|
private synthetic method <init>(p0: int, p1: int): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int): InternalInternal
|
public synthetic final static method box-impl(p0: int, p1: int): InternalInternal
|
||||||
public final static method constructor-impl(p0: int, p1: int): void
|
public final static method constructor-impl(p0: int, p1: int): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
||||||
public final @org.jetbrains.annotations.NotNull method getValue$main(): Internal
|
public final static @org.jetbrains.annotations.NotNull method getValue-impl$main(p0: int, p1: int): Internal
|
||||||
public final method getValue$x$main(): int
|
|
||||||
public final method getValue$y$main(): int
|
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int): int
|
public static method hashCode-impl(p0: int, p1: int): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int): java.lang.String
|
public static method toString-impl(p0: int, p1: int): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): Internal
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-0-0(): int
|
||||||
|
public synthetic final method unbox-impl-0-1(): int
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class InternalPrivate {
|
public final class InternalPrivate {
|
||||||
// source: 'visibility.kt'
|
// source: 'visibility.kt'
|
||||||
private field value$x: int
|
private final field field-0-0: int
|
||||||
private field value$y: int
|
private final field field-0-1: int
|
||||||
private synthetic method <init>(p0: int, p1: int): void
|
private synthetic method <init>(p0: int, p1: int): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int): InternalPrivate
|
public synthetic final static method box-impl(p0: int, p1: int): InternalPrivate
|
||||||
public final static method constructor-impl(p0: int, p1: int): void
|
public final static method constructor-impl(p0: int, p1: int): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
||||||
public final @org.jetbrains.annotations.NotNull method getValue$main(): Private
|
public final static @org.jetbrains.annotations.NotNull method getValue-impl$main(p0: int, p1: int): Private
|
||||||
private final method getValue$x(): int
|
|
||||||
private final method getValue$y(): int
|
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int): int
|
public static method hashCode-impl(p0: int, p1: int): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int): java.lang.String
|
public static method toString-impl(p0: int, p1: int): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): Private
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-0-0(): int
|
||||||
|
public synthetic final method unbox-impl-0-1(): int
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class InternalPublic {
|
public final class InternalPublic {
|
||||||
// source: 'visibility.kt'
|
// source: 'visibility.kt'
|
||||||
private field value$x: int
|
private final field field-0-0: int
|
||||||
private field value$y: int
|
private final field field-0-1: int
|
||||||
private synthetic method <init>(p0: int, p1: int): void
|
private synthetic method <init>(p0: int, p1: int): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int): InternalPublic
|
public synthetic final static method box-impl(p0: int, p1: int): InternalPublic
|
||||||
public final static method constructor-impl(p0: int, p1: int): void
|
public final static method constructor-impl(p0: int, p1: int): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
||||||
public final @org.jetbrains.annotations.NotNull method getValue$main(): Public
|
public final static @org.jetbrains.annotations.NotNull method getValue-impl$main(p0: int, p1: int): Public
|
||||||
public final method getValue$x$main(): int
|
|
||||||
public final method getValue$y$main(): int
|
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int): int
|
public static method hashCode-impl(p0: int, p1: int): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int): java.lang.String
|
public static method toString-impl(p0: int, p1: int): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): Public
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-0-0(): int
|
||||||
|
public synthetic final method unbox-impl-0-1(): int
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class Private {
|
public final class Private {
|
||||||
// source: 'visibility.kt'
|
// source: 'visibility.kt'
|
||||||
private field x: int
|
private final field field-0: int
|
||||||
private field y: int
|
private final field field-1: int
|
||||||
private synthetic method <init>(p0: int, p1: int): void
|
private synthetic method <init>(p0: int, p1: int): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int): Private
|
public synthetic final static method box-impl(p0: int, p1: int): Private
|
||||||
public final static method constructor-impl(p0: int, p1: int): void
|
public final static method constructor-impl(p0: int, p1: int): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
||||||
private final method getX(): int
|
|
||||||
private final method getY(): int
|
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int): int
|
public static method hashCode-impl(p0: int, p1: int): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int): java.lang.String
|
public static method toString-impl(p0: int, p1: int): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): int
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-1(): int
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class PrivateInternal {
|
public final class PrivateInternal {
|
||||||
// source: 'visibility.kt'
|
// source: 'visibility.kt'
|
||||||
private field value$x: int
|
private final field field-0-0: int
|
||||||
private field value$y: int
|
private final field field-0-1: int
|
||||||
private synthetic method <init>(p0: int, p1: int): void
|
private synthetic method <init>(p0: int, p1: int): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int): PrivateInternal
|
public synthetic final static method box-impl(p0: int, p1: int): PrivateInternal
|
||||||
public final static method constructor-impl(p0: int, p1: int): void
|
public final static method constructor-impl(p0: int, p1: int): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
||||||
private final method getValue$x(): int
|
|
||||||
private final method getValue$y(): int
|
|
||||||
private final method getValue(): Internal
|
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int): int
|
public static method hashCode-impl(p0: int, p1: int): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int): java.lang.String
|
public static method toString-impl(p0: int, p1: int): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): Internal
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-0-0(): int
|
||||||
|
public synthetic final method unbox-impl-0-1(): int
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class PrivatePrivate {
|
public final class PrivatePrivate {
|
||||||
// source: 'visibility.kt'
|
// source: 'visibility.kt'
|
||||||
private field value$x: int
|
private final field field-0-0: int
|
||||||
private field value$y: int
|
private final field field-0-1: int
|
||||||
private synthetic method <init>(p0: int, p1: int): void
|
private synthetic method <init>(p0: int, p1: int): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int): PrivatePrivate
|
public synthetic final static method box-impl(p0: int, p1: int): PrivatePrivate
|
||||||
public final static method constructor-impl(p0: int, p1: int): void
|
public final static method constructor-impl(p0: int, p1: int): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
||||||
private final method getValue$x(): int
|
|
||||||
private final method getValue$y(): int
|
|
||||||
private final method getValue(): Private
|
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int): int
|
public static method hashCode-impl(p0: int, p1: int): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int): java.lang.String
|
public static method toString-impl(p0: int, p1: int): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): Private
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-0-0(): int
|
||||||
|
public synthetic final method unbox-impl-0-1(): int
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class PrivatePublic {
|
public final class PrivatePublic {
|
||||||
// source: 'visibility.kt'
|
// source: 'visibility.kt'
|
||||||
private field value$x: int
|
private final field field-0-0: int
|
||||||
private field value$y: int
|
private final field field-0-1: int
|
||||||
private synthetic method <init>(p0: int, p1: int): void
|
private synthetic method <init>(p0: int, p1: int): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int): PrivatePublic
|
public synthetic final static method box-impl(p0: int, p1: int): PrivatePublic
|
||||||
public final static method constructor-impl(p0: int, p1: int): void
|
public final static method constructor-impl(p0: int, p1: int): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
||||||
private final method getValue$x(): int
|
|
||||||
private final method getValue$y(): int
|
|
||||||
private final method getValue(): Public
|
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int): int
|
public static method hashCode-impl(p0: int, p1: int): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int): java.lang.String
|
public static method toString-impl(p0: int, p1: int): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): Public
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-0-0(): int
|
||||||
|
public synthetic final method unbox-impl-0-1(): int
|
||||||
|
}
|
||||||
|
|
||||||
|
@kotlin.Metadata
|
||||||
|
public final class Public$Companion {
|
||||||
|
// source: 'visibility.kt'
|
||||||
|
private method <init>(): void
|
||||||
|
public synthetic method <init>(p0: kotlin.jvm.internal.DefaultConstructorMarker): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getT(): Public
|
||||||
|
public synthetic final method getT-0(): int
|
||||||
|
public synthetic final method getT-1(): int
|
||||||
|
public final method getX(): int
|
||||||
|
public final method getY(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getZ(): Public
|
||||||
|
public synthetic final method getZ-0(): int
|
||||||
|
public synthetic final method getZ-1(): int
|
||||||
|
public final method setX(p0: int): void
|
||||||
|
public final method setZ-sUp7gFk(p0: int, p1: int): void
|
||||||
|
public final inner class Public$Companion
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class Public {
|
public final class Public {
|
||||||
// source: 'visibility.kt'
|
// source: 'visibility.kt'
|
||||||
private field x: int
|
public final static @org.jetbrains.annotations.NotNull field Companion: Public$Companion
|
||||||
private field y: int
|
private final field field-0: int
|
||||||
|
private final field field-1: int
|
||||||
|
static method <clinit>(): void
|
||||||
private synthetic method <init>(p0: int, p1: int): void
|
private synthetic method <init>(p0: int, p1: int): void
|
||||||
|
public synthetic final static method access$getX$cp(): int
|
||||||
|
public synthetic final static method access$getZ-0$cp(): int
|
||||||
|
public synthetic final static method access$getZ-1$cp(): int
|
||||||
|
public synthetic final static method access$setX$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setZ-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setZ-1$cp(p0: int): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int): Public
|
public synthetic final static method box-impl(p0: int, p1: int): Public
|
||||||
public final static method constructor-impl(p0: int, p1: int): void
|
public final static method constructor-impl(p0: int, p1: int): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
||||||
public final method getX(): int
|
public final static method getX-impl(p0: int, p1: int): int
|
||||||
public final method getY(): int
|
public final static method getY-impl(p0: int, p1: int): int
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int): int
|
public static method hashCode-impl(p0: int, p1: int): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int): java.lang.String
|
public static method toString-impl(p0: int, p1: int): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): int
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-1(): int
|
||||||
|
public final inner class Public$Companion
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class PublicInternal {
|
public final class PublicInternal {
|
||||||
// source: 'visibility.kt'
|
// source: 'visibility.kt'
|
||||||
private field value$x: int
|
private final field field-0-0: int
|
||||||
private field value$y: int
|
private final field field-0-1: int
|
||||||
private synthetic method <init>(p0: int, p1: int): void
|
private synthetic method <init>(p0: int, p1: int): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int): PublicInternal
|
public synthetic final static method box-impl(p0: int, p1: int): PublicInternal
|
||||||
public final static method constructor-impl(p0: int, p1: int): void
|
public final static method constructor-impl(p0: int, p1: int): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
||||||
public final method getValue$x$main(): int
|
public final static @org.jetbrains.annotations.NotNull method getValue-impl(p0: int, p1: int): Internal
|
||||||
public final method getValue$y$main(): int
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getValue(): Internal
|
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int): int
|
public static method hashCode-impl(p0: int, p1: int): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int): java.lang.String
|
public static method toString-impl(p0: int, p1: int): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): Internal
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-0-0(): int
|
||||||
|
public synthetic final method unbox-impl-0-1(): int
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class PublicPrivate {
|
public final class PublicPrivate {
|
||||||
// source: 'visibility.kt'
|
// source: 'visibility.kt'
|
||||||
private field value$x: int
|
private final field field-0-0: int
|
||||||
private field value$y: int
|
private final field field-0-1: int
|
||||||
private synthetic method <init>(p0: int, p1: int): void
|
private synthetic method <init>(p0: int, p1: int): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int): PublicPrivate
|
public synthetic final static method box-impl(p0: int, p1: int): PublicPrivate
|
||||||
public final static method constructor-impl(p0: int, p1: int): void
|
public final static method constructor-impl(p0: int, p1: int): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
||||||
private final method getValue$x(): int
|
public final static @org.jetbrains.annotations.NotNull method getValue-impl(p0: int, p1: int): Private
|
||||||
private final method getValue$y(): int
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getValue(): Private
|
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int): int
|
public static method hashCode-impl(p0: int, p1: int): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int): java.lang.String
|
public static method toString-impl(p0: int, p1: int): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): Private
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-0-0(): int
|
||||||
|
public synthetic final method unbox-impl-0-1(): int
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.jvm.JvmInline
|
@kotlin.jvm.JvmInline
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class PublicPublic {
|
public final class PublicPublic {
|
||||||
// source: 'visibility.kt'
|
// source: 'visibility.kt'
|
||||||
private field value$x: int
|
private final field field-0-0: int
|
||||||
private field value$y: int
|
private final field field-0-1: int
|
||||||
private synthetic method <init>(p0: int, p1: int): void
|
private synthetic method <init>(p0: int, p1: int): void
|
||||||
public synthetic final static method box-impl(p0: int, p1: int): PublicPublic
|
public synthetic final static method box-impl(p0: int, p1: int): PublicPublic
|
||||||
public final static method constructor-impl(p0: int, p1: int): void
|
public final static method constructor-impl(p0: int, p1: int): void
|
||||||
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean
|
||||||
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
public static method equals-impl(p0: int, p1: int, p2: java.lang.Object): boolean
|
||||||
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
public final static method equals-impl0(p0: int, p1: int, p2: int, p3: int): boolean
|
||||||
public final method getValue$x(): int
|
public final static @org.jetbrains.annotations.NotNull method getValue-impl(p0: int, p1: int): Public
|
||||||
public final method getValue$y(): int
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getValue(): Public
|
|
||||||
public method hashCode(): int
|
public method hashCode(): int
|
||||||
public static method hashCode-impl(p0: int, p1: int): int
|
public static method hashCode-impl(p0: int, p1: int): int
|
||||||
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
public @org.jetbrains.annotations.NotNull method toString(): java.lang.String
|
||||||
public static method toString-impl(p0: int, p1: int): java.lang.String
|
public static method toString-impl(p0: int, p1: int): java.lang.String
|
||||||
public synthetic final method unbox-impl0(): int
|
public synthetic final method unbox-impl-0(): Public
|
||||||
public synthetic final method unbox-impl1(): int
|
public synthetic final method unbox-impl-0-0(): int
|
||||||
|
public synthetic final method unbox-impl-0-1(): int
|
||||||
|
}
|
||||||
|
|
||||||
|
@kotlin.Metadata
|
||||||
|
public final class Regular$Companion {
|
||||||
|
// source: 'visibility.kt'
|
||||||
|
private method <init>(): void
|
||||||
|
public synthetic method <init>(p0: kotlin.jvm.internal.DefaultConstructorMarker): void
|
||||||
|
public synthetic final static method access$getJvmStaticX3(p0: Regular$Companion): Public
|
||||||
|
public synthetic final static method access$getJvmStaticY3(p0: Regular$Companion): Internal
|
||||||
|
public synthetic final static method access$getJvmStaticZ3(p0: Regular$Companion): Private
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticX1$annotations(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getJvmStaticX1(): Public
|
||||||
|
public synthetic final method getJvmStaticX1-0(): int
|
||||||
|
public synthetic final method getJvmStaticX1-1(): int
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticX2$main$annotations(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getJvmStaticX2$main(): Public
|
||||||
|
public synthetic final method getJvmStaticX2-0(): int
|
||||||
|
public synthetic final method getJvmStaticX2-1(): int
|
||||||
|
private synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticX3$annotations(): void
|
||||||
|
private final method getJvmStaticX3(): Public
|
||||||
|
public synthetic final method getJvmStaticX3-0(): int
|
||||||
|
public synthetic final method getJvmStaticX3-1(): int
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticX4$annotations(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getJvmStaticX4(): Public
|
||||||
|
public synthetic final method getJvmStaticX4-0(): int
|
||||||
|
public synthetic final method getJvmStaticX4-1(): int
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticX5$main$annotations(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getJvmStaticX5$main(): Public
|
||||||
|
public synthetic final method getJvmStaticX5-0(): int
|
||||||
|
public synthetic final method getJvmStaticX5-1(): int
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticX6$annotations(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getJvmStaticX6(): Public
|
||||||
|
public synthetic final method getJvmStaticX6-0(): int
|
||||||
|
public synthetic final method getJvmStaticX6-1(): int
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticY1$annotations(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getJvmStaticY1(): Internal
|
||||||
|
public synthetic final method getJvmStaticY1-0(): int
|
||||||
|
public synthetic final method getJvmStaticY1-1(): int
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticY2$main$annotations(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getJvmStaticY2$main(): Internal
|
||||||
|
public synthetic final method getJvmStaticY2-0(): int
|
||||||
|
public synthetic final method getJvmStaticY2-1(): int
|
||||||
|
private synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticY3$annotations(): void
|
||||||
|
private final method getJvmStaticY3(): Internal
|
||||||
|
public synthetic final method getJvmStaticY3-0(): int
|
||||||
|
public synthetic final method getJvmStaticY3-1(): int
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticY4$annotations(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getJvmStaticY4(): Internal
|
||||||
|
public synthetic final method getJvmStaticY4-0(): int
|
||||||
|
public synthetic final method getJvmStaticY4-1(): int
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticY5$main$annotations(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getJvmStaticY5$main(): Internal
|
||||||
|
public synthetic final method getJvmStaticY5-0(): int
|
||||||
|
public synthetic final method getJvmStaticY5-1(): int
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticY6$annotations(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getJvmStaticY6(): Internal
|
||||||
|
public synthetic final method getJvmStaticY6-0(): int
|
||||||
|
public synthetic final method getJvmStaticY6-1(): int
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticZ1$annotations(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getJvmStaticZ1(): Private
|
||||||
|
public synthetic final method getJvmStaticZ1-0(): int
|
||||||
|
public synthetic final method getJvmStaticZ1-1(): int
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticZ2$main$annotations(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getJvmStaticZ2$main(): Private
|
||||||
|
public synthetic final method getJvmStaticZ2-0(): int
|
||||||
|
public synthetic final method getJvmStaticZ2-1(): int
|
||||||
|
private synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticZ3$annotations(): void
|
||||||
|
private final method getJvmStaticZ3(): Private
|
||||||
|
public synthetic final method getJvmStaticZ3-0(): int
|
||||||
|
public synthetic final method getJvmStaticZ3-1(): int
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticZ4$annotations(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getJvmStaticZ4(): Private
|
||||||
|
public synthetic final method getJvmStaticZ4-0(): int
|
||||||
|
public synthetic final method getJvmStaticZ4-1(): int
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticZ5$main$annotations(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getJvmStaticZ5$main(): Private
|
||||||
|
public synthetic final method getJvmStaticZ5-0(): int
|
||||||
|
public synthetic final method getJvmStaticZ5-1(): int
|
||||||
|
public synthetic deprecated static @kotlin.jvm.JvmStatic method getJvmStaticZ6$annotations(): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getJvmStaticZ6(): Private
|
||||||
|
public synthetic final method getJvmStaticZ6-0(): int
|
||||||
|
public synthetic final method getJvmStaticZ6-1(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getStaticX1(): Public
|
||||||
|
public synthetic final method getStaticX1-0(): int
|
||||||
|
public synthetic final method getStaticX1-1(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getStaticX2$main(): Public
|
||||||
|
public synthetic final method getStaticX2-0(): int
|
||||||
|
public synthetic final method getStaticX2-1(): int
|
||||||
|
private final method getStaticX3(): Public
|
||||||
|
public synthetic final method getStaticX3-0(): int
|
||||||
|
public synthetic final method getStaticX3-1(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getStaticX4(): Public
|
||||||
|
public synthetic final method getStaticX4-0(): int
|
||||||
|
public synthetic final method getStaticX4-1(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getStaticX5$main(): Public
|
||||||
|
public synthetic final method getStaticX5-0(): int
|
||||||
|
public synthetic final method getStaticX5-1(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getStaticX6(): Public
|
||||||
|
public synthetic final method getStaticX6-0(): int
|
||||||
|
public synthetic final method getStaticX6-1(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getStaticY1(): Internal
|
||||||
|
public synthetic final method getStaticY1-0(): int
|
||||||
|
public synthetic final method getStaticY1-1(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getStaticY2$main(): Internal
|
||||||
|
public synthetic final method getStaticY2-0(): int
|
||||||
|
public synthetic final method getStaticY2-1(): int
|
||||||
|
private final method getStaticY3(): Internal
|
||||||
|
public synthetic final method getStaticY3-0(): int
|
||||||
|
public synthetic final method getStaticY3-1(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getStaticY4(): Internal
|
||||||
|
public synthetic final method getStaticY4-0(): int
|
||||||
|
public synthetic final method getStaticY4-1(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getStaticY5$main(): Internal
|
||||||
|
public synthetic final method getStaticY5-0(): int
|
||||||
|
public synthetic final method getStaticY5-1(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getStaticY6(): Internal
|
||||||
|
public synthetic final method getStaticY6-0(): int
|
||||||
|
public synthetic final method getStaticY6-1(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getStaticZ1(): Private
|
||||||
|
public synthetic final method getStaticZ1-0(): int
|
||||||
|
public synthetic final method getStaticZ1-1(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getStaticZ2$main(): Private
|
||||||
|
public synthetic final method getStaticZ2-0(): int
|
||||||
|
public synthetic final method getStaticZ2-1(): int
|
||||||
|
private final method getStaticZ3(): Private
|
||||||
|
public synthetic final method getStaticZ3-0(): int
|
||||||
|
public synthetic final method getStaticZ3-1(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getStaticZ4(): Private
|
||||||
|
public synthetic final method getStaticZ4-0(): int
|
||||||
|
public synthetic final method getStaticZ4-1(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getStaticZ5$main(): Private
|
||||||
|
public synthetic final method getStaticZ5-0(): int
|
||||||
|
public synthetic final method getStaticZ5-1(): int
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getStaticZ6(): Private
|
||||||
|
public synthetic final method getStaticZ6-0(): int
|
||||||
|
public synthetic final method getStaticZ6-1(): int
|
||||||
|
public final method setJvmStaticX1-sUp7gFk(p0: int, p1: int): void
|
||||||
|
public final method setJvmStaticX2-sUp7gFk$main(p0: int, p1: int): void
|
||||||
|
public final method setJvmStaticX6-sUp7gFk$main(p0: int, p1: int): void
|
||||||
|
public final method setJvmStaticY1-sUp7gFk(p0: int, p1: int): void
|
||||||
|
public final method setJvmStaticY2-sUp7gFk$main(p0: int, p1: int): void
|
||||||
|
public final method setJvmStaticY6-sUp7gFk$main(p0: int, p1: int): void
|
||||||
|
public final method setJvmStaticZ1-sUp7gFk(p0: int, p1: int): void
|
||||||
|
public final method setJvmStaticZ2-sUp7gFk$main(p0: int, p1: int): void
|
||||||
|
public final method setJvmStaticZ6-sUp7gFk$main(p0: int, p1: int): void
|
||||||
|
public final method setStaticX1-sUp7gFk(p0: int, p1: int): void
|
||||||
|
public final method setStaticX2-sUp7gFk$main(p0: int, p1: int): void
|
||||||
|
public final method setStaticX6-sUp7gFk$main(p0: int, p1: int): void
|
||||||
|
public final method setStaticY1-sUp7gFk(p0: int, p1: int): void
|
||||||
|
public final method setStaticY2-sUp7gFk$main(p0: int, p1: int): void
|
||||||
|
public final method setStaticY6-sUp7gFk$main(p0: int, p1: int): void
|
||||||
|
public final method setStaticZ1-sUp7gFk(p0: int, p1: int): void
|
||||||
|
public final method setStaticZ2-sUp7gFk$main(p0: int, p1: int): void
|
||||||
|
public final method setStaticZ6-sUp7gFk$main(p0: int, p1: int): void
|
||||||
|
public final inner class Regular$Companion
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class Regular {
|
public final class Regular {
|
||||||
// source: 'visibility.kt'
|
// source: 'visibility.kt'
|
||||||
private field x1$x: int
|
public final static @org.jetbrains.annotations.NotNull field Companion: Regular$Companion
|
||||||
private field x1$y: int
|
private static field jvmStaticX1-0: int
|
||||||
private field x2$x: int
|
private static field jvmStaticX1-1: int
|
||||||
private field x2$y: int
|
private static field jvmStaticX2-0: int
|
||||||
private field x3$x: int
|
private static field jvmStaticX2-1: int
|
||||||
private field x3$y: int
|
private static field jvmStaticX3-0: int
|
||||||
private field x4$x: int
|
private static field jvmStaticX3-1: int
|
||||||
private field x4$y: int
|
private static field jvmStaticX4-0: int
|
||||||
private field x5$x: int
|
private static field jvmStaticX4-1: int
|
||||||
private field x5$y: int
|
private static field jvmStaticX5-0: int
|
||||||
private field x6$x: int
|
private static field jvmStaticX5-1: int
|
||||||
private field x6$y: int
|
private static field jvmStaticX6-0: int
|
||||||
private field y1$x: int
|
private static field jvmStaticX6-1: int
|
||||||
private field y1$y: int
|
private static field jvmStaticY1-0: int
|
||||||
private field y2$x: int
|
private static field jvmStaticY1-1: int
|
||||||
private field y2$y: int
|
private static field jvmStaticY2-0: int
|
||||||
private field y3$x: int
|
private static field jvmStaticY2-1: int
|
||||||
private field y3$y: int
|
private static field jvmStaticY3-0: int
|
||||||
private field y4$x: int
|
private static field jvmStaticY3-1: int
|
||||||
private field y4$y: int
|
private static field jvmStaticY4-0: int
|
||||||
private field y5$x: int
|
private static field jvmStaticY4-1: int
|
||||||
private field y5$y: int
|
private static field jvmStaticY5-0: int
|
||||||
private field y6$x: int
|
private static field jvmStaticY5-1: int
|
||||||
private field y6$y: int
|
private static field jvmStaticY6-0: int
|
||||||
private field z1$x: int
|
private static field jvmStaticY6-1: int
|
||||||
private field z1$y: int
|
private static field jvmStaticZ1-0: int
|
||||||
private field z2$x: int
|
private static field jvmStaticZ1-1: int
|
||||||
private field z2$y: int
|
private static field jvmStaticZ2-0: int
|
||||||
private field z3$x: int
|
private static field jvmStaticZ2-1: int
|
||||||
private field z3$y: int
|
private static field jvmStaticZ3-0: int
|
||||||
private field z4$x: int
|
private static field jvmStaticZ3-1: int
|
||||||
private field z4$y: int
|
private static field jvmStaticZ4-0: int
|
||||||
private field z5$x: int
|
private static field jvmStaticZ4-1: int
|
||||||
private field z5$y: int
|
private static field jvmStaticZ5-0: int
|
||||||
private field z6$x: int
|
private static field jvmStaticZ5-1: int
|
||||||
private field z6$y: int
|
private static field jvmStaticZ6-0: int
|
||||||
|
private static field jvmStaticZ6-1: int
|
||||||
|
private static field staticX1-0: int
|
||||||
|
private static field staticX1-1: int
|
||||||
|
private static field staticX2-0: int
|
||||||
|
private static field staticX2-1: int
|
||||||
|
private static field staticX3-0: int
|
||||||
|
private static field staticX3-1: int
|
||||||
|
private static field staticX4-0: int
|
||||||
|
private static field staticX4-1: int
|
||||||
|
private static field staticX5-0: int
|
||||||
|
private static field staticX5-1: int
|
||||||
|
private static field staticX6-0: int
|
||||||
|
private static field staticX6-1: int
|
||||||
|
private static field staticY1-0: int
|
||||||
|
private static field staticY1-1: int
|
||||||
|
private static field staticY2-0: int
|
||||||
|
private static field staticY2-1: int
|
||||||
|
private static field staticY3-0: int
|
||||||
|
private static field staticY3-1: int
|
||||||
|
private static field staticY4-0: int
|
||||||
|
private static field staticY4-1: int
|
||||||
|
private static field staticY5-0: int
|
||||||
|
private static field staticY5-1: int
|
||||||
|
private static field staticY6-0: int
|
||||||
|
private static field staticY6-1: int
|
||||||
|
private static field staticZ1-0: int
|
||||||
|
private static field staticZ1-1: int
|
||||||
|
private static field staticZ2-0: int
|
||||||
|
private static field staticZ2-1: int
|
||||||
|
private static field staticZ3-0: int
|
||||||
|
private static field staticZ3-1: int
|
||||||
|
private static field staticZ4-0: int
|
||||||
|
private static field staticZ4-1: int
|
||||||
|
private static field staticZ5-0: int
|
||||||
|
private static field staticZ5-1: int
|
||||||
|
private static field staticZ6-0: int
|
||||||
|
private static field staticZ6-1: int
|
||||||
|
private field x1-0: int
|
||||||
|
private field x1-1: int
|
||||||
|
private field x2-0: int
|
||||||
|
private field x2-1: int
|
||||||
|
private field x3-0: int
|
||||||
|
private field x3-1: int
|
||||||
|
private field x4-0: int
|
||||||
|
private field x4-1: int
|
||||||
|
private field x5-0: int
|
||||||
|
private field x5-1: int
|
||||||
|
private field x6-0: int
|
||||||
|
private field x6-1: int
|
||||||
|
private field y1-0: int
|
||||||
|
private field y1-1: int
|
||||||
|
private field y2-0: int
|
||||||
|
private field y2-1: int
|
||||||
|
private field y3-0: int
|
||||||
|
private field y3-1: int
|
||||||
|
private field y4-0: int
|
||||||
|
private field y4-1: int
|
||||||
|
private field y5-0: int
|
||||||
|
private field y5-1: int
|
||||||
|
private field y6-0: int
|
||||||
|
private field y6-1: int
|
||||||
|
private field z1-0: int
|
||||||
|
private field z1-1: int
|
||||||
|
private field z2-0: int
|
||||||
|
private field z2-1: int
|
||||||
|
private field z3-0: int
|
||||||
|
private field z3-1: int
|
||||||
|
private field z4-0: int
|
||||||
|
private field z4-1: int
|
||||||
|
private field z5-0: int
|
||||||
|
private field z5-1: int
|
||||||
|
private field z6-0: int
|
||||||
|
private field z6-1: int
|
||||||
|
static method <clinit>(): void
|
||||||
public method <init>(): void
|
public method <init>(): void
|
||||||
|
public synthetic final static method access$getJvmStaticX1-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticX1-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticX2-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticX2-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticX3-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticX3-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticX4-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticX4-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticX5-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticX5-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticX6-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticX6-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticY1-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticY1-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticY2-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticY2-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticY3-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticY3-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticY4-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticY4-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticY5-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticY5-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticY6-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticY6-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticZ1-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticZ1-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticZ2-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticZ2-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticZ3-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticZ3-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticZ4-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticZ4-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticZ5-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticZ5-1$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticZ6-0$cp(): int
|
||||||
|
public synthetic final static method access$getJvmStaticZ6-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticX1-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticX1-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticX2-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticX2-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticX3-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticX3-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticX4-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticX4-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticX5-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticX5-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticX6-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticX6-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticY1-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticY1-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticY2-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticY2-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticY3-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticY3-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticY4-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticY4-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticY5-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticY5-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticY6-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticY6-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticZ1-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticZ1-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticZ2-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticZ2-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticZ3-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticZ3-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticZ4-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticZ4-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticZ5-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticZ5-1$cp(): int
|
||||||
|
public synthetic final static method access$getStaticZ6-0$cp(): int
|
||||||
|
public synthetic final static method access$getStaticZ6-1$cp(): int
|
||||||
|
public synthetic final static method access$setJvmStaticX1-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticX1-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticX2-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticX2-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticX6-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticX6-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticY1-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticY1-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticY2-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticY2-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticY6-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticY6-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticZ1-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticZ1-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticZ2-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticZ2-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticZ6-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setJvmStaticZ6-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticX1-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticX1-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticX2-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticX2-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticX6-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticX6-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticY1-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticY1-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticY2-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticY2-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticY6-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticY6-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticZ1-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticZ1-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticZ2-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticZ2-1$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticZ6-0$cp(p0: int): void
|
||||||
|
public synthetic final static method access$setStaticZ6-1$cp(p0: int): void
|
||||||
public final method callAll(): void
|
public final method callAll(): void
|
||||||
public final method getX1$x(): int
|
public final static @org.jetbrains.annotations.NotNull method getJvmStaticX1(): Public
|
||||||
public final method getX1$y(): int
|
public final static @org.jetbrains.annotations.NotNull method getJvmStaticX2$main(): Public
|
||||||
|
private final static method getJvmStaticX3(): Public
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getJvmStaticX4(): Public
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getJvmStaticX5$main(): Public
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getJvmStaticX6(): Public
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getJvmStaticY1(): Internal
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getJvmStaticY2$main(): Internal
|
||||||
|
private final static method getJvmStaticY3(): Internal
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getJvmStaticY4(): Internal
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getJvmStaticY5$main(): Internal
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getJvmStaticY6(): Internal
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getJvmStaticZ1(): Private
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getJvmStaticZ2$main(): Private
|
||||||
|
private final static method getJvmStaticZ3(): Private
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getJvmStaticZ4(): Private
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getJvmStaticZ5$main(): Private
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getJvmStaticZ6(): Private
|
||||||
public final @org.jetbrains.annotations.NotNull method getX1(): Public
|
public final @org.jetbrains.annotations.NotNull method getX1(): Public
|
||||||
|
public synthetic final method getX1-0(): int
|
||||||
|
public synthetic final method getX1-1(): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getX2$main(): Public
|
public final @org.jetbrains.annotations.NotNull method getX2$main(): Public
|
||||||
public final method getX2$x$main(): int
|
public synthetic final method getX2-0(): int
|
||||||
public final method getX2$y$main(): int
|
public synthetic final method getX2-1(): int
|
||||||
private final method getX3(): Public
|
private final method getX3(): Public
|
||||||
public final method getX4$x(): int
|
public synthetic final method getX3-0(): int
|
||||||
public final method getX4$y(): int
|
public synthetic final method getX3-1(): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getX4(): Public
|
public final @org.jetbrains.annotations.NotNull method getX4(): Public
|
||||||
|
public synthetic final method getX4-0(): int
|
||||||
|
public synthetic final method getX4-1(): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getX5$main(): Public
|
public final @org.jetbrains.annotations.NotNull method getX5$main(): Public
|
||||||
public final method getX5$x$main(): int
|
public synthetic final method getX5-0(): int
|
||||||
public final method getX5$y$main(): int
|
public synthetic final method getX5-1(): int
|
||||||
public final method getX6$x(): int
|
|
||||||
public final method getX6$y(): int
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getX6(): Public
|
public final @org.jetbrains.annotations.NotNull method getX6(): Public
|
||||||
public final method getY1$x$main(): int
|
public synthetic final method getX6-0(): int
|
||||||
public final method getY1$y$main(): int
|
public synthetic final method getX6-1(): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getY1(): Internal
|
public final @org.jetbrains.annotations.NotNull method getY1(): Internal
|
||||||
|
public synthetic final method getY1-0(): int
|
||||||
|
public synthetic final method getY1-1(): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getY2$main(): Internal
|
public final @org.jetbrains.annotations.NotNull method getY2$main(): Internal
|
||||||
public final method getY2$x$main(): int
|
public synthetic final method getY2-0(): int
|
||||||
public final method getY2$y$main(): int
|
public synthetic final method getY2-1(): int
|
||||||
private final method getY3(): Internal
|
private final method getY3(): Internal
|
||||||
public final method getY4$x$main(): int
|
public synthetic final method getY3-0(): int
|
||||||
public final method getY4$y$main(): int
|
public synthetic final method getY3-1(): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getY4(): Internal
|
public final @org.jetbrains.annotations.NotNull method getY4(): Internal
|
||||||
|
public synthetic final method getY4-0(): int
|
||||||
|
public synthetic final method getY4-1(): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getY5$main(): Internal
|
public final @org.jetbrains.annotations.NotNull method getY5$main(): Internal
|
||||||
public final method getY5$x$main(): int
|
public synthetic final method getY5-0(): int
|
||||||
public final method getY5$y$main(): int
|
public synthetic final method getY5-1(): int
|
||||||
public final method getY6$x$main(): int
|
|
||||||
public final method getY6$y$main(): int
|
|
||||||
public final @org.jetbrains.annotations.NotNull method getY6(): Internal
|
public final @org.jetbrains.annotations.NotNull method getY6(): Internal
|
||||||
|
public synthetic final method getY6-0(): int
|
||||||
|
public synthetic final method getY6-1(): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getZ1(): Private
|
public final @org.jetbrains.annotations.NotNull method getZ1(): Private
|
||||||
|
public synthetic final method getZ1-0(): int
|
||||||
|
public synthetic final method getZ1-1(): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getZ2$main(): Private
|
public final @org.jetbrains.annotations.NotNull method getZ2$main(): Private
|
||||||
|
public synthetic final method getZ2-0(): int
|
||||||
|
public synthetic final method getZ2-1(): int
|
||||||
private final method getZ3(): Private
|
private final method getZ3(): Private
|
||||||
|
public synthetic final method getZ3-0(): int
|
||||||
|
public synthetic final method getZ3-1(): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getZ4(): Private
|
public final @org.jetbrains.annotations.NotNull method getZ4(): Private
|
||||||
|
public synthetic final method getZ4-0(): int
|
||||||
|
public synthetic final method getZ4-1(): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getZ5$main(): Private
|
public final @org.jetbrains.annotations.NotNull method getZ5$main(): Private
|
||||||
|
public synthetic final method getZ5-0(): int
|
||||||
|
public synthetic final method getZ5-1(): int
|
||||||
public final @org.jetbrains.annotations.NotNull method getZ6(): Private
|
public final @org.jetbrains.annotations.NotNull method getZ6(): Private
|
||||||
|
public synthetic final method getZ6-0(): int
|
||||||
|
public synthetic final method getZ6-1(): int
|
||||||
public final method setX1-sUp7gFk(p0: int, p1: int): void
|
public final method setX1-sUp7gFk(p0: int, p1: int): void
|
||||||
public final method setX2-sUp7gFk$main(p0: int, p1: int): void
|
public final method setX2-sUp7gFk$main(p0: int, p1: int): void
|
||||||
private final method setX3-sUp7gFk(p0: int, p1: int): void
|
|
||||||
private final method setX4-sUp7gFk(p0: int, p1: int): void
|
|
||||||
private final method setX5-sUp7gFk(p0: int, p1: int): void
|
|
||||||
public final method setX6-sUp7gFk$main(p0: int, p1: int): void
|
public final method setX6-sUp7gFk$main(p0: int, p1: int): void
|
||||||
public final method setY1-sUp7gFk(p0: int, p1: int): void
|
public final method setY1-sUp7gFk(p0: int, p1: int): void
|
||||||
public final method setY2-sUp7gFk$main(p0: int, p1: int): void
|
public final method setY2-sUp7gFk$main(p0: int, p1: int): void
|
||||||
private final method setY3-sUp7gFk(p0: int, p1: int): void
|
|
||||||
private final method setY4-sUp7gFk(p0: int, p1: int): void
|
|
||||||
private final method setY5-sUp7gFk(p0: int, p1: int): void
|
|
||||||
public final method setY6-sUp7gFk$main(p0: int, p1: int): void
|
public final method setY6-sUp7gFk$main(p0: int, p1: int): void
|
||||||
public final method setZ1-sUp7gFk(p0: int, p1: int): void
|
public final method setZ1-sUp7gFk(p0: int, p1: int): void
|
||||||
public final method setZ2-sUp7gFk$main(p0: int, p1: int): void
|
public final method setZ2-sUp7gFk$main(p0: int, p1: int): void
|
||||||
private final method setZ3-sUp7gFk(p0: int, p1: int): void
|
|
||||||
private final method setZ4-sUp7gFk(p0: int, p1: int): void
|
|
||||||
private final method setZ5-sUp7gFk(p0: int, p1: int): void
|
|
||||||
public final method setZ6-sUp7gFk$main(p0: int, p1: int): void
|
public final method setZ6-sUp7gFk$main(p0: int, p1: int): void
|
||||||
|
public final inner class Regular$Companion
|
||||||
}
|
}
|
||||||
|
|
||||||
@kotlin.Metadata
|
@kotlin.Metadata
|
||||||
public final class VisibilityKt {
|
public final class VisibilityKt {
|
||||||
// source: 'visibility.kt'
|
// source: 'visibility.kt'
|
||||||
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
|
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
|
||||||
|
public final inner class Regular$Companion
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,28 +41,27 @@ fun functionWithoutBoxes(x: D, y: D) {
|
|||||||
// 2 public final static constructor-impl\(IILjava/lang/String;\)V
|
// 2 public final static constructor-impl\(IILjava/lang/String;\)V
|
||||||
// 2 INVOKESTATIC D.constructor-impl \(IILjava/lang/String;\)V
|
// 2 INVOKESTATIC D.constructor-impl \(IILjava/lang/String;\)V
|
||||||
// 2 INVOKESTATIC C.constructor-impl \(IILjava/lang/String;\)V
|
// 2 INVOKESTATIC C.constructor-impl \(IILjava/lang/String;\)V
|
||||||
// 1 public final getX\(\)LC;
|
// 1 public final static getX-impl\(.+\)LC;
|
||||||
// 1 public final getX\$x\(\)I
|
// 1 public final synthetic unbox-impl-0-0\(\)I
|
||||||
// 1 public final getX\$y-\w*\(\)I
|
// 1 public final synthetic unbox-impl-0-1\(\)I
|
||||||
// 1 public final getX\$z\(\)Ljava/lang/String;
|
// 1 public final synthetic unbox-impl-0-2\(\)Ljava/lang/String;
|
||||||
// 2 private synthetic <init>\(IILjava/lang/String;\)V
|
// 2 private synthetic <init>\(IILjava/lang/String;\)V
|
||||||
// 1 public final static synthetic box-impl\(IILjava/lang/String;\)LD;
|
// 1 public final static synthetic box-impl\(IILjava/lang/String;\)LD;
|
||||||
// 1 public final static synthetic box-impl\(IILjava/lang/String;\)LC;
|
// 1 public final static synthetic box-impl\(IILjava/lang/String;\)LC;
|
||||||
// 2 public final synthetic unbox-impl0\(\)I
|
// 1 public final synthetic unbox-impl-0\(\)I
|
||||||
// 2 public final synthetic unbox-impl1\(\)I
|
// 1 public final synthetic unbox-impl-1\(\)I
|
||||||
// 2 public final synthetic unbox-impl2\(\)Ljava/lang/String;
|
// 1 public final synthetic unbox-impl-2\(\)Ljava/lang/String;
|
||||||
// 1 private I x\$x
|
// 1 private final I field-0-0\n
|
||||||
// 1 private I x\$y
|
// 1 private final I field-0-1\n
|
||||||
// 1 private Ljava/lang/String; x\$z
|
// 1 private final Ljava/lang/String; field-0-2\n
|
||||||
// 0 private LC; x
|
// 0 private final LC; (field.*)x\n
|
||||||
// 3 private I x
|
// 1 private final I x\n
|
||||||
// 1 private I y
|
// 1 private final I field-0\n
|
||||||
// 1 private Ljava/lang/String; z
|
// 1 private final I field-1\n
|
||||||
|
// 1 private final Ljava/lang/String; field-2\n
|
||||||
// 1 INVOKESPECIAL C.<init> \(IILjava/lang/String;\)V
|
// 1 INVOKESPECIAL C.<init> \(IILjava/lang/String;\)V
|
||||||
// 1 INVOKESPECIAL D.<init> \(IILjava/lang/String;\)V
|
// 1 INVOKESPECIAL D.<init> \(IILjava/lang/String;\)V
|
||||||
// 1 INVOKESTATIC D.box-impl \(IILjava/lang/String;\)LD;
|
// 1 INVOKESTATIC D.box-impl \(IILjava/lang/String;\)LD;
|
||||||
// 1 INVOKESTATIC D.box-impl \(IILjava/lang/String;\)LD;\n ARETURN
|
// 2 INVOKESTATIC C.box-impl \(IILjava/lang/String;\)LC;
|
||||||
// 1 INVOKESTATIC C.box-impl \(IILjava/lang/String;\)LC;
|
|
||||||
// 1 INVOKESTATIC C.box-impl \(IILjava/lang/String;\)LC;\n ARETURN
|
|
||||||
// 1 public final static functionWithoutBoxes-GPBa7dw\(IILjava/lang/String;IILjava/lang/String;\)V
|
// 1 public final static functionWithoutBoxes-GPBa7dw\(IILjava/lang/String;IILjava/lang/String;\)V
|
||||||
// 0 functionWithoutBoxes.*(\n {3}.*)*(\n {4}(NEW [ABCD]|.*(box|[ABCD]\.<init>|LA;|LB;|LC;|LD;)))
|
// 0 functionWithoutBoxes.*(\n {3}.*)*(\n {4}(NEW [ABCD]|.*(box|[ABCD]\.<init>|LA;|LB;|LC;|LD;)))
|
||||||
|
|||||||
@@ -62,12 +62,10 @@ fun reassignField(x: DPoint, box: Box) {
|
|||||||
// 1 107(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){2}108
|
// 1 107(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){2}108
|
||||||
// 0 107(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){3}108
|
// 0 107(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){3}108
|
||||||
// 0 108(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){1}109
|
// 0 108(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){1}109
|
||||||
// 1 109(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){2}110
|
// 0 109(\D|\d\D|\d\d\D)*([DA]STORE(\D|\d\D|\d\d\D)*){1}110
|
||||||
// 0 109(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){3}110
|
|
||||||
// 1 110(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){2}111
|
// 1 110(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){2}111
|
||||||
// 0 110(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){3}111
|
// 0 110(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){3}111
|
||||||
// 0 111(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){1}112
|
// 0 111(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){1}112
|
||||||
// 1 112(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){2}113
|
// 0 112(\D|\d\D|\d\d\D)*([DA]STORE(\D|\d\D|\d\d\D)*){1}113
|
||||||
// 0 112(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){3}113
|
// 1 113(\D|\d\D|\d\d\D)*(ASTORE(\D|\d\D|\d\d\D)*){1}114
|
||||||
// 1 113(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){2}114
|
// 0 113(\D|\d\D|\d\d\D)*(ASTORE(\D|\d\D|\d\d\D)*){2}114
|
||||||
// 0 113(\D|\d\D|\d\d\D)*(DSTORE(\D|\d\D|\d\d\D)*){3}114
|
|
||||||
|
|||||||
@@ -13,18 +13,43 @@ fun DPoint.toObject() = this as Any
|
|||||||
fun DPoint.toDPointOrNull() = this as DPoint?
|
fun DPoint.toDPointOrNull() = this as DPoint?
|
||||||
fun Nothing?.toDPointOrNull() = this as DPoint?
|
fun Nothing?.toDPointOrNull() = this as DPoint?
|
||||||
|
|
||||||
fun equalsChecks(left: DPoint, right: DPoint) {
|
// separate to escape from StackOverflow in regex
|
||||||
|
|
||||||
|
fun equalsChecks1(left: DPoint, right: DPoint) {
|
||||||
require(100, left == right)
|
require(100, left == right)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun equalsChecks2(left: DPoint, right: DPoint) {
|
||||||
require(101, left.toObject() == right)
|
require(101, left.toObject() == right)
|
||||||
|
}
|
||||||
|
fun equalsChecks3(left: DPoint, right: DPoint) {
|
||||||
require(102, left == right.toObject())
|
require(102, left == right.toObject())
|
||||||
|
}
|
||||||
|
fun equalsChecks4(left: DPoint, right: DPoint) {
|
||||||
require(103, left.toObject() == right.toObject())
|
require(103, left.toObject() == right.toObject())
|
||||||
|
}
|
||||||
|
fun equalsChecks5(left: DPoint, right: DPoint) {
|
||||||
require(104, null == right)
|
require(104, null == right)
|
||||||
|
}
|
||||||
|
fun equalsChecks6(left: DPoint, right: DPoint) {
|
||||||
require(105, left == null)
|
require(105, left == null)
|
||||||
|
}
|
||||||
|
fun equalsChecks7(left: DPoint, right: DPoint) {
|
||||||
require(106, null as Any? == right)
|
require(106, null as Any? == right)
|
||||||
|
}
|
||||||
|
fun equalsChecks8(left: DPoint, right: DPoint) {
|
||||||
require(107, left == null as Any?)
|
require(107, left == null as Any?)
|
||||||
|
}
|
||||||
|
fun equalsChecks9(left: DPoint, right: DPoint) {
|
||||||
require(108, null.toDPointOrNull() == right)
|
require(108, null.toDPointOrNull() == right)
|
||||||
|
}
|
||||||
|
fun equalsChecks10(left: DPoint, right: DPoint) {
|
||||||
require(109, left == null.toDPointOrNull())
|
require(109, left == null.toDPointOrNull())
|
||||||
|
}
|
||||||
|
fun equalsChecks11(left: DPoint, right: DPoint) {
|
||||||
require(110, left.toDPointOrNull() == right)
|
require(110, left.toDPointOrNull() == right)
|
||||||
|
}
|
||||||
|
fun equalsChecks12(left: DPoint, right: DPoint) {
|
||||||
require(111, left == right.toDPointOrNull())
|
require(111, left == right.toDPointOrNull())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,7 +61,7 @@ fun equalsChecks(left: DPoint, right: DPoint) {
|
|||||||
// 1 BIPUSH 105\n {4}DLOAD 0\n {4}DLOAD 2\n {4}ACONST_NULL\n {4}INVOKESTATIC .*equals-impl .*\n {4}INVOKESTATIC .*require
|
// 1 BIPUSH 105\n {4}DLOAD 0\n {4}DLOAD 2\n {4}ACONST_NULL\n {4}INVOKESTATIC .*equals-impl .*\n {4}INVOKESTATIC .*require
|
||||||
// 1 BIPUSH 106\n {4}ACONST_NULL\n {4}DLOAD 4\n {4}DLOAD 6\n {4}.*box.*\n {4}INVOKESTATIC .*Intrinsics.areEqual.*\n {4}INVOKESTATIC .*require
|
// 1 BIPUSH 106\n {4}ACONST_NULL\n {4}DLOAD 4\n {4}DLOAD 6\n {4}.*box.*\n {4}INVOKESTATIC .*Intrinsics.areEqual.*\n {4}INVOKESTATIC .*require
|
||||||
// 1 BIPUSH 107\n {4}DLOAD 0\n {4}DLOAD 2\n {4}ACONST_NULL\n {4}INVOKESTATIC .*equals-impl .*\n {4}INVOKESTATIC .*require
|
// 1 BIPUSH 107\n {4}DLOAD 0\n {4}DLOAD 2\n {4}ACONST_NULL\n {4}INVOKESTATIC .*equals-impl .*\n {4}INVOKESTATIC .*require
|
||||||
// 1 BIPUSH 108\n {4}ACONST_NULL\n {4}.*toDPointOrNull.*\n {4}DUP\n {4}IFNONNULL.*(\n {3}([^b\n]|b[^o\n]|bo[^x\n]|box-impl\d)*)*\n {4}INVOKESTATIC .*require
|
// 1 BIPUSH 108\n {4}ACONST_NULL\n {4}.*toDPointOrNull.*\n {4}ASTORE.*\n {4}ALOAD.*\n {4}DUP\n {4}IFNONNULL.*(\n {3}([^b\n]|b[^o\n]|bo[^x\n]|box-impl-\d)+)*\n {4}INVOKESTATIC .*require
|
||||||
// 1 BIPUSH 109\n {4}DLOAD 0\n {4}DLOAD 2\n {4}ACONST_NULL\n {4}.*toDPointOrNull.*\n {4}INVOKESTATIC .*equals-impl .*\n {4}INVOKESTATIC .*require
|
// 1 BIPUSH 109\n {4}DLOAD 0\n {4}DLOAD 2\n {4}ACONST_NULL\n {4}.*toDPointOrNull.*\n {4}INVOKESTATIC .*equals-impl .*\n {4}INVOKESTATIC .*require
|
||||||
// 1 BIPUSH 110\n {4}DLOAD 0\n {4}DLOAD 2\n {4}.*toDPointOrNull.*\n {4}DUP\n {4}IFNONNULL.*(\n {3}([^b\n]|b[^o\n]|bo[^x\n]|box-impl\d)*)*\n {4}INVOKESTATIC .*require
|
// 1 BIPUSH 110\n {4}DLOAD 0\n {4}DLOAD 2\n {4}.*toDPointOrNull.*\n {4}ASTORE.*\n {4}ALOAD.*\n {4}DUP\n {4}IFNONNULL.*(\n {3}([^b\n]|b[^o\n]|bo[^x\n]|box-impl-\d)+)*\n {4}INVOKESTATIC .*require
|
||||||
// 1 BIPUSH 111\n {4}DLOAD 0\n {4}DLOAD 2\n {4}DLOAD 4\n {4}DLOAD 6\n {4}.*toDPointOrNull.*\n {4}INVOKESTATIC .*equals-impl .*\n {4}INVOKESTATIC .*require
|
// 1 BIPUSH 111\n {4}DLOAD 0\n {4}DLOAD 2\n {4}DLOAD 4\n {4}DLOAD 6\n {4}.*toDPointOrNull.*\n {4}INVOKESTATIC .*equals-impl .*\n {4}INVOKESTATIC .*require
|
||||||
|
|||||||
+25
-30
@@ -74,20 +74,20 @@ fun trySetSegment(segment: DSegment) {
|
|||||||
|
|
||||||
// 0 public final getOpposite\(\)LDPoint;
|
// 0 public final getOpposite\(\)LDPoint;
|
||||||
// 1 public final static getOpposite-impl\(DD\)LDPoint;
|
// 1 public final static getOpposite-impl\(DD\)LDPoint;
|
||||||
// 1 private D p1\$x
|
// 1 private D p1-0
|
||||||
// 1 private D p1\$y
|
// 1 private D p1-1
|
||||||
// 0 private DPoint; p1
|
// 0 private DPoint; p1
|
||||||
// 1 private D p2\$x
|
// 1 private D p2-0
|
||||||
// 1 private D p2\$y
|
// 1 private D p2-1
|
||||||
// 0 private DPoint; p2
|
// 0 private DPoint; p2
|
||||||
// 1 private D point1WithBackingFieldAndDefaultGetter\$x
|
// 1 private D point1WithBackingFieldAndDefaultGetter-0
|
||||||
// 1 private D point1WithBackingFieldAndDefaultGetter\$y
|
// 1 private D point1WithBackingFieldAndDefaultGetter-1
|
||||||
// 0 private DPoint; point1WithBackingFieldAndDefaultGetter
|
// 0 private DPoint; point1WithBackingFieldAndDefaultGetter
|
||||||
// 1 private D point2WithBackingFieldAndDefaultGetter\$x
|
// 1 private D point2WithBackingFieldAndDefaultGetter-0
|
||||||
// 1 private D point2WithBackingFieldAndDefaultGetter\$y
|
// 1 private D point2WithBackingFieldAndDefaultGetter-1
|
||||||
// 0 private DPoint; point2WithBackingFieldAndDefaultGetter
|
// 0 private DPoint; point2WithBackingFieldAndDefaultGetter
|
||||||
// 1 private D pointWithBackingFieldAndCustomGetter\$x
|
// 1 private D pointWithBackingFieldAndCustomGetter-0
|
||||||
// 1 private D pointWithBackingFieldAndCustomGetter\$y
|
// 1 private D pointWithBackingFieldAndCustomGetter-1
|
||||||
// 0 private DPoint; pointWithBackingFieldAndCustomGetter
|
// 0 private DPoint; pointWithBackingFieldAndCustomGetter
|
||||||
// 0 private DPoint; notImplemented
|
// 0 private DPoint; notImplemented
|
||||||
// 0 private D notImplemented
|
// 0 private D notImplemented
|
||||||
@@ -108,22 +108,22 @@ fun trySetSegment(segment: DSegment) {
|
|||||||
// 1 public final setPoint2WithBackingFieldAndDefaultGetter-sUp7gFk\(DD\)V
|
// 1 public final setPoint2WithBackingFieldAndDefaultGetter-sUp7gFk\(DD\)V
|
||||||
// 1 public final getPointWithBackingFieldAndCustomGetter\(\)LDPoint;
|
// 1 public final getPointWithBackingFieldAndCustomGetter\(\)LDPoint;
|
||||||
// 1 public final setPointWithBackingFieldAndCustomGetter-sUp7gFk\(DD\)V
|
// 1 public final setPointWithBackingFieldAndCustomGetter-sUp7gFk\(DD\)V
|
||||||
// 1 public final getP1\$x\(\)D
|
// 1 public final synthetic getP1-0\(\)D
|
||||||
// 1 public final getP1\$y\(\)D
|
// 1 public final synthetic getP1-1\(\)D
|
||||||
// 1 public final getP2\$x\(\)D
|
// 1 public final synthetic getP2-0\(\)D
|
||||||
// 1 public final getP2\$y\(\)D
|
// 1 public final synthetic getP2-1\(\)D
|
||||||
// 1 public final getPoint1WithBackingFieldAndDefaultGetter\$x\(\)D
|
// 1 public final synthetic getPoint1WithBackingFieldAndDefaultGetter-0\(\)D
|
||||||
// 1 public final getPoint1WithBackingFieldAndDefaultGetter\$y\(\)D
|
// 1 public final synthetic getPoint1WithBackingFieldAndDefaultGetter-1\(\)D
|
||||||
// 1 public final getPoint2WithBackingFieldAndDefaultGetter\$x\(\)D
|
// 1 public final synthetic getPoint2WithBackingFieldAndDefaultGetter-0\(\)D
|
||||||
// 1 public final getPoint2WithBackingFieldAndDefaultGetter\$y\(\)D
|
// 1 public final synthetic getPoint2WithBackingFieldAndDefaultGetter-1\(\)D
|
||||||
// 0 public final getCenter\$
|
// 0 public final getCenter\$
|
||||||
// 0 public final getNotImplemented\$
|
// 0 public final getNotImplemented\$
|
||||||
// 0 public final getPointWithBackingFieldAndCustomGetter\$
|
// 0 public final getPointWithBackingFieldAndCustomGetter\$
|
||||||
// 0 ^ {2}\b.*get.*\$.*(\n {3}.*)*(\n {4}.*\.box)
|
// 0 ^ {2}\b.*get.*\$.*(\n {3}.*)*(\n {4}.*\.box)
|
||||||
// 1 tryGetSegment\(LDSegment;\)V
|
// 1 tryGetSegment\(LDSegment;\)V
|
||||||
// 0 try[GS]etSegment\(LDSegment;\)V.*(\n {3}.*)*(\n {4}.*\.box)
|
// 0 try[GS]etSegment\(LDSegment;\)V.*(\n {3}.*)*(\n {4}.*\.box)
|
||||||
// 1 tryGetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}.*LDPoint;)){13}
|
// 1 tryGetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}.*LDPoint;)){7}
|
||||||
// 0 tryGetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}.*LDPoint;)){14}
|
// 0 tryGetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}.*LDPoint;)){8}
|
||||||
// 0 trySetSegment\(LDSegment;\)V.*(\n {3}.*)*(\n {4}.*LDPoint;)
|
// 0 trySetSegment\(LDSegment;\)V.*(\n {3}.*)*(\n {4}.*LDPoint;)
|
||||||
// 1 trySetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}INVOKEVIRTUAL DSegment\.setNotImplemented-sUp7gFk \(DD\)V)){1}
|
// 1 trySetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}INVOKEVIRTUAL DSegment\.setNotImplemented-sUp7gFk \(DD\)V)){1}
|
||||||
// 0 trySetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}INVOKEVIRTUAL DSegment\.setNotImplemented-sUp7gFk \(DD\)V)){2}
|
// 0 trySetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}INVOKEVIRTUAL DSegment\.setNotImplemented-sUp7gFk \(DD\)V)){2}
|
||||||
@@ -137,13 +137,8 @@ fun trySetSegment(segment: DSegment) {
|
|||||||
// 0 trySetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}INVOKEVIRTUAL DSegment\.setP1-sUp7gFk \(DD\)V)){2}
|
// 0 trySetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}INVOKEVIRTUAL DSegment\.setP1-sUp7gFk \(DD\)V)){2}
|
||||||
// 1 trySetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}INVOKEVIRTUAL DSegment\.setP2-sUp7gFk \(DD\)V)){1}
|
// 1 trySetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}INVOKEVIRTUAL DSegment\.setP2-sUp7gFk \(DD\)V)){1}
|
||||||
// 0 trySetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}INVOKEVIRTUAL DSegment\.setP2-sUp7gFk \(DD\)V)){2}
|
// 0 trySetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}INVOKEVIRTUAL DSegment\.setP2-sUp7gFk \(DD\)V)){2}
|
||||||
// 1 tryGetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}INVOKEVIRTUAL DPoint\.getX \(\)D)){3}
|
// 0 try[GS]etSegment\(LDSegment;\)V.*(\n {3}.*)*(\n {4}INVOKEVIRTUAL DPoint\.get[XY] \(\)D)
|
||||||
// 0 tryGetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}INVOKEVIRTUAL DPoint\.getX \(\)D)){4}
|
// 1 tryGetSegment\(LDSegment;\)V.*((\n {3}.*)*?(\n {4}INVOKEVIRTUAL DSegment\.get.*-[01] \(\)D)){14}
|
||||||
// 0 trySetSegment\(LDSegment;\)V.*(\n {3}.*)*(\n {4}INVOKEVIRTUAL DPoint\.getX \(\)D)
|
// 0 tryGetSegment\(LDSegment;\)V.*((\n {3}.*)*?(\n {4}INVOKEVIRTUAL DSegment\.get.*-[01] \(\)D)){15}
|
||||||
// 1 tryGetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}INVOKEVIRTUAL DPoint\.getY \(\)D)){3}
|
// 1 trySetSegment\(LDSegment;\)V.*((\n {3}.*)*?(\n {4}INVOKEVIRTUAL DSegment\.get.*-[01] \(\)D)){12}
|
||||||
// 0 tryGetSegment\(LDSegment;\)V.*((\n {3}.*)*(\n {4}INVOKEVIRTUAL DPoint\.getY \(\)D)){4}
|
// 0 trySetSegment\(LDSegment;\)V.*((\n {3}.*)*?(\n {4}INVOKEVIRTUAL DSegment\.get.*-[01] \(\)D)){13}
|
||||||
// 0 trySetSegment\(LDSegment;\)V.*(\n {3}.*)*(\n {4}INVOKEVIRTUAL DPoint\.getY \(\)D)
|
|
||||||
// 1 tryGetSegment\(LDSegment;\)V.*((\n {3}.*)*?(\n {4}INVOKEVIRTUAL DSegment\.get.*\$[xy] \(\)D)){8}
|
|
||||||
// 0 tryGetSegment\(LDSegment;\)V.*((\n {3}.*)*?(\n {4}INVOKEVIRTUAL DSegment\.get.*\$[xy] \(\)D)){9}
|
|
||||||
// 1 trySetSegment\(LDSegment;\)V.*((\n {3}.*)*?(\n {4}INVOKEVIRTUAL DSegment\.get.*\$[xy] \(\)D)){12}
|
|
||||||
// 0 trySetSegment\(LDSegment;\)V.*((\n {3}.*)*?(\n {4}INVOKEVIRTUAL DSegment\.get.*\$[xy] \(\)D)){13}
|
|
||||||
|
|||||||
+3
-3
@@ -50202,9 +50202,9 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("MFVCFieldInitializationOrder.kt")
|
@TestMetadata("MfvcFieldInitializationOrder.kt")
|
||||||
public void testMFVCFieldInitializationOrder() throws Exception {
|
public void testMfvcFieldInitializationOrder() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/valueClasses/MFVCFieldInitializationOrder.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
runTest("compiler/testData/codegen/box/valueClasses/MfvcFieldInitializationOrder.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user