diff --git a/knit-asm/src/main/java/tiktok/knit/plugin/element/ComponentClass.kt b/knit-asm/src/main/java/tiktok/knit/plugin/element/ComponentClass.kt index 167ba84..9bf0514 100644 --- a/knit-asm/src/main/java/tiktok/knit/plugin/element/ComponentClass.kt +++ b/knit-asm/src/main/java/tiktok/knit/plugin/element/ComponentClass.kt @@ -26,6 +26,7 @@ import tiktok.knit.plugin.knitVMAnnotationDesc import tiktok.knit.plugin.providesDesc import tiktok.knit.plugin.singletonDesc import tiktok.knit.plugin.toFieldAccess +import tiktok.knit.plugin.writer.VMProperty import kotlin.metadata.Visibility import kotlin.metadata.isSecondary import kotlin.metadata.jvm.signature @@ -56,6 +57,9 @@ data class ComponentClass( emptyMap(), emptyList(), emptyList(), false, ) + // Internal names of all vm properties in this component class, used for incremental build + val vmPropertyInternalNames = hashSetOf() + companion object { fun from(container: MetadataContainer): ComponentClass { val classNode = container.node diff --git a/knit-asm/src/main/java/tiktok/knit/plugin/writer/VMWriter.kt b/knit-asm/src/main/java/tiktok/knit/plugin/writer/VMWriter.kt index a830957..e3b2947 100644 --- a/knit-asm/src/main/java/tiktok/knit/plugin/writer/VMWriter.kt +++ b/knit-asm/src/main/java/tiktok/knit/plugin/writer/VMWriter.kt @@ -64,6 +64,9 @@ fun generateVMLogic(context: KnitContext, classNode: ClassNode, thisComponent: B val allVMProperties = getVMProperties(context, classNode, thisComponent) if (allVMProperties.isEmpty()) return + val componentClass = context.componentMap[classNode.name] + componentClass?.vmPropertyInternalNames?.addAll(allVMProperties.map { it.type.internalName }) + // create vm prop provider functions for (vmProp in allVMProperties) { val backendFunctionName = vmProp.property.name + "\$knitVm" diff --git a/knit-bytex/src/main/java/tiktok/knit/bytex/KnitContextImpl.kt b/knit-bytex/src/main/java/tiktok/knit/bytex/KnitContextImpl.kt index 5d7a059..a901359 100644 --- a/knit-bytex/src/main/java/tiktok/knit/bytex/KnitContextImpl.kt +++ b/knit-bytex/src/main/java/tiktok/knit/bytex/KnitContextImpl.kt @@ -158,10 +158,18 @@ class KnitContextImpl( depsMap[internalName]?.forEach { producer -> allNonIncrementalFiles += "$producer.class" } + allNonIncrementalFiles += calculateVMRelatedClasses(internalName).map { "$it.class" } } return allNonIncrementalFiles } + private fun calculateVMRelatedClasses(changedClass: String): Collection { + val componentMap = componentMap + return componentMap.filter { + changedClass in it.value.vmPropertyInternalNames + }.keys + } + class Storage( val componentMap: Map, val backDepsMap: Map>, @@ -170,4 +178,4 @@ class KnitContextImpl( private val gson by lazy { Gson() } private const val cacheName = "knit-cache.json" -private val globalProvidesClass = "$globalProvidesInternalName.class" \ No newline at end of file +private val globalProvidesClass = "$globalProvidesInternalName.class"