Respect explicit api mode state when generating actual declarations

#KT-44067 Fixed
This commit is contained in:
Leonid Startsev
2021-04-28 01:48:11 +03:00
committed by Space
parent 8cd704b6db
commit 796d2fd210
11 changed files with 113 additions and 7 deletions
@@ -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) {
@@ -0,0 +1,16 @@
// "Create actual class for module testModule_JVM (JVM)" "true"
// COMPILER_ARGUMENTS: -Xexplicit-api=strict
public expect class <caret>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
}
@@ -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
}
@@ -0,0 +1 @@
// My: to be implemented
@@ -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) {}
}
@@ -0,0 +1,4 @@
// "Create actual function for module testModule_JVM (JVM)" "true"
// COMPILER_ARGUMENTS: -Xexplicit-api=strict
public expect fun <caret>foo(arg: Int): String
@@ -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
@@ -0,0 +1 @@
// foo: to be implemented
@@ -0,0 +1,4 @@
// foo: to be implemented
public actual fun foo(arg: Int): String {
TODO("Not yet implemented")
}
@@ -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) {
@@ -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)