Skip to content

Commit

Permalink
fix: use less heap in Capabilities.
Browse files Browse the repository at this point in the history
  • Loading branch information
autonomousapps committed Feb 7, 2025
1 parent aa9bb1e commit a9e620f
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 17 deletions.
12 changes: 12 additions & 0 deletions src/main/kotlin/com/autonomousapps/internal/utils/collections.kt
Original file line number Diff line number Diff line change
Expand Up @@ -221,12 +221,24 @@ internal inline fun <T> Collection<T>.reallyAll(predicate: (T) -> Boolean): Bool
return true
}

internal fun <T> List<T>.efficient(): List<T> = when {
isEmpty() -> emptyList()
size == 1 -> Collections.singletonList(first())
else -> this
}

internal fun <T> Set<T>.efficient(): Set<T> = when {
isEmpty() -> emptySet()
size == 1 -> Collections.singleton(first())
else -> this
}

internal fun <K, V> Map<K, V>.efficient(): Map<K, V> = when {
isEmpty() -> emptyMap()
size == 1 -> Collections.singletonMap(keys.first(), values.first())
else -> this
}

/**
* Given a list of pairs, where the pairs are key -> (value as Set) pairs, merge into a map (not
* losing any values).
Expand Down
32 changes: 18 additions & 14 deletions src/main/kotlin/com/autonomousapps/model/internal/Capability.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package com.autonomousapps.model.internal

import com.autonomousapps.internal.unsafeLazy
import com.autonomousapps.internal.utils.LexicographicIterableComparator
import com.autonomousapps.internal.utils.efficient
import com.autonomousapps.internal.utils.filterToOrderedSet
import com.autonomousapps.internal.utils.mapToOrderedSet
import com.autonomousapps.model.internal.intermediates.consumer.MemberAccess
Expand Down Expand Up @@ -58,7 +59,7 @@ internal data class AndroidManifestCapability(
}

override fun merge(other: Capability): Capability {
return AndroidManifestCapability(componentMap + (other as AndroidManifestCapability).componentMap)
return AndroidManifestCapability((componentMap + (other as AndroidManifestCapability).componentMap).efficient())
}
}

Expand All @@ -68,7 +69,7 @@ internal data class AndroidAssetCapability(
val assets: List<String>,
) : Capability() {
override fun merge(other: Capability): Capability {
return AndroidAssetCapability(assets + (other as AndroidAssetCapability).assets)
return AndroidAssetCapability((assets + (other as AndroidAssetCapability).assets).efficient())
}
}

Expand All @@ -85,7 +86,7 @@ internal data class AndroidResCapability(
override fun merge(other: Capability): Capability {
return AndroidResCapability(
rImport + (other as AndroidResCapability).rImport,
lines + other.lines
(lines + other.lines).efficient()
)
}
}
Expand All @@ -99,7 +100,7 @@ internal data class AnnotationProcessorCapability(
override fun merge(other: Capability): Capability {
return AnnotationProcessorCapability(
processor, // other.processor ?
supportedAnnotationTypes + (other as AnnotationProcessorCapability).supportedAnnotationTypes
(supportedAnnotationTypes + (other as AnnotationProcessorCapability).supportedAnnotationTypes).efficient()
)
}
}
Expand Down Expand Up @@ -127,16 +128,16 @@ internal data class BinaryClassCapability(

fun build(): PartitionResult {
return PartitionResult(
matchingClasses = matchingClasses,
nonMatchingClasses = nonMatchingClasses,
matchingClasses = matchingClasses.efficient(),
nonMatchingClasses = nonMatchingClasses.efficient(),
)
}
}
}

override fun merge(other: Capability): Capability {
return BinaryClassCapability(
binaryClasses = binaryClasses + (other as BinaryClassCapability).binaryClasses,
binaryClasses = (binaryClasses + (other as BinaryClassCapability).binaryClasses).efficient(),
)
}

Expand Down Expand Up @@ -242,8 +243,8 @@ internal data class ConstantCapability(
) : Capability() {
override fun merge(other: Capability): Capability {
return ConstantCapability(
constants + (other as ConstantCapability).constants,
ktFiles + other.ktFiles
(constants + (other as ConstantCapability).constants).efficient(),
(ktFiles + other.ktFiles).efficient()
)
}
}
Expand Down Expand Up @@ -279,7 +280,7 @@ internal data class InlineMemberCapability(
}

override fun merge(other: Capability): Capability {
return InlineMemberCapability(inlineMembers + (other as InlineMemberCapability).inlineMembers)
return InlineMemberCapability((inlineMembers + (other as InlineMemberCapability).inlineMembers).efficient())
}
}

Expand Down Expand Up @@ -311,7 +312,7 @@ internal data class TypealiasCapability(
}

override fun merge(other: Capability): Capability {
return TypealiasCapability(typealiases + (other as TypealiasCapability).typealiases)
return TypealiasCapability((typealiases + (other as TypealiasCapability).typealiases).efficient())
}
}

Expand All @@ -321,7 +322,7 @@ internal data class NativeLibCapability(
val fileNames: Set<String>,
) : Capability() {
override fun merge(other: Capability): Capability {
return NativeLibCapability(fileNames + (other as NativeLibCapability).fileNames)
return NativeLibCapability((fileNames + (other as NativeLibCapability).fileNames).efficient())
}
}

Expand All @@ -333,7 +334,8 @@ internal data class ServiceLoaderCapability(
) : Capability() {
override fun merge(other: Capability): Capability {
return ServiceLoaderCapability(
providerFile + (other as ServiceLoaderCapability).providerFile, providerClasses + other.providerClasses
providerFile + (other as ServiceLoaderCapability).providerFile,
(providerClasses + other.providerClasses).efficient(),
)
}
}
Expand All @@ -344,6 +346,8 @@ internal data class SecurityProviderCapability(
val securityProviders: Set<String>,
) : Capability() {
override fun merge(other: Capability): Capability {
return SecurityProviderCapability(securityProviders + (other as SecurityProviderCapability).securityProviders)
return SecurityProviderCapability(
(securityProviders + (other as SecurityProviderCapability).securityProviders).efficient(),
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// SPDX-License-Identifier: Apache-2.0
package com.autonomousapps.model.internal.intermediates.producer

import com.autonomousapps.internal.utils.efficient
import com.autonomousapps.internal.utils.ifNotEmpty
import com.autonomousapps.model.Coordinates
import com.autonomousapps.model.internal.*
Expand Down Expand Up @@ -85,9 +86,9 @@ internal data class ExplodedJar(
override fun toCapabilities(): List<Capability> {
val capabilities = mutableListOf<Capability>()
capabilities += InferredCapability(isCompileOnlyAnnotations)
binaryClasses.ifNotEmpty { capabilities += BinaryClassCapability(it) }
constantFields.ifNotEmpty { capabilities += ConstantCapability(it, ktFiles) }
securityProviders.ifNotEmpty { capabilities += SecurityProviderCapability(it) }
binaryClasses.ifNotEmpty { capabilities += BinaryClassCapability(it.efficient()) }
constantFields.ifNotEmpty { capabilities += ConstantCapability(it.efficient(), ktFiles) }
securityProviders.ifNotEmpty { capabilities += SecurityProviderCapability(it.efficient()) }
androidLintRegistry?.let { capabilities += AndroidLinterCapability(it, isLintJar) }
return capabilities
}
Expand Down

0 comments on commit a9e620f

Please sign in to comment.