From 796d2fd210c3c1a945609645757f612c7889ff40 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Wed, 28 Apr 2021 01:48:11 +0300 Subject: [PATCH] Respect explicit api mode state when generating actual declarations #KT-44067 Fixed --- .../OverrideMemberChooserObject.kt | 15 +++++++++++- .../class/header/header.kt | 16 +++++++++++++ .../class/header/header.kt.after | 16 +++++++++++++ .../createActualExplicitApi/class/jvm/My.kt | 1 + .../class/jvm/My.kt.after | 24 +++++++++++++++++++ .../function/header/header.kt | 4 ++++ .../function/header/header.kt.after | 4 ++++ .../function/jvm/foo.kt | 1 + .../function/jvm/foo.kt.after | 4 ++++ .../AbstractQuickFixMultiModuleTest.kt | 12 +++++----- .../QuickFixMultiModuleTestGenerated.java | 23 ++++++++++++++++++ 11 files changed, 113 insertions(+), 7 deletions(-) create mode 100644 idea/testData/multiModuleQuickFix/createActualExplicitApi/class/header/header.kt create mode 100644 idea/testData/multiModuleQuickFix/createActualExplicitApi/class/header/header.kt.after create mode 100644 idea/testData/multiModuleQuickFix/createActualExplicitApi/class/jvm/My.kt create mode 100644 idea/testData/multiModuleQuickFix/createActualExplicitApi/class/jvm/My.kt.after create mode 100644 idea/testData/multiModuleQuickFix/createActualExplicitApi/function/header/header.kt create mode 100644 idea/testData/multiModuleQuickFix/createActualExplicitApi/function/header/header.kt.after create mode 100644 idea/testData/multiModuleQuickFix/createActualExplicitApi/function/jvm/foo.kt create mode 100644 idea/testData/multiModuleQuickFix/createActualExplicitApi/function/jvm/foo.kt.after diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt index cec91ea5f3a..1fa4f2a9bf9 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -12,6 +12,9 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiDocCommentOwner import com.intellij.psi.PsiElement import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.config.AnalysisFlag +import org.jetbrains.kotlin.config.AnalysisFlags +import org.jetbrains.kotlin.config.ExplicitApiMode import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde @@ -21,9 +24,11 @@ import org.jetbrains.kotlin.idea.core.overrideImplement.BodyType.* import org.jetbrains.kotlin.idea.core.util.DescriptorMemberChooserObject import org.jetbrains.kotlin.idea.j2k.IdeaDocCommentConverter import org.jetbrains.kotlin.idea.kdoc.KDocElementFactory +import org.jetbrains.kotlin.idea.project.getLanguageVersionSettings import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.approximateFlexibleTypes import org.jetbrains.kotlin.idea.util.expectedDescriptors +import org.jetbrains.kotlin.idea.util.module import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.findDocComment.findDocComment @@ -36,6 +41,8 @@ import org.jetbrains.kotlin.renderer.DescriptorRendererModifier.* import org.jetbrains.kotlin.renderer.OverrideRenderingPolicy import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.checkers.ExperimentalUsageChecker +import org.jetbrains.kotlin.resolve.checkers.ExplicitApiDeclarationChecker +import org.jetbrains.kotlin.resolve.checkers.explicitApiEnabled import org.jetbrains.kotlin.resolve.descriptorUtil.setSingleOverridden import org.jetbrains.kotlin.util.findCallableMemberBySignature @@ -133,6 +140,12 @@ fun OverrideMemberChooserObject.generateMember( renderPrimaryConstructorParametersAsProperties = true } } + + if (MemberGenerateMode.OVERRIDE != mode && + project.getLanguageVersionSettings(targetClass?.module).explicitApiEnabled + ) { + if (!ExplicitApiDeclarationChecker.explicitVisibilityIsNotRequired(this@generateMember.descriptor)) renderDefaultVisibility = true + } } if (preferConstructorParameter && descriptor is PropertyDescriptor) { diff --git a/idea/testData/multiModuleQuickFix/createActualExplicitApi/class/header/header.kt b/idea/testData/multiModuleQuickFix/createActualExplicitApi/class/header/header.kt new file mode 100644 index 00000000000..8ab30f77213 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActualExplicitApi/class/header/header.kt @@ -0,0 +1,16 @@ +// "Create actual class for module testModule_JVM (JVM)" "true" +// COMPILER_ARGUMENTS: -Xexplicit-api=strict + +public expect class My { + public fun foo(param: String): Int + + public fun String.bar(y: Double): Boolean + + public fun baz(): Unit + + public constructor(flag: Boolean) + + public val isGood: Boolean + + public var status: Int +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createActualExplicitApi/class/header/header.kt.after b/idea/testData/multiModuleQuickFix/createActualExplicitApi/class/header/header.kt.after new file mode 100644 index 00000000000..9b9c58aa17e --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActualExplicitApi/class/header/header.kt.after @@ -0,0 +1,16 @@ +// "Create actual class for module testModule_JVM (JVM)" "true" +// COMPILER_ARGUMENTS: -Xexplicit-api=strict + +public expect class My { + public fun foo(param: String): Int + + public fun String.bar(y: Double): Boolean + + public fun baz(): Unit + + public constructor(flag: Boolean) + + public val isGood: Boolean + + public var status: Int +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createActualExplicitApi/class/jvm/My.kt b/idea/testData/multiModuleQuickFix/createActualExplicitApi/class/jvm/My.kt new file mode 100644 index 00000000000..b39e9e28a63 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActualExplicitApi/class/jvm/My.kt @@ -0,0 +1 @@ +// My: to be implemented \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createActualExplicitApi/class/jvm/My.kt.after b/idea/testData/multiModuleQuickFix/createActualExplicitApi/class/jvm/My.kt.after new file mode 100644 index 00000000000..2e58e4d97e5 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActualExplicitApi/class/jvm/My.kt.after @@ -0,0 +1,24 @@ +// My: to be implemented +public actual class My { + public actual fun foo(param: String): Int { + TODO("Not yet implemented") + } + + public actual fun String.bar(y: Double): Boolean { + TODO("Not yet implemented") + } + + public actual fun baz() { + } + + public actual constructor(flag: Boolean) { + TODO("Not yet implemented") + } + + public actual val isGood: Boolean + get() = TODO("Not yet implemented") + public actual var status: Int + get() = TODO("Not yet implemented") + set(value) {} + +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createActualExplicitApi/function/header/header.kt b/idea/testData/multiModuleQuickFix/createActualExplicitApi/function/header/header.kt new file mode 100644 index 00000000000..9c14a406343 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActualExplicitApi/function/header/header.kt @@ -0,0 +1,4 @@ +// "Create actual function for module testModule_JVM (JVM)" "true" +// COMPILER_ARGUMENTS: -Xexplicit-api=strict + +public expect fun foo(arg: Int): String \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createActualExplicitApi/function/header/header.kt.after b/idea/testData/multiModuleQuickFix/createActualExplicitApi/function/header/header.kt.after new file mode 100644 index 00000000000..594d508fcd2 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActualExplicitApi/function/header/header.kt.after @@ -0,0 +1,4 @@ +// "Create actual function for module testModule_JVM (JVM)" "true" +// COMPILER_ARGUMENTS: -Xexplicit-api=strict + +public expect fun foo(arg: Int): String \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createActualExplicitApi/function/jvm/foo.kt b/idea/testData/multiModuleQuickFix/createActualExplicitApi/function/jvm/foo.kt new file mode 100644 index 00000000000..611b3f4a6eb --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActualExplicitApi/function/jvm/foo.kt @@ -0,0 +1 @@ +// foo: to be implemented \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createActualExplicitApi/function/jvm/foo.kt.after b/idea/testData/multiModuleQuickFix/createActualExplicitApi/function/jvm/foo.kt.after new file mode 100644 index 00000000000..4d52f6b2e1c --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActualExplicitApi/function/jvm/foo.kt.after @@ -0,0 +1,4 @@ +// foo: to be implemented +public actual fun foo(arg: Int): String { + TODO("Not yet implemented") +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiModuleTest.kt b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiModuleTest.kt index 64abb375043..d8a69f9af5e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiModuleTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiModuleTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -14,10 +14,7 @@ import junit.framework.TestCase import org.jetbrains.kotlin.idea.inspections.findExistingEditor import org.jetbrains.kotlin.idea.multiplatform.setupMppProjectFromDirStructure import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest -import org.jetbrains.kotlin.idea.test.DirectiveBasedActionUtils -import org.jetbrains.kotlin.idea.test.PluginTestCaseBase -import org.jetbrains.kotlin.idea.test.allKotlinFiles -import org.jetbrains.kotlin.idea.test.findFileWithCaret +import org.jetbrains.kotlin.idea.test.* import org.jetbrains.kotlin.idea.util.application.executeCommand import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.InTextDirectivesUtils @@ -32,7 +29,10 @@ abstract class AbstractQuickFixMultiModuleTest : AbstractMultiModuleTest(), Quic fun doTest(dirPath: String) { setupMppProjectFromDirStructure(File(dirPath)) - doQuickFixTest(dirPath) + val directiveFileText = project.findFileWithCaret().text + withCustomCompilerOptions(directiveFileText, project, module) { + doQuickFixTest(dirPath) + } } private fun doQuickFixTest(dirPath: String) { diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java index 582e3c5e9a4..f24deac9960 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java @@ -517,6 +517,29 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul } } + @TestMetadata("idea/testData/multiModuleQuickFix/createActualExplicitApi") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class CreateActualExplicitApi extends AbstractQuickFixMultiModuleTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInCreateActualExplicitApi() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/multiModuleQuickFix/createActualExplicitApi"), Pattern.compile("^([^\\.]+)$"), null, true); + } + + @TestMetadata("class") + public void testClass() throws Exception { + runTest("idea/testData/multiModuleQuickFix/createActualExplicitApi/class/"); + } + + @TestMetadata("function") + public void testFunction() throws Exception { + runTest("idea/testData/multiModuleQuickFix/createActualExplicitApi/function/"); + } + } + @TestMetadata("idea/testData/multiModuleQuickFix/createExpect") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)