[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,
|
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 ->
|
add(FirErrors.OVERRIDING_FINAL_MEMBER) { firDiagnostic ->
|
||||||
OverridingFinalMemberImpl(
|
OverridingFinalMemberImpl(
|
||||||
firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a),
|
firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a),
|
||||||
|
|||||||
+5
@@ -1788,6 +1788,11 @@ sealed interface KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
|
|||||||
val valueParameter: KtSymbol
|
val valueParameter: KtSymbol
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface TypealiasExpandsToArrayOfNothings : KtFirDiagnostic<KtElement> {
|
||||||
|
override val diagnosticClass get() = TypealiasExpandsToArrayOfNothings::class
|
||||||
|
val type: KtType
|
||||||
|
}
|
||||||
|
|
||||||
interface OverridingFinalMember : KtFirDiagnostic<KtNamedDeclaration> {
|
interface OverridingFinalMember : KtFirDiagnostic<KtNamedDeclaration> {
|
||||||
override val diagnosticClass get() = OverridingFinalMember::class
|
override val diagnosticClass get() = OverridingFinalMember::class
|
||||||
val overriddenDeclaration: KtCallableSymbol
|
val overriddenDeclaration: KtCallableSymbol
|
||||||
|
|||||||
+6
@@ -2148,6 +2148,12 @@ internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideImpl
|
|||||||
token: KtLifetimeToken,
|
token: KtLifetimeToken,
|
||||||
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride
|
) : 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(
|
internal class OverridingFinalMemberImpl(
|
||||||
override val overriddenDeclaration: KtCallableSymbol,
|
override val overriddenDeclaration: KtCallableSymbol,
|
||||||
override val containingClassName: Name,
|
override val containingClassName: Name,
|
||||||
|
|||||||
+4
@@ -853,6 +853,10 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
|
|||||||
parameter<FirValueParameterSymbol>("valueParameter")
|
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) {
|
val OVERRIDING_FINAL_MEMBER by error<KtNamedDeclaration>(PositioningStrategy.OVERRIDE_MODIFIER) {
|
||||||
parameter<FirCallableSymbol<*>>("overriddenDeclaration")
|
parameter<FirCallableSymbol<*>>("overriddenDeclaration")
|
||||||
parameter<Name>("containingClassName")
|
parameter<Name>("containingClassName")
|
||||||
|
|||||||
@@ -477,6 +477,7 @@ object FirErrors {
|
|||||||
val CANNOT_CHANGE_ACCESS_PRIVILEGE by error3<KtModifierListOwner, Visibility, FirCallableSymbol<*>, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER)
|
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 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 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 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 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)
|
val PROPERTY_TYPE_MISMATCH_ON_INHERITANCE by error2<KtClassOrObject, FirCallableSymbol<*>, FirCallableSymbol<*>>(SourceElementPositioningStrategies.DECLARATION_NAME)
|
||||||
|
|||||||
+1
@@ -161,6 +161,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
|
|||||||
FirTopLevelTypeAliasChecker,
|
FirTopLevelTypeAliasChecker,
|
||||||
FirActualTypeAliasChecker,
|
FirActualTypeAliasChecker,
|
||||||
FirActualTypealiasToSpecialAnnotationChecker,
|
FirActualTypealiasToSpecialAnnotationChecker,
|
||||||
|
FirTypeAliasExpandsToArrayOfNothingsChecker,
|
||||||
)
|
)
|
||||||
|
|
||||||
override val anonymousFunctionCheckers: Set<FirAnonymousFunctionChecker>
|
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_ARGUMENTS
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TOO_MANY_CHARACTERS_IN_CHARACTER_LITERAL
|
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.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
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPEALIAS_EXPANSION_DEPRECATION_ERROR
|
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
|
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, multipleDefaultsMessage, SYMBOL)
|
||||||
map.put(MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE, 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(OVERRIDING_FINAL_MEMBER, "''{0}'' in ''{1}'' is final and cannot be overridden", DECLARATION_NAME, TO_STRING)
|
||||||
|
|
||||||
map.put(
|
map.put(
|
||||||
|
|||||||
+5
-5
@@ -1,12 +1,12 @@
|
|||||||
typealias A<T> = Array<T>
|
typealias A<T> = Array<T>
|
||||||
typealias AA<T> = A<A<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 First<X, Y> = List<X>
|
||||||
typealias UnusedAN1 = First<Int, Array<Nothing>>
|
typealias UnusedAN1 = <!TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS!>First<Int, Array<Nothing>><!>
|
||||||
typealias UnusedAN2 = First<Int, A<Nothing>> // TODO
|
typealias UnusedAN2 = <!TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS!>First<Int, A<Nothing>><!> // TODO
|
||||||
|
|||||||
Reference in New Issue
Block a user