diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java index f64f01d1bb0..c1073781eed 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsTestGenerated.java @@ -2138,6 +2138,11 @@ public class FirDiagnosticsTestGenerated extends AbstractFirDiagnosticsTest { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/visibility"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @TestMetadata("exposedPropertyType.kt") + public void testExposedPropertyType() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedPropertyType.kt"); + } + @TestMetadata("exposedTypeAlias.kt") public void testExposedTypeAlias() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedTypeAlias.kt"); diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java index b256653d010..609ffe7d6b5 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithLightTreeTestGenerated.java @@ -2138,6 +2138,11 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/visibility"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @TestMetadata("exposedPropertyType.kt") + public void testExposedPropertyType() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedPropertyType.kt"); + } + @TestMetadata("exposedTypeAlias.kt") public void testExposedTypeAlias() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedTypeAlias.kt"); diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityChecker.kt index 83709dd0177..5ad7f9d316b 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityChecker.kt @@ -5,24 +5,20 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration -import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.diagnostics.DiagnosticFactory2 -import org.jetbrains.kotlin.diagnostics.DiagnosticFactory3 import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.onSource import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.resolve.toSymbol -import org.jetbrains.kotlin.fir.resolve.transformers.firClassLike -import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.coneTypeSafe object FirExposedVisibilityChecker : FirDeclarationChecker() { override fun check(declaration: FirMemberDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { - if (declaration is FirTypeAlias) { - checkTypeAlias(declaration, context, reporter) + when (declaration) { + is FirTypeAlias -> checkTypeAlias(declaration, context, reporter) + is FirProperty -> checkProperty(declaration, context, reporter) } } @@ -35,8 +31,18 @@ object FirExposedVisibilityChecker : FirDeclarationChecker } } + private fun checkProperty(declaration: FirProperty, context: CheckerContext, reporter: DiagnosticReporter) { + val propertyVisibility = declaration.effectiveVisibility + val restricting = + declaration.returnTypeRef.coneTypeSafe()?.leastPermissiveDescriptor(declaration.session, propertyVisibility) + if (restricting != null) { + reporter.reportExposure(Error.EXPOSED_PROPERTY_TYPE, declaration.source) + } + } + private enum class Error { - EXPOSED_TYPEALIAS_EXPANDED_TYPE + EXPOSED_TYPEALIAS_EXPANDED_TYPE, + EXPOSED_PROPERTY_TYPE, } private fun DiagnosticReporter.reportExposure( @@ -49,6 +55,11 @@ object FirExposedVisibilityChecker : FirDeclarationChecker report(Errors.FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE.onSource(it)) } } + Error.EXPOSED_PROPERTY_TYPE -> { + source?.let { + report(Errors.FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE.onSource(it)) + } + } } } } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 83356111ecf..19cd0e351b6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -137,6 +137,7 @@ public interface Errors { // (FIR) Exposed visibility group DiagnosticFactory0 FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE = DiagnosticFactory0.create(ERROR); + DiagnosticFactory0 FIR_EXPOSED_PROPERTY_TYPE = DiagnosticFactory0.create(ERROR); DiagnosticFactory2> INACCESSIBLE_TYPE = DiagnosticFactory2.create(WARNING); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 6a56949d5fb..bf75cf84994 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -83,6 +83,7 @@ public class DefaultErrorMessages { MAP.put(EXPOSED_TYPEALIAS_EXPANDED_TYPE, "''{0}'' typealias exposes ''{2}'' in expanded type{1}", TO_STRING, TO_STRING, TO_STRING); MAP.put(FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE, "FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE"); + MAP.put(FIR_EXPOSED_PROPERTY_TYPE, "FIR_EXPOSED_PROPERTY_TYPE"); MAP.put(EXTENSION_SHADOWED_BY_MEMBER, "Extension is shadowed by a member: {0}", COMPACT_WITH_MODIFIERS); MAP.put(EXTENSION_FUNCTION_SHADOWED_BY_INNER_CLASS_CONSTRUCTOR,