[FE 1.0/FIR] Fix message of SEALED_SUPERTYPE_IN_LOCAL_CLASS diagnostic

^KT-46285 Fixed
This commit is contained in:
Dmitriy Novozhilov
2021-10-21 11:33:22 +03:00
committed by teamcityserver
parent 94664694df
commit 06a26a5a74
18 changed files with 262 additions and 14 deletions
@@ -26271,6 +26271,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
runTest("compiler/testData/diagnostics/tests/sealed/RedundantAbstract.kt");
}
@Test
@TestMetadata("sealedInheritorErrorMessage.kt")
public void testSealedInheritorErrorMessage() throws Exception {
runTest("compiler/testData/diagnostics/tests/sealed/sealedInheritorErrorMessage.kt");
}
@Test
@TestMetadata("TreeWhen.kt")
public void testTreeWhen() throws Exception {
@@ -26271,6 +26271,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
runTest("compiler/testData/diagnostics/tests/sealed/RedundantAbstract.kt");
}
@Test
@TestMetadata("sealedInheritorErrorMessage.kt")
public void testSealedInheritorErrorMessage() throws Exception {
runTest("compiler/testData/diagnostics/tests/sealed/sealedInheritorErrorMessage.kt");
}
@Test
@TestMetadata("TreeWhen.kt")
public void testTreeWhen() throws Exception {
@@ -10,6 +10,7 @@ import com.intellij.psi.impl.source.tree.LeafPsiElement
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.EffectiveVisibility
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.diagnostics.WhenMissingCase
@@ -170,7 +171,10 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
val SUPERTYPE_APPEARS_TWICE by error<KtTypeReference>()
val CLASS_IN_SUPERTYPE_FOR_ENUM by error<KtTypeReference>()
val SEALED_SUPERTYPE by error<KtTypeReference>()
val SEALED_SUPERTYPE_IN_LOCAL_CLASS by error<KtTypeReference>()
val SEALED_SUPERTYPE_IN_LOCAL_CLASS by error<KtTypeReference> {
parameter<String>("declarationType")
parameter<ClassKind>("sealedClassKind")
}
val SEALED_INHERITOR_IN_DIFFERENT_PACKAGE by error<KtTypeReference>()
val SEALED_INHERITOR_IN_DIFFERENT_MODULE by error<KtTypeReference>()
val CLASS_INHERITS_JAVA_SEALED_CLASS by error<KtTypeReference>()
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.config.LanguageFeature.RestrictRetentionForExpressio
import org.jetbrains.kotlin.config.LanguageFeature.RestrictionOfValReassignmentViaBackingField
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.EffectiveVisibility
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.diagnostics.WhenMissingCase
@@ -174,7 +175,7 @@ object FirErrors {
val SUPERTYPE_APPEARS_TWICE by error0<KtTypeReference>()
val CLASS_IN_SUPERTYPE_FOR_ENUM by error0<KtTypeReference>()
val SEALED_SUPERTYPE by error0<KtTypeReference>()
val SEALED_SUPERTYPE_IN_LOCAL_CLASS by error0<KtTypeReference>()
val SEALED_SUPERTYPE_IN_LOCAL_CLASS by error2<KtTypeReference, String, ClassKind>()
val SEALED_INHERITOR_IN_DIFFERENT_PACKAGE by error0<KtTypeReference>()
val SEALED_INHERITOR_IN_DIFFERENT_MODULE by error0<KtTypeReference>()
val CLASS_INHERITS_JAVA_SEALED_CLASS by error0<KtTypeReference>()
@@ -10,6 +10,7 @@ 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.FirAnonymousObject
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.declarations.utils.classId
@@ -65,10 +66,17 @@ object FirSealedSupertypeChecker : FirClassChecker() {
continue
}
val classSymbol = context.session.symbolProvider.getClassLikeSymbolByClassId(classId) as? FirRegularClassSymbol ?: continue
val superClassSymbol = context.session.symbolProvider.getClassLikeSymbolByClassId(classId) as? FirRegularClassSymbol ?: continue
if (classSymbol.modality == Modality.SEALED) {
reporter.reportOn(it.source, FirErrors.SEALED_SUPERTYPE_IN_LOCAL_CLASS, context)
if (superClassSymbol.modality == Modality.SEALED) {
val declarationType = if (declaration is FirAnonymousObject) "Anonymous object" else "Local class"
reporter.reportOn(
it.source,
FirErrors.SEALED_SUPERTYPE_IN_LOCAL_CLASS,
declarationType,
superClassSymbol.classKind,
context
)
return
}
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.analysis.diagnostics
import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.CLASS_KIND
import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.RENDER_POSITION_VARIANCE
import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.STRING
import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.commaSeparated
@@ -614,7 +615,7 @@ class FirDefaultErrorMessages {
map.put(SUPERTYPE_APPEARS_TWICE, "A supertype appears twice")
map.put(CLASS_IN_SUPERTYPE_FOR_ENUM, "Enum class cannot inherit from classes")
map.put(SEALED_SUPERTYPE, "This type is sealed, so it can be inherited by only its own nested classes or objects")
map.put(SEALED_SUPERTYPE_IN_LOCAL_CLASS, "Local class cannot extend a sealed class")
map.put(SEALED_SUPERTYPE_IN_LOCAL_CLASS, "{0} cannot extend a sealed {1}", STRING, CLASS_KIND)
map.put(SEALED_INHERITOR_IN_DIFFERENT_PACKAGE, "A class can only inherit from a sealed class or interface declared in the same package")
map.put(SEALED_INHERITOR_IN_DIFFERENT_MODULE, "Inheritance of sealed classes or interfaces from different module is prohibited")
map.put(CLASS_INHERITS_JAVA_SEALED_CLASS, "Inheritance of Java sealed classes is prohibited")