mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-04-07 15:52:02 +00:00
[FIR] Support for EXPOSED_FUNCTION_RETURN_TYPE
This commit is contained in:
committed by
Mikhail Glukhikh
parent
0f16c88dd2
commit
4e577caa99
9
compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.kt
vendored
Normal file
9
compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.kt
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
class A {
|
||||
private class InnerA {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
abstract class B {
|
||||
<!FIR_EXPOSED_FUNCTION_RETURN_TYPE!>fun foo(str: String): A.InnerA<!>
|
||||
}
|
||||
23
compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.txt
vendored
Normal file
23
compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.txt
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
FILE: exposedFunctionReturnType.kt
|
||||
public final class A : R|kotlin/Any| {
|
||||
public constructor(): R|A| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
private final class InnerA : R|kotlin/Any| {
|
||||
public[private] constructor(): R|A.InnerA| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
public abstract class B : R|kotlin/Any| {
|
||||
public constructor(): R|B| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
public final fun foo(str: R|kotlin/String|): R|A.InnerA|
|
||||
|
||||
}
|
||||
|
||||
@@ -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("exposedFunctionReturnType.kt")
|
||||
public void testExposedFunctionReturnType() throws Exception {
|
||||
runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("exposedPropertyType.kt")
|
||||
public void testExposedPropertyType() throws Exception {
|
||||
runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedPropertyType.kt");
|
||||
|
||||
@@ -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("exposedFunctionReturnType.kt")
|
||||
public void testExposedFunctionReturnType() throws Exception {
|
||||
runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("exposedPropertyType.kt")
|
||||
public void testExposedPropertyType() throws Exception {
|
||||
runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedPropertyType.kt");
|
||||
|
||||
@@ -19,6 +19,7 @@ object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>
|
||||
when (declaration) {
|
||||
is FirTypeAlias -> checkTypeAlias(declaration, context, reporter)
|
||||
is FirProperty -> checkProperty(declaration, context, reporter)
|
||||
is FirFunction<*> -> checkFunction(declaration, context, reporter)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +32,17 @@ object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkFunction(declaration: FirFunction<*>, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
val functionVisibility = (declaration as FirMemberDeclaration).effectiveVisibility
|
||||
if (declaration !is FirConstructor) {
|
||||
val restricting = declaration.returnTypeRef.coneTypeSafe<ConeClassLikeType>()
|
||||
?.leastPermissiveDescriptor(declaration.session, functionVisibility)
|
||||
if (restricting != null) {
|
||||
reporter.reportExposure(Error.EXPOSED_FUNCTION_RETURN_TYPE, declaration.source)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkProperty(declaration: FirProperty, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
val propertyVisibility = declaration.effectiveVisibility
|
||||
val restricting =
|
||||
@@ -58,6 +70,7 @@ object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>
|
||||
EXPOSED_TYPEALIAS_EXPANDED_TYPE,
|
||||
EXPOSED_PROPERTY_TYPE,
|
||||
EXPOSED_RECEIVER_TYPE,
|
||||
EXPOSED_FUNCTION_RETURN_TYPE
|
||||
}
|
||||
|
||||
private fun DiagnosticReporter.reportExposure(
|
||||
@@ -80,6 +93,11 @@ object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>
|
||||
report(Errors.FIR_EXPOSED_RECEIVER_TYPE.onSource(it))
|
||||
}
|
||||
}
|
||||
Error.EXPOSED_FUNCTION_RETURN_TYPE -> {
|
||||
source?.let {
|
||||
report(Errors.FIR_EXPOSED_FUNCTION_RETURN_TYPE.onSource(it))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -139,6 +139,7 @@ public interface Errors {
|
||||
DiagnosticFactory0<PsiElement> FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<PsiElement> FIR_EXPOSED_PROPERTY_TYPE = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<KtTypeParameter> FIR_EXPOSED_RECEIVER_TYPE = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<PsiElement> FIR_EXPOSED_FUNCTION_RETURN_TYPE = DiagnosticFactory0.create(ERROR);
|
||||
|
||||
DiagnosticFactory2<KtExpression, KotlinType, Collection<ClassDescriptor>> INACCESSIBLE_TYPE = DiagnosticFactory2.create(WARNING);
|
||||
|
||||
|
||||
@@ -85,6 +85,7 @@ public class DefaultErrorMessages {
|
||||
MAP.put(FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE, "FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE");
|
||||
MAP.put(FIR_EXPOSED_PROPERTY_TYPE, "FIR_EXPOSED_PROPERTY_TYPE");
|
||||
MAP.put(FIR_EXPOSED_RECEIVER_TYPE, "FIR_EXPOSED_RECEIVER_TYPE");
|
||||
MAP.put(FIR_EXPOSED_FUNCTION_RETURN_TYPE, "FIR_EXPOSED_FUNCTION_RETURN_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,
|
||||
|
||||
Reference in New Issue
Block a user