From f4ffd479cce86206985916ab078992ddda8b98dd Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Mon, 17 Jul 2023 17:44:24 +0300 Subject: [PATCH] [FIR] Support TYPEALIAS_EXPANDED_TO_MALFORMED_TYPE ^KT-59410 Fixed --- .../diagnostics/KtFirDataClassConverters.kt | 7 ++++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 5 +++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 6 +++ .../diagnostics/FirDiagnosticsList.kt | 4 ++ .../fir/analysis/diagnostics/FirErrors.kt | 1 + .../checkers/CommonDeclarationCheckers.kt | 1 + ...ypeAliasExpandsToArrayOfNothingsChecker.kt | 38 +++++++++++++++++++ .../diagnostics/FirErrorsDefaultMessages.kt | 3 ++ .../illegalTypeInTypeAliasExpansion.fir.kt | 10 ++--- 9 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeAliasExpandsToArrayOfNothingsChecker.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index dda9b77be01..47feeb107a3 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -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), diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 77cfc014fd3..6a0cf061688 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -1788,6 +1788,11 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { val valueParameter: KtSymbol } + interface TypealiasExpandsToArrayOfNothings : KtFirDiagnostic { + override val diagnosticClass get() = TypealiasExpandsToArrayOfNothings::class + val type: KtType + } + interface OverridingFinalMember : KtFirDiagnostic { override val diagnosticClass get() = OverridingFinalMember::class val overriddenDeclaration: KtCallableSymbol diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index a6d058e576e..09fa4f72f46 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -2148,6 +2148,12 @@ internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideImpl token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride +internal class TypealiasExpandsToArrayOfNothingsImpl( + override val type: KtType, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.TypealiasExpandsToArrayOfNothings + internal class OverridingFinalMemberImpl( override val overriddenDeclaration: KtCallableSymbol, override val containingClassName: Name, diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index cd3c388a7c3..7f9d75dbf1e 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -853,6 +853,10 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { parameter("valueParameter") } + val TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS by error { + parameter("type") + } + val OVERRIDING_FINAL_MEMBER by error(PositioningStrategy.OVERRIDE_MODIFIER) { parameter>("overriddenDeclaration") parameter("containingClassName") diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 762fe8785c7..c49aa7065e1 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -477,6 +477,7 @@ object FirErrors { val CANNOT_CHANGE_ACCESS_PRIVILEGE by error3, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES by error1(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE by error1(SourceElementPositioningStrategies.DECLARATION_NAME) + val TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS by error1() val OVERRIDING_FINAL_MEMBER by error2, Name>(SourceElementPositioningStrategies.OVERRIDE_MODIFIER) val RETURN_TYPE_MISMATCH_ON_INHERITANCE by error2, FirCallableSymbol<*>>(SourceElementPositioningStrategies.DECLARATION_NAME) val PROPERTY_TYPE_MISMATCH_ON_INHERITANCE by error2, FirCallableSymbol<*>>(SourceElementPositioningStrategies.DECLARATION_NAME) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt index b3bbcde4a4d..856282ab972 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt @@ -161,6 +161,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() { FirTopLevelTypeAliasChecker, FirActualTypeAliasChecker, FirActualTypealiasToSpecialAnnotationChecker, + FirTypeAliasExpandsToArrayOfNothingsChecker, ) override val anonymousFunctionCheckers: Set diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeAliasExpandsToArrayOfNothingsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeAliasExpandsToArrayOfNothingsChecker.kt new file mode 100644 index 00000000000..fa26f79bfb3 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeAliasExpandsToArrayOfNothingsChecker.kt @@ -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 +} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt index 2f6d1d0d36c..c6ac314f559 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt @@ -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( diff --git a/compiler/testData/diagnostics/tests/typealias/illegalTypeInTypeAliasExpansion.fir.kt b/compiler/testData/diagnostics/tests/typealias/illegalTypeInTypeAliasExpansion.fir.kt index 1602af910b6..d49f4a54de1 100644 --- a/compiler/testData/diagnostics/tests/typealias/illegalTypeInTypeAliasExpansion.fir.kt +++ b/compiler/testData/diagnostics/tests/typealias/illegalTypeInTypeAliasExpansion.fir.kt @@ -1,12 +1,12 @@ typealias A = Array typealias AA = A> -typealias AN = A +typealias AN = A -typealias AAN = AA +typealias AAN = AA -typealias AAN2 = A> +typealias AAN2 = A> typealias First = List -typealias UnusedAN1 = First> -typealias UnusedAN2 = First> // TODO +typealias UnusedAN1 = First> +typealias UnusedAN2 = First> // TODO