From 77153f0926f395c8da0c23461bb1d3d16e640379 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 29 Nov 2016 21:11:30 +0300 Subject: [PATCH] Kapt3: Fix "Parameter names are clashing in inner class constructor" (KT-14998) --- .../kotlin/kapt3/stubs/parseParameters.kt | 11 ++++- ...ileToSourceStubConverterTestGenerated.java | 6 +++ plugins/kapt3/testData/converter/kt14998.kt | 10 +++++ plugins/kapt3/testData/converter/kt14998.txt | 45 +++++++++++++++++++ 4 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 plugins/kapt3/testData/converter/kt14998.kt create mode 100644 plugins/kapt3/testData/converter/kt14998.txt diff --git a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/stubs/parseParameters.kt b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/stubs/parseParameters.kt index d38eb16f130..c37b0fc05a3 100644 --- a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/stubs/parseParameters.kt +++ b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/stubs/parseParameters.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.kapt3.stubs +import org.jetbrains.kotlin.kapt3.util.isAbstract import org.jetbrains.kotlin.kapt3.util.isEnum import org.jetbrains.kotlin.kapt3.util.isStatic import org.jetbrains.org.objectweb.asm.Type @@ -45,8 +46,14 @@ internal fun MethodNode.getParametersInfo(containingClass: ClassNode): List(parameterTypes.size - startParameterIndex) for (index in startParameterIndex..parameterTypes.lastIndex) { val type = parameterTypes[index] - var name = parameters.getOrNull(index - startParameterIndex)?.name - ?: localVariables.getOrNull(index + (if (isStatic) 0 else 1))?.name + + // Use parameters only in case of the abstract methods (it hasn't local variables table) + var name: String? = if (isAbstract(this.access) && this.name != "") + parameters.getOrNull(index - startParameterIndex)?.name + else + null + + name = name ?: localVariables.getOrNull(index + (if (isStatic) 0 else 1))?.name ?: "p${index - startParameterIndex}" // Property setters has bad parameter names diff --git a/plugins/kapt3/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java b/plugins/kapt3/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java index 0ede69c1756..da187b63a3a 100644 --- a/plugins/kapt3/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java +++ b/plugins/kapt3/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java @@ -126,6 +126,12 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi doTest(fileName); } + @TestMetadata("kt14998.kt") + public void testKt14998() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/kapt3/testData/converter/kt14998.kt"); + doTest(fileName); + } + @TestMetadata("modifiers.kt") public void testModifiers() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("plugins/kapt3/testData/converter/modifiers.kt"); diff --git a/plugins/kapt3/testData/converter/kt14998.kt b/plugins/kapt3/testData/converter/kt14998.kt new file mode 100644 index 00000000000..3d3cfa22858 --- /dev/null +++ b/plugins/kapt3/testData/converter/kt14998.kt @@ -0,0 +1,10 @@ +class Outer { + private inner class Inner(val foo: String, val bar: String) + private class Nested(val foo: String, val bar: String) + + fun nonAbstract(s: String, i: Int) { + + } + + abstract fun abstract(s: String, i: Int) +} \ No newline at end of file diff --git a/plugins/kapt3/testData/converter/kt14998.txt b/plugins/kapt3/testData/converter/kt14998.txt new file mode 100644 index 00000000000..2d2286158d9 --- /dev/null +++ b/plugins/kapt3/testData/converter/kt14998.txt @@ -0,0 +1,45 @@ +public final class Outer { + + public final void nonAbstract(java.lang.String s, int i) { + } + + public abstract void abstract(java.lang.String s, int i); + + public Outer() { + super(); + } + + private final class Inner { + private final java.lang.String foo = null; + private final java.lang.String bar = null; + + public final java.lang.String getFoo() { + return null; + } + + public final java.lang.String getBar() { + return null; + } + + public Inner(java.lang.String foo, java.lang.String bar) { + super(); + } + } + + private static final class Nested { + private final java.lang.String foo = null; + private final java.lang.String bar = null; + + public final java.lang.String getFoo() { + return null; + } + + public final java.lang.String getBar() { + return null; + } + + public Nested(java.lang.String foo, java.lang.String bar) { + super(); + } + } +}