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) })
}
def classpathFiles = classpath.findAll { it.exists() }
def classLoader = new URLClassLoader(classpathFiles.collect { it.toURL() }.toArray(new URL[classpath.size()]))
def classLoader = new URLClassLoader(classpath.collect { it.toURL() }.toArray(new URL[classpath.size()]))
def configuration = new CompilerConfiguration()
def scriptDefinitionClass = classLoader.loadClass(scriptDefinitionClassName)
def scriptDefinition = new KotlinScriptDefinitionFromAnnotatedTemplate(JvmClassMappingKt.getKotlinClass(scriptDefinitionClass),
null, null, null, classpathFiles)
null, null, null, classpath.collect())
configuration.add(JVMConfigurationKeys.SCRIPT_DEFINITIONS, scriptDefinition)
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.copy()
@@ -4,17 +4,23 @@ import org.objectweb.asm.ClassReader
import org.objectweb.asm.ClassWriter
import org.objectweb.asm.commons.Remapper
import org.objectweb.asm.commons.RemappingClassAdapter
import org.objectweb.asm.tree.ClassNode
class KotlinScriptBinaryArtifactRemapper {
String mainClassName
final String originalSourceFileName
final String mainClassName
KotlinScriptBinaryArtifactRemapper(String mainClassName) {
KotlinScriptBinaryArtifactRemapper(String originalSourceFileName, String mainClassName) {
this.originalSourceFileName = originalSourceFileName
this.mainClassName = mainClassName
}
KotlinScriptBinaryArtifact remapToPackage(KotlinScriptBinaryArtifact artifact, String packageName) {
def reader = new ClassReader(new ByteArrayInputStream(artifact.data))
def node = new ClassNode()
def writer = new ClassWriter(0)
def reader = new ClassReader(new ByteArrayInputStream(artifact.data))
reader.accept(node, ClassReader.EXPAND_FRAMES)
def normalizedPackageName = packageName.replace('.', '/')
def oldClassName = reader.getClassName()
def newClassName = artifact.relativePath.replace(oldClassName, "$normalizedPackageName/$oldClassName")
@@ -31,7 +37,8 @@ class KotlinScriptBinaryArtifactRemapper {
}
def remappingAdapter = new RemappingClassAdapter(writer, remapper)
reader.accept(remappingAdapter, ClassReader.EXPAND_FRAMES)
node.accept(remappingAdapter)
writer.visitSource(originalSourceFileName, null)
writer.visitEnd()
return new KotlinScriptBinaryArtifact(newClassName, writer.toByteArray())
@@ -48,7 +48,7 @@ class ApolloScriptCompileTask extends DefaultTask {
removeBinariesFor(it.file)
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) }
artifacts.each {