From 99a05f5d61a4bb6177443bee5a350e5f55ea557e Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 2 May 2017 19:06:20 +0300 Subject: [PATCH] Kapt3: Convert reference to KMutableMap.Entry correctly (KT-17567) --- .../kotlin/kapt3/javac/KaptTreeMaker.kt | 11 ++++++++++- ...ssFileToSourceStubConverterTestGenerated.java | 6 ++++++ plugins/kapt3/testData/converter/kt17567.kt | 6 ++++++ plugins/kapt3/testData/converter/kt17567.txt | 16 ++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 plugins/kapt3/testData/converter/kt17567.kt create mode 100644 plugins/kapt3/testData/converter/kt17567.txt diff --git a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/javac/KaptTreeMaker.kt b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/javac/KaptTreeMaker.kt index ff6035bd7d6..dd11f9a3d20 100644 --- a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/javac/KaptTreeMaker.kt +++ b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/javac/KaptTreeMaker.kt @@ -37,7 +37,7 @@ class KaptTreeMaker(context: Context) : TreeMaker(context) { } fun FqName(internalOrFqName: String): JCTree.JCExpression { - val path = internalOrFqName.replace('/', '.').split('.') + val path = internalOrFqName.replace('/', '.').convertSpecialFqName().split('.') assert(path.isNotEmpty()) if (path.size == 1) return SimpleName(path.single()) @@ -48,6 +48,15 @@ class KaptTreeMaker(context: Context) : TreeMaker(context) { return expr } + private fun String.convertSpecialFqName(): String { + // Hard-coded in ImplementationBodyCodegen, KOTLIN_MARKER_INTERFACES + if (this == "kotlin.jvm.internal.markers.KMutableMap\$Entry") { + return replace('$', '.') + } + + return this + } + fun convertBuiltinType(type: Type): JCTree.JCExpression? { val typeTag = when (type) { BYTE_TYPE -> TypeTag.BYTE 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 511d7531d47..70dd2611c84 100644 --- a/plugins/kapt3/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java +++ b/plugins/kapt3/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java @@ -168,6 +168,12 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi doTest(fileName); } + @TestMetadata("kt17567.kt") + public void testKt17567() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/kapt3/testData/converter/kt17567.kt"); + doTest(fileName); + } + @TestMetadata("mapEntry.kt") public void testMapEntry() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("plugins/kapt3/testData/converter/mapEntry.kt"); diff --git a/plugins/kapt3/testData/converter/kt17567.kt b/plugins/kapt3/testData/converter/kt17567.kt new file mode 100644 index 00000000000..ba1aba0ee25 --- /dev/null +++ b/plugins/kapt3/testData/converter/kt17567.kt @@ -0,0 +1,6 @@ +package test + +internal class MutableEntry( + private val internal: MutableMap, + override val key: K, value: V +): MutableMap.MutableEntry \ No newline at end of file diff --git a/plugins/kapt3/testData/converter/kt17567.txt b/plugins/kapt3/testData/converter/kt17567.txt new file mode 100644 index 00000000000..7059b17d12d --- /dev/null +++ b/plugins/kapt3/testData/converter/kt17567.txt @@ -0,0 +1,16 @@ +package test; + +public final class MutableEntry implements java.util.Map.Entry, kotlin.jvm.internal.markers.KMutableMap.Entry { + private final java.util.Map internal = null; + private final K key = null; + + @java.lang.Override() + public K getKey() { + return null; + } + + public MutableEntry(@org.jetbrains.annotations.NotNull() + java.util.Map internal, K key, V value) { + super(); + } +}