From 456037a30d26b691e0afde3c0743dc82cd0efb65 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Thu, 26 Jan 2017 17:56:22 +0100 Subject: [PATCH] Generate proper annotaions on parameters for @JvmOverloads; Fix for KT-15743: Overloaded Kotlin extensions annotates wrong parameters in java #KT-15743 Fixed --- .../DefaultParameterValueSubstitutor.kt | 6 +- .../kotlin/codegen/FunctionCodegen.java | 15 +- .../jvmOverloadsAndParametersAnnotations.kt | 129 +++++++++++++++++ .../jvmOverloadsAndParametersAnnotations.txt | 133 ++++++++++++++++++ .../jvmOverloads/extensionMethod.txt | 2 +- .../jvmOverloads/innerClass.txt | 2 +- .../codegen/BytecodeListingTestGenerated.java | 6 + 7 files changed, 286 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/codegen/bytecodeListing/jvmOverloadsAndParametersAnnotations.kt create mode 100644 compiler/testData/codegen/bytecodeListing/jvmOverloadsAndParametersAnnotations.txt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt index c170ef857d3..b69b6e57623 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.annotations.findJvmOverloadsAnnotation import org.jetbrains.kotlin.resolve.jvm.diagnostics.OtherOrigin +import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterKind import org.jetbrains.org.objectweb.asm.Label import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Type @@ -146,10 +147,7 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) { mv.visitAnnotation(ANNOTATION_TYPE_DESCRIPTOR_FOR_JVMOVERLOADS_GENERATED_METHODS, /* visible = */ false) } - remainingParameters.withIndex().forEach { - val annotationCodegen = AnnotationCodegen.forParameter(it.index, mv, memberCodegen, typeMapper) - annotationCodegen.genAnnotations(it.value, signature.valueParameters[it.index].asmType) - } + FunctionCodegen.generateParameterAnnotations(functionDescriptor, mv, signature, remainingParameters, memberCodegen, state) if (!state.classBuilderMode.generateBodies) { FunctionCodegen.generateLocalVariablesForParameters(mv, signature, null, Label(), Label(), remainingParameters, isStatic, typeMapper) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index b336992d16a..df741c4fb76 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -330,9 +330,22 @@ public class FunctionCodegen { @NotNull JvmMethodSignature jvmSignature, @NotNull InnerClassConsumer innerClassConsumer, @NotNull GenerationState state + ) { + generateParameterAnnotations( + functionDescriptor, mv, jvmSignature, functionDescriptor.getValueParameters(), innerClassConsumer, state + ); + } + + public static void generateParameterAnnotations( + @NotNull FunctionDescriptor functionDescriptor, + @NotNull MethodVisitor mv, + @NotNull JvmMethodSignature jvmSignature, + @NotNull List valueParameters, + @NotNull InnerClassConsumer innerClassConsumer, + @NotNull GenerationState state ) { KotlinTypeMapper typeMapper = state.getTypeMapper(); - Iterator iterator = functionDescriptor.getValueParameters().iterator(); + Iterator iterator = valueParameters.iterator(); List kotlinParameterTypes = jvmSignature.getValueParameters(); for (int i = 0; i < kotlinParameterTypes.size(); i++) { diff --git a/compiler/testData/codegen/bytecodeListing/jvmOverloadsAndParametersAnnotations.kt b/compiler/testData/codegen/bytecodeListing/jvmOverloadsAndParametersAnnotations.kt new file mode 100644 index 00000000000..458b4f14add --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/jvmOverloadsAndParametersAnnotations.kt @@ -0,0 +1,129 @@ +// WITH_RUNTIME + +annotation class StringRes +annotation class LongRes +annotation class DefRes + +class ASimpleClass { + @JvmOverloads + fun String.showSnackbar(@StringRes stringResId: Int, duration: Int = 2) { + + } + + @JvmOverloads + fun showSnackbarNoExtension(@StringRes stringResId: Int, duration: Int = 2) { + + } + + @JvmOverloads + fun String.showSnackbarLong(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") { + + } + + @JvmOverloads + fun showSnackbarLongNoExtension(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") { + + } +} + +object BSimpleObject { + @JvmStatic + @JvmOverloads + fun String.showSnackbar(@StringRes stringResId: Int, duration: Int = 2) { + + } + + @JvmStatic + @JvmOverloads + fun showSnackbarNoExtension(@StringRes stringResId: Int, duration: Int = 2) { + + } + + @JvmStatic + @JvmOverloads + fun String.showSnackbarLong(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") { + + } + + @JvmStatic + @JvmOverloads + fun showSnackbarLongNoExtension(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") { + + } +} + +class CClassWithCompanion { + companion object { + @JvmStatic + @JvmOverloads + fun String.showSnackbar(@StringRes stringResId: Int, duration: Int = 2) { + + } + + @JvmStatic + @JvmOverloads + fun showSnackbarNoExtension(@StringRes stringResId: Int, duration: Int = 2) { + + } + + @JvmStatic + @JvmOverloads + fun String.showSnackbarLong(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") { + + } + + @JvmStatic + @JvmOverloads + fun showSnackbarLongNoExtension(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") { + + } + } +} + +class DClassConstuctors { + @JvmOverloads + constructor(@StringRes stringResId: Int, duration: Int = 2) { + + } + + @JvmOverloads + constructor(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") { + + } + + inner class InnerClass { + @JvmOverloads + constructor(@StringRes stringResId: Int, duration: Int = 2) { + + } + + @JvmOverloads + constructor(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") { + + } + + } +} + + + +@JvmOverloads +fun String.showSnackbar(@StringRes stringResId: Int, duration: Int = 2) { + +} + +@JvmOverloads +fun showSnackbarNoExtension(@StringRes stringResId: Int, duration: Int = 2) { + +} + +@JvmOverloads +fun String.showSnackbarLong(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") { + +} + + +@JvmOverloads +fun showSnackbarLongNoExtension(@StringRes stringResId: Int, @DefRes duration: Int = 2, @LongRes oneMoreNonDefault: Long, andDefaultOne: String = "Default") { + +} diff --git a/compiler/testData/codegen/bytecodeListing/jvmOverloadsAndParametersAnnotations.txt b/compiler/testData/codegen/bytecodeListing/jvmOverloadsAndParametersAnnotations.txt new file mode 100644 index 00000000000..6882a9121fe --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/jvmOverloadsAndParametersAnnotations.txt @@ -0,0 +1,133 @@ +@kotlin.Metadata +public final class ASimpleClass { + public method (): void + public synthetic static @kotlin.jvm.JvmOverloads method showSnackbar$default(p0: ASimpleClass, p1: java.lang.String, p2: int, p3: int, p4: int, p5: java.lang.Object): void + public final @kotlin.jvm.JvmOverloads method showSnackbar(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int): void + public final @kotlin.jvm.JvmOverloads method showSnackbar(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, p2: int): void + public synthetic static @kotlin.jvm.JvmOverloads method showSnackbarLong$default(p0: ASimpleClass, p1: java.lang.String, p2: int, p3: int, p4: long, p5: java.lang.String, p6: int, p7: java.lang.Object): void + public final @kotlin.jvm.JvmOverloads method showSnackbarLong(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, @DefRes p2: int, @LongRes p3: long): void + public final @kotlin.jvm.JvmOverloads method showSnackbarLong(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, @DefRes p2: int, @LongRes p3: long, @org.jetbrains.annotations.NotNull p4: java.lang.String): void + public final @kotlin.jvm.JvmOverloads method showSnackbarLong(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, @LongRes p2: long): void + public synthetic static @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension$default(p0: ASimpleClass, p1: int, p2: int, p3: long, p4: java.lang.String, p5: int, p6: java.lang.Object): void + public final @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension(@StringRes p0: int, @DefRes p1: int, @LongRes p2: long): void + public final @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension(@StringRes p0: int, @DefRes p1: int, @LongRes p2: long, @org.jetbrains.annotations.NotNull p3: java.lang.String): void + public final @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension(@StringRes p0: int, @LongRes p1: long): void + public synthetic static @kotlin.jvm.JvmOverloads method showSnackbarNoExtension$default(p0: ASimpleClass, p1: int, p2: int, p3: int, p4: java.lang.Object): void + public final @kotlin.jvm.JvmOverloads method showSnackbarNoExtension(@StringRes p0: int): void + public final @kotlin.jvm.JvmOverloads method showSnackbarNoExtension(@StringRes p0: int, p1: int): void +} + +@kotlin.Metadata +public final class BSimpleObject { + public final static field INSTANCE: BSimpleObject + static method (): void + private method (): void + public synthetic static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbar$default(p0: java.lang.String, p1: int, p2: int, p3: int, p4: java.lang.Object): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbar(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbar(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, p2: int): void + public synthetic static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLong$default(p0: java.lang.String, p1: int, p2: int, p3: long, p4: java.lang.String, p5: int, p6: java.lang.Object): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLong(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, @DefRes p2: int, @LongRes p3: long): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLong(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, @DefRes p2: int, @LongRes p3: long, @org.jetbrains.annotations.NotNull p4: java.lang.String): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLong(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, @LongRes p2: long): void + public synthetic static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension$default(p0: int, p1: int, p2: long, p3: java.lang.String, p4: int, p5: java.lang.Object): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension(@StringRes p0: int, @DefRes p1: int, @LongRes p2: long): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension(@StringRes p0: int, @DefRes p1: int, @LongRes p2: long, @org.jetbrains.annotations.NotNull p3: java.lang.String): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension(@StringRes p0: int, @LongRes p1: long): void + public synthetic static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarNoExtension$default(p0: int, p1: int, p2: int, p3: java.lang.Object): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarNoExtension(@StringRes p0: int): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarNoExtension(@StringRes p0: int, p1: int): void +} + +@kotlin.Metadata +public final class CClassWithCompanion$Companion { + inner class CClassWithCompanion$Companion + private method (): void + public synthetic method (p0: kotlin.jvm.internal.DefaultConstructorMarker): void + public synthetic static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbar$default(p0: CClassWithCompanion$Companion, p1: java.lang.String, p2: int, p3: int, p4: int, p5: java.lang.Object): void + public final @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbar(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int): void + public final @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbar(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, p2: int): void + public synthetic static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLong$default(p0: CClassWithCompanion$Companion, p1: java.lang.String, p2: int, p3: int, p4: long, p5: java.lang.String, p6: int, p7: java.lang.Object): void + public final @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLong(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, @DefRes p2: int, @LongRes p3: long): void + public final @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLong(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, @DefRes p2: int, @LongRes p3: long, @org.jetbrains.annotations.NotNull p4: java.lang.String): void + public final @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLong(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, @LongRes p2: long): void + public synthetic static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension$default(p0: CClassWithCompanion$Companion, p1: int, p2: int, p3: long, p4: java.lang.String, p5: int, p6: java.lang.Object): void + public final @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension(@StringRes p0: int, @DefRes p1: int, @LongRes p2: long): void + public final @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension(@StringRes p0: int, @DefRes p1: int, @LongRes p2: long, @org.jetbrains.annotations.NotNull p3: java.lang.String): void + public final @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension(@StringRes p0: int, @LongRes p1: long): void + public synthetic static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarNoExtension$default(p0: CClassWithCompanion$Companion, p1: int, p2: int, p3: int, p4: java.lang.Object): void + public final @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarNoExtension(@StringRes p0: int): void + public final @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarNoExtension(@StringRes p0: int, p1: int): void +} + +@kotlin.Metadata +public final class CClassWithCompanion { + public final static field Companion: CClassWithCompanion$Companion + inner class CClassWithCompanion$Companion + static method (): void + public method (): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbar(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbar(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, p2: int): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLong(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, @DefRes p2: int, @LongRes p3: long): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLong(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, @DefRes p2: int, @LongRes p3: long, @org.jetbrains.annotations.NotNull p4: java.lang.String): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLong(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, @LongRes p2: long): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension(@StringRes p0: int, @DefRes p1: int, @LongRes p2: long): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension(@StringRes p0: int, @DefRes p1: int, @LongRes p2: long, @org.jetbrains.annotations.NotNull p3: java.lang.String): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension(@StringRes p0: int, @LongRes p1: long): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarNoExtension(@StringRes p0: int): void + public final static @kotlin.jvm.JvmStatic @kotlin.jvm.JvmOverloads method showSnackbarNoExtension(@StringRes p0: int, p1: int): void +} + +@kotlin.Metadata +public final class DClassConstuctors$InnerClass { + synthetic final field this$0: DClassConstuctors + inner class DClassConstuctors$InnerClass + public @kotlin.jvm.JvmOverloads method (@java.lang.Synthetic @java.lang.Synthetic p0: DClassConstuctors, @StringRes p1: int, @DefRes p2: int, @LongRes p3: long, @org.jetbrains.annotations.NotNull p4: java.lang.String): void + public @kotlin.jvm.JvmOverloads method (@java.lang.Synthetic p0: DClassConstuctors, @StringRes p1: int): void + public @kotlin.jvm.JvmOverloads method (@java.lang.Synthetic p0: DClassConstuctors, @StringRes p1: int, @DefRes p2: int, @LongRes p3: long): void + public @kotlin.jvm.JvmOverloads method (@java.lang.Synthetic p0: DClassConstuctors, @StringRes p1: int, @LongRes p2: long): void + public @kotlin.jvm.JvmOverloads method (@java.lang.Synthetic p0: DClassConstuctors, @StringRes p1: int, p2: int): void + public synthetic @kotlin.jvm.JvmOverloads method (p0: DClassConstuctors, p1: int, p2: int, p3: int, p4: kotlin.jvm.internal.DefaultConstructorMarker): void + public synthetic @kotlin.jvm.JvmOverloads method (p0: DClassConstuctors, p1: int, p2: int, p3: long, p4: java.lang.String, p5: int, p6: kotlin.jvm.internal.DefaultConstructorMarker): void +} + +@kotlin.Metadata +public final class DClassConstuctors { + inner class DClassConstuctors$InnerClass + public @kotlin.jvm.JvmOverloads method (@StringRes p0: int): void + public @kotlin.jvm.JvmOverloads method (@StringRes p0: int, @DefRes p1: int, @LongRes p2: long): void + public @kotlin.jvm.JvmOverloads method (@StringRes p0: int, @DefRes p1: int, @LongRes p2: long, @org.jetbrains.annotations.NotNull p3: java.lang.String): void + public @kotlin.jvm.JvmOverloads method (@StringRes p0: int, @LongRes p1: long): void + public @kotlin.jvm.JvmOverloads method (@StringRes p0: int, p1: int): void + public synthetic @kotlin.jvm.JvmOverloads method (p0: int, p1: int, p2: int, p3: kotlin.jvm.internal.DefaultConstructorMarker): void + public synthetic @kotlin.jvm.JvmOverloads method (p0: int, p1: int, p2: long, p3: java.lang.String, p4: int, p5: kotlin.jvm.internal.DefaultConstructorMarker): void +} + +@java.lang.annotation.Retention +@kotlin.Metadata +public annotation class DefRes + +@kotlin.Metadata +public final class JvmOverloadsAndParametersAnnotationsKt { + public synthetic static @kotlin.jvm.JvmOverloads method showSnackbar$default(p0: java.lang.String, p1: int, p2: int, p3: int, p4: java.lang.Object): void + public final static @kotlin.jvm.JvmOverloads method showSnackbar(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int): void + public final static @kotlin.jvm.JvmOverloads method showSnackbar(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, p2: int): void + public synthetic static @kotlin.jvm.JvmOverloads method showSnackbarLong$default(p0: java.lang.String, p1: int, p2: int, p3: long, p4: java.lang.String, p5: int, p6: java.lang.Object): void + public final static @kotlin.jvm.JvmOverloads method showSnackbarLong(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, @DefRes p2: int, @LongRes p3: long): void + public final static @kotlin.jvm.JvmOverloads method showSnackbarLong(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, @DefRes p2: int, @LongRes p3: long, @org.jetbrains.annotations.NotNull p4: java.lang.String): void + public final static @kotlin.jvm.JvmOverloads method showSnackbarLong(@org.jetbrains.annotations.NotNull p0: java.lang.String, @StringRes p1: int, @LongRes p2: long): void + public synthetic static @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension$default(p0: int, p1: int, p2: long, p3: java.lang.String, p4: int, p5: java.lang.Object): void + public final static @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension(@StringRes p0: int, @DefRes p1: int, @LongRes p2: long): void + public final static @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension(@StringRes p0: int, @DefRes p1: int, @LongRes p2: long, @org.jetbrains.annotations.NotNull p3: java.lang.String): void + public final static @kotlin.jvm.JvmOverloads method showSnackbarLongNoExtension(@StringRes p0: int, @LongRes p1: long): void + public synthetic static @kotlin.jvm.JvmOverloads method showSnackbarNoExtension$default(p0: int, p1: int, p2: int, p3: java.lang.Object): void + public final static @kotlin.jvm.JvmOverloads method showSnackbarNoExtension(@StringRes p0: int): void + public final static @kotlin.jvm.JvmOverloads method showSnackbarNoExtension(@StringRes p0: int, p1: int): void +} + +@java.lang.annotation.Retention +@kotlin.Metadata +public annotation class LongRes + +@java.lang.annotation.Retention +@kotlin.Metadata +public annotation class StringRes diff --git a/compiler/testData/codegen/light-analysis/jvmOverloads/extensionMethod.txt b/compiler/testData/codegen/light-analysis/jvmOverloads/extensionMethod.txt index 7acfe1d0ce9..48571f5327a 100644 --- a/compiler/testData/codegen/light-analysis/jvmOverloads/extensionMethod.txt +++ b/compiler/testData/codegen/light-analysis/jvmOverloads/extensionMethod.txt @@ -7,6 +7,6 @@ public final class C { public final class ExtensionMethodKt { public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String public synthetic static method foo$default(p0: C, p1: java.lang.String, p2: java.lang.String, p3: int, p4: java.lang.Object): java.lang.String + public final static @kotlin.jvm.JvmOverloads @org.jetbrains.annotations.NotNull @synthetic.kotlin.jvm.GeneratedByJvmOverloads method foo(@org.jetbrains.annotations.NotNull p0: C, @org.jetbrains.annotations.NotNull p1: java.lang.String): java.lang.String public final static @kotlin.jvm.JvmOverloads @org.jetbrains.annotations.NotNull method foo(@org.jetbrains.annotations.NotNull p0: C, @org.jetbrains.annotations.NotNull p1: java.lang.String, @org.jetbrains.annotations.NotNull p2: java.lang.String): java.lang.String - public final static @kotlin.jvm.JvmOverloads @org.jetbrains.annotations.NotNull @synthetic.kotlin.jvm.GeneratedByJvmOverloads method foo(@org.jetbrains.annotations.NotNull p0: C, p1: java.lang.String): java.lang.String } diff --git a/compiler/testData/codegen/light-analysis/jvmOverloads/innerClass.txt b/compiler/testData/codegen/light-analysis/jvmOverloads/innerClass.txt index 449f2a84042..aa83e37f5c4 100644 --- a/compiler/testData/codegen/light-analysis/jvmOverloads/innerClass.txt +++ b/compiler/testData/codegen/light-analysis/jvmOverloads/innerClass.txt @@ -15,8 +15,8 @@ public final class Outer/Inner { private final @org.jetbrains.annotations.NotNull field s2: java.lang.String synthetic final field this$0: Outer inner class Outer/Inner + public @kotlin.jvm.JvmOverloads @synthetic.kotlin.jvm.GeneratedByJvmOverloads method (@java.lang.Synthetic p0: Outer, @org.jetbrains.annotations.NotNull p1: java.lang.String): void public @kotlin.jvm.JvmOverloads method (@java.lang.Synthetic p0: Outer, @org.jetbrains.annotations.NotNull p1: java.lang.String, @org.jetbrains.annotations.NotNull p2: java.lang.String): void - public @kotlin.jvm.JvmOverloads @synthetic.kotlin.jvm.GeneratedByJvmOverloads method (@org.jetbrains.annotations.NotNull p0: Outer, p1: java.lang.String): void public synthetic method (p0: Outer, p1: java.lang.String, p2: java.lang.String, p3: int, p4: kotlin.jvm.internal.DefaultConstructorMarker): void public final @org.jetbrains.annotations.NotNull method getS1(): java.lang.String public final @org.jetbrains.annotations.NotNull method getS2(): java.lang.String diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java index 475afe8cc9e..9ea53b8592f 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java @@ -90,6 +90,12 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest { doTest(fileName); } + @TestMetadata("jvmOverloadsAndParametersAnnotations.kt") + public void testJvmOverloadsAndParametersAnnotations() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/jvmOverloadsAndParametersAnnotations.kt"); + doTest(fileName); + } + @TestMetadata("noCollectionStubMethodsInInterface.kt") public void testNoCollectionStubMethodsInInterface() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/noCollectionStubMethodsInInterface.kt");