[FIR] Support for EXPOSED_PROPERTY_TYPE
This commit is contained in:
committed by
Mikhail Glukhikh
parent
cc86767a23
commit
02c90c6576
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("exposedPropertyType.kt")
|
||||||
|
public void testExposedPropertyType() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedPropertyType.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("exposedTypeAlias.kt")
|
@TestMetadata("exposedTypeAlias.kt")
|
||||||
public void testExposedTypeAlias() throws Exception {
|
public void testExposedTypeAlias() throws Exception {
|
||||||
runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedTypeAlias.kt");
|
runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedTypeAlias.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("exposedPropertyType.kt")
|
||||||
|
public void testExposedPropertyType() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedPropertyType.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("exposedTypeAlias.kt")
|
@TestMetadata("exposedTypeAlias.kt")
|
||||||
public void testExposedTypeAlias() throws Exception {
|
public void testExposedTypeAlias() throws Exception {
|
||||||
runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedTypeAlias.kt");
|
runTest("compiler/fir/analysis-tests/testData/resolve/visibility/exposedTypeAlias.kt");
|
||||||
|
|||||||
+20
-9
@@ -5,24 +5,20 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory2
|
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory3
|
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||||
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.resolve.toSymbol
|
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.firClassLike
|
|
||||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
|
||||||
import org.jetbrains.kotlin.fir.types.coneTypeSafe
|
import org.jetbrains.kotlin.fir.types.coneTypeSafe
|
||||||
|
|
||||||
object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>() {
|
object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>() {
|
||||||
override fun check(declaration: FirMemberDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
|
override fun check(declaration: FirMemberDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
if (declaration is FirTypeAlias) {
|
when (declaration) {
|
||||||
checkTypeAlias(declaration, context, reporter)
|
is FirTypeAlias -> checkTypeAlias(declaration, context, reporter)
|
||||||
|
is FirProperty -> checkProperty(declaration, context, reporter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,8 +31,18 @@ object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun checkProperty(declaration: FirProperty, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
|
val propertyVisibility = declaration.effectiveVisibility
|
||||||
|
val restricting =
|
||||||
|
declaration.returnTypeRef.coneTypeSafe<ConeClassLikeType>()?.leastPermissiveDescriptor(declaration.session, propertyVisibility)
|
||||||
|
if (restricting != null) {
|
||||||
|
reporter.reportExposure(Error.EXPOSED_PROPERTY_TYPE, declaration.source)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private enum class Error {
|
private enum class Error {
|
||||||
EXPOSED_TYPEALIAS_EXPANDED_TYPE
|
EXPOSED_TYPEALIAS_EXPANDED_TYPE,
|
||||||
|
EXPOSED_PROPERTY_TYPE,
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun DiagnosticReporter.reportExposure(
|
private fun DiagnosticReporter.reportExposure(
|
||||||
@@ -49,6 +55,11 @@ object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>
|
|||||||
report(Errors.FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE.onSource(it))
|
report(Errors.FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE.onSource(it))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Error.EXPOSED_PROPERTY_TYPE -> {
|
||||||
|
source?.let {
|
||||||
|
report(Errors.FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE.onSource(it))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -137,6 +137,7 @@ public interface Errors {
|
|||||||
|
|
||||||
// (FIR) Exposed visibility group
|
// (FIR) Exposed visibility group
|
||||||
DiagnosticFactory0<PsiElement> FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE = DiagnosticFactory0.create(ERROR);
|
DiagnosticFactory0<PsiElement> FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE = DiagnosticFactory0.create(ERROR);
|
||||||
|
DiagnosticFactory0<PsiElement> FIR_EXPOSED_PROPERTY_TYPE = DiagnosticFactory0.create(ERROR);
|
||||||
|
|
||||||
DiagnosticFactory2<KtExpression, KotlinType, Collection<ClassDescriptor>> INACCESSIBLE_TYPE = DiagnosticFactory2.create(WARNING);
|
DiagnosticFactory2<KtExpression, KotlinType, Collection<ClassDescriptor>> INACCESSIBLE_TYPE = DiagnosticFactory2.create(WARNING);
|
||||||
|
|
||||||
|
|||||||
+1
@@ -83,6 +83,7 @@ public class DefaultErrorMessages {
|
|||||||
MAP.put(EXPOSED_TYPEALIAS_EXPANDED_TYPE, "''{0}'' typealias exposes ''{2}'' in expanded type{1}", TO_STRING, TO_STRING, TO_STRING);
|
MAP.put(EXPOSED_TYPEALIAS_EXPANDED_TYPE, "''{0}'' typealias exposes ''{2}'' in expanded type{1}", TO_STRING, TO_STRING, TO_STRING);
|
||||||
|
|
||||||
MAP.put(FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE, "FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE");
|
MAP.put(FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE, "FIR_EXPOSED_TYPEALIAS_EXPANDED_TYPE");
|
||||||
|
MAP.put(FIR_EXPOSED_PROPERTY_TYPE, "FIR_EXPOSED_PROPERTY_TYPE");
|
||||||
|
|
||||||
MAP.put(EXTENSION_SHADOWED_BY_MEMBER, "Extension is shadowed by a member: {0}", COMPACT_WITH_MODIFIERS);
|
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,
|
MAP.put(EXTENSION_FUNCTION_SHADOWED_BY_INNER_CLASS_CONSTRUCTOR,
|
||||||
|
|||||||
Reference in New Issue
Block a user