[FIR] Fix false positive errors for members with explicit API mode, ^KT-51758 Fixed

This commit is contained in:
Ivan Kochurkin
2022-03-30 18:50:05 +03:00
committed by teamcity
parent 1eefca4259
commit fc77d0d26b
6 changed files with 56 additions and 8 deletions
@@ -30994,6 +30994,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
runTest("compiler/testData/diagnostics/tests/testsWithExplicitApi/mustBeEffectivelyPublic.kt");
}
@Test
@TestMetadata("noErrorsForMemebersInsideInternalDeclaration.kt")
public void testNoErrorsForMemebersInsideInternalDeclaration() throws Exception {
runTest("compiler/testData/diagnostics/tests/testsWithExplicitApi/noErrorsForMemebersInsideInternalDeclaration.kt");
}
@Test
@TestMetadata("properties.kt")
public void testProperties() throws Exception {
@@ -30994,6 +30994,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
runTest("compiler/testData/diagnostics/tests/testsWithExplicitApi/mustBeEffectivelyPublic.kt");
}
@Test
@TestMetadata("noErrorsForMemebersInsideInternalDeclaration.kt")
public void testNoErrorsForMemebersInsideInternalDeclaration() throws Exception {
runTest("compiler/testData/diagnostics/tests/testsWithExplicitApi/noErrorsForMemebersInsideInternalDeclaration.kt");
}
@Test
@TestMetadata("properties.kt")
public void testProperties() throws Exception {
@@ -30994,6 +30994,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
runTest("compiler/testData/diagnostics/tests/testsWithExplicitApi/mustBeEffectivelyPublic.kt");
}
@Test
@TestMetadata("noErrorsForMemebersInsideInternalDeclaration.kt")
public void testNoErrorsForMemebersInsideInternalDeclaration() throws Exception {
runTest("compiler/testData/diagnostics/tests/testsWithExplicitApi/noErrorsForMemebersInsideInternalDeclaration.kt");
}
@Test
@TestMetadata("properties.kt")
public void testProperties() throws Exception {
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor
import org.jetbrains.kotlin.fir.declarations.utils.effectiveVisibility
import org.jetbrains.kotlin.fir.declarations.utils.isData
import org.jetbrains.kotlin.fir.declarations.utils.isOverride
import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.resolve.transformers.publishedApiEffectiveVisibility
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.KtDeclaration
@@ -47,6 +48,10 @@ object FirExplicitApiDeclarationChecker : FirDeclarationSyntaxChecker<FirDeclara
// Enum entries do not have visibilities
if (element is FirEnumEntry) return
if (!element.effectiveVisibility.publicApi && element.publishedApiEffectiveVisibility == null) return
val lastDeclaration = context.containingDeclarations.lastOrNull()
if ((lastDeclaration as? FirMemberDeclaration)?.effectiveVisibility?.publicApi == false) {
return
}
checkVisibilityModifier(state, element, source, context, reporter)
checkExplicitReturnType(state, element, source, context, reporter)
@@ -85,14 +90,10 @@ object FirExplicitApiDeclarationChecker : FirDeclarationSyntaxChecker<FirDeclara
*/
private fun explicitVisibilityIsNotRequired(declaration: FirMemberDeclaration, context: CheckerContext): Boolean {
return when (declaration) {
// 1,
is FirPrimaryConstructor,
// 4
is FirPropertyAccessor,
// 6
is FirValueParameter,
// 7
is FirAnonymousFunction -> true
is FirPrimaryConstructor, // 1,
is FirPropertyAccessor, // 4
is FirValueParameter, // 6
is FirAnonymousFunction -> true // 7
is FirCallableDeclaration -> {
val containingClass = context.containingDeclarations.lastOrNull() as? FirRegularClass
// 2, 5
@@ -0,0 +1,23 @@
// FIR_IDENTICAL
// SKIP_TXT
// ISSUE: KT-51758
@PublishedApi
internal class SomeClass {
private val somethingPrivate = "123"
public val somethingPublic = "456"
fun foo() = "789"
}
@PublishedApi
internal class Outer {
class Inner {
private val somethingPrivate = "123"
public val somethingPublic = "456"
fun foo() = "789"
}
}
@@ -31084,6 +31084,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/testsWithExplicitApi/mustBeEffectivelyPublic.kt");
}
@Test
@TestMetadata("noErrorsForMemebersInsideInternalDeclaration.kt")
public void testNoErrorsForMemebersInsideInternalDeclaration() throws Exception {
runTest("compiler/testData/diagnostics/tests/testsWithExplicitApi/noErrorsForMemebersInsideInternalDeclaration.kt");
}
@Test
@TestMetadata("properties.kt")
public void testProperties() throws Exception {