Class signature reification
This commit is contained in:
committed by
Andrey Breslav
parent
6d6d6fadc1
commit
c18c67c993
@@ -30,6 +30,8 @@ import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethods
|
|||||||
import kotlin.platform.platformStatic
|
import kotlin.platform.platformStatic
|
||||||
import org.jetbrains.org.objectweb.asm.tree.LdcInsnNode
|
import org.jetbrains.org.objectweb.asm.tree.LdcInsnNode
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
|
import org.jetbrains.org.objectweb.asm.signature.SignatureWriter
|
||||||
|
import org.jetbrains.org.objectweb.asm.signature.SignatureReader
|
||||||
|
|
||||||
public class ReifiedTypeInliner(private val parametersMapping: ReifiedTypeParameterMappings?) {
|
public class ReifiedTypeInliner(private val parametersMapping: ReifiedTypeParameterMappings?) {
|
||||||
|
|
||||||
@@ -49,11 +51,48 @@ public class ReifiedTypeInliner(private val parametersMapping: ReifiedTypeParame
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public fun reifySignature(oldSignature: String): SignatureReificationResult {
|
||||||
|
if (parametersMapping == null) return SignatureReificationResult(oldSignature, false)
|
||||||
|
|
||||||
|
val signatureRemapper = object : SignatureWriter() {
|
||||||
|
var needFurtherReification = false
|
||||||
|
override fun visitTypeVariable(name: String?) {
|
||||||
|
val mapping = getMappingByName(name) ?:
|
||||||
|
return super.visitTypeArgument()
|
||||||
|
if (mapping.newName != null) {
|
||||||
|
needFurtherReification = true
|
||||||
|
return super.visitTypeVariable(mapping.newName)
|
||||||
|
}
|
||||||
|
|
||||||
|
// else TypeVariable is replaced by concrete type
|
||||||
|
visitClassType(mapping.asmType!!.getInternalName())
|
||||||
|
visitEnd()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun visitFormalTypeParameter(name: String?) {
|
||||||
|
val mapping = getMappingByName(name) ?:
|
||||||
|
return super.visitFormalTypeParameter(name)
|
||||||
|
if (mapping.newName != null) {
|
||||||
|
needFurtherReification = true
|
||||||
|
super.visitFormalTypeParameter(mapping.newName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getMappingByName(name: String?) = parametersMapping[name!!]
|
||||||
|
}
|
||||||
|
|
||||||
|
SignatureReader(oldSignature).accept(signatureRemapper)
|
||||||
|
|
||||||
|
return SignatureReificationResult(signatureRemapper.toString(), signatureRemapper.needFurtherReification)
|
||||||
|
}
|
||||||
|
|
||||||
private fun isReifiedMarker(insn: AbstractInsnNode): Boolean {
|
private fun isReifiedMarker(insn: AbstractInsnNode): Boolean {
|
||||||
if (insn.getOpcode() != Opcodes.INVOKESTATIC || insn !is MethodInsnNode) return false
|
if (insn.getOpcode() != Opcodes.INVOKESTATIC || insn !is MethodInsnNode) return false
|
||||||
return insn.owner == IntrinsicMethods.INTRINSICS_CLASS_NAME && insn.name.startsWith("reify")
|
return insn.owner == IntrinsicMethods.INTRINSICS_CLASS_NAME && insn.name.startsWith("reify")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data class SignatureReificationResult(val newSignature: String, val needFurtherReification: Boolean)
|
||||||
|
|
||||||
private fun processReifyMarker(insn: MethodInsnNode, instructions: InsnList) {
|
private fun processReifyMarker(insn: MethodInsnNode, instructions: InsnList) {
|
||||||
val mapping = getTypeParameterMapping(insn) ?: return
|
val mapping = getTypeParameterMapping(insn) ?: return
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user