[FIR] Implement CANNOT_BE_IMPORTED diagnostic
This commit is contained in:
+6
@@ -945,6 +945,12 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
|
|||||||
val CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON by error<KtSimpleNameExpression>(PositioningStrategy.IMPORT_LAST_NAME) {
|
val CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON by error<KtSimpleNameExpression>(PositioningStrategy.IMPORT_LAST_NAME) {
|
||||||
parameter<Name>("objectName")
|
parameter<Name>("objectName")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val PACKAGE_CANNOT_BE_IMPORTED by error<KtSimpleNameExpression>(PositioningStrategy.IMPORT_LAST_NAME)
|
||||||
|
|
||||||
|
val CANNOT_BE_IMPORTED by error<KtSimpleNameExpression>(PositioningStrategy.IMPORT_LAST_NAME) {
|
||||||
|
parameter<Name>("name")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -520,5 +520,7 @@ object FirErrors {
|
|||||||
|
|
||||||
// Imports
|
// Imports
|
||||||
val CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON by error1<KtSimpleNameExpression, Name>(SourceElementPositioningStrategies.IMPORT_LAST_NAME)
|
val CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON by error1<KtSimpleNameExpression, Name>(SourceElementPositioningStrategies.IMPORT_LAST_NAME)
|
||||||
|
val PACKAGE_CANNOT_BE_IMPORTED by error0<KtSimpleNameExpression>(SourceElementPositioningStrategies.IMPORT_LAST_NAME)
|
||||||
|
val CANNOT_BE_IMPORTED by error1<KtSimpleNameExpression, Name>(SourceElementPositioningStrategies.IMPORT_LAST_NAME)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+34
-1
@@ -16,9 +16,13 @@ import org.jetbrains.kotlin.name.ClassId
|
|||||||
object FirImportsChecker : FirFileChecker() {
|
object FirImportsChecker : FirFileChecker() {
|
||||||
override fun check(declaration: FirFile, context: CheckerContext, reporter: DiagnosticReporter) {
|
override fun check(declaration: FirFile, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
declaration.imports.forEach { import ->
|
declaration.imports.forEach { import ->
|
||||||
if (import.isAllUnder && import !is FirResolvedImport && import !is FirErrorImport) {
|
if (import is FirErrorImport) return@forEach
|
||||||
|
if (import.isAllUnder && import !is FirResolvedImport) {
|
||||||
checkAllUnderFromEnumEntry(import, context, reporter)
|
checkAllUnderFromEnumEntry(import, context, reporter)
|
||||||
}
|
}
|
||||||
|
if (!import.isAllUnder) {
|
||||||
|
checkCanBeImported(import, context, reporter)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,4 +36,33 @@ object FirImportsChecker : FirFileChecker() {
|
|||||||
reporter.reportOn(import.source, FirErrors.CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON, classFir.name, context)
|
reporter.reportOn(import.source, FirErrors.CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON, classFir.name, context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun checkCanBeImported(import: FirImport, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
|
val importedFqName = import.importedFqName ?: return
|
||||||
|
val importedName = importedFqName.shortName()
|
||||||
|
//empty name come from LT in some erroneous cases
|
||||||
|
if (importedName.isSpecial || importedName.identifier.isEmpty()) return
|
||||||
|
val classId = (import as? FirResolvedImport)?.resolvedClassId
|
||||||
|
if (classId != null) {
|
||||||
|
val classSymbol = context.session.symbolProvider.getClassLikeSymbolByFqName(classId) ?: return
|
||||||
|
val classFir = classSymbol.fir as? FirRegularClass ?: return
|
||||||
|
if (classFir.classKind.isSingleton) return
|
||||||
|
|
||||||
|
val illegalImport = classFir.declarations.any {
|
||||||
|
it is FirSimpleFunction && !it.isStatic && it.name == importedName ||
|
||||||
|
it is FirProperty && it.name == importedName
|
||||||
|
}
|
||||||
|
if (illegalImport) {
|
||||||
|
reporter.reportOn(import.source, FirErrors.CANNOT_BE_IMPORTED, importedName, context)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
val importedClassId = ClassId.topLevel(importedFqName)
|
||||||
|
if (context.session.symbolProvider.getClassLikeSymbolByFqName(importedClassId) != null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
context.session.symbolProvider.getPackage(importedFqName)?.let {
|
||||||
|
reporter.reportOn(import.source, FirErrors.PACKAGE_CANNOT_BE_IMPORTED, context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+8
@@ -54,6 +54,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.BREAK_OR_CONTINUE
|
|||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CALLABLE_REFERENCE_LHS_NOT_A_CLASS
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CALLABLE_REFERENCE_LHS_NOT_A_CLASS
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CALLABLE_REFERENCE_TO_ANNOTATION_CONSTRUCTOR
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CALLABLE_REFERENCE_TO_ANNOTATION_CONSTRUCTOR
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_BE_IMPORTED
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_CHANGE_ACCESS_PRIVILEGE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_CHANGE_ACCESS_PRIVILEGE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_INFER_PARAMETER_TYPE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_INFER_PARAMETER_TYPE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_WEAKEN_ACCESS_PRIVILEGE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_WEAKEN_ACCESS_PRIVILEGE
|
||||||
@@ -229,6 +230,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ONLY_ONE_CLASS_BO
|
|||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OTHER_ERROR
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OTHER_ERROR
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OVERLOAD_RESOLUTION_AMBIGUITY
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OVERLOAD_RESOLUTION_AMBIGUITY
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OVERRIDING_FINAL_MEMBER
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OVERRIDING_FINAL_MEMBER
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PACKAGE_CANNOT_BE_IMPORTED
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIVATE_CLASS_MEMBER_FROM_INLINE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.PRIVATE_CLASS_MEMBER_FROM_INLINE
|
||||||
@@ -1166,6 +1168,12 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension {
|
|||||||
"Cannot import-on-demand from object ''{0}''",
|
"Cannot import-on-demand from object ''{0}''",
|
||||||
TO_STRING
|
TO_STRING
|
||||||
)
|
)
|
||||||
|
map.put(PACKAGE_CANNOT_BE_IMPORTED, "Packages cannot be imported")
|
||||||
|
map.put(
|
||||||
|
CANNOT_BE_IMPORTED,
|
||||||
|
"Cannot import ''{0}'', functions and properties can be imported only from packages or objects",
|
||||||
|
TO_STRING
|
||||||
|
)
|
||||||
|
|
||||||
// Extended checkers group
|
// Extended checkers group
|
||||||
map.put(REDUNDANT_VISIBILITY_MODIFIER, "Redundant visibility modifier")
|
map.put(REDUNDANT_VISIBILITY_MODIFIER, "Redundant visibility modifier")
|
||||||
|
|||||||
-3
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.resolve.transformers
|
package org.jetbrains.kotlin.fir.resolve.transformers
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||||
@@ -14,8 +13,6 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
|||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildErrorImport
|
import org.jetbrains.kotlin.fir.declarations.builder.buildErrorImport
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildResolvedImport
|
import org.jetbrains.kotlin.fir.declarations.builder.buildResolvedImport
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
|
||||||
import org.jetbrains.kotlin.fir.lookupTracker
|
import org.jetbrains.kotlin.fir.lookupTracker
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeImportFromSingleton
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeImportFromSingleton
|
||||||
|
|||||||
+2
-2
@@ -11,7 +11,7 @@ class X
|
|||||||
// FILE: c.kt
|
// FILE: c.kt
|
||||||
package c
|
package c
|
||||||
|
|
||||||
import a.x
|
import a.<!PACKAGE_CANNOT_BE_IMPORTED!>x<!>
|
||||||
import b.x
|
import b.<!PACKAGE_CANNOT_BE_IMPORTED!>x<!>
|
||||||
|
|
||||||
class Y : <!UNRESOLVED_REFERENCE!>x.X<!>
|
class Y : <!UNRESOLVED_REFERENCE!>x.X<!>
|
||||||
@@ -57,4 +57,4 @@ import a.<!SYNTAX!>%<!>.b.c.<!SYNTAX!><!>
|
|||||||
import a.b.c.D.<!SYNTAX!><!>
|
import a.b.c.D.<!SYNTAX!><!>
|
||||||
import a.b.c.D.E.<!SYNTAX!><!>
|
import a.b.c.D.E.<!SYNTAX!><!>
|
||||||
|
|
||||||
import a<!SYNTAX!>?.<!><!SYNTAX!>b<!>
|
import <!PACKAGE_CANNOT_BE_IMPORTED!>a<!><!SYNTAX!>?.<!><!SYNTAX!>b<!>
|
||||||
|
|||||||
@@ -48,17 +48,17 @@ class D {
|
|||||||
|
|
||||||
|
|
||||||
// FILE:c.kt
|
// FILE:c.kt
|
||||||
import a
|
import <!PACKAGE_CANNOT_BE_IMPORTED!>a<!>
|
||||||
import a.b
|
import a.<!PACKAGE_CANNOT_BE_IMPORTED!>b<!>
|
||||||
|
|
||||||
import a.foo
|
import a.foo
|
||||||
import a.foo.bar
|
import a.foo.bar
|
||||||
import a.bar
|
import a.bar
|
||||||
import a.bar.foo
|
import a.bar.foo
|
||||||
|
|
||||||
import a.B.foo
|
import a.B.<!CANNOT_BE_IMPORTED!>foo<!>
|
||||||
import a.B.foo.bar
|
import a.B.foo.bar
|
||||||
import a.B.bar
|
import a.B.<!CANNOT_BE_IMPORTED!>bar<!>
|
||||||
import a.B.bar.foo
|
import a.B.bar.foo
|
||||||
|
|
||||||
import a.C.foo
|
import a.C.foo
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import reflect.Constructor
|
|||||||
import b.*
|
import b.*
|
||||||
import d
|
import d
|
||||||
import d.Test
|
import d.Test
|
||||||
import b.d
|
import b.<!PACKAGE_CANNOT_BE_IMPORTED!>d<!>
|
||||||
|
|
||||||
class Some: <!UNRESOLVED_REFERENCE!>Test<!>()
|
class Some: <!UNRESOLVED_REFERENCE!>Test<!>()
|
||||||
|
|
||||||
|
|||||||
+13
@@ -2580,6 +2580,19 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
|||||||
token,
|
token,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
add(FirErrors.PACKAGE_CANNOT_BE_IMPORTED) { firDiagnostic ->
|
||||||
|
PackageCannotBeImportedImpl(
|
||||||
|
firDiagnostic as FirPsiDiagnostic<*>,
|
||||||
|
token,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
add(FirErrors.CANNOT_BE_IMPORTED) { firDiagnostic ->
|
||||||
|
CannotBeImportedImpl(
|
||||||
|
firDiagnostic.a,
|
||||||
|
firDiagnostic as FirPsiDiagnostic<*>,
|
||||||
|
token,
|
||||||
|
)
|
||||||
|
}
|
||||||
add(FirJvmErrors.CONFLICTING_JVM_DECLARATIONS) { firDiagnostic ->
|
add(FirJvmErrors.CONFLICTING_JVM_DECLARATIONS) { firDiagnostic ->
|
||||||
ConflictingJvmDeclarationsImpl(
|
ConflictingJvmDeclarationsImpl(
|
||||||
firDiagnostic as FirPsiDiagnostic<*>,
|
firDiagnostic as FirPsiDiagnostic<*>,
|
||||||
|
|||||||
+9
@@ -1810,6 +1810,15 @@ sealed class KtFirDiagnostic<PSI: PsiElement> : KtDiagnosticWithPsi<PSI> {
|
|||||||
abstract val objectName: Name
|
abstract val objectName: Name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
abstract class PackageCannotBeImported : KtFirDiagnostic<KtSimpleNameExpression>() {
|
||||||
|
override val diagnosticClass get() = PackageCannotBeImported::class
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class CannotBeImported : KtFirDiagnostic<KtSimpleNameExpression>() {
|
||||||
|
override val diagnosticClass get() = CannotBeImported::class
|
||||||
|
abstract val name: Name
|
||||||
|
}
|
||||||
|
|
||||||
abstract class ConflictingJvmDeclarations : KtFirDiagnostic<PsiElement>() {
|
abstract class ConflictingJvmDeclarations : KtFirDiagnostic<PsiElement>() {
|
||||||
override val diagnosticClass get() = ConflictingJvmDeclarations::class
|
override val diagnosticClass get() = ConflictingJvmDeclarations::class
|
||||||
}
|
}
|
||||||
|
|||||||
+15
@@ -2936,6 +2936,21 @@ internal class CannotAllUnderImportFromSingletonImpl(
|
|||||||
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal class PackageCannotBeImportedImpl(
|
||||||
|
firDiagnostic: FirPsiDiagnostic<*>,
|
||||||
|
override val token: ValidityToken,
|
||||||
|
) : KtFirDiagnostic.PackageCannotBeImported(), KtAbstractFirDiagnostic<KtSimpleNameExpression> {
|
||||||
|
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class CannotBeImportedImpl(
|
||||||
|
override val name: Name,
|
||||||
|
firDiagnostic: FirPsiDiagnostic<*>,
|
||||||
|
override val token: ValidityToken,
|
||||||
|
) : KtFirDiagnostic.CannotBeImported(), KtAbstractFirDiagnostic<KtSimpleNameExpression> {
|
||||||
|
override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic)
|
||||||
|
}
|
||||||
|
|
||||||
internal class ConflictingJvmDeclarationsImpl(
|
internal class ConflictingJvmDeclarationsImpl(
|
||||||
firDiagnostic: FirPsiDiagnostic<*>,
|
firDiagnostic: FirPsiDiagnostic<*>,
|
||||||
override val token: ValidityToken,
|
override val token: ValidityToken,
|
||||||
|
|||||||
Reference in New Issue
Block a user