[FIR] Deprecate using typealias as callable qualifier in import

^KT-64350 Fixed
This commit is contained in:
Roman Efremov
2024-02-13 11:33:29 +01:00
committed by Space Team
parent 802366064d
commit 3994e3f63a
19 changed files with 157 additions and 10 deletions
@@ -1732,6 +1732,14 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
}
val OPERATOR_RENAMED_ON_IMPORT by error<KtImportDirective>(PositioningStrategy.IMPORT_LAST_NAME)
val TYPEALIAS_AS_CALLABLE_QUALIFIER_IN_IMPORT by deprecationError<KtImportDirective>(
LanguageFeature.ProhibitTypealiasAsCallableQualifierInImport,
PositioningStrategy.IMPORT_LAST_BUT_ONE_NAME,
) {
parameter<Name>("typealiasName")
parameter<Name>("originalClassName")
}
}
val SUSPEND by object : DiagnosticGroup("Suspend errors") {
@@ -93,6 +93,7 @@ enum class PositioningStrategy(private val strategy: String? = null) {
QUESTION_MARK_BY_TYPE,
ANNOTATION_USE_SITE,
IMPORT_LAST_NAME,
IMPORT_LAST_BUT_ONE_NAME,
DATA_MODIFIER,
SPREAD_OPERATOR,
DECLARATION_WITH_BODY,
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.config.LanguageFeature.ProhibitInvisibleAbstractMeth
import org.jetbrains.kotlin.config.LanguageFeature.ProhibitNonReifiedArraysAsReifiedTypeArguments
import org.jetbrains.kotlin.config.LanguageFeature.ProhibitScriptTopLevelInnerClasses
import org.jetbrains.kotlin.config.LanguageFeature.ProhibitSingleNamedFunctionAsExpression
import org.jetbrains.kotlin.config.LanguageFeature.ProhibitTypealiasAsCallableQualifierInImport
import org.jetbrains.kotlin.config.LanguageFeature.ProhibitUseSiteTargetAnnotationsOnSuperTypes
import org.jetbrains.kotlin.config.LanguageFeature.RestrictRetentionForExpressionAnnotations
import org.jetbrains.kotlin.config.LanguageFeature.RestrictionOfValReassignmentViaBackingField
@@ -858,6 +859,7 @@ object FirErrors {
val CANNOT_BE_IMPORTED: KtDiagnosticFactory1<Name> by error1<KtImportDirective, Name>(SourceElementPositioningStrategies.IMPORT_LAST_NAME)
val CONFLICTING_IMPORT: KtDiagnosticFactory1<Name> by error1<KtImportDirective, Name>(SourceElementPositioningStrategies.IMPORT_ALIAS)
val OPERATOR_RENAMED_ON_IMPORT: KtDiagnosticFactory0 by error0<KtImportDirective>(SourceElementPositioningStrategies.IMPORT_LAST_NAME)
val TYPEALIAS_AS_CALLABLE_QUALIFIER_IN_IMPORT: KtDiagnosticFactoryForDeprecation2<Name, Name> by deprecationError2<KtImportDirective, Name, Name>(ProhibitTypealiasAsCallableQualifierInImport, SourceElementPositioningStrategies.IMPORT_LAST_BUT_ONE_NAME)
// Suspend errors
val ILLEGAL_SUSPEND_FUNCTION_CALL: KtDiagnosticFactory1<FirBasedSymbol<*>> by error1<PsiElement, FirBasedSymbol<*>>(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED)
@@ -95,7 +95,8 @@ object FirImportsChecker : FirFileChecker(MppCheckerKind.Common) {
val symbolProvider = context.session.symbolProvider
val parentClassId = (import as? FirResolvedImport)?.resolvedParentClassId
if (parentClassId != null) {
val parentClassSymbol = parentClassId.resolveToClass(context) ?: return
val parentClassLikeSymbol = parentClassId.resolveToClassLike(context) ?: return
val parentClassSymbol = parentClassLikeSymbol.fullyExpandedClass(context.session) ?: return
fun reportInvisibleParentClasses(classSymbol: FirRegularClassSymbol, depth: Int) {
if (!classSymbol.isVisible(context)) {
@@ -109,7 +110,14 @@ object FirImportsChecker : FirFileChecker(MppCheckerKind.Common) {
reportInvisibleParentClasses(parentClassSymbol, 1)
when (val status = parentClassSymbol.getImportStatusOfCallableMembers(context, importedName)) {
ImportStatus.OK -> return
ImportStatus.OK -> {
if (parentClassLikeSymbol is FirTypeAliasSymbol) {
reporter.reportOn(
import.source, FirErrors.TYPEALIAS_AS_CALLABLE_QUALIFIER_IN_IMPORT,
parentClassLikeSymbol.name, parentClassSymbol.name, context
)
}
}
is ImportStatus.Invisible -> {
val source = import.getSourceForImportSegment(0)
reporter.report(status.symbol.toInvisibleReferenceDiagnostic(source), context)
@@ -237,8 +245,12 @@ object FirImportsChecker : FirFileChecker(MppCheckerKind.Common) {
}
}
private fun ClassId.resolveToClassLike(context: CheckerContext): FirClassLikeSymbol<*>? {
return context.session.symbolProvider.getClassLikeSymbolByClassId(this)
}
private fun ClassId.resolveToClass(context: CheckerContext): FirRegularClassSymbol? {
val classSymbol = context.session.symbolProvider.getClassLikeSymbolByClassId(this) ?: return null
val classSymbol = resolveToClassLike(context) ?: return null
return when (classSymbol) {
is FirRegularClassSymbol -> classSymbol
is FirTypeAliasSymbol -> classSymbol.fullyExpandedClass(context.session)
@@ -611,6 +611,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.THROWABLE_TYPE_MI
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TOO_MANY_ARGUMENTS
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TOO_MANY_CHARACTERS_IN_CHARACTER_LITERAL
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TOPLEVEL_TYPEALIASES_ONLY
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPEALIAS_AS_CALLABLE_QUALIFIER_IN_IMPORT
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPEALIAS_EXPANSION_DEPRECATION
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPEALIAS_EXPANSION_DEPRECATION_ERROR
@@ -2511,6 +2512,13 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
TO_STRING
)
map.put(OPERATOR_RENAMED_ON_IMPORT, "Operator renamed to a different operator on import.")
map.put(
TYPEALIAS_AS_CALLABLE_QUALIFIER_IN_IMPORT,
"Cannot use typealias ''{0}'' as a callable qualifier in import. " +
"Use original class ''{1}'' instead or rewrite calls with ''{0}'' as a qualifier. " +
"See https://youtrack.jetbrains.com/issue/KT-64431.",
NAME, NAME
)
// Suspend
map.put(