override fun transform()

in hot-reload-agent/src/main/kotlin/org/jetbrains/compose/reload/agent/jdwp.kt [40:83]


    override fun transform(
        module: Module?, loader: ClassLoader?, className: String?, classBeingRedefined: Class<*>?,
        protectionDomain: ProtectionDomain?, classfileBuffer: ByteArray?
    ): ByteArray? {
        val classId = ClassId(className ?: return null)
        if (!classId.isTransformAllowed()) return null
        if (classId.isIgnored) return null
        if (classBeingRedefined == null) return null
        if (classfileBuffer == null) return null
        if (localReloadRequest.get() != null) return null

        return try {
            transformLock.lock()
            logger.info("Detected 'external reload' request for '${classBeingRedefined.name}'")

            /* Transform */
            val transformedCode = runCatching {
                val clazz = getClassPool(classBeingRedefined.classLoader).makeClass(classfileBuffer.inputStream())
                clazz.transformForStaticsInitialization(classBeingRedefined)
                val baos = ByteArrayOutputStream()
                val daos = DataOutputStream(baos)
                clazz.classFile.write(daos)
                baos.toByteArray()
            }.getOrElse { failure ->
                logger.error("Failed to transform '${className}'", failure)
                classfileBuffer
            }

            /* Resolve bytecode after transforming */
            val definition = ClassDefinition(classBeingRedefined, transformedCode)

            /* Issue a request to reload the UI */
            issueExternalReloadRequest(ClassDefinition(classBeingRedefined, classfileBuffer), instrumentation)

            /* Return the transformed code as bytes */
            definition.definitionClassFile

        } catch (t: Throwable) {
            logger.error("Failed to transform '${classBeingRedefined.name}'", t)
            null
        } finally {
            transformLock.unlock()
        }
    }