Add source information to remapped scripts

This commit is contained in:
Gary Tierney
2017-09-17 19:36:58 +01:00
parent 89516dab63
commit 1f33619ac6
3 changed files with 15 additions and 9 deletions
@@ -41,17 +41,16 @@ class KotlinCompilerConfigurationFactory {
classpath.addAll(bootClasspath.split(File.pathSeparatorChar.toString()).collect { new File(it) }) classpath.addAll(bootClasspath.split(File.pathSeparatorChar.toString()).collect { new File(it) })
} }
def classpathFiles = classpath.findAll { it.exists() } def classLoader = new URLClassLoader(classpath.collect { it.toURL() }.toArray(new URL[classpath.size()]))
def classLoader = new URLClassLoader(classpathFiles.collect { it.toURL() }.toArray(new URL[classpath.size()]))
def configuration = new CompilerConfiguration() def configuration = new CompilerConfiguration()
def scriptDefinitionClass = classLoader.loadClass(scriptDefinitionClassName) def scriptDefinitionClass = classLoader.loadClass(scriptDefinitionClassName)
def scriptDefinition = new KotlinScriptDefinitionFromAnnotatedTemplate(JvmClassMappingKt.getKotlinClass(scriptDefinitionClass), def scriptDefinition = new KotlinScriptDefinitionFromAnnotatedTemplate(JvmClassMappingKt.getKotlinClass(scriptDefinitionClass),
null, null, null, classpathFiles) null, null, null, classpath.collect())
configuration.add(JVMConfigurationKeys.SCRIPT_DEFINITIONS, scriptDefinition) configuration.add(JVMConfigurationKeys.SCRIPT_DEFINITIONS, scriptDefinition)
configuration.put(JVMConfigurationKeys.CONTENT_ROOTS, classpath.collect { new JvmClasspathRoot(it) }) configuration.put(JVMConfigurationKeys.CONTENT_ROOTS, classpath.collect { new JvmClasspathRoot(it) })
configuration.put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true) configuration.put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, false)
configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector) configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector)
configuration.copy() configuration.copy()
@@ -4,17 +4,23 @@ import org.objectweb.asm.ClassReader
import org.objectweb.asm.ClassWriter import org.objectweb.asm.ClassWriter
import org.objectweb.asm.commons.Remapper import org.objectweb.asm.commons.Remapper
import org.objectweb.asm.commons.RemappingClassAdapter import org.objectweb.asm.commons.RemappingClassAdapter
import org.objectweb.asm.tree.ClassNode
class KotlinScriptBinaryArtifactRemapper { class KotlinScriptBinaryArtifactRemapper {
String mainClassName final String originalSourceFileName
final String mainClassName
KotlinScriptBinaryArtifactRemapper(String mainClassName) { KotlinScriptBinaryArtifactRemapper(String originalSourceFileName, String mainClassName) {
this.originalSourceFileName = originalSourceFileName
this.mainClassName = mainClassName this.mainClassName = mainClassName
} }
KotlinScriptBinaryArtifact remapToPackage(KotlinScriptBinaryArtifact artifact, String packageName) { KotlinScriptBinaryArtifact remapToPackage(KotlinScriptBinaryArtifact artifact, String packageName) {
def reader = new ClassReader(new ByteArrayInputStream(artifact.data)) def node = new ClassNode()
def writer = new ClassWriter(0) def writer = new ClassWriter(0)
def reader = new ClassReader(new ByteArrayInputStream(artifact.data))
reader.accept(node, ClassReader.EXPAND_FRAMES)
def normalizedPackageName = packageName.replace('.', '/') def normalizedPackageName = packageName.replace('.', '/')
def oldClassName = reader.getClassName() def oldClassName = reader.getClassName()
def newClassName = artifact.relativePath.replace(oldClassName, "$normalizedPackageName/$oldClassName") def newClassName = artifact.relativePath.replace(oldClassName, "$normalizedPackageName/$oldClassName")
@@ -31,7 +37,8 @@ class KotlinScriptBinaryArtifactRemapper {
} }
def remappingAdapter = new RemappingClassAdapter(writer, remapper) def remappingAdapter = new RemappingClassAdapter(writer, remapper)
reader.accept(remappingAdapter, ClassReader.EXPAND_FRAMES) node.accept(remappingAdapter)
writer.visitSource(originalSourceFileName, null)
writer.visitEnd() writer.visitEnd()
return new KotlinScriptBinaryArtifact(newClassName, writer.toByteArray()) return new KotlinScriptBinaryArtifact(newClassName, writer.toByteArray())
@@ -48,7 +48,7 @@ class ApolloScriptCompileTask extends DefaultTask {
removeBinariesFor(it.file) removeBinariesFor(it.file)
def binary = compiler.compile(it.file.toPath()) def binary = compiler.compile(it.file.toPath())
def binaryArtifactRemapper = new KotlinScriptBinaryArtifactRemapper(binary.mainClassName) def binaryArtifactRemapper = new KotlinScriptBinaryArtifactRemapper(it.file.name, binary.mainClassName)
def artifacts = binary.artifacts.collect { binaryArtifactRemapper.remapToPackage(it, packageName) } def artifacts = binary.artifacts.collect { binaryArtifactRemapper.remapToPackage(it, packageName) }
artifacts.each { artifacts.each {