Generalize parameter index calculation in ASM 7 support

Second part for d2a205c72d commit

 #KT-27774 Fixed
This commit is contained in:
Mikhael Bogdanov
2018-11-12 09:41:18 +01:00
parent e044ec78a1
commit 7ee13ca353
23 changed files with 376 additions and 11 deletions
@@ -29,10 +29,14 @@ internal class AnnotationsAndParameterCollectorMethodVisitor(
private val member: BinaryJavaMethodBase,
private val context: ClassifierResolutionContext,
private val signatureParser: BinaryClassSignatureParser,
private val parametersToSkipNumber: Int
private val parametersToSkipNumber: Int,
private val parametersCountInMethodDesc: Int
) : MethodVisitor(ASM_API_VERSION_FOR_CLASS_READING) {
private var parameterIndex = 0
private var visibleAnnotableParameterCount = parametersCountInMethodDesc
private var invisibleAnnotableParameterCount = parametersCountInMethodDesc
override fun visitAnnotationDefault(): AnnotationVisitor? {
member.safeAs<BinaryJavaMethod>()?.hasAnnotationParameterDefaultValue = true
// We don't store default value in Java model
@@ -59,8 +63,19 @@ internal class AnnotationsAndParameterCollectorMethodVisitor(
desc, context, signatureParser
)
@Suppress("NOTHING_TO_OVERRIDE")
override fun visitAnnotableParameterCount(parameterCount: Int, visible: Boolean) {
if (visible) {
visibleAnnotableParameterCount = parameterCount
} else {
invisibleAnnotableParameterCount = parameterCount
}
}
override fun visitParameterAnnotation(parameter: Int, desc: String, visible: Boolean): AnnotationVisitor? {
val index = if (Opcodes.API_VERSION <= Opcodes.ASM6) parameter - parametersToSkipNumber else parameter
val absoluteParameterIndex =
parameter + parametersCountInMethodDesc - if (visible) visibleAnnotableParameterCount else invisibleAnnotableParameterCount
val index = absoluteParameterIndex - parametersToSkipNumber
if (index < 0) return null
val annotations =
@@ -106,7 +106,14 @@ abstract class BinaryJavaMethodBase(
else -> 0
}
return member to AnnotationsAndParameterCollectorMethodVisitor(member, parentContext, signatureParser, paramIgnoreCount)
return member to
AnnotationsAndParameterCollectorMethodVisitor(
member,
parentContext,
signatureParser,
paramIgnoreCount,
Type.getArgumentTypes(desc).size
)
}
private fun parseMethodDescription(