Skip to content

Commit 456037a

Browse files
author
Mikhael Bogdanov
committed
Generate proper annotaions on parameters for @jvmoverloads;
Fix for KT-15743: Overloaded Kotlin extensions annotates wrong parameters in java #KT-15743 Fixed
1 parent ab464ea commit 456037a

File tree

7 files changed

+286
-7
lines changed

7 files changed

+286
-7
lines changed

compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue
2727
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
2828
import org.jetbrains.kotlin.resolve.jvm.annotations.findJvmOverloadsAnnotation
2929
import org.jetbrains.kotlin.resolve.jvm.diagnostics.OtherOrigin
30+
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterKind
3031
import org.jetbrains.org.objectweb.asm.Label
3132
import org.jetbrains.org.objectweb.asm.Opcodes
3233
import org.jetbrains.org.objectweb.asm.Type
@@ -146,10 +147,7 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) {
146147
mv.visitAnnotation(ANNOTATION_TYPE_DESCRIPTOR_FOR_JVMOVERLOADS_GENERATED_METHODS, /* visible = */ false)
147148
}
148149

149-
remainingParameters.withIndex().forEach {
150-
val annotationCodegen = AnnotationCodegen.forParameter(it.index, mv, memberCodegen, typeMapper)
151-
annotationCodegen.genAnnotations(it.value, signature.valueParameters[it.index].asmType)
152-
}
150+
FunctionCodegen.generateParameterAnnotations(functionDescriptor, mv, signature, remainingParameters, memberCodegen, state)
153151

154152
if (!state.classBuilderMode.generateBodies) {
155153
FunctionCodegen.generateLocalVariablesForParameters(mv, signature, null, Label(), Label(), remainingParameters, isStatic, typeMapper)

compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,9 +330,22 @@ public static void generateParameterAnnotations(
330330
@NotNull JvmMethodSignature jvmSignature,
331331
@NotNull InnerClassConsumer innerClassConsumer,
332332
@NotNull GenerationState state
333+
) {
334+
generateParameterAnnotations(
335+
functionDescriptor, mv, jvmSignature, functionDescriptor.getValueParameters(), innerClassConsumer, state
336+
);
337+
}
338+
339+
public static void generateParameterAnnotations(
340+
@NotNull FunctionDescriptor functionDescriptor,
341+
@NotNull MethodVisitor mv,
342+
@NotNull JvmMethodSignature jvmSignature,
343+
@NotNull List<ValueParameterDescriptor> valueParameters,
344+
@NotNull InnerClassConsumer innerClassConsumer,
345+
@NotNull GenerationState state
333346
) {
334347
KotlinTypeMapper typeMapper = state.getTypeMapper();
335-
Iterator<ValueParameterDescriptor> iterator = functionDescriptor.getValueParameters().iterator();
348+
Iterator<ValueParameterDescriptor> iterator = valueParameters.iterator();
336349
List<JvmMethodParameterSignature> kotlinParameterTypes = jvmSignature.getValueParameters();
337350

338351
for (int i = 0; i < kotlinParameterTypes.size(); i++) {
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
// WITH_RUNTIME
2+
3+
annotation class StringRes
4+
annotation class LongRes
5+
annotation class DefRes
6+
7+
class ASimpleClass {
8+
@JvmOverloads
9+
fun String.showSnackbar(@StringRes stringResId: Int, duration: Int = 2) {
10+
11+
}
12+
13+
@JvmOverloads
14+
fun showSnackbarNoExtension(@StringRes stringResId: Int, duration: Int = 2) {
15+
16+
}
17+
18+
@JvmOverloads
19+
fun String.showSnackbarLong(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") {
20+
21+
}
22+
23+
@JvmOverloads
24+
fun showSnackbarLongNoExtension(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") {
25+
26+
}
27+
}
28+
29+
object BSimpleObject {
30+
@JvmStatic
31+
@JvmOverloads
32+
fun String.showSnackbar(@StringRes stringResId: Int, duration: Int = 2) {
33+
34+
}
35+
36+
@JvmStatic
37+
@JvmOverloads
38+
fun showSnackbarNoExtension(@StringRes stringResId: Int, duration: Int = 2) {
39+
40+
}
41+
42+
@JvmStatic
43+
@JvmOverloads
44+
fun String.showSnackbarLong(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") {
45+
46+
}
47+
48+
@JvmStatic
49+
@JvmOverloads
50+
fun showSnackbarLongNoExtension(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") {
51+
52+
}
53+
}
54+
55+
class CClassWithCompanion {
56+
companion object {
57+
@JvmStatic
58+
@JvmOverloads
59+
fun String.showSnackbar(@StringRes stringResId: Int, duration: Int = 2) {
60+
61+
}
62+
63+
@JvmStatic
64+
@JvmOverloads
65+
fun showSnackbarNoExtension(@StringRes stringResId: Int, duration: Int = 2) {
66+
67+
}
68+
69+
@JvmStatic
70+
@JvmOverloads
71+
fun String.showSnackbarLong(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") {
72+
73+
}
74+
75+
@JvmStatic
76+
@JvmOverloads
77+
fun showSnackbarLongNoExtension(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") {
78+
79+
}
80+
}
81+
}
82+
83+
class DClassConstuctors {
84+
@JvmOverloads
85+
constructor(@StringRes stringResId: Int, duration: Int = 2) {
86+
87+
}
88+
89+
@JvmOverloads
90+
constructor(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") {
91+
92+
}
93+
94+
inner class InnerClass {
95+
@JvmOverloads
96+
constructor(@StringRes stringResId: Int, duration: Int = 2) {
97+
98+
}
99+
100+
@JvmOverloads
101+
constructor(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") {
102+
103+
}
104+
105+
}
106+
}
107+
108+
109+
110+
@JvmOverloads
111+
fun String.showSnackbar(@StringRes stringResId: Int, duration: Int = 2) {
112+
113+
}
114+
115+
@JvmOverloads
116+
fun showSnackbarNoExtension(@StringRes stringResId: Int, duration: Int = 2) {
117+
118+
}
119+
120+
@JvmOverloads
121+
fun String.showSnackbarLong(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") {
122+
123+
}
124+
125+
126+
@JvmOverloads
127+
fun showSnackbarLongNoExtension(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") {
128+
129+
}

0 commit comments

Comments
 (0)