From adb15d2d1a3c2085d3aaae6f0f7dc40f4d6d4a0e Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 23 Apr 2018 14:20:29 +0200 Subject: [PATCH] Do not report JvmOverloads warning on actual function with expected defaults #KT-23910 --- .../jvm/checkers/declarationCheckers.kt | 3 ++- .../multiplatform/jvmOverloads.kt | 11 +++++++++++ .../multiplatform/jvmOverloads.txt | 10 ++++++++++ .../DiagnosticsTestWithStdLibGenerated.java | 18 ++++++++++++++++++ ...sticsTestWithStdLibUsingJavacGenerated.java | 18 ++++++++++++++++++ 5 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/multiplatform/jvmOverloads.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/multiplatform/jvmOverloads.txt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt index 05572faf709..3f61b6b723d 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.annotations.hasJvmStaticAnnotation +import org.jetbrains.kotlin.resolve.calls.components.isActualParameterWithCorrespondingExpectedDefault import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext import org.jetbrains.kotlin.resolve.inline.InlineUtil @@ -199,7 +200,7 @@ class OverloadsAnnotationChecker: DeclarationChecker { diagnosticHolder.report(ErrorsJvm.OVERLOADS_LOCAL.on(annotationEntry)) } else if (!descriptor.visibility.isPublicAPI && descriptor.visibility != Visibilities.INTERNAL) { diagnosticHolder.report(ErrorsJvm.OVERLOADS_PRIVATE.on(annotationEntry)) - } else if (descriptor.valueParameters.none { it.declaresDefaultValue() }) { + } else if (descriptor.valueParameters.none { it.declaresDefaultValue() || it.isActualParameterWithCorrespondingExpectedDefault }) { diagnosticHolder.report(ErrorsJvm.OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS.on(annotationEntry)) } } diff --git a/compiler/testData/diagnostics/testsWithStdLib/multiplatform/jvmOverloads.kt b/compiler/testData/diagnostics/testsWithStdLib/multiplatform/jvmOverloads.kt new file mode 100644 index 00000000000..427d84be1c8 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/multiplatform/jvmOverloads.kt @@ -0,0 +1,11 @@ +// !LANGUAGE: +MultiPlatformProjects +// MODULE: m1-common +// FILE: common.kt + +expect fun foo(x: String, y: Int = -1) + +// MODULE: m2-jvm(m1-common) +// FILE: jvm.kt + +@JvmOverloads +actual fun foo(x: String, y: Int) {} diff --git a/compiler/testData/diagnostics/testsWithStdLib/multiplatform/jvmOverloads.txt b/compiler/testData/diagnostics/testsWithStdLib/multiplatform/jvmOverloads.txt new file mode 100644 index 00000000000..2aa5ad3d363 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/multiplatform/jvmOverloads.txt @@ -0,0 +1,10 @@ +// -- Module: -- +package + +public expect fun foo(/*0*/ x: kotlin.String, /*1*/ y: kotlin.Int = ...): kotlin.Unit + + +// -- Module: -- +package + +@kotlin.jvm.JvmOverloads public actual fun foo(/*0*/ x: kotlin.String, /*1*/ y: kotlin.Int): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java index 602963daf87..c077ab0cca8 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java @@ -2402,6 +2402,24 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW } } + @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/multiplatform") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Multiplatform extends AbstractDiagnosticsTestWithStdLib { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInMultiplatform() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/multiplatform"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("jvmOverloads.kt") + public void testJvmOverloads() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/multiplatform/jvmOverloads.kt"); + } + } + @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/native") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java index 66d663b2712..5fe9b9da582 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java @@ -2402,6 +2402,24 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno } } + @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/multiplatform") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Multiplatform extends AbstractDiagnosticsTestWithStdLibUsingJavac { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInMultiplatform() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/multiplatform"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("jvmOverloads.kt") + public void testJvmOverloads() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/multiplatform/jvmOverloads.kt"); + } + } + @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/native") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)