[Commonizer] Intern duplicated CirFunctionModifiers instances
This commit is contained in:
+8
-9
@@ -5,12 +5,11 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.descriptors.commonizer.cir
|
package org.jetbrains.kotlin.descriptors.commonizer.cir
|
||||||
|
|
||||||
// TODO: inline?
|
interface CirFunctionModifiers {
|
||||||
data class CirFunctionModifiers(
|
val isOperator: Boolean
|
||||||
var isOperator: Boolean,
|
val isInfix: Boolean
|
||||||
var isInfix: Boolean,
|
val isInline: Boolean
|
||||||
var isInline: Boolean,
|
val isTailrec: Boolean
|
||||||
var isTailrec: Boolean,
|
val isSuspend: Boolean
|
||||||
var isSuspend: Boolean,
|
val isExternal: Boolean
|
||||||
var isExternal: Boolean
|
}
|
||||||
)
|
|
||||||
|
|||||||
+1
-9
@@ -35,15 +35,7 @@ object CirFunctionFactory {
|
|||||||
extensionReceiver = source.extensionReceiverParameter?.let(CirExtensionReceiverFactory::create),
|
extensionReceiver = source.extensionReceiverParameter?.let(CirExtensionReceiverFactory::create),
|
||||||
returnType = CirTypeFactory.create(source.returnType!!),
|
returnType = CirTypeFactory.create(source.returnType!!),
|
||||||
kind = source.kind,
|
kind = source.kind,
|
||||||
// TODO: inline?
|
modifiers = CirFunctionModifiersFactory.create(source),
|
||||||
modifiers = CirFunctionModifiers(
|
|
||||||
isOperator = source.isOperator,
|
|
||||||
isInfix = source.isInfix,
|
|
||||||
isInline = source.isInline,
|
|
||||||
isTailrec = source.isTailrec,
|
|
||||||
isSuspend = source.isSuspend,
|
|
||||||
isExternal = source.isExternal
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+44
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 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.descriptors.commonizer.cir.factory
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirFunctionModifiers
|
||||||
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirFunctionModifiersImpl
|
||||||
|
import org.jetbrains.kotlin.descriptors.commonizer.utils.Interner
|
||||||
|
|
||||||
|
object CirFunctionModifiersFactory {
|
||||||
|
private val interner = Interner<CirFunctionModifiers>()
|
||||||
|
|
||||||
|
fun create(source: SimpleFunctionDescriptor): CirFunctionModifiers = create(
|
||||||
|
isOperator = source.isOperator,
|
||||||
|
isInfix = source.isInfix,
|
||||||
|
isInline = source.isInline,
|
||||||
|
isTailrec = source.isTailrec,
|
||||||
|
isSuspend = source.isSuspend,
|
||||||
|
isExternal = source.isExternal
|
||||||
|
)
|
||||||
|
|
||||||
|
fun create(
|
||||||
|
isOperator: Boolean,
|
||||||
|
isInfix: Boolean,
|
||||||
|
isInline: Boolean,
|
||||||
|
isTailrec: Boolean,
|
||||||
|
isSuspend: Boolean,
|
||||||
|
isExternal: Boolean
|
||||||
|
): CirFunctionModifiers {
|
||||||
|
return interner.intern(
|
||||||
|
CirFunctionModifiersImpl(
|
||||||
|
isOperator = isOperator,
|
||||||
|
isInfix = isInfix,
|
||||||
|
isInline = isInline,
|
||||||
|
isTailrec = isTailrec,
|
||||||
|
isSuspend = isSuspend,
|
||||||
|
isExternal = isExternal
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.utils.intern
|
|||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
object CirValueParameterFactory {
|
object CirValueParameterFactory {
|
||||||
private val interner = Interner<CirValueParameterImpl>()
|
private val interner = Interner<CirValueParameter>()
|
||||||
|
|
||||||
fun create(source: ValueParameterDescriptor): CirValueParameter = create(
|
fun create(source: ValueParameterDescriptor): CirValueParameter = create(
|
||||||
annotations = source.annotations.map(CirAnnotationFactory::create),
|
annotations = source.annotations.map(CirAnnotationFactory::create),
|
||||||
|
|||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 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.descriptors.commonizer.cir.impl
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirFunctionModifiers
|
||||||
|
|
||||||
|
data class CirFunctionModifiersImpl(
|
||||||
|
override val isOperator: Boolean,
|
||||||
|
override val isInfix: Boolean,
|
||||||
|
override val isInline: Boolean,
|
||||||
|
override val isTailrec: Boolean,
|
||||||
|
override val isSuspend: Boolean,
|
||||||
|
override val isExternal: Boolean
|
||||||
|
) : CirFunctionModifiers
|
||||||
+43
-22
@@ -6,33 +6,54 @@
|
|||||||
package org.jetbrains.kotlin.descriptors.commonizer.core
|
package org.jetbrains.kotlin.descriptors.commonizer.core
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirFunctionModifiers
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirFunctionModifiers
|
||||||
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirFunctionModifiersFactory
|
||||||
|
|
||||||
class FunctionModifiersCommonizer : Commonizer<CirFunctionModifiers, CirFunctionModifiers> {
|
class FunctionModifiersCommonizer : AbstractStandardCommonizer<CirFunctionModifiers, CirFunctionModifiers>() {
|
||||||
private var modifiers: CirFunctionModifiers? = null
|
private class MutableModifiers(
|
||||||
private var error = false
|
var isOperator: Boolean,
|
||||||
|
var isInfix: Boolean,
|
||||||
|
var isInline: Boolean,
|
||||||
|
var isTailrec: Boolean,
|
||||||
|
var isSuspend: Boolean,
|
||||||
|
var isExternal: Boolean
|
||||||
|
) {
|
||||||
|
constructor(immutable: CirFunctionModifiers) : this(
|
||||||
|
isOperator = immutable.isOperator,
|
||||||
|
isInfix = immutable.isInfix,
|
||||||
|
isInline = immutable.isInline,
|
||||||
|
isTailrec = immutable.isTailrec,
|
||||||
|
isSuspend = immutable.isSuspend,
|
||||||
|
isExternal = immutable.isExternal
|
||||||
|
)
|
||||||
|
|
||||||
override val result: CirFunctionModifiers
|
fun toImmutableModifiers(): CirFunctionModifiers = CirFunctionModifiersFactory.create(
|
||||||
get() = modifiers?.takeIf { !error } ?: throw IllegalCommonizerStateException()
|
isOperator = isOperator,
|
||||||
|
isInfix = isInfix,
|
||||||
|
isInline = isInline,
|
||||||
|
isTailrec = isTailrec,
|
||||||
|
isSuspend = isSuspend,
|
||||||
|
isExternal = isExternal
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
override fun commonizeWith(next: CirFunctionModifiers): Boolean {
|
private lateinit var modifiers: MutableModifiers
|
||||||
if (error)
|
|
||||||
|
override fun commonizationResult() = modifiers.toImmutableModifiers()
|
||||||
|
|
||||||
|
override fun initialize(first: CirFunctionModifiers) {
|
||||||
|
modifiers = MutableModifiers(first)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun doCommonizeWith(next: CirFunctionModifiers): Boolean {
|
||||||
|
if (modifiers.isSuspend != next.isSuspend)
|
||||||
return false
|
return false
|
||||||
|
|
||||||
val modifiers = modifiers
|
modifiers.isOperator = modifiers.isOperator && next.isOperator
|
||||||
if (modifiers == null)
|
modifiers.isInfix = modifiers.isInfix && next.isInfix
|
||||||
this.modifiers = next.copy() // TODO: inline?
|
modifiers.isInline = modifiers.isInline && next.isInline
|
||||||
else {
|
modifiers.isTailrec = modifiers.isTailrec && next.isTailrec
|
||||||
if (modifiers.isSuspend != next.isSuspend)
|
modifiers.isExternal = modifiers.isExternal && next.isExternal
|
||||||
error = true
|
|
||||||
else {
|
|
||||||
modifiers.isOperator = modifiers.isOperator && next.isOperator
|
|
||||||
modifiers.isInfix = modifiers.isInfix && next.isInfix
|
|
||||||
modifiers.isInline = modifiers.isInline && next.isInline
|
|
||||||
modifiers.isTailrec = modifiers.isTailrec && next.isTailrec
|
|
||||||
modifiers.isExternal = modifiers.isExternal && next.isExternal
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return !error
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.descriptors.commonizer.core
|
package org.jetbrains.kotlin.descriptors.commonizer.core
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirFunctionModifiers
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirFunctionModifiers
|
||||||
|
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirFunctionModifiersFactory
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
class FunctionModifiersCommonizerTest : AbstractCommonizerTest<CirFunctionModifiers, CirFunctionModifiers>() {
|
class FunctionModifiersCommonizerTest : AbstractCommonizerTest<CirFunctionModifiers, CirFunctionModifiers>() {
|
||||||
@@ -170,7 +171,7 @@ private fun mockFunctionModifiers(
|
|||||||
isTailrec: Boolean = false,
|
isTailrec: Boolean = false,
|
||||||
isSuspend: Boolean = false,
|
isSuspend: Boolean = false,
|
||||||
isExternal: Boolean = false
|
isExternal: Boolean = false
|
||||||
) = CirFunctionModifiers(
|
) = CirFunctionModifiersFactory.create(
|
||||||
isOperator = isOperator,
|
isOperator = isOperator,
|
||||||
isInfix = isInfix,
|
isInfix = isInfix,
|
||||||
isInline = isInline,
|
isInline = isInline,
|
||||||
|
|||||||
Reference in New Issue
Block a user