Skip to content

Commit 5ec1616

Browse files
committed
Kapt: Preserve parameter names for abstract methods
1 parent 18e17a4 commit 5ec1616

File tree

7 files changed

+71
-10
lines changed

7 files changed

+71
-10
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public void visitEnd() {
7070
// So we just do it here
7171
if (methodNode.instructions.size() == 0
7272
// MethodNode does not create a list of variables for abstract methods, so we would get NPE in accept() instead
73-
&& (!(delegate instanceof MethodNode) || (methodNode.access & Opcodes.ACC_ABSTRACT) == 0)
73+
&& (!(delegate instanceof MethodNode) || methodNode.localVariables != null)
7474
) {
7575
List<LocalVariableNode> localVariables = methodNode.localVariables;
7676
// visits local variables

plugins/kapt3/src/org/jetbrains/kotlin/kapt3/Kapt3BuilderFactory.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,8 @@ import org.jetbrains.kotlin.codegen.ClassBuilder
2121
import org.jetbrains.kotlin.codegen.ClassBuilderFactory
2222
import org.jetbrains.kotlin.codegen.ClassBuilderMode
2323
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
24-
import org.jetbrains.org.objectweb.asm.ClassWriter
25-
import org.jetbrains.org.objectweb.asm.FieldVisitor
26-
import org.jetbrains.org.objectweb.asm.MethodVisitor
27-
import org.jetbrains.org.objectweb.asm.tree.ClassNode
28-
import org.jetbrains.org.objectweb.asm.tree.FieldNode
29-
import org.jetbrains.org.objectweb.asm.tree.MethodNode
24+
import org.jetbrains.org.objectweb.asm.*
25+
import org.jetbrains.org.objectweb.asm.tree.*
3026

3127
internal class Kapt3BuilderFactory : ClassBuilderFactory {
3228
internal val compiledClasses = mutableListOf<ClassNode>()
@@ -65,6 +61,12 @@ internal class Kapt3BuilderFactory : ClassBuilderFactory {
6561
): MethodVisitor {
6662
val methodNode = super.newMethod(origin, access, name, desc, signature, exceptions) as MethodNode
6763
origins.put(methodNode, origin)
64+
65+
// ASM doesn't read information about local variables for the `abstract` methods so we need to get it manually
66+
if ((access and Opcodes.ACC_ABSTRACT) != 0 && methodNode.localVariables == null) {
67+
methodNode.localVariables = mutableListOf<LocalVariableNode>()
68+
}
69+
6870
return methodNode
6971
}
7072
}

plugins/kapt3/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,12 @@ public void testMapEntry() throws Exception {
186186
doTest(fileName);
187187
}
188188

189+
@TestMetadata("methodParameterNames.kt")
190+
public void testMethodParameterNames() throws Exception {
191+
String fileName = KotlinTestUtils.navigationMetadata("plugins/kapt3/testData/converter/methodParameterNames.kt");
192+
doTest(fileName);
193+
}
194+
189195
@TestMetadata("methodPropertySignatureClash.kt")
190196
public void testMethodPropertySignatureClash() throws Exception {
191197
String fileName = KotlinTestUtils.navigationMetadata("plugins/kapt3/testData/converter/methodPropertySignatureClash.kt");

plugins/kapt3/testData/converter/abstractMethods.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
public abstract class Base {
22

33
protected abstract void doJob(@org.jetbrains.annotations.NotNull()
4-
java.lang.String p0, int p1);
4+
java.lang.String job, int delay);
55

66
protected abstract <T extends java.lang.CharSequence>void doJobGeneric(@org.jetbrains.annotations.NotNull()
7-
T p0, int p1);
7+
T job, int delay);
88

99
public Base() {
1010
super();

plugins/kapt3/testData/converter/mapEntry.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ public abstract interface EntryHolder {
22

33
@org.jetbrains.annotations.NotNull()
44
public abstract java.util.Map.Entry<java.lang.String, java.lang.Object> entry(@org.jetbrains.annotations.NotNull()
5-
java.util.Map.Entry<? extends java.lang.CharSequence, ? extends java.util.Map.Entry<java.lang.String, java.lang.Integer>> p0);
5+
java.util.Map.Entry<? extends java.lang.CharSequence, ? extends java.util.Map.Entry<java.lang.String, java.lang.Integer>> p);
66

77
@org.jetbrains.annotations.NotNull()
88
public abstract java.util.Map.Entry<java.lang.String, java.lang.Object> getEntryProperty();
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
interface Intf {
2+
fun foo(abc: String)
3+
4+
fun bar(bcd: Int): String {
5+
return ""
6+
}
7+
}
8+
9+
abstract class Cls {
10+
abstract fun foo(abc: String)
11+
12+
fun bar(bcd: Int): String {
13+
return ""
14+
}
15+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
public abstract class Cls {
2+
3+
public abstract void foo(@org.jetbrains.annotations.NotNull()
4+
java.lang.String abc);
5+
6+
@org.jetbrains.annotations.NotNull()
7+
public final java.lang.String bar(int bcd) {
8+
return null;
9+
}
10+
11+
public Cls() {
12+
super();
13+
}
14+
}
15+
16+
////////////////////
17+
18+
19+
public abstract interface Intf {
20+
21+
public abstract void foo(@org.jetbrains.annotations.NotNull()
22+
java.lang.String abc);
23+
24+
@org.jetbrains.annotations.NotNull()
25+
public abstract java.lang.String bar(int bcd);
26+
27+
public static final class DefaultImpls {
28+
29+
public DefaultImpls() {
30+
super();
31+
}
32+
33+
@org.jetbrains.annotations.NotNull()
34+
public static java.lang.String bar(Intf $this, int bcd) {
35+
return null;
36+
}
37+
}
38+
}

0 commit comments

Comments
 (0)