Update synthetic parameter processing logic according to ASM 7 changes

#KT-27774 Fixed
This commit is contained in:
Mikhael Bogdanov
2018-10-29 08:48:37 +01:00
parent 23b9889ebb
commit d2a205c72d
47 changed files with 808 additions and 12 deletions
@@ -60,7 +60,7 @@ internal class AnnotationsAndParameterCollectorMethodVisitor(
)
override fun visitParameterAnnotation(parameter: Int, desc: String, visible: Boolean): AnnotationVisitor? {
val index = parameter - parametersToSkipNumber
val index = if (Opcodes.API_VERSION <= Opcodes.ASM6) parameter - parametersToSkipNumber else parameter
if (index < 0) return null
val annotations =
@@ -252,7 +252,12 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass {
MethodAnnotationVisitor v = memberVisitor.visitMethod(Name.identifier(name), desc);
if (v == null) return null;
int methodParamCount = Type.getArgumentTypes(desc).length;
return new MethodVisitor(ASM5) {
private int visibleAnnotableParameterCount = methodParamCount;
private int invisibleAnnotableParameterCount = methodParamCount;
@Override
public org.jetbrains.org.objectweb.asm.AnnotationVisitor visitAnnotation(@NotNull String desc, boolean visible) {
return convertAnnotationVisitor(v, desc, innerClasses);
@@ -260,10 +265,19 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass {
@Override
public org.jetbrains.org.objectweb.asm.AnnotationVisitor visitParameterAnnotation(int parameter, @NotNull String desc, boolean visible) {
AnnotationArgumentVisitor av = v.visitParameterAnnotation(parameter, resolveNameByDesc(desc, innerClasses), SourceElement.NO_SOURCE);
int parameterIndex = parameter + methodParamCount - (visible ? visibleAnnotableParameterCount : invisibleAnnotableParameterCount);
AnnotationArgumentVisitor av = v.visitParameterAnnotation(parameterIndex, resolveNameByDesc(desc, innerClasses), SourceElement.NO_SOURCE);
return av == null ? null : convertAnnotationVisitor(av, innerClasses);
}
public void visitAnnotableParameterCount(int parameterCount, boolean visible) {
if (visible)
visibleAnnotableParameterCount = parameterCount;
else {
invisibleAnnotableParameterCount = parameterCount;
}
}
@Override
public void visitEnd() {
v.visitEnd();