[FIR] Check typealiases in supertypes

^KT-59830 Fixed

Merge-request: KT-MR-11187
Merged-by: Nikolay Lunyak <Nikolay.Lunyak@jetbrains.com>
This commit is contained in:
Nikolay Lunyak
2023-07-20 12:50:06 +00:00
committed by Space Team
parent 8a645e9c0a
commit 84dd1acec1
10 changed files with 51 additions and 19 deletions
@@ -339,6 +339,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
runTest("compiler/testData/diagnostics/tests/fileDependencyRecursion.kt"); runTest("compiler/testData/diagnostics/tests/fileDependencyRecursion.kt");
} }
@Test
@TestMetadata("finalSupertype.kt")
public void testFinalSupertype() throws Exception {
runTest("compiler/testData/diagnostics/tests/finalSupertype.kt");
}
@Test @Test
@TestMetadata("ForRangeConventions.kt") @TestMetadata("ForRangeConventions.kt")
public void testForRangeConventions() throws Exception { public void testForRangeConventions() throws Exception {
@@ -339,6 +339,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
runTest("compiler/testData/diagnostics/tests/fileDependencyRecursion.kt"); runTest("compiler/testData/diagnostics/tests/fileDependencyRecursion.kt");
} }
@Test
@TestMetadata("finalSupertype.kt")
public void testFinalSupertype() throws Exception {
runTest("compiler/testData/diagnostics/tests/finalSupertype.kt");
}
@Test @Test
@TestMetadata("ForRangeConventions.kt") @TestMetadata("ForRangeConventions.kt")
public void testForRangeConventions() throws Exception { public void testForRangeConventions() throws Exception {
@@ -12,4 +12,4 @@ package a
import b.TA import b.TA
class MyClass : TA() class MyClass : <!FINAL_SUPERTYPE!>TA<!>()
@@ -339,6 +339,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/tests/fileDependencyRecursion.kt"); runTest("compiler/testData/diagnostics/tests/fileDependencyRecursion.kt");
} }
@Test
@TestMetadata("finalSupertype.kt")
public void testFinalSupertype() throws Exception {
runTest("compiler/testData/diagnostics/tests/finalSupertype.kt");
}
@Test @Test
@TestMetadata("ForRangeConventions.kt") @TestMetadata("ForRangeConventions.kt")
public void testForRangeConventions() throws Exception { public void testForRangeConventions() throws Exception {
@@ -339,6 +339,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
runTest("compiler/testData/diagnostics/tests/fileDependencyRecursion.kt"); runTest("compiler/testData/diagnostics/tests/fileDependencyRecursion.kt");
} }
@Test
@TestMetadata("finalSupertype.kt")
public void testFinalSupertype() throws Exception {
runTest("compiler/testData/diagnostics/tests/finalSupertype.kt");
}
@Test @Test
@TestMetadata("ForRangeConventions.kt") @TestMetadata("ForRangeConventions.kt")
public void testForRangeConventions() throws Exception { public void testForRangeConventions() throws Exception {
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirField import org.jetbrains.kotlin.fir.declarations.FirField
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.fullyExpandedClass
import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.declarations.utils.modality
import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.languageVersionSettings
@@ -55,14 +56,17 @@ object FirSupertypesChecker : FirClassChecker() {
reporter.reportOn(superTypeRef.source, FirErrors.SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE, context) reporter.reportOn(superTypeRef.source, FirErrors.SUPERTYPE_IS_EXTENSION_FUNCTION_TYPE, context)
extensionFunctionSupertypeReported = true extensionFunctionSupertypeReported = true
} }
val lookupTag = (coneType as? ConeClassLikeType)?.lookupTag ?: continue
val superTypeSymbol = lookupTag.toSymbol(context.session)
if (superTypeSymbol is FirRegularClassSymbol) { checkAnnotationOnSuperclass(superTypeRef, context, reporter)
if (!superClassSymbols.add(superTypeSymbol)) {
val fullyExpandedType = coneType.fullyExpandedType(context.session)
val symbol = fullyExpandedType.toSymbol(context.session)
if (symbol is FirRegularClassSymbol) {
if (!superClassSymbols.add(symbol)) {
reporter.reportOn(superTypeRef.source, FirErrors.SUPERTYPE_APPEARS_TWICE, context) reporter.reportOn(superTypeRef.source, FirErrors.SUPERTYPE_APPEARS_TWICE, context)
} }
if (superTypeSymbol.classKind != ClassKind.INTERFACE) { if (symbol.classKind != ClassKind.INTERFACE) {
if (classAppeared) { if (classAppeared) {
reporter.reportOn(superTypeRef.source, FirErrors.MANY_CLASSES_IN_SUPERTYPE_LIST, context) reporter.reportOn(superTypeRef.source, FirErrors.MANY_CLASSES_IN_SUPERTYPE_LIST, context)
} else { } else {
@@ -73,8 +77,8 @@ object FirSupertypesChecker : FirClassChecker() {
interfaceWithSuperclassReported = true interfaceWithSuperclassReported = true
} }
} }
val isObject = superTypeSymbol.classKind == ClassKind.OBJECT val isObject = symbol.classKind == ClassKind.OBJECT
if (!finalSupertypeReported && !isObject && superTypeSymbol.modality == Modality.FINAL) { if (!finalSupertypeReported && !isObject && symbol.modality == Modality.FINAL) {
reporter.reportOn(superTypeRef.source, FirErrors.FINAL_SUPERTYPE, context) reporter.reportOn(superTypeRef.source, FirErrors.FINAL_SUPERTYPE, context)
finalSupertypeReported = true finalSupertypeReported = true
} }
@@ -84,11 +88,6 @@ object FirSupertypesChecker : FirClassChecker() {
} }
} }
checkAnnotationOnSuperclass(superTypeRef, context, reporter)
val fullyExpandedType = coneType.fullyExpandedType(context.session)
val symbol = fullyExpandedType.toSymbol(context.session)
checkClassCannotBeExtendedDirectly(symbol, reporter, superTypeRef, context) checkClassCannotBeExtendedDirectly(symbol, reporter, superTypeRef, context)
if (coneType.typeArguments.isNotEmpty()) { if (coneType.typeArguments.isNotEmpty()) {
+8
View File
@@ -0,0 +1,8 @@
// FIR_IDENTICAL
// ISSUE: KT-59830
class OOO
typealias Alias = OOO
class Child : <!FINAL_SUPERTYPE!>Alias<!>() //K1: [FINAL_SUPERTYPE] This type is final, so it cannot be inherited from, no error in K2
@@ -1,6 +0,0 @@
interface IBase
typealias B = IBase
class Test1 : B
class Test2 : IBase, B
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
interface IBase interface IBase
typealias B = IBase typealias B = IBase
@@ -339,6 +339,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/fileDependencyRecursion.kt"); runTest("compiler/testData/diagnostics/tests/fileDependencyRecursion.kt");
} }
@Test
@TestMetadata("finalSupertype.kt")
public void testFinalSupertype() throws Exception {
runTest("compiler/testData/diagnostics/tests/finalSupertype.kt");
}
@Test @Test
@TestMetadata("ForRangeConventions.kt") @TestMetadata("ForRangeConventions.kt")
public void testForRangeConventions() throws Exception { public void testForRangeConventions() throws Exception {