From 4e577caa99cc3fcfdbd9fcd4e0b41ce1e820a41b Mon Sep 17 00:00:00 2001 From: rapturemain Date: Sat, 21 Mar 2020 05:20:15 +0300 Subject: [PATCH] [FIR] Support for EXPOSED_FUNCTION_RETURN_TYPE --- .../visibility/exposedFunctionReturnType.kt | 9 ++++++++ .../visibility/exposedFunctionReturnType.txt | 23 +++++++++++++++++++ .../fir/FirDiagnosticsTestGenerated.java | 5 ++++ ...DiagnosticsWithLightTreeTestGenerated.java | 5 ++++ .../FirExposedVisibilityChecker.kt | 18 +++++++++++++++ .../jetbrains/kotlin/diagnostics/Errors.java | 1 + .../rendering/DefaultErrorMessages.java | 1 + 7 files changed, 62 insertions(+) create mode 100644 compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.kt create mode 100644 compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.txt diff --git a/compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.kt b/compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.kt new file mode 100644 index 00000000000..ef5ea826973 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.kt @@ -0,0 +1,9 @@ +class A { + private class InnerA { + + } +} + +abstract class B { + fun foo(str: String): A.InnerA +} \ No newline at end of file diff --git a/compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.txt b/compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.txt new file mode 100644 index 00000000000..d325ad69a6b --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/visibility/exposedFunctionReturnType.txt @@ -0,0 +1,23 @@ +FILE: exposedFunctionReturnType.kt + public final class A : R|kotlin/Any| { + public constructor(): R|A| { + super() + } + + private final class InnerA : R|kotlin/Any| { + public[private] constructor(): R|A.InnerA| { + super() + } + + } + + } + public abstract class B : R|kotlin/Any| { + public constructor(): R|B| { + super() + } + + public final fun foo(str: R|kotlin/String|): R|A.InnerA| + + } + 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 c1073781eed..0131591b4f3 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("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"); 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 609ffe7d6b5..108fa097784 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("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"); 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 de1b95bbac5..22ea2cb66d0 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 @@ -19,6 +19,7 @@ object FirExposedVisibilityChecker : FirDeclarationChecker 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 } } + private fun checkFunction(declaration: FirFunction<*>, context: CheckerContext, reporter: DiagnosticReporter) { + val functionVisibility = (declaration as FirMemberDeclaration).effectiveVisibility + if (declaration !is FirConstructor) { + val restricting = declaration.returnTypeRef.coneTypeSafe() + ?.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 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 report(Errors.FIR_EXPOSED_RECEIVER_TYPE.onSource(it)) } } + Error.EXPOSED_FUNCTION_RETURN_TYPE -> { + source?.let { + report(Errors.FIR_EXPOSED_FUNCTION_RETURN_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 ee822d6cfdc..aac56c6fefe 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -139,6 +139,7 @@ public interface Errors { DiagnosticFactory0 FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 FIR_EXPOSED_PROPERTY_TYPE = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 FIR_EXPOSED_RECEIVER_TYPE = DiagnosticFactory0.create(ERROR); + DiagnosticFactory0 FIR_EXPOSED_FUNCTION_RETURN_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 f9d9cd0d338..a172da18335 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -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,