Skip to content

Commit 7ac8729

Browse files
committed
Optimize memory allocation.
1 parent 29596b9 commit 7ac8729

File tree

5 files changed

+40
-26
lines changed

5 files changed

+40
-26
lines changed

SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/kir/descriptor/cache/ExposedDescriptorsCache.kt

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.resolve.constants.ArrayValue
3131
import org.jetbrains.kotlin.resolve.constants.KClassValue
3232
import org.jetbrains.kotlin.resolve.descriptorUtil.firstArgument
3333
import org.jetbrains.kotlin.resolve.descriptorUtil.module
34+
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
3435

3536
// Based on ObjCExportTranslatorImpl and ObjCExportHeaderGenerator
3637
internal class ExposedDescriptorsCache(
@@ -79,18 +80,22 @@ internal class ExposedDescriptorsCache(
7980
}
8081

8182
private fun exposePackageFragment(packageFragment: PackageFragmentDescriptor) {
82-
val contributedDescriptors = packageFragment.getMemberScope().getContributedDescriptors()
83+
val memberScope = packageFragment.getMemberScope()
8384

84-
contributedDescriptors
85-
.filterIsInstance<CallableMemberDescriptor>()
85+
memberScope
86+
.getContributedDescriptors(kindFilter = DescriptorKindFilter.CALLABLES)
8687
.forEach {
87-
exposeGlobalMemberOrExtension(it)
88+
if (it is CallableMemberDescriptor) {
89+
exposeGlobalMemberOrExtension(it)
90+
}
8891
}
8992

90-
contributedDescriptors
91-
.filterIsInstance<ClassDescriptor>()
93+
memberScope
94+
.getContributedDescriptors(kindFilter = DescriptorKindFilter.CLASSIFIERS)
9295
.forEach {
93-
exposeClassIncludingNestedClasses(it)
96+
if (it is ClassDescriptor) {
97+
exposeClassIncludingNestedClasses(it)
98+
}
9499
}
95100
}
96101

@@ -139,9 +144,12 @@ internal class ExposedDescriptorsCache(
139144
exposeClass(classDescriptor)
140145

141146
classDescriptor.unsubstitutedMemberScope
142-
.getContributedDescriptors()
143-
.filterIsInstance<ClassDescriptor>()
144-
.forEach(::exposeClassIncludingNestedClasses)
147+
.getContributedDescriptors(kindFilter = DescriptorKindFilter.CLASSIFIERS)
148+
.forEach {
149+
if (it is ClassDescriptor) {
150+
exposeClassIncludingNestedClasses(it)
151+
}
152+
}
145153
}
146154

147155
private fun exposeClass(classDescriptor: ClassDescriptor) {
@@ -191,10 +199,11 @@ internal class ExposedDescriptorsCache(
191199
}
192200

193201
classDescriptor.unsubstitutedMemberScope
194-
.getContributedDescriptors()
195-
.filterIsInstance<CallableMemberDescriptor>()
202+
.getContributedDescriptors(kindFilter = DescriptorKindFilter.CALLABLES)
196203
.forEach {
197-
exposeCallableMember(it, typeParameterScope)
204+
if (it is CallableMemberDescriptor) {
205+
exposeCallableMember(it, typeParameterScope)
206+
}
198207
}
199208

200209
if (classDescriptor.kind.isEnumClass) {

SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/kir/util/FindAnnotationExtension.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,21 @@ import org.jetbrains.kotlin.resolve.constants.ArrayValue
1010
import org.jetbrains.kotlin.resolve.constants.ConstantValue
1111
import org.jetbrains.kotlin.resolve.constants.EnumValue
1212
import org.jetbrains.kotlin.resolve.constants.KClassValue
13+
import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass
1314
import kotlin.reflect.KClass
1415
import kotlin.reflect.KParameter
1516

1617
inline fun <reified T : Annotation> Annotated.hasAnnotation(): Boolean =
1718
hasAnnotation(T::class)
1819

19-
fun <T : Annotation> Annotated.hasAnnotation(annotation: KClass<T>): Boolean {
20-
val annotationName = FqName(annotation.qualifiedName!!)
21-
22-
return this.annotations.hasAnnotation(annotationName)
23-
}
20+
fun <T : Annotation> Annotated.hasAnnotation(annotation: KClass<T>): Boolean =
21+
this.annotations.any { it.fqName?.asString() == annotation.qualifiedName }
2422

2523
inline fun <reified T : Annotation> Annotated.findAnnotation(): T? =
2624
findAnnotation(T::class)
2725

2826
fun <T : Annotation> Annotated.findAnnotation(annotationClass: KClass<T>): T? {
29-
val annotationName = FqName(annotationClass.qualifiedName!!)
30-
val annotation = this.annotations.findAnnotation(annotationName) ?: return null
27+
val annotation = this.annotations.firstOrNull { it.fqName?.asString() == annotationClass.qualifiedName } ?: return null
3128

3229
val constructor = annotationClass.constructors.first()
3330

SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/phases/SkiePhaseScheduler.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ class SkiePhaseScheduler {
176176
SwiftRuntimeGenerator,
177177
LoadCustomSwiftSourceFilesPhase,
178178

179-
RenameConflictingCallableDeclarationsPhase,
179+
RenameConflictingCallableDeclarationsPhase(),
180180

181181
// Features
182182

@@ -209,7 +209,7 @@ class SkiePhaseScheduler {
209209
RenameTypesConflictsWithOtherTypesPhase,
210210
RenameCallableDeclarationsConflictingWithTypeDeclarationsPhase,
211211
RenameParametersNamedSelfPhase,
212-
RenameConflictingCallableDeclarationsPhase,
212+
RenameConflictingCallableDeclarationsPhase(),
213213
FixDuplicatedOverriddenFunctionsPhase,
214214
TemporarilyRenameTypesConflictingWithExternalModulesPhase,
215215
FixOirFunctionSignaturesForApiNotesPhase(context),

SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/phases/memberconflicts/RenameConflictingCallableDeclarationsPhase.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ import co.touchlab.skie.sir.element.module
1818
import co.touchlab.skie.sir.element.receiverDeclaration
1919
import co.touchlab.skie.sir.element.resolveAsSirClass
2020

21-
object RenameConflictingCallableDeclarationsPhase : SirPhase {
21+
class RenameConflictingCallableDeclarationsPhase : SirPhase {
22+
23+
private val highestDistanceToInheritanceHierarchyRootCache = mutableMapOf<SirClass, Int>()
24+
private val containerFqNameCache = mutableMapOf<SirDeclarationParent, String>()
2225

2326
context(SirPhase.Context)
2427
override suspend fun execute() {
@@ -100,7 +103,7 @@ object RenameConflictingCallableDeclarationsPhase : SirPhase {
100103
get() = module is SirModule.Kotlin
101104

102105
private val SirClass.highestDistanceToInheritanceHierarchyRoot: Int
103-
get() {
106+
get() = highestDistanceToInheritanceHierarchyRootCache.getOrPut(this) {
104107
val maxFromSuperTypes = superTypes.maxOfOrNull {
105108
it.resolveAsSirClass()?.highestDistanceToInheritanceHierarchyRoot ?: Int.MAX_VALUE
106109
}
@@ -114,7 +117,9 @@ object RenameConflictingCallableDeclarationsPhase : SirPhase {
114117

115118
@Suppress("RecursivePropertyAccessor")
116119
private val SirDeclarationParent.containerFqName: String
117-
get() = (this.parent?.containerFqName ?: "") + this.toString()
120+
get() = containerFqNameCache.getOrPut(this) {
121+
(this.parent?.containerFqName ?: "") + this.toString()
122+
}
118123

119124
context(SirPhase.Context)
120125
private fun UniqueSignatureSet.addEnumCases(enumCases: List<SirEnumCase>) {

SKIE/compiler/kotlin-plugin/src/kgp_common/kotlin/co/touchlab/skie/sir/type/translation/SirTypeTranslator.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,14 @@ class SirTypeTranslator(
9898
isEscaping = isEscaping,
9999
)
100100

101+
// Optimization - prevents re-creating the lambda type argument mapper for every invocation
102+
private val cachedMapTypeArgument = ::mapTypeArgument
103+
101104
private fun mapType(oirType: DeclaredOirType): SirType =
102105
OirDeclaredSirType(
103106
declaration = oirType.declaration,
104107
typeArguments = oirType.typeArguments,
105-
mapTypeArgument = ::mapTypeArgument,
108+
mapTypeArgument = cachedMapTypeArgument,
106109
)
107110

108111
private fun mapType(

0 commit comments

Comments
 (0)