[FIR] Support for EXPOSED_PARAMETER_TYPE
This commit is contained in:
committed by
Mikhail Glukhikh
parent
216eea6a20
commit
d811f6f4a6
+9
@@ -0,0 +1,9 @@
|
|||||||
|
class A {
|
||||||
|
private class AInner
|
||||||
|
}
|
||||||
|
|
||||||
|
class B {
|
||||||
|
fun foo(<!EXPOSED_PARAMETER_TYPE!>value: A.AInner<!>) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
FILE: exposedFunctionParameterType.kt
|
||||||
|
public final class A : R|kotlin/Any| {
|
||||||
|
public constructor(): R|A| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
private final class AInner : R|kotlin/Any| {
|
||||||
|
public[private] constructor(): R|A.AInner| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public final class B : R|kotlin/Any| {
|
||||||
|
public constructor(): R|B| {
|
||||||
|
super<R|kotlin/Any|>()
|
||||||
|
}
|
||||||
|
|
||||||
|
public final fun foo(value: R|A.AInner|): R|kotlin/Unit| {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Generated
+5
@@ -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);
|
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/visibility"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("exposedFunctionParameterType.kt")
|
||||||
|
public void testExposedFunctionParameterType() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionParameterType.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("exposedFunctionReturnType.kt")
|
@TestMetadata("exposedFunctionReturnType.kt")
|
||||||
public void testExposedFunctionReturnType() throws Exception {
|
public void testExposedFunctionReturnType() throws Exception {
|
||||||
runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.kt");
|
runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.kt");
|
||||||
|
|||||||
+5
@@ -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);
|
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/visibility"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("exposedFunctionParameterType.kt")
|
||||||
|
public void testExposedFunctionParameterType() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionParameterType.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("exposedFunctionReturnType.kt")
|
@TestMetadata("exposedFunctionReturnType.kt")
|
||||||
public void testExposedFunctionReturnType() throws Exception {
|
public void testExposedFunctionReturnType() throws Exception {
|
||||||
runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.kt");
|
runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.kt");
|
||||||
|
|||||||
+23
-5
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
|||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.onSource
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.onSource
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||||
|
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||||
import org.jetbrains.kotlin.fir.types.coneTypeSafe
|
import org.jetbrains.kotlin.fir.types.coneTypeSafe
|
||||||
|
|
||||||
@@ -44,7 +45,7 @@ object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>
|
|||||||
private fun checkFunction(declaration: FirFunction<*>, context: CheckerContext, reporter: DiagnosticReporter) {
|
private fun checkFunction(declaration: FirFunction<*>, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
val functionVisibility = (declaration as FirMemberDeclaration).firEffectiveVisibility(declaration.session)
|
val functionVisibility = (declaration as FirMemberDeclaration).firEffectiveVisibility(declaration.session)
|
||||||
if (declaration !is FirConstructor) {
|
if (declaration !is FirConstructor) {
|
||||||
val restricting = declaration.returnTypeRef.coneTypeSafe<ConeClassLikeType>()
|
val restricting = declaration.returnTypeRef.coneTypeSafe<ConeKotlinType>()
|
||||||
?.leastPermissiveDescriptor(declaration.session, functionVisibility)
|
?.leastPermissiveDescriptor(declaration.session, functionVisibility)
|
||||||
if (restricting != null) {
|
if (restricting != null) {
|
||||||
reporter.reportExposure(
|
reporter.reportExposure(
|
||||||
@@ -56,12 +57,29 @@ object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
declaration.valueParameters.forEachIndexed { i, valueParameter ->
|
||||||
|
if (i < declaration.valueParameters.size) {
|
||||||
|
val restricting =
|
||||||
|
valueParameter.returnTypeRef.coneTypeSafe<ConeKotlinType>()
|
||||||
|
?.leastPermissiveDescriptor(declaration.session, functionVisibility)
|
||||||
|
if (restricting != null) {
|
||||||
|
reporter.reportExposure(
|
||||||
|
FirErrors.EXPOSED_PARAMETER_TYPE,
|
||||||
|
restricting,
|
||||||
|
functionVisibility,
|
||||||
|
restricting.firEffectiveVisibility(declaration.session),
|
||||||
|
valueParameter.source
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
checkMemberReceiver(declaration.receiverTypeRef, declaration as? FirCallableMemberDeclaration<*>, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkProperty(declaration: FirProperty, context: CheckerContext, reporter: DiagnosticReporter) {
|
private fun checkProperty(declaration: FirProperty, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
val propertyVisibility = declaration.firEffectiveVisibility(declaration.session)
|
val propertyVisibility = declaration.firEffectiveVisibility(declaration.session)
|
||||||
val restricting =
|
val restricting =
|
||||||
declaration.returnTypeRef.coneTypeSafe<ConeClassLikeType>()?.leastPermissiveDescriptor(declaration.session, propertyVisibility)
|
declaration.returnTypeRef.coneTypeSafe<ConeKotlinType>()?.leastPermissiveDescriptor(declaration.session, propertyVisibility)
|
||||||
if (restricting != null) {
|
if (restricting != null) {
|
||||||
reporter.reportExposure(
|
reporter.reportExposure(
|
||||||
FirErrors.EXPOSED_PROPERTY_TYPE,
|
FirErrors.EXPOSED_PROPERTY_TYPE,
|
||||||
@@ -76,10 +94,10 @@ object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>
|
|||||||
|
|
||||||
private fun checkMemberReceiver(
|
private fun checkMemberReceiver(
|
||||||
typeRef: FirTypeRef?,
|
typeRef: FirTypeRef?,
|
||||||
memberDeclaration: FirCallableMemberDeclaration<*>, reporter: DiagnosticReporter
|
memberDeclaration: FirCallableMemberDeclaration<*>?, reporter: DiagnosticReporter
|
||||||
) {
|
) {
|
||||||
if (typeRef == null) return
|
if (typeRef == null || memberDeclaration == null) return
|
||||||
val receiverParameterType = typeRef.coneTypeSafe<ConeClassLikeType>()
|
val receiverParameterType = typeRef.coneTypeSafe<ConeKotlinType>()
|
||||||
val memberVisibility = memberDeclaration.firEffectiveVisibility(memberDeclaration.session)
|
val memberVisibility = memberDeclaration.firEffectiveVisibility(memberDeclaration.session)
|
||||||
val restricting = receiverParameterType?.leastPermissiveDescriptor(memberDeclaration.session, memberVisibility)
|
val restricting = receiverParameterType?.leastPermissiveDescriptor(memberDeclaration.session, memberVisibility)
|
||||||
if (restricting != null) {
|
if (restricting != null) {
|
||||||
|
|||||||
+2
-2
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPOSED_TYPEALIAS
|
|||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPOSED_FUNCTION_RETURN_TYPE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPOSED_FUNCTION_RETURN_TYPE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPOSED_PROPERTY_TYPE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPOSED_PROPERTY_TYPE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPOSED_RECEIVER_TYPE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPOSED_RECEIVER_TYPE
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXPOSED_PARAMETER_TYPE
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
class FirDefaultErrorMessages : DefaultErrorMessages.Extension {
|
class FirDefaultErrorMessages : DefaultErrorMessages.Extension {
|
||||||
@@ -42,7 +43,6 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension {
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
<<<<<<< HEAD:compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt
|
|
||||||
val MAP = FirDiagnosticFactoryToRendererMap("FIR").also { map ->
|
val MAP = FirDiagnosticFactoryToRendererMap("FIR").also { map ->
|
||||||
map.put(UNRESOLVED_REFERENCE, "Unresolved reference: {0}", NULLABLE_STRING)
|
map.put(UNRESOLVED_REFERENCE, "Unresolved reference: {0}", NULLABLE_STRING)
|
||||||
map.put(INAPPLICABLE_CANDIDATE, "Inapplicable candidate(s): {0}", SYMBOLS)
|
map.put(INAPPLICABLE_CANDIDATE, "Inapplicable candidate(s): {0}", SYMBOLS)
|
||||||
@@ -70,6 +70,6 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension {
|
|||||||
map.put(EXPOSED_PROPERTY_TYPE, "{0} property exposes its {2} type{1}", TO_STRING, TO_STRING, TO_STRING)
|
map.put(EXPOSED_PROPERTY_TYPE, "{0} property exposes its {2} type{1}", TO_STRING, TO_STRING, TO_STRING)
|
||||||
map.put(EXPOSED_FUNCTION_RETURN_TYPE, "{0} function exposes its {2} return type{1}", TO_STRING, TO_STRING, TO_STRING)
|
map.put(EXPOSED_FUNCTION_RETURN_TYPE, "{0} function exposes its {2} return type{1}", TO_STRING, TO_STRING, TO_STRING)
|
||||||
map.put(EXPOSED_RECEIVER_TYPE, "{0} member exposes its {2} receiver type{1}", TO_STRING, TO_STRING, TO_STRING)
|
map.put(EXPOSED_RECEIVER_TYPE, "{0} member exposes its {2} receiver type{1}", TO_STRING, TO_STRING, TO_STRING)
|
||||||
}
|
map.put(EXPOSED_PARAMETER_TYPE, "{0} function exposes its {2} parameter type{1}", TO_STRING, TO_STRING, TO_STRING)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-3
@@ -12,11 +12,8 @@ import org.jetbrains.kotlin.fir.FirEffectiveVisibility
|
|||||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||||
<<<<<<< HEAD
|
|
||||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||||
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
||||||
=======
|
|
||||||
>>>>>>> d43c780e5de... [FIR] Fixed EXPOSED_RECEIVER_TYPE
|
|
||||||
|
|
||||||
object FirErrors {
|
object FirErrors {
|
||||||
val UNRESOLVED_REFERENCE by error1<FirSourceElement, PsiElement, String?>()
|
val UNRESOLVED_REFERENCE by error1<FirSourceElement, PsiElement, String?>()
|
||||||
@@ -64,3 +61,4 @@ object FirErrors {
|
|||||||
val INCOMPATIBLE_MODIFIERS by error2<FirSourceElement, PsiElement, KtModifierKeywordToken, KtModifierKeywordToken>()
|
val INCOMPATIBLE_MODIFIERS by error2<FirSourceElement, PsiElement, KtModifierKeywordToken, KtModifierKeywordToken>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user