[Commonizer] Encapsulate interning inside of CIR entities: CirPropertySetter

This commit is contained in:
Dmitriy Dolovov
2021-03-04 13:24:00 +03:00
parent f1739980d3
commit f7d977d7c4
5 changed files with 50 additions and 63 deletions
@@ -5,6 +5,51 @@
package org.jetbrains.kotlin.descriptors.commonizer.cir
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.descriptors.commonizer.utils.Interner
interface CirPropertySetter : CirDeclaration, CirPropertyAccessor, CirHasVisibility {
val parameterAnnotations: List<CirAnnotation>
companion object {
fun createInterned(
annotations: List<CirAnnotation>,
parameterAnnotations: List<CirAnnotation>,
visibility: Visibility,
isDefault: Boolean,
isExternal: Boolean,
isInline: Boolean
): CirPropertySetter = interner.intern(
CirPropertySetterInternedImpl(
annotations = annotations,
parameterAnnotations = parameterAnnotations,
visibility = visibility,
isDefault = isDefault,
isExternal = isExternal,
isInline = isInline
)
)
@Suppress("NOTHING_TO_INLINE")
inline fun createDefaultNoAnnotations(visibility: Visibility): CirPropertySetter = createInterned(
annotations = emptyList(),
parameterAnnotations = emptyList(),
visibility = visibility,
isDefault = visibility == Visibilities.Public,
isExternal = false,
isInline = false
)
private val interner = Interner<CirPropertySetterInternedImpl>()
}
}
private data class CirPropertySetterInternedImpl(
override val annotations: List<CirAnnotation>,
override val parameterAnnotations: List<CirAnnotation>,
override val visibility: Visibility,
override val isDefault: Boolean,
override val isExternal: Boolean,
override val isInline: Boolean
) : CirPropertySetter
@@ -9,24 +9,17 @@ import kotlinx.metadata.Flag
import kotlinx.metadata.KmProperty
import kotlinx.metadata.klib.annotations
import kotlinx.metadata.klib.setterAnnotations
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirAnnotation
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirPropertySetter
import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirPropertySetterImpl
import org.jetbrains.kotlin.descriptors.commonizer.metadata.decodeVisibility
import org.jetbrains.kotlin.descriptors.commonizer.utils.Interner
object CirPropertySetterFactory {
private val interner = Interner<CirPropertySetter>()
fun create(source: KmProperty, typeResolver: CirTypeResolver): CirPropertySetter? {
if (!Flag.Property.HAS_SETTER(source.flags))
return null
val setterFlags = source.setterFlags
return create(
return CirPropertySetter.createInterned(
annotations = CirAnnotationFactory.createAnnotations(setterFlags, typeResolver, source::setterAnnotations),
parameterAnnotations = source.setterParameter?.let { setterParameter ->
CirAnnotationFactory.createAnnotations(setterParameter.flags, typeResolver, setterParameter::annotations)
@@ -37,34 +30,4 @@ object CirPropertySetterFactory {
isInline = Flag.PropertyAccessor.IS_INLINE(setterFlags)
)
}
fun create(
annotations: List<CirAnnotation>,
parameterAnnotations: List<CirAnnotation>,
visibility: Visibility,
isDefault: Boolean,
isExternal: Boolean,
isInline: Boolean
): CirPropertySetter {
return interner.intern(
CirPropertySetterImpl(
annotations = annotations,
parameterAnnotations = parameterAnnotations,
visibility = visibility,
isDefault = isDefault,
isExternal = isExternal,
isInline = isInline
)
)
}
@Suppress("NOTHING_TO_INLINE")
inline fun createDefaultNoAnnotations(visibility: Visibility): CirPropertySetter = create(
annotations = emptyList(),
parameterAnnotations = emptyList(),
visibility = visibility,
isDefault = visibility == Visibilities.Public,
isExternal = false,
isInline = false
)
}
@@ -1,19 +0,0 @@
/*
* 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.Visibility
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirAnnotation
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirPropertySetter
data class CirPropertySetterImpl(
override val annotations: List<CirAnnotation>,
override val parameterAnnotations: List<CirAnnotation>,
override val visibility: Visibility,
override val isDefault: Boolean,
override val isExternal: Boolean,
override val isInline: Boolean
) : CirPropertySetter
@@ -8,10 +8,9 @@ package org.jetbrains.kotlin.descriptors.commonizer.core
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirHasVisibility
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirPropertySetter
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirPropertySetterFactory
class PropertySetterCommonizer : AbstractNullableCommonizer<CirPropertySetter, CirPropertySetter, CirHasVisibility, Visibility>(
wrappedCommonizerFactory = { VisibilityCommonizer.equalizing() },
extractor = { it },
builder = CirPropertySetterFactory::createDefaultNoAnnotations
builder = CirPropertySetter::createDefaultNoAnnotations
)
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.descriptors.Visibilities.Protected
import org.jetbrains.kotlin.descriptors.Visibilities.Public
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirPropertySetter
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirPropertySetterFactory
import org.junit.Test
class PropertySetterCommonizerTest : AbstractCommonizerTest<CirPropertySetter?, CirPropertySetter?>() {
@@ -93,13 +92,13 @@ class PropertySetterCommonizerTest : AbstractCommonizerTest<CirPropertySetter?,
private fun doTestSuccess(expected: Visibility?, vararg variants: Visibility?) =
super.doTestSuccess(
expected = expected?.let { CirPropertySetterFactory.createDefaultNoAnnotations(expected) },
*variants.map { it?.let(CirPropertySetterFactory::createDefaultNoAnnotations) }.toTypedArray()
expected = expected?.let { CirPropertySetter.createDefaultNoAnnotations(expected) },
*variants.map { it?.let(CirPropertySetter::createDefaultNoAnnotations) }.toTypedArray()
)
private fun doTestFailure(vararg variants: Visibility?) =
super.doTestFailure(
*variants.map { it?.let(CirPropertySetterFactory::createDefaultNoAnnotations) }.toTypedArray(),
*variants.map { it?.let(CirPropertySetter::createDefaultNoAnnotations) }.toTypedArray(),
shouldFailOnFirstVariant = false
)