[Commonizer] Apply interner to avoid duplicated CirValueParameterImpl objects
This commit is contained in:
+1
-1
@@ -90,7 +90,7 @@ class CirClassConstructorImpl(original: ClassConstructorDescriptor) : CirClassCo
|
|||||||
// save only type parameters that are contributed by the constructor itself
|
// save only type parameters that are contributed by the constructor itself
|
||||||
typeParameter.takeIf { it.containingDeclaration == original }?.let(::CirTypeParameterImpl)
|
typeParameter.takeIf { it.containingDeclaration == original }?.let(::CirTypeParameterImpl)
|
||||||
}
|
}
|
||||||
override val valueParameters = original.valueParameters.map(::CirValueParameterImpl)
|
override val valueParameters = original.valueParameters.map(CirValueParameterImpl.Companion::create)
|
||||||
override val hasStableParameterNames = original.hasStableParameterNames()
|
override val hasStableParameterNames = original.hasStableParameterNames()
|
||||||
override val hasSynthesizedParameterNames = original.hasSynthesizedParameterNames()
|
override val hasSynthesizedParameterNames = original.hasSynthesizedParameterNames()
|
||||||
}
|
}
|
||||||
|
|||||||
+44
-2
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir
|
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.descriptors.commonizer.utils.NonThreadSafeInterner
|
||||||
import org.jetbrains.kotlin.descriptors.commonizer.utils.intern
|
import org.jetbrains.kotlin.descriptors.commonizer.utils.intern
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
@@ -46,7 +47,7 @@ class CirFunctionImpl(original: SimpleFunctionDescriptor) : CirFunctionOrPropert
|
|||||||
override val isInline = original.isInline
|
override val isInline = original.isInline
|
||||||
override val isTailrec = original.isTailrec
|
override val isTailrec = original.isTailrec
|
||||||
override val isSuspend = original.isSuspend
|
override val isSuspend = original.isSuspend
|
||||||
override val valueParameters = original.valueParameters.map(::CirValueParameterImpl)
|
override val valueParameters = original.valueParameters.map(CirValueParameterImpl.Companion::create)
|
||||||
override val hasStableParameterNames = original.hasStableParameterNames()
|
override val hasStableParameterNames = original.hasStableParameterNames()
|
||||||
override val hasSynthesizedParameterNames = original.hasSynthesizedParameterNames()
|
override val hasSynthesizedParameterNames = original.hasSynthesizedParameterNames()
|
||||||
}
|
}
|
||||||
@@ -72,7 +73,7 @@ data class CirCommonValueParameter(
|
|||||||
override val declaresDefaultValue get() = false
|
override val declaresDefaultValue get() = false
|
||||||
}
|
}
|
||||||
|
|
||||||
class CirValueParameterImpl(original: ValueParameterDescriptor) : CirValueParameter {
|
class CirValueParameterImpl private constructor(original: ValueParameterDescriptor) : CirValueParameter {
|
||||||
override val name = original.name.intern()
|
override val name = original.name.intern()
|
||||||
override val annotations = original.annotations.map(CirAnnotation.Companion::create)
|
override val annotations = original.annotations.map(CirAnnotation.Companion::create)
|
||||||
override val returnType = CirType.create(original.returnType!!)
|
override val returnType = CirType.create(original.returnType!!)
|
||||||
@@ -80,4 +81,45 @@ class CirValueParameterImpl(original: ValueParameterDescriptor) : CirValueParame
|
|||||||
override val declaresDefaultValue = original.declaresDefaultValue()
|
override val declaresDefaultValue = original.declaresDefaultValue()
|
||||||
override val isCrossinline = original.isCrossinline
|
override val isCrossinline = original.isCrossinline
|
||||||
override val isNoinline = original.isNoinline
|
override val isNoinline = original.isNoinline
|
||||||
|
|
||||||
|
// See also org.jetbrains.kotlin.types.KotlinType.cachedHashCode
|
||||||
|
private var cachedHashCode = 0
|
||||||
|
|
||||||
|
private fun computeHashCode(): Int {
|
||||||
|
var result = name.hashCode()
|
||||||
|
result += 31 * result + annotations.hashCode()
|
||||||
|
result += 31 * result + returnType.hashCode()
|
||||||
|
result += 31 * result + varargElementType.hashCode()
|
||||||
|
result += 31 * result + declaresDefaultValue.hashCode()
|
||||||
|
result += 31 * result + isCrossinline.hashCode()
|
||||||
|
result += 31 * result + isNoinline.hashCode()
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
var currentHashCode = cachedHashCode
|
||||||
|
if (currentHashCode != 0) return currentHashCode
|
||||||
|
|
||||||
|
currentHashCode = computeHashCode()
|
||||||
|
cachedHashCode = currentHashCode
|
||||||
|
return currentHashCode
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean =
|
||||||
|
if (other is CirValueParameterImpl) {
|
||||||
|
name == other.name
|
||||||
|
&& returnType == other.returnType
|
||||||
|
&& annotations == other.annotations
|
||||||
|
&& varargElementType == other.varargElementType
|
||||||
|
&& declaresDefaultValue == other.declaresDefaultValue
|
||||||
|
&& isCrossinline == other.isCrossinline
|
||||||
|
&& isNoinline == other.isNoinline
|
||||||
|
} else
|
||||||
|
false
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val interner = NonThreadSafeInterner<CirValueParameterImpl>()
|
||||||
|
|
||||||
|
fun create(original: ValueParameterDescriptor): CirValueParameterImpl = interner.intern(CirValueParameterImpl(original))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user