[FIR] Support for EXPOSED_FUNCTION_RETURN_TYPE

This commit is contained in:
rapturemain
2020-03-21 05:20:15 +03:00
committed by Mikhail Glukhikh
parent 0f16c88dd2
commit 4e577caa99
7 changed files with 62 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
class A {
private class InnerA {
}
}
abstract class B {
<!FIR_EXPOSED_FUNCTION_RETURN_TYPE!>fun foo(str: String): A.InnerA<!>
}

View 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|
}

View File

@@ -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");

View File

@@ -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");

View File

@@ -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))
}
}
}
}
}

View File

@@ -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);

View File

@@ -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,