From 6769ce0e2b9b56178da0624b86af3e1fb440623b Mon Sep 17 00:00:00 2001 From: Tianyu Geng Date: Tue, 23 Mar 2021 18:29:00 -0700 Subject: [PATCH] FIR checker: check TOPLEVEL_TYPEALIASES_ONLY --- .../resolve/visibility/exposedTypeAlias.kt | 6 ++--- .../diagnostics/FirDiagnosticsList.kt | 6 ++++- .../fir/analysis/diagnostics/FirErrors.kt | 4 ++++ .../declaration/FirTypeAliasChecker.kt | 23 +++++++++++++++++++ .../diagnostics/FirDefaultErrorMessages.kt | 4 ++++ .../fir/checkers/CommonDeclarationCheckers.kt | 1 + .../tests/classLiteral/typealiases.fir.kt | 4 ++-- .../typealias/topLevelTypeAliasesOnly.fir.kt | 19 --------------- .../typealias/topLevelTypeAliasesOnly.kt | 1 + .../diagnostics/KtFirDataClassConverters.kt | 7 ++++++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 5 ++++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 8 +++++++ 12 files changed, 63 insertions(+), 25 deletions(-) create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeAliasChecker.kt delete mode 100644 compiler/testData/diagnostics/tests/typealias/topLevelTypeAliasesOnly.fir.kt diff --git a/compiler/fir/analysis-tests/testData/resolve/visibility/exposedTypeAlias.kt b/compiler/fir/analysis-tests/testData/resolve/visibility/exposedTypeAlias.kt index 42efe259c37..aa8ecb763e7 100644 --- a/compiler/fir/analysis-tests/testData/resolve/visibility/exposedTypeAlias.kt +++ b/compiler/fir/analysis-tests/testData/resolve/visibility/exposedTypeAlias.kt @@ -2,12 +2,12 @@ class A { private inner class Inner } class B { - typealias AInner = A.Inner + typealias AInner = A.Inner inner class Inner } class C { - typealias BInner = B.Inner + typealias BInner = B.Inner } typealias AInner0 = A.Inner @@ -15,4 +15,4 @@ typealias BInner0 = B.Inner private typealias MyString = String -fun foo(): MyString = "" +fun foo(): MyString = "" \ No newline at end of file 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 914879b34c0..59236dcb20a 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 @@ -10,7 +10,6 @@ import com.intellij.psi.PsiTypeElement import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.diagnostics.WhenMissingCase -import org.jetbrains.kotlin.resolve.ForbiddenNamedArgumentsTarget import org.jetbrains.kotlin.fir.FirEffectiveVisibility import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.PrivateForInline @@ -26,6 +25,7 @@ import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.resolve.ForbiddenNamedArgumentsTarget import kotlin.properties.PropertyDelegateProvider import kotlin.properties.ReadOnlyProperty @@ -523,6 +523,10 @@ object DIAGNOSTICS_LIST : DiagnosticList() { val NO_SET_METHOD by error(PositioningStrategy.ARRAY_ACCESS) } + val TYPE_ALIAS by object : DiagnosticGroup("Type alias") { + val TOPLEVEL_TYPEALIASES_ONLY by error() + } + val EXTENDED_CHECKERS by object : DiagnosticGroup("Extended checkers") { val REDUNDANT_VISIBILITY_MODIFIER by warning(PositioningStrategy.VISIBILITY_MODIFIER) val REDUNDANT_MODALITY_MODIFIER by warning(PositioningStrategy.MODALITY_MODIFIER) 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 bb0488f0559..d90aff7a443 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 @@ -41,6 +41,7 @@ import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.KtPropertyDelegate import org.jetbrains.kotlin.psi.KtSimpleNameExpression +import org.jetbrains.kotlin.psi.KtTypeAlias import org.jetbrains.kotlin.psi.KtTypeParameter import org.jetbrains.kotlin.psi.KtTypeParameterList import org.jetbrains.kotlin.psi.KtTypeReference @@ -313,6 +314,9 @@ object FirErrors { val NO_GET_METHOD by error0(SourceElementPositioningStrategies.ARRAY_ACCESS) val NO_SET_METHOD by error0(SourceElementPositioningStrategies.ARRAY_ACCESS) + // Type alias + val TOPLEVEL_TYPEALIASES_ONLY by error0() + // Extended checkers val REDUNDANT_VISIBILITY_MODIFIER by warning0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val REDUNDANT_MODALITY_MODIFIER by warning0(SourceElementPositioningStrategies.MODALITY_MODIFIER) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeAliasChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeAliasChecker.kt new file mode 100644 index 00000000000..e34baa09a94 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeAliasChecker.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2021 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.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn +import org.jetbrains.kotlin.fir.declarations.FirFile +import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration +import org.jetbrains.kotlin.fir.declarations.FirTypeAlias + +object FirTypeAliasChecker : FirMemberDeclarationChecker() { + override fun check(declaration: FirMemberDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { + if (declaration !is FirTypeAlias) return + if (context.containingDeclarations.lastOrNull() !is FirFile) { + reporter.reportOn(declaration.source, FirErrors.TOPLEVEL_TYPEALIASES_ONLY, context) + } + } +} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt index e6e88ec66b1..d9367f4d791 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt @@ -189,6 +189,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SUPERTYPE_NOT_INI import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SUPER_IS_NOT_AN_EXPRESSION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SUPER_NOT_AVAILABLE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.SYNTAX +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TOPLEVEL_TYPEALIASES_ONLY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_ARGUMENTS_NOT_ALLOWED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_MISMATCH import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.TYPE_PARAMETERS_IN_ENUM @@ -691,6 +692,9 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension { map.put(NO_GET_METHOD, "No get method providing array access") map.put(NO_SET_METHOD, "No set method providing array access") + // Type alias + map.put(TOPLEVEL_TYPEALIASES_ONLY, "Nested and local type aliases are not supported") + // Extended checkers group map.put(REDUNDANT_VISIBILITY_MODIFIER, "Redundant visibility modifier") map.put(REDUNDANT_MODALITY_MODIFIER, "Redundant modality modifier") diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt index 6772017f00d..a8e9d63bb48 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt @@ -24,6 +24,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() { FirInfixFunctionDeclarationChecker, FirExposedVisibilityDeclarationChecker, FirSealedSupertypeChecker, + FirTypeAliasChecker, ) override val functionCheckers: Set = setOf( diff --git a/compiler/testData/diagnostics/tests/classLiteral/typealiases.fir.kt b/compiler/testData/diagnostics/tests/classLiteral/typealiases.fir.kt index ebc38e073af..f280c2b4f14 100644 --- a/compiler/testData/diagnostics/tests/classLiteral/typealiases.fir.kt +++ b/compiler/testData/diagnostics/tests/classLiteral/typealiases.fir.kt @@ -9,7 +9,7 @@ typealias TTNullableTString = TNullableTString fun f3() = TTNullableTString::class inline fun f4(b: Boolean): Any { - typealias X = T - typealias Y = T? + typealias X = T + typealias Y = T? return if (b) X::class else Y::class } diff --git a/compiler/testData/diagnostics/tests/typealias/topLevelTypeAliasesOnly.fir.kt b/compiler/testData/diagnostics/tests/typealias/topLevelTypeAliasesOnly.fir.kt deleted file mode 100644 index 8c79e33dda3..00000000000 --- a/compiler/testData/diagnostics/tests/typealias/topLevelTypeAliasesOnly.fir.kt +++ /dev/null @@ -1,19 +0,0 @@ -typealias TopLevel = Any - -interface A { - typealias Nested = Any -} - -class C { - typealias Nested = Any - class D { - typealias Nested = Any - fun foo() { - typealias LocalInMember = Any - } - } -} - -fun foo() { - typealias Local = Any -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/typealias/topLevelTypeAliasesOnly.kt b/compiler/testData/diagnostics/tests/typealias/topLevelTypeAliasesOnly.kt index f5b85f53ba4..b52cd286816 100644 --- a/compiler/testData/diagnostics/tests/typealias/topLevelTypeAliasesOnly.kt +++ b/compiler/testData/diagnostics/tests/typealias/topLevelTypeAliasesOnly.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL typealias TopLevel = Any interface A { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index bc527e82fab..2499245ccd2 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.KtPropertyDelegate import org.jetbrains.kotlin.psi.KtSimpleNameExpression +import org.jetbrains.kotlin.psi.KtTypeAlias import org.jetbrains.kotlin.psi.KtTypeParameter import org.jetbrains.kotlin.psi.KtTypeParameterList import org.jetbrains.kotlin.psi.KtTypeReference @@ -1421,6 +1422,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.TOPLEVEL_TYPEALIASES_ONLY) { firDiagnostic -> + ToplevelTypealiasesOnlyImpl( + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } add(FirErrors.REDUNDANT_VISIBILITY_MODIFIER) { firDiagnostic -> RedundantVisibilityModifierImpl( firDiagnostic as FirPsiDiagnostic<*>, diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index 4c13b53fccf..f862adf2b71 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.KtPropertyDelegate import org.jetbrains.kotlin.psi.KtSimpleNameExpression +import org.jetbrains.kotlin.psi.KtTypeAlias import org.jetbrains.kotlin.psi.KtTypeParameter import org.jetbrains.kotlin.psi.KtTypeParameterList import org.jetbrains.kotlin.psi.KtTypeReference @@ -1000,6 +1001,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = NoSetMethod::class } + abstract class ToplevelTypealiasesOnly : KtFirDiagnostic() { + override val diagnosticClass get() = ToplevelTypealiasesOnly::class + } + abstract class RedundantVisibilityModifier : KtFirDiagnostic() { override val diagnosticClass get() = RedundantVisibilityModifier::class } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 6019e31252e..77ced007e2b 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -38,6 +38,7 @@ import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.KtPropertyDelegate import org.jetbrains.kotlin.psi.KtSimpleNameExpression +import org.jetbrains.kotlin.psi.KtTypeAlias import org.jetbrains.kotlin.psi.KtTypeParameter import org.jetbrains.kotlin.psi.KtTypeParameterList import org.jetbrains.kotlin.psi.KtTypeReference @@ -1619,6 +1620,13 @@ internal class NoSetMethodImpl( override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } +internal class ToplevelTypealiasesOnlyImpl( + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.ToplevelTypealiasesOnly(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + internal class RedundantVisibilityModifierImpl( firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken,