[Commonizer] Intern duplicated CirFunctionModifiers instances
This commit is contained in:
+8
-9
@@ -5,12 +5,11 @@
|
||||
|
||||
package org.jetbrains.kotlin.descriptors.commonizer.cir
|
||||
|
||||
// TODO: inline?
|
||||
data class CirFunctionModifiers(
|
||||
var isOperator: Boolean,
|
||||
var isInfix: Boolean,
|
||||
var isInline: Boolean,
|
||||
var isTailrec: Boolean,
|
||||
var isSuspend: Boolean,
|
||||
var isExternal: Boolean
|
||||
)
|
||||
interface CirFunctionModifiers {
|
||||
val isOperator: Boolean
|
||||
val isInfix: Boolean
|
||||
val isInline: Boolean
|
||||
val isTailrec: Boolean
|
||||
val isSuspend: Boolean
|
||||
val isExternal: Boolean
|
||||
}
|
||||
|
||||
+1
-9
@@ -35,15 +35,7 @@ object CirFunctionFactory {
|
||||
extensionReceiver = source.extensionReceiverParameter?.let(CirExtensionReceiverFactory::create),
|
||||
returnType = CirTypeFactory.create(source.returnType!!),
|
||||
kind = source.kind,
|
||||
// TODO: inline?
|
||||
modifiers = CirFunctionModifiers(
|
||||
isOperator = source.isOperator,
|
||||
isInfix = source.isInfix,
|
||||
isInline = source.isInline,
|
||||
isTailrec = source.isTailrec,
|
||||
isSuspend = source.isSuspend,
|
||||
isExternal = source.isExternal
|
||||
)
|
||||
modifiers = CirFunctionModifiersFactory.create(source),
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+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
|
||||
|
||||
object CirValueParameterFactory {
|
||||
private val interner = Interner<CirValueParameterImpl>()
|
||||
private val interner = Interner<CirValueParameter>()
|
||||
|
||||
fun create(source: ValueParameterDescriptor): CirValueParameter = 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
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirFunctionModifiers
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirFunctionModifiersFactory
|
||||
|
||||
class FunctionModifiersCommonizer : Commonizer<CirFunctionModifiers, CirFunctionModifiers> {
|
||||
private var modifiers: CirFunctionModifiers? = null
|
||||
private var error = false
|
||||
class FunctionModifiersCommonizer : AbstractStandardCommonizer<CirFunctionModifiers, CirFunctionModifiers>() {
|
||||
private class MutableModifiers(
|
||||
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
|
||||
get() = modifiers?.takeIf { !error } ?: throw IllegalCommonizerStateException()
|
||||
fun toImmutableModifiers(): CirFunctionModifiers = CirFunctionModifiersFactory.create(
|
||||
isOperator = isOperator,
|
||||
isInfix = isInfix,
|
||||
isInline = isInline,
|
||||
isTailrec = isTailrec,
|
||||
isSuspend = isSuspend,
|
||||
isExternal = isExternal
|
||||
)
|
||||
}
|
||||
|
||||
override fun commonizeWith(next: CirFunctionModifiers): Boolean {
|
||||
if (error)
|
||||
private lateinit var modifiers: MutableModifiers
|
||||
|
||||
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
|
||||
|
||||
val modifiers = modifiers
|
||||
if (modifiers == null)
|
||||
this.modifiers = next.copy() // TODO: inline?
|
||||
else {
|
||||
if (modifiers.isSuspend != next.isSuspend)
|
||||
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
|
||||
}
|
||||
}
|
||||
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
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirFunctionModifiers
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirFunctionModifiersFactory
|
||||
import org.junit.Test
|
||||
|
||||
class FunctionModifiersCommonizerTest : AbstractCommonizerTest<CirFunctionModifiers, CirFunctionModifiers>() {
|
||||
@@ -170,7 +171,7 @@ private fun mockFunctionModifiers(
|
||||
isTailrec: Boolean = false,
|
||||
isSuspend: Boolean = false,
|
||||
isExternal: Boolean = false
|
||||
) = CirFunctionModifiers(
|
||||
) = CirFunctionModifiersFactory.create(
|
||||
isOperator = isOperator,
|
||||
isInfix = isInfix,
|
||||
isInline = isInline,
|
||||
|
||||
Reference in New Issue
Block a user