[FIR] Support TYPEALIAS_EXPANDED_TO_MALFORMED_TYPE
^KT-59410 Fixed
This commit is contained in:
committed by
Space Team
parent
97b00793b4
commit
f4ffd479cc
+7
@@ -2516,6 +2516,13 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
||||
token,
|
||||
)
|
||||
}
|
||||
add(FirErrors.TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS) { firDiagnostic ->
|
||||
TypealiasExpandsToArrayOfNothingsImpl(
|
||||
firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a),
|
||||
firDiagnostic as KtPsiDiagnostic,
|
||||
token,
|
||||
)
|
||||
}
|
||||
add(FirErrors.OVERRIDING_FINAL_MEMBER) { firDiagnostic ->
|
||||
OverridingFinalMemberImpl(
|
||||
firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a),
|
||||
|
||||
+5
@@ -1788,6 +1788,11 @@ sealed interface KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
|
||||
val valueParameter: KtSymbol
|
||||
}
|
||||
|
||||
interface TypealiasExpandsToArrayOfNothings : KtFirDiagnostic<KtElement> {
|
||||
override val diagnosticClass get() = TypealiasExpandsToArrayOfNothings::class
|
||||
val type: KtType
|
||||
}
|
||||
|
||||
interface OverridingFinalMember : KtFirDiagnostic<KtNamedDeclaration> {
|
||||
override val diagnosticClass get() = OverridingFinalMember::class
|
||||
val overriddenDeclaration: KtCallableSymbol
|
||||
|
||||
+6
@@ -2148,6 +2148,12 @@ internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideImpl
|
||||
token: KtLifetimeToken,
|
||||
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride
|
||||
|
||||
internal class TypealiasExpandsToArrayOfNothingsImpl(
|
||||
override val type: KtType,
|
||||
firDiagnostic: KtPsiDiagnostic,
|
||||
token: KtLifetimeToken,
|
||||
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.TypealiasExpandsToArrayOfNothings
|
||||
|
||||
internal class OverridingFinalMemberImpl(
|
||||
override val overriddenDeclaration: KtCallableSymbol,
|
||||
override val containingClassName: Name,
|
||||
|
||||
+4
@@ -853,6 +853,10 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
|
||||
parameter<FirValueParameterSymbol>("valueParameter")
|
||||
}
|
||||
|
||||
val TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS by error<KtElement> {
|
||||
parameter<ConeKotlinType>("type")
|
||||
}
|
||||
|
||||
val OVERRIDING_FINAL_MEMBER by error<KtNamedDeclaration>(PositioningStrategy.OVERRIDE_MODIFIER) {
|
||||
parameter<FirCallableSymbol<*>>("overriddenDeclaration")
|
||||
parameter<Name>("containingClassName")
|
||||
|
||||
@@ -477,6 +477,7 @@ object FirErrors {
|
||||
val CANNOT_CHANGE_ACCESS_PRIVILEGE by error3<KtModifierListOwner, Visibility, FirCallableSymbol<*>, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER)
|
||||
val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES by error1<KtElement, FirValueParameterSymbol>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
|
||||
val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE by error1<KtElement, FirValueParameterSymbol>(SourceElementPositioningStrategies.DECLARATION_NAME)
|
||||
val TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS by error1<KtElement, ConeKotlinType>()
|
||||
val OVERRIDING_FINAL_MEMBER by error2<KtNamedDeclaration, FirCallableSymbol<*>, Name>(SourceElementPositioningStrategies.OVERRIDE_MODIFIER)
|
||||
val RETURN_TYPE_MISMATCH_ON_INHERITANCE by error2<KtClassOrObject, FirCallableSymbol<*>, FirCallableSymbol<*>>(SourceElementPositioningStrategies.DECLARATION_NAME)
|
||||
val PROPERTY_TYPE_MISMATCH_ON_INHERITANCE by error2<KtClassOrObject, FirCallableSymbol<*>, FirCallableSymbol<*>>(SourceElementPositioningStrategies.DECLARATION_NAME)
|
||||
|
||||
+1
@@ -161,6 +161,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
|
||||
FirTopLevelTypeAliasChecker,
|
||||
FirActualTypeAliasChecker,
|
||||
FirActualTypealiasToSpecialAnnotationChecker,
|
||||
FirTypeAliasExpandsToArrayOfNothingsChecker,
|
||||
)
|
||||
|
||||
override val anonymousFunctionCheckers: Set<FirAnonymousFunctionChecker>
|
||||
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
||||
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.diagnostics.reportOn
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.expandedConeType
|
||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.classId
|
||||
import org.jetbrains.kotlin.fir.types.type
|
||||
import org.jetbrains.kotlin.name.StandardClassIds
|
||||
|
||||
object FirTypeAliasExpandsToArrayOfNothingsChecker : FirTypeAliasChecker() {
|
||||
override fun check(declaration: FirTypeAlias, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
val type = declaration.expandedConeType ?: return
|
||||
|
||||
if (type.isMalformed(context)) {
|
||||
reporter.reportOn(declaration.expandedTypeRef.source, FirErrors.TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS, type, context)
|
||||
}
|
||||
}
|
||||
|
||||
private fun ConeKotlinType.isMalformed(context: CheckerContext): Boolean =
|
||||
expandedClassId(context) == StandardClassIds.Array
|
||||
&& typeArguments.singleOrNull()?.type?.expandedClassId(context) == StandardClassIds.Nothing
|
||||
|| containsMalformedArgument(context)
|
||||
|
||||
private fun ConeKotlinType.containsMalformedArgument(context: CheckerContext) =
|
||||
typeArguments.any { it.type?.isMalformed(context) == true }
|
||||
|
||||
private fun ConeKotlinType.expandedClassId(context: CheckerContext) = fullyExpandedType(context.session).classId
|
||||
}
|
||||
+3
@@ -554,6 +554,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_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
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPEALIAS_SHOULD_EXPAND_TO_CLASS
|
||||
@@ -1435,6 +1436,8 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
|
||||
map.put(MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES, multipleDefaultsMessage, SYMBOL)
|
||||
map.put(MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE, multipleDefaultsMessage, SYMBOL)
|
||||
|
||||
map.put(TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS, "Type alias expanded to malformed type ''{0}''", RENDER_TYPE)
|
||||
|
||||
map.put(OVERRIDING_FINAL_MEMBER, "''{0}'' in ''{1}'' is final and cannot be overridden", DECLARATION_NAME, TO_STRING)
|
||||
|
||||
map.put(
|
||||
|
||||
+5
-5
@@ -1,12 +1,12 @@
|
||||
typealias A<T> = Array<T>
|
||||
typealias AA<T> = A<A<T>>
|
||||
|
||||
typealias AN = A<Nothing>
|
||||
typealias AN = <!TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS!>A<Nothing><!>
|
||||
|
||||
typealias AAN = AA<Nothing>
|
||||
typealias AAN = <!TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS!>AA<Nothing><!>
|
||||
|
||||
typealias AAN2 = A<A<Nothing>>
|
||||
typealias AAN2 = <!TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS!>A<A<Nothing>><!>
|
||||
|
||||
typealias First<X, Y> = List<X>
|
||||
typealias UnusedAN1 = First<Int, Array<Nothing>>
|
||||
typealias UnusedAN2 = First<Int, A<Nothing>> // TODO
|
||||
typealias UnusedAN1 = <!TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS!>First<Int, Array<Nothing>><!>
|
||||
typealias UnusedAN2 = <!TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS!>First<Int, A<Nothing>><!> // TODO
|
||||
|
||||
Reference in New Issue
Block a user