From 01c76153c7d680513e977c48974277445d50816d Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 29 Nov 2016 19:51:41 +0300 Subject: [PATCH] Kapt3: Allow function overloads based on return type (KT-14996). Fix wrong facade class name inside the default package --- .../org/jetbrains/kotlin/kapt3/KaptContext.kt | 2 + .../kotlin/kapt3/javac/KaptJavaLog.kt | 43 +++++++++++++++++++ .../stubs/ClassFileToSourceStubConverter.kt | 2 +- ...ileToSourceStubConverterTestGenerated.java | 6 +++ plugins/kapt3/testData/converter/kt14996.kt | 7 +++ plugins/kapt3/testData/converter/kt14996.txt | 14 ++++++ 6 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 plugins/kapt3/src/org/jetbrains/kotlin/kapt3/javac/KaptJavaLog.kt create mode 100644 plugins/kapt3/testData/converter/kt14996.kt create mode 100644 plugins/kapt3/testData/converter/kt14996.txt diff --git a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/KaptContext.kt b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/KaptContext.kt index a08826a9ee6..62a1164db46 100644 --- a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/KaptContext.kt +++ b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/KaptContext.kt @@ -21,6 +21,7 @@ import com.sun.tools.javac.main.JavaCompiler import com.sun.tools.javac.util.Context import com.sun.tools.javac.util.Options import org.jetbrains.kotlin.kapt3.javac.KaptJavaCompiler +import org.jetbrains.kotlin.kapt3.javac.KaptJavaLog import org.jetbrains.kotlin.kapt3.javac.KaptTreeMaker import org.jetbrains.kotlin.kapt3.util.KaptLogger import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin @@ -39,6 +40,7 @@ class KaptContext( val options: Options init { + KaptJavaLog.preRegister(context) JavacFileManager.preRegister(context) KaptTreeMaker.preRegister(context) KaptJavaCompiler.preRegister(context) diff --git a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/javac/KaptJavaLog.kt b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/javac/KaptJavaLog.kt new file mode 100644 index 00000000000..212b6f0d805 --- /dev/null +++ b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/javac/KaptJavaLog.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.kapt3.javac + +import com.sun.tools.javac.util.Context +import com.sun.tools.javac.util.JCDiagnostic +import com.sun.tools.javac.util.Log + +class KaptJavaLog(context: Context?) : Log(context) { + override fun report(diagnostic: JCDiagnostic) { + if (diagnostic.type == JCDiagnostic.DiagnosticType.ERROR && diagnostic.code in IGNORED_DIAGNOSTICS) { + return + } + + super.report(diagnostic) + } + + companion object { + private val IGNORED_DIAGNOSTICS = setOf( + "compiler.err.name.clash.same.erasure", + "compiler.err.name.clash.same.erasure.no.override", + "compiler.err.name.clash.same.erasure.no.override.1", + "compiler.err.name.clash.same.erasure.no.hide") + + internal fun preRegister(context: Context) { + context.put(Log.logKey, Context.Factory(::KaptJavaLog)) + } + } +} \ No newline at end of file diff --git a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt index 04c8d20119c..7de43c710a3 100644 --- a/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt +++ b/plugins/kapt3/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt @@ -150,7 +150,7 @@ class ClassFileToSourceStubConverter( val simpleName = when (descriptor) { is PackageFragmentDescriptor -> { - val className = clazz.name.drop(packageFqName.length + 1) + val className = if (packageFqName.isEmpty()) clazz.name else clazz.name.drop(packageFqName.length + 1) if (className.isEmpty()) throw IllegalStateException("Invalid package facade class name: ${clazz.name}") className } 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 58d682a25ae..363ac9564ba 100644 --- a/plugins/kapt3/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java +++ b/plugins/kapt3/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java @@ -114,6 +114,12 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi doTest(fileName); } + @TestMetadata("kt14996.kt") + public void testKt14996() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/kapt3/testData/converter/kt14996.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/kt14996.kt b/plugins/kapt3/testData/converter/kt14996.kt new file mode 100644 index 00000000000..463ac4c9152 --- /dev/null +++ b/plugins/kapt3/testData/converter/kt14996.kt @@ -0,0 +1,7 @@ +fun crashMe(values: List): String { + throw UnsupportedOperationException() +} + +fun crashMe(values: List): CharSequence { + throw UnsupportedOperationException() +} \ No newline at end of file diff --git a/plugins/kapt3/testData/converter/kt14996.txt b/plugins/kapt3/testData/converter/kt14996.txt new file mode 100644 index 00000000000..512bc502bd4 --- /dev/null +++ b/plugins/kapt3/testData/converter/kt14996.txt @@ -0,0 +1,14 @@ +public final class Kt14996Kt { + + public Kt14996Kt() { + super(); + } + + public static final java.lang.String crashMe(java.util.List values) { + return null; + } + + public static final java.lang.CharSequence crashMe(java.util.List values) { + return null; + } +}