Annotate $default-method with same annotations as original
#KT-6930 Fixed
This commit is contained in:
@@ -169,9 +169,7 @@ public class FunctionCodegen {
|
||||
v.getSerializationBindings().put(METHOD_FOR_FUNCTION, functionDescriptor, asmMethod);
|
||||
}
|
||||
|
||||
AnnotationCodegen.forMethod(mv, typeMapper).genAnnotations(functionDescriptor, asmMethod.getReturnType());
|
||||
|
||||
generateParameterAnnotations(functionDescriptor, mv, jvmSignature);
|
||||
generateAnnotationsForMethod(functionDescriptor, asmMethod, mv, true);
|
||||
|
||||
if (state.getClassBuilderMode() != ClassBuilderMode.LIGHT_CLASSES) {
|
||||
generateJetValueParameterAnnotations(mv, functionDescriptor, jvmSignature);
|
||||
@@ -218,10 +216,21 @@ public class FunctionCodegen {
|
||||
methodContext.recordSyntheticAccessorIfNeeded(functionDescriptor, bindingContext);
|
||||
}
|
||||
|
||||
private void generateAnnotationsForMethod(
|
||||
@NotNull FunctionDescriptor functionDescriptor,
|
||||
Method asmMethod,
|
||||
MethodVisitor mv,
|
||||
boolean recordParametersIndices
|
||||
) {
|
||||
AnnotationCodegen.forMethod(mv, typeMapper).genAnnotations(functionDescriptor, asmMethod.getReturnType());
|
||||
generateParameterAnnotations(functionDescriptor, mv, typeMapper.mapSignature(functionDescriptor), recordParametersIndices);
|
||||
}
|
||||
|
||||
private void generateParameterAnnotations(
|
||||
@NotNull FunctionDescriptor functionDescriptor,
|
||||
@NotNull MethodVisitor mv,
|
||||
@NotNull JvmMethodSignature jvmSignature
|
||||
@NotNull JvmMethodSignature jvmSignature,
|
||||
boolean recordParametersIndices
|
||||
) {
|
||||
Iterator<ValueParameterDescriptor> iterator = functionDescriptor.getValueParameters().iterator();
|
||||
List<JvmMethodParameterSignature> kotlinParameterTypes = jvmSignature.getValueParameters();
|
||||
@@ -236,7 +245,9 @@ public class FunctionCodegen {
|
||||
|
||||
if (kind == JvmMethodParameterKind.VALUE) {
|
||||
ValueParameterDescriptor parameter = iterator.next();
|
||||
v.getSerializationBindings().put(INDEX_FOR_VALUE_PARAMETER, parameter, i);
|
||||
if (recordParametersIndices) {
|
||||
v.getSerializationBindings().put(INDEX_FOR_VALUE_PARAMETER, parameter, i);
|
||||
}
|
||||
AnnotationCodegen.forParameter(i, mv, typeMapper).genAnnotations(parameter, parameterSignature.getAsmType());
|
||||
}
|
||||
}
|
||||
@@ -603,6 +614,8 @@ public class FunctionCodegen {
|
||||
getThrownExceptions(functionDescriptor, typeMapper)
|
||||
);
|
||||
|
||||
generateAnnotationsForMethod(functionDescriptor, defaultMethod, mv, false);
|
||||
|
||||
if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
|
||||
if (this.owner instanceof PackageFacadeContext) {
|
||||
mv.visitCode();
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
import java.lang.annotation.*
|
||||
import kotlin.reflect.jvm.java
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
Retention(RetentionPolicy.RUNTIME)
|
||||
annotation class Ann(val x: Int)
|
||||
class A {
|
||||
Ann(1) fun foo(Ann(2) x: Int, y: Int = 2, Ann(3) z: Int) {}
|
||||
|
||||
Ann(1) constructor(Ann(2) x: Int, y: Int = 2, Ann(3) z: Int)
|
||||
}
|
||||
|
||||
class B [Ann(1)] (Ann(2) x: Int, y: Int = 2, Ann(3) z: Int) {}
|
||||
|
||||
fun Array<out Annotation>.ann() = filterIsInstance<Ann>()
|
||||
|
||||
fun test(name: String, annotations: Array<out Annotation>, parameters: Array<out Array<out Annotation>>) {
|
||||
assertEquals(1, annotations.ann()[0].x, "$name[0]")
|
||||
|
||||
assertEquals(2, parameters[0].ann()[0].x, "$name-param[0]")
|
||||
assertEquals(0, parameters[1].ann().size(), "$name-param[1]")
|
||||
assertEquals(3, parameters[2].ann()[0].x, "$name-param[2]")
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val foo = javaClass<A>().getDeclaredMethods().first { it.getName() == "foo" }
|
||||
test("foo", foo.getDeclaredAnnotations(), foo.getParameterAnnotations())
|
||||
|
||||
val fooDefault = javaClass<A>().getDeclaredMethods().first { it.getName() == "foo\$default" }
|
||||
test("foo", foo.getDeclaredAnnotations(), foo.getParameterAnnotations())
|
||||
|
||||
val (secondary, secondaryDefault) = javaClass<A>().getDeclaredConstructors().partition { it.getParameterTypes().size() == 3 }
|
||||
|
||||
test("secondary", secondary[0].getDeclaredAnnotations(), secondary[0].getParameterAnnotations())
|
||||
test("secondary\$default", secondaryDefault[0].getDeclaredAnnotations(), secondaryDefault[0].getParameterAnnotations())
|
||||
|
||||
val (primary, primaryDefault) = javaClass<B>().getConstructors().partition { it.getParameterTypes().size() == 3 }
|
||||
|
||||
test("primary", primary[0].getDeclaredAnnotations(), primary[0].getParameterAnnotations())
|
||||
test("secondary\$default", primaryDefault[0].getDeclaredAnnotations(), primaryDefault[0].getParameterAnnotations())
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+6
@@ -49,6 +49,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
|
||||
doTestWithStdlib(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("annotationsOnDefault.kt")
|
||||
public void testAnnotationsOnDefault() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/annotations/annotationsOnDefault.kt");
|
||||
doTestWithStdlib(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("defaultParameterValues.kt")
|
||||
public void testDefaultParameterValues() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/annotations/defaultParameterValues.kt");
|
||||
|
||||
Reference in New Issue
Block a user