diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityDeclarationChecker.kt index 1724c3728d1..b968ff4e019 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExposedVisibilityDeclarationChecker.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.correspondingProperty import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.effectiveVisibility import org.jetbrains.kotlin.fir.declarations.utils.expandedConeType @@ -112,65 +113,83 @@ object FirExposedVisibilityDeclarationChecker : FirBasicDeclarationChecker() { functionVisibility = EffectiveVisibility.PrivateInClass } - if (functionVisibility == EffectiveVisibility.Local) return - if (declaration !is FirConstructor && declaration !is FirPropertyAccessor) { - declaration.returnTypeRef.coneType - .findVisibilityExposure(context, functionVisibility)?.let { (restricting, restrictingVisibility) -> - reporter.reportOn( - declaration.source, - FirErrors.EXPOSED_FUNCTION_RETURN_TYPE, - functionVisibility, - restricting, - restrictingVisibility, - context - ) - } - } + val isNonLocal = functionVisibility != EffectiveVisibility.Local + if (declaration !is FirPropertyAccessor) { - declaration.valueParameters.forEachIndexed { i, valueParameter -> - if (i < declaration.valueParameters.size) { - val (restricting, restrictingVisibility) = valueParameter.returnTypeRef.coneType - .findVisibilityExposure(context, functionVisibility) ?: return@forEachIndexed - reporter.reportOn( - valueParameter.source, - FirErrors.EXPOSED_PARAMETER_TYPE, - functionVisibility, - restricting, - restrictingVisibility, - context - ) + if (isNonLocal && declaration !is FirConstructor) { + declaration.returnTypeRef.coneType + .findVisibilityExposure(context, functionVisibility)?.let { (restricting, restrictingVisibility) -> + reporter.reportOn( + declaration.source, + FirErrors.EXPOSED_FUNCTION_RETURN_TYPE, + functionVisibility, + restricting, + restrictingVisibility, + context + ) + } + } + + for (valueParameter in declaration.valueParameters) { + var exposureFound = false + + if (isNonLocal) { + valueParameter.returnTypeRef.coneType + .findVisibilityExposure(context, functionVisibility)?.let { (restricting, restrictingVisibility) -> + reporter.reportOn( + valueParameter.source, + FirErrors.EXPOSED_PARAMETER_TYPE, + functionVisibility, + restricting, + restrictingVisibility, + context + ) + exposureFound = true + } } + + if (exposureFound) continue + + val property = valueParameter.correspondingProperty ?: continue + if (property.isLocal) continue + val propertyVisibility = property.effectiveVisibility + + if (propertyVisibility == EffectiveVisibility.Local) continue + property.returnTypeRef.coneType + .findVisibilityExposure(context, propertyVisibility)?.let { (restricting, restrictingVisibility) -> + reporter.reportOn( + valueParameter.source, + FirErrors.EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR, + propertyVisibility, + restricting, + restrictingVisibility, + context + ) + } } } - checkMemberReceiver(declaration.receiverParameter?.typeRef, declaration as? FirCallableDeclaration, reporter, context) + + if (isNonLocal) { + checkMemberReceiver(declaration.receiverParameter?.typeRef, declaration as? FirCallableDeclaration, reporter, context) + } } private fun checkProperty(declaration: FirProperty, reporter: DiagnosticReporter, context: CheckerContext) { + if (declaration.fromPrimaryConstructor == true) return if (declaration.isLocal) return val propertyVisibility = declaration.effectiveVisibility if (propertyVisibility == EffectiveVisibility.Local) return declaration.returnTypeRef.coneType .findVisibilityExposure(context, propertyVisibility)?.let { (restricting, restrictingVisibility) -> - if (declaration.fromPrimaryConstructor == true) { - reporter.reportOn( - declaration.source, - FirErrors.EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR, - propertyVisibility, - restricting, - restrictingVisibility, - context - ) - } else { - reporter.reportOn( - declaration.source, - FirErrors.EXPOSED_PROPERTY_TYPE, - propertyVisibility, - restricting, - restrictingVisibility, - context - ) - } + reporter.reportOn( + declaration.source, + FirErrors.EXPOSED_PROPERTY_TYPE, + propertyVisibility, + restricting, + restrictingVisibility, + context + ) } checkMemberReceiver(declaration.receiverParameter?.typeRef, declaration, reporter, context) } diff --git a/compiler/testData/diagnostics/tests/exposed/propertyInSimpleConstructor.fir.kt b/compiler/testData/diagnostics/tests/exposed/propertyInSimpleConstructor.fir.kt deleted file mode 100644 index 0be75d21778..00000000000 --- a/compiler/testData/diagnostics/tests/exposed/propertyInSimpleConstructor.fir.kt +++ /dev/null @@ -1,3 +0,0 @@ -private enum class Foo { A, B } - -class Bar(val foo: Foo) diff --git a/compiler/testData/diagnostics/tests/exposed/propertyInSimpleConstructor.kt b/compiler/testData/diagnostics/tests/exposed/propertyInSimpleConstructor.kt index 21371c56dd6..bb94341d505 100644 --- a/compiler/testData/diagnostics/tests/exposed/propertyInSimpleConstructor.kt +++ b/compiler/testData/diagnostics/tests/exposed/propertyInSimpleConstructor.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL private enum class Foo { A, B } class Bar(val foo: Foo) \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/exposed/simple.fir.kt b/compiler/testData/diagnostics/tests/exposed/simple.fir.kt index b02eb73cb09..aacc30d5738 100644 --- a/compiler/testData/diagnostics/tests/exposed/simple.fir.kt +++ b/compiler/testData/diagnostics/tests/exposed/simple.fir.kt @@ -6,7 +6,7 @@ public interface Your: My { fun foo(): T } -public class DerivedMy>(val x: My): Base() { +public class DerivedMy>(val x: My): Base() { constructor(xx: My?, x: My): this(xx ?: x) diff --git a/compiler/testData/diagnostics/tests/sealed/privateTypeInConstructor.fir.kt b/compiler/testData/diagnostics/tests/sealed/privateTypeInConstructor.fir.kt deleted file mode 100644 index 66a16aa2a3e..00000000000 --- a/compiler/testData/diagnostics/tests/sealed/privateTypeInConstructor.fir.kt +++ /dev/null @@ -1,24 +0,0 @@ -// ISSUE: KT-45043, KT-51229 -// DIAGNOSTICS: -UNUSED_PARAMETER - -private class Bar - -sealed class SealedFoo( - val x: Bar, - private val y: Bar, - z: Bar -) - -abstract class AbstractFoo( - val x: Bar, - private val y: Bar, - z: Bar -) - -internal sealed class A { - protected abstract val b: B? - protected data class B(val s: String) - internal data class C private constructor(override val b: B?) : A() { - constructor() : this(null) - } -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/sealed/privateTypeInConstructor.kt b/compiler/testData/diagnostics/tests/sealed/privateTypeInConstructor.kt index dc88fec1999..3ae9f922c09 100644 --- a/compiler/testData/diagnostics/tests/sealed/privateTypeInConstructor.kt +++ b/compiler/testData/diagnostics/tests/sealed/privateTypeInConstructor.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ISSUE: KT-45043, KT-51229 // DIAGNOSTICS: -UNUSED_PARAMETER diff --git a/compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInConstructor.fir.kt b/compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInConstructor.fir.kt deleted file mode 100644 index d6f71be854f..00000000000 --- a/compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInConstructor.fir.kt +++ /dev/null @@ -1,18 +0,0 @@ -// ISSUE: KT-57458 - -private enum class Foo { A, B } - -class Bar constructor( - @Suppress("EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR_ERROR") - val foo: Foo, -) - -class Var constructor( - @property:Suppress("EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR_ERROR") - val foo: Foo, -) - -class Zar constructor( - @param:Suppress("EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR_ERROR") - val foo: Foo, -) diff --git a/compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInConstructor.kt b/compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInConstructor.kt index 8781065ac09..e96703e159c 100644 --- a/compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInConstructor.kt +++ b/compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInConstructor.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ISSUE: KT-57458 private enum class Foo { A, B } diff --git a/compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.fir.kt b/compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.fir.kt deleted file mode 100644 index b9f32ed4b0b..00000000000 --- a/compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.fir.kt +++ /dev/null @@ -1,18 +0,0 @@ -// ISSUE: KT-57458 - -private enum class Foo { A, B } - -class Bar private constructor( - @Suppress("EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR_ERROR") - val foo: Foo, -) - -class Var private constructor( - @property:Suppress("EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR_ERROR") - val foo: Foo, -) - -class Zar private constructor( - @param:Suppress("EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR_ERROR") - val foo: Foo, -) diff --git a/compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt b/compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt index 716b7dc8483..35e0b86da51 100644 --- a/compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt +++ b/compiler/testData/diagnostics/tests/suppressExposedPropertyTypeInPrivateConstructor.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ISSUE: KT-57458 private enum class Foo { A, B }