From 5ec16167bc0fc5ee4aaa41f2b90065ecd3dc19d6 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 19 May 2017 18:16:26 +0300 Subject: [PATCH] Kapt: Preserve parameter names for abstract methods --- .../codegen/TransformationMethodVisitor.java | 2 +- .../kotlin/kapt3/Kapt3BuilderFactory.kt | 14 ++++--- ...ileToSourceStubConverterTestGenerated.java | 6 +++ .../testData/converter/abstractMethods.txt | 4 +- plugins/kapt3/testData/converter/mapEntry.txt | 2 +- .../converter/methodParameterNames.kt | 15 ++++++++ .../converter/methodParameterNames.txt | 38 +++++++++++++++++++ 7 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 plugins/kapt3/testData/converter/methodParameterNames.kt create mode 100644 plugins/kapt3/testData/converter/methodParameterNames.txt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/TransformationMethodVisitor.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/TransformationMethodVisitor.java index 85138557e43..daade3065ec 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/TransformationMethodVisitor.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/TransformationMethodVisitor.java @@ -70,7 +70,7 @@ public abstract class TransformationMethodVisitor extends MethodVisitor { // So we just do it here if (methodNode.instructions.size() == 0 // MethodNode does not create a list of variables for abstract methods, so we would get NPE in accept() instead - && (!(delegate instanceof MethodNode) || (methodNode.access & Opcodes.ACC_ABSTRACT) == 0) + && (!(delegate instanceof MethodNode) || methodNode.localVariables != null) ) { List localVariables = methodNode.localVariables; // visits local variables diff --git a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/Kapt3BuilderFactory.kt b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/Kapt3BuilderFactory.kt index aed9bd6b788..d80f721371d 100644 --- a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/Kapt3BuilderFactory.kt +++ b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/Kapt3BuilderFactory.kt @@ -21,12 +21,8 @@ import org.jetbrains.kotlin.codegen.ClassBuilder import org.jetbrains.kotlin.codegen.ClassBuilderFactory import org.jetbrains.kotlin.codegen.ClassBuilderMode import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin -import org.jetbrains.org.objectweb.asm.ClassWriter -import org.jetbrains.org.objectweb.asm.FieldVisitor -import org.jetbrains.org.objectweb.asm.MethodVisitor -import org.jetbrains.org.objectweb.asm.tree.ClassNode -import org.jetbrains.org.objectweb.asm.tree.FieldNode -import org.jetbrains.org.objectweb.asm.tree.MethodNode +import org.jetbrains.org.objectweb.asm.* +import org.jetbrains.org.objectweb.asm.tree.* internal class Kapt3BuilderFactory : ClassBuilderFactory { internal val compiledClasses = mutableListOf() @@ -65,6 +61,12 @@ internal class Kapt3BuilderFactory : ClassBuilderFactory { ): MethodVisitor { val methodNode = super.newMethod(origin, access, name, desc, signature, exceptions) as MethodNode origins.put(methodNode, origin) + + // ASM doesn't read information about local variables for the `abstract` methods so we need to get it manually + if ((access and Opcodes.ACC_ABSTRACT) != 0 && methodNode.localVariables == null) { + methodNode.localVariables = mutableListOf() + } + return methodNode } } 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 231a51d9086..386a247b925 100644 --- a/plugins/kapt3/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java +++ b/plugins/kapt3/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java @@ -186,6 +186,12 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi doTest(fileName); } + @TestMetadata("methodParameterNames.kt") + public void testMethodParameterNames() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/kapt3/testData/converter/methodParameterNames.kt"); + doTest(fileName); + } + @TestMetadata("methodPropertySignatureClash.kt") public void testMethodPropertySignatureClash() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("plugins/kapt3/testData/converter/methodPropertySignatureClash.kt"); diff --git a/plugins/kapt3/testData/converter/abstractMethods.txt b/plugins/kapt3/testData/converter/abstractMethods.txt index 91a92381fe3..a1cc5381837 100644 --- a/plugins/kapt3/testData/converter/abstractMethods.txt +++ b/plugins/kapt3/testData/converter/abstractMethods.txt @@ -1,10 +1,10 @@ public abstract class Base { protected abstract void doJob(@org.jetbrains.annotations.NotNull() - java.lang.String p0, int p1); + java.lang.String job, int delay); protected abstract void doJobGeneric(@org.jetbrains.annotations.NotNull() - T p0, int p1); + T job, int delay); public Base() { super(); diff --git a/plugins/kapt3/testData/converter/mapEntry.txt b/plugins/kapt3/testData/converter/mapEntry.txt index b223419c33d..62867fcbab5 100644 --- a/plugins/kapt3/testData/converter/mapEntry.txt +++ b/plugins/kapt3/testData/converter/mapEntry.txt @@ -2,7 +2,7 @@ public abstract interface EntryHolder { @org.jetbrains.annotations.NotNull() public abstract java.util.Map.Entry entry(@org.jetbrains.annotations.NotNull() - java.util.Map.Entry> p0); + java.util.Map.Entry> p); @org.jetbrains.annotations.NotNull() public abstract java.util.Map.Entry getEntryProperty(); diff --git a/plugins/kapt3/testData/converter/methodParameterNames.kt b/plugins/kapt3/testData/converter/methodParameterNames.kt new file mode 100644 index 00000000000..5cde588ceb3 --- /dev/null +++ b/plugins/kapt3/testData/converter/methodParameterNames.kt @@ -0,0 +1,15 @@ +interface Intf { + fun foo(abc: String) + + fun bar(bcd: Int): String { + return "" + } +} + +abstract class Cls { + abstract fun foo(abc: String) + + fun bar(bcd: Int): String { + return "" + } +} \ No newline at end of file diff --git a/plugins/kapt3/testData/converter/methodParameterNames.txt b/plugins/kapt3/testData/converter/methodParameterNames.txt new file mode 100644 index 00000000000..643c93ec505 --- /dev/null +++ b/plugins/kapt3/testData/converter/methodParameterNames.txt @@ -0,0 +1,38 @@ +public abstract class Cls { + + public abstract void foo(@org.jetbrains.annotations.NotNull() + java.lang.String abc); + + @org.jetbrains.annotations.NotNull() + public final java.lang.String bar(int bcd) { + return null; + } + + public Cls() { + super(); + } +} + +//////////////////// + + +public abstract interface Intf { + + public abstract void foo(@org.jetbrains.annotations.NotNull() + java.lang.String abc); + + @org.jetbrains.annotations.NotNull() + public abstract java.lang.String bar(int bcd); + + public static final class DefaultImpls { + + public DefaultImpls() { + super(); + } + + @org.jetbrains.annotations.NotNull() + public static java.lang.String bar(Intf $this, int bcd) { + return null; + } + } +}