From f3a7312ee617704d8ec99a87098ddf9930a8b848 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 21 Jun 2023 15:51:15 +0200 Subject: [PATCH] K2: use ClassKind.CLASS for object literals K1 uses CLASS, and libraries like kotlinx-metadata-jvm and kotlin-reflect already rely on it. #KT-57641 Fixed --- .../FirConstructorAllowedChecker.kt | 24 +++++++++++-------- .../FirTypeParametersInObjectChecker.kt | 15 +++++------- .../fir/backend/Fir2IrClassifierStorage.kt | 3 +-- .../converter/DeclarationsConverter.kt | 2 +- .../kotlin/fir/builder/RawFirBuilder.kt | 2 +- .../box/reflection/classes/objectInstance.kt | 1 + .../testData/localClasses/AnonymousObject.kt | 2 -- 7 files changed, 24 insertions(+), 25 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstructorAllowedChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstructorAllowedChecker.kt index 0f3c8ec9a99..e956810c3ba 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstructorAllowedChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstructorAllowedChecker.kt @@ -9,11 +9,12 @@ import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities +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.checkers.getModifierList -import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors -import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.declarations.FirRegularClass @@ -36,14 +37,17 @@ object FirConstructorAllowedChecker : FirConstructorChecker() { ClassKind.ENUM_CLASS -> if (declaration.visibility != Visibilities.Private) { reporter.reportOn(source, FirErrors.NON_PRIVATE_CONSTRUCTOR_IN_ENUM, context) } - ClassKind.CLASS -> if (containingClass is FirRegularClass && containingClass.modality == Modality.SEALED) { - val modifierList = source.getModifierList() ?: return - val hasIllegalModifier = modifierList.modifiers.any { - val token = it.token - token in KtTokens.VISIBILITY_MODIFIERS && token != KtTokens.PROTECTED_KEYWORD && token != KtTokens.PRIVATE_KEYWORD - } - if (hasIllegalModifier) { - reporter.reportOn(source, FirErrors.NON_PRIVATE_OR_PROTECTED_CONSTRUCTOR_IN_SEALED, context) + ClassKind.CLASS -> when (containingClass) { + is FirAnonymousObject -> reporter.reportOn(source, FirErrors.CONSTRUCTOR_IN_OBJECT, context) + is FirRegularClass -> if (containingClass.modality == Modality.SEALED) { + val modifierList = source.getModifierList() ?: return + val hasIllegalModifier = modifierList.modifiers.any { + val token = it.token + token in KtTokens.VISIBILITY_MODIFIERS && token != KtTokens.PROTECTED_KEYWORD && token != KtTokens.PRIVATE_KEYWORD + } + if (hasIllegalModifier) { + reporter.reportOn(source, FirErrors.NON_PRIVATE_OR_PROTECTED_CONSTRUCTOR_IN_SEALED, context) + } } } ClassKind.ANNOTATION_CLASS -> { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeParametersInObjectChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeParametersInObjectChecker.kt index b9e194c3fdc..e46acda6a86 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeParametersInObjectChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeParametersInObjectChecker.kt @@ -8,10 +8,10 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.diagnostics.DiagnosticReporter -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors 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.analysis.getChild import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.declarations.FirClass @@ -20,15 +20,12 @@ import org.jetbrains.kotlin.fir.languageVersionSettings object FirTypeParametersInObjectChecker : FirClassChecker() { override fun check(declaration: FirClass, context: CheckerContext, reporter: DiagnosticReporter) { - if (declaration.classKind != ClassKind.OBJECT) { - return - } - - when (declaration) { - is FirRegularClass -> if (declaration.typeParameters.isNotEmpty()) { + if (declaration.classKind == ClassKind.OBJECT && declaration is FirRegularClass) { + if (declaration.typeParameters.isNotEmpty()) { reporter.reportOn(declaration.source, FirErrors.TYPE_PARAMETERS_IN_OBJECT, context) } - is FirAnonymousObject -> if (declaration.source?.getChild(KtNodeTypes.TYPE_PARAMETER_LIST, depth = 1) != null) { + } else if (declaration.classKind == ClassKind.CLASS && declaration is FirAnonymousObject) { + if (declaration.source?.getChild(KtNodeTypes.TYPE_PARAMETER_LIST, depth = 1) != null) { val diagnosticFactory = if (context.session.languageVersionSettings.supportsFeature(LanguageFeature.ProhibitTypeParametersInAnonymousObjects)) { FirErrors.TYPE_PARAMETERS_IN_OBJECT diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index 80da6397cb2..ea1c41040b4 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt @@ -400,8 +400,7 @@ class Fir2IrClassifierStorage( name = name, visibility = components.visibilityConverter.convertToDescriptorVisibility(visibility), symbol = IrClassSymbolImpl(), - // NB: for unknown reason, IR uses 'CLASS' kind for simple anonymous objects - kind = anonymousObject.classKind.takeIf { it == ClassKind.ENUM_ENTRY } ?: ClassKind.CLASS, + kind = anonymousObject.classKind, modality = modality, ).apply { metadata = FirMetadataSource.Class(anonymousObject) diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 31f073f81c5..68e079b2367 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -657,7 +657,7 @@ class DeclarationsConverter( source = objectDeclaration.toFirSourceElement() origin = FirDeclarationOrigin.Source moduleData = baseModuleData - classKind = ClassKind.OBJECT + classKind = ClassKind.CLASS scopeProvider = baseScopeProvider symbol = FirAnonymousObjectSymbol() status = FirDeclarationStatusImpl(Visibilities.Local, Modality.FINAL) diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index d2967ffb495..a350b46d46d 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -1399,7 +1399,7 @@ open class RawFirBuilder( source = objectDeclaration.toFirSourceElement() moduleData = baseModuleData origin = FirDeclarationOrigin.Source - classKind = ClassKind.OBJECT + classKind = ClassKind.CLASS scopeProvider = baseScopeProvider symbol = FirAnonymousObjectSymbol() status = FirDeclarationStatusImpl(Visibilities.Local, Modality.FINAL) diff --git a/compiler/testData/codegen/box/reflection/classes/objectInstance.kt b/compiler/testData/codegen/box/reflection/classes/objectInstance.kt index 21f3b75a878..7928f7470b2 100644 --- a/compiler/testData/codegen/box/reflection/classes/objectInstance.kt +++ b/compiler/testData/codegen/box/reflection/classes/objectInstance.kt @@ -29,6 +29,7 @@ fun box(): String { assertEquals(null, C::class.objectInstance) assertEquals(null, String::class.objectInstance) assertEquals(Unit, Unit::class.objectInstance) + assertEquals(null, object {}::class.objectInstance) return "OK" } diff --git a/libraries/tools/kotlinp/testData/localClasses/AnonymousObject.kt b/libraries/tools/kotlinp/testData/localClasses/AnonymousObject.kt index 9f5d97ee25a..7cce458e02e 100644 --- a/libraries/tools/kotlinp/testData/localClasses/AnonymousObject.kt +++ b/libraries/tools/kotlinp/testData/localClasses/AnonymousObject.kt @@ -1,5 +1,3 @@ -// IGNORE K2 - fun test() = object : Runnable { override fun run() { } }