Use JvmPackageTable from bootstrap compiler in KotlinModuleShadowTransformer

Instead of generating another copy of it into buildSrc. Also move
KotlinModuleShadowTransformer to kotlin-reflect's build script, to its
only usage
This commit is contained in:
Alexander Udalov
2017-11-22 12:03:39 +01:00
parent a1f895bb1f
commit 200c62b574
5 changed files with 61 additions and 2984 deletions
-2
View File
@@ -3,7 +3,6 @@ buildscript {
val buildSrcKotlinVersion: String by extra(findProperty("buildSrc.kotlin.version")?.toString() ?: embeddedKotlinVersion)
val buildSrcKotlinRepo: String? by extra(findProperty("buildSrc.kotlin.repo") as String?)
extra["versions.shadow"] = "2.0.1"
extra["versions.protobuf-java"] = "2.6.1"
repositories {
buildSrcKotlinRepo?.let {
@@ -47,7 +46,6 @@ dependencies {
// compile("org.jetbrains.kotlin:kotlin-gradle-plugin:${rootProject.extra["bootstrap_kotlin_version"]}")
compile("com.github.jengelman.gradle.plugins:shadow:${property("versions.shadow")}")
compile("org.ow2.asm:asm-all:6.0_BETA")
compile("com.google.protobuf:protobuf-java:${property("versions.protobuf-java")}")
}
samWithReceiver {
@@ -1,62 +0,0 @@
import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer
import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext
import org.gradle.api.file.FileTreeElement
import org.gradle.api.logging.Logger
import org.jetbrains.kotlin.serialization.jvm.JvmPackageTable
import shadow.org.apache.tools.zip.ZipEntry
import shadow.org.apache.tools.zip.ZipOutputStream
import java.io.ByteArrayOutputStream
import java.io.DataInputStream
import java.io.DataOutputStream
class KotlinModuleShadowTransformer(private val logger: Logger) : Transformer {
private data class Entry(val path: String, val bytes: ByteArray)
private val data = mutableListOf<Entry>()
override fun canTransformResource(element: FileTreeElement): Boolean =
element.path.substringAfterLast(".") == KOTLIN_MODULE
override fun transform(context: TransformerContext) {
fun relocate(content: String): String =
context.relocators.fold(content) { acc, relocator -> relocator.applyToSourceContent(acc) }
val input = DataInputStream(context.`is`)
val version = IntArray(input.readInt()) { input.readInt() }
logger.info("Transforming ${context.path} with version ${version.toList()}")
val table = JvmPackageTable.PackageTable.parseFrom(context.`is`).toBuilder()
val newTable = JvmPackageTable.PackageTable.newBuilder().apply {
for (packageParts in table.packagePartsList + table.metadataPartsList) {
addPackageParts(JvmPackageTable.PackageParts.newBuilder(packageParts).apply {
packageFqName = relocate(packageFqName)
})
}
addAllJvmPackageName(table.jvmPackageNameList.map(::relocate))
}
val baos = ByteArrayOutputStream()
val output = DataOutputStream(baos)
output.writeInt(version.size)
version.forEach(output::writeInt)
newTable.build().writeTo(output)
output.flush()
data += Entry(context.path, baos.toByteArray())
}
override fun hasTransformedResource(): Boolean =
data.isNotEmpty()
override fun modifyOutputStream(os: ZipOutputStream) {
for ((path, bytes) in data) {
os.putNextEntry(ZipEntry(path))
os.write(bytes)
}
data.clear()
}
companion object {
const val KOTLIN_MODULE = "kotlin_module"
}
}
@@ -73,8 +73,6 @@ fun main(args: Array<String>) {
modifyAndExecProtoc(protoPath)
}
generateJvmPackageTableToBuildSrc()
println()
println("Do not forget to run GenerateProtoBufCompare")
}
@@ -161,7 +159,3 @@ private fun modifyForDebug(protoPath: ProtoPath): String {
}
return text
}
private fun generateJvmPackageTableToBuildSrc() {
execProtoc("core/descriptors.jvm/src/jvm_package_table.proto", "buildSrc/src/main/java")
}
+61
View File
@@ -1,5 +1,13 @@
import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext
import org.jetbrains.kotlin.serialization.jvm.JvmPackageTable
import proguard.gradle.ProGuardTask
import shadow.org.apache.tools.zip.ZipEntry
import shadow.org.apache.tools.zip.ZipOutputStream
import java.io.ByteArrayOutputStream
import java.io.DataInputStream
import java.io.DataOutputStream
description = "Kotlin Full Reflection Library"
@@ -63,6 +71,59 @@ val copyAnnotations by task<Sync> {
tasks.getByName("compileJava").dependsOn(copyAnnotations)
class KotlinModuleShadowTransformer(private val logger: Logger) : Transformer {
@Suppress("ArrayInDataClass")
private data class Entry(val path: String, val bytes: ByteArray)
private val data = mutableListOf<Entry>()
override fun canTransformResource(element: FileTreeElement): Boolean =
element.path.substringAfterLast(".") == KOTLIN_MODULE
override fun transform(context: TransformerContext) {
fun relocate(content: String): String =
context.relocators.fold(content) { acc, relocator -> relocator.applyToSourceContent(acc) }
val input = DataInputStream(context.`is`)
val version = IntArray(input.readInt()) { input.readInt() }
logger.info("Transforming ${context.path} with version ${version.toList()}")
val table = JvmPackageTable.PackageTable.parseFrom(context.`is`).toBuilder()
val newTable = JvmPackageTable.PackageTable.newBuilder().apply {
for (packageParts in table.packagePartsList + table.metadataPartsList) {
addPackageParts(JvmPackageTable.PackageParts.newBuilder(packageParts).apply {
packageFqName = relocate(packageFqName)
})
}
addAllJvmPackageName(table.jvmPackageNameList.map(::relocate))
}
val baos = ByteArrayOutputStream()
val output = DataOutputStream(baos)
output.writeInt(version.size)
version.forEach(output::writeInt)
newTable.build().writeTo(output)
output.flush()
data += Entry(context.path, baos.toByteArray())
}
override fun hasTransformedResource(): Boolean =
data.isNotEmpty()
override fun modifyOutputStream(os: ZipOutputStream) {
for ((path, bytes) in data) {
os.putNextEntry(ZipEntry(path))
os.write(bytes)
}
data.clear()
}
companion object {
const val KOTLIN_MODULE = "kotlin_module"
}
}
val reflectShadowJar by task<ShadowJar> {
classifier = "shadow"
version = null