diff --git a/compiler/fir/analysis-tests/testData/resolve/enum.kt b/compiler/fir/analysis-tests/testData/resolve/enum.kt index 300bdf1464a..85c14edcc19 100644 --- a/compiler/fir/analysis-tests/testData/resolve/enum.kt +++ b/compiler/fir/analysis-tests/testData/resolve/enum.kt @@ -26,11 +26,11 @@ enum class EnumClass { override val bar: String = "a" }, - E2 { + E2 { }, - E3(); + E3(); abstract fun foo(): Int abstract val bar: String diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNotImplementedOverrideChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNotImplementedOverrideChecker.kt index 0eded547fc8..fb03684a834 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNotImplementedOverrideChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirNotImplementedOverrideChecker.kt @@ -28,16 +28,13 @@ import org.jetbrains.kotlin.util.OperatorNameConventions object FirNotImplementedOverrideChecker : FirClassChecker() { override fun check(declaration: FirClass<*>, context: CheckerContext, reporter: DiagnosticReporter) { - // TODO: kt4763Property: reporting on `object` literal causes invalid error in test...FirDiagnosticHandler - if (declaration !is FirRegularClass) return - val source = declaration.source ?: return - if (source.kind is FirFakeSourceElementKind) return + val sourceKind = source.kind + if (sourceKind is FirFakeSourceElementKind && sourceKind != FirFakeSourceElementKind.EnumInitializer) return val modality = declaration.modality() if (modality == Modality.ABSTRACT || modality == Modality.SEALED) return - if (declaration.isExpect) return + if (declaration is FirRegularClass && declaration.isExpect) return val classKind = declaration.classKind - // TODO: we should check enum entries (probably as anonymous objects, see above) if (classKind == ClassKind.ANNOTATION_CLASS || classKind == ClassKind.ENUM_CLASS) return val classScope = declaration.unsubstitutedScope( @@ -70,7 +67,9 @@ object FirNotImplementedOverrideChecker : FirClassChecker() { classScope.processFunctionsByName(name) { namedFunctionSymbol -> val simpleFunction = namedFunctionSymbol.fir if (!simpleFunction.shouldBeImplemented()) return@processFunctionsByName - if (declaration.isData && simpleFunction.matchesDataClassSyntheticMemberSignatures) return@processFunctionsByName + if (declaration is FirRegularClass && declaration.isData && simpleFunction.matchesDataClassSyntheticMemberSignatures) { + return@processFunctionsByName + } // TODO: suspend function overridden by a Java class in the middle is not properly regarded as an override if (simpleFunction.isSuspend) return@processFunctionsByName @@ -94,7 +93,7 @@ object FirNotImplementedOverrideChecker : FirClassChecker() { if (notImplementedSymbols.isNotEmpty()) { val notImplemented = notImplementedSymbols.first().fir - if (notImplemented.isFromInterface(context)) { + if (notImplemented.isFromInterfaceOrEnum(context)) { reporter.reportOn(source, FirErrors.ABSTRACT_MEMBER_NOT_IMPLEMENTED, declaration, notImplemented, context) } else { reporter.reportOn(source, FirErrors.ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED, declaration, notImplemented, context) @@ -110,8 +109,8 @@ object FirNotImplementedOverrideChecker : FirClassChecker() { } } - private fun FirCallableDeclaration<*>.isFromInterface(context: CheckerContext): Boolean = - (getContainingClass(context) as? FirRegularClass)?.isInterface == true + private fun FirCallableDeclaration<*>.isFromInterfaceOrEnum(context: CheckerContext): Boolean = + (getContainingClass(context) as? FirRegularClass)?.let { it.isInterface || it.isEnumClass } == true private val FirSimpleFunction.matchesDataClassSyntheticMemberSignatures: Boolean get() = (this.name == OperatorNameConventions.EQUALS && matchesEqualsSignature) || 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 01a648be256..46f52e708de 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 @@ -532,7 +532,8 @@ class DeclarationsConverter( fun convertObjectLiteral(objectLiteral: LighterASTNode): FirElement { return withChildClassName(ANONYMOUS_OBJECT_NAME) { buildAnonymousObject { - source = objectLiteral.toFirSourceElement() + val objectDeclaration = objectLiteral.getChildNodesByType(OBJECT_DECLARATION).first() + source = objectDeclaration.toFirSourceElement() origin = FirDeclarationOrigin.Source session = baseSession classKind = ClassKind.OBJECT @@ -551,7 +552,7 @@ class DeclarationsConverter( var delegatedConstructorSource: FirLightSourceElement? = null var delegateFields: List? = null - objectLiteral.getChildNodesByType(OBJECT_DECLARATION).first().forEachChildren { + objectDeclaration.forEachChildren { when (it.tokenType) { MODIFIER_LIST -> modifiers = convertModifierList(it) PRIMARY_CONSTRUCTOR -> primaryConstructor = it @@ -636,7 +637,7 @@ class DeclarationsConverter( annotations += modifiers.annotations initializer = withChildClassName(enumEntryName) { buildAnonymousObject { - source = this@buildEnumEntry.source + source = enumEntry.toFirSourceElement(FirFakeSourceElementKind.EnumInitializer) session = baseSession origin = FirDeclarationOrigin.Source classKind = ClassKind.ENUM_ENTRY 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 1d46cda0d1a..b2ad391072e 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 @@ -894,7 +894,7 @@ open class RawFirBuilder( val objectDeclaration = expression.objectDeclaration return withChildClassName(ANONYMOUS_OBJECT_NAME) { buildAnonymousObject { - source = expression.toFirSourceElement() + source = objectDeclaration.toFirSourceElement() session = baseSession origin = FirDeclarationOrigin.Source classKind = ClassKind.OBJECT diff --git a/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTotalKotlinTestCase.kt b/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTotalKotlinTestCase.kt index 653044f09ce..618031b5cbf 100644 --- a/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTotalKotlinTestCase.kt +++ b/compiler/fir/raw-fir/psi2fir/tests/org/jetbrains/kotlin/fir/builder/RawFirBuilderTotalKotlinTestCase.kt @@ -258,6 +258,7 @@ class RawFirBuilderTotalKotlinTestCase : AbstractRawFirBuilderTestCase() { it is KtAnnotatedExpression || it is KtWhenConditionWithExpression || it is KtFinallySection || + it is KtObjectLiteralExpression || // TODO: KT-24089 (support of dynamic) it is KtDynamicType || // NB: KtAnnotation is processed via its KtAnnotationEntries diff --git a/compiler/testData/diagnostics/tests/declarationChecks/kt1141.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/kt1141.fir.kt index 3a78cf9adad..af4f585547f 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/kt1141.fir.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/kt1141.fir.kt @@ -7,7 +7,7 @@ public interface SomeTrait { } fun foo() { - val x = object : SomeTrait { + val x = object : SomeTrait { } x.foo() } @@ -17,5 +17,5 @@ fun foo() { class C : SomeTrait {} fun foo2() { - val r = object : Runnable {} //no error + val r = object : Runnable {} //no error } diff --git a/compiler/testData/diagnostics/tests/enum/enumEntryInAbstractEnum.fir.kt b/compiler/testData/diagnostics/tests/enum/enumEntryInAbstractEnum.fir.kt deleted file mode 100644 index d3ba8db322a..00000000000 --- a/compiler/testData/diagnostics/tests/enum/enumEntryInAbstractEnum.fir.kt +++ /dev/null @@ -1,13 +0,0 @@ -enum class EnumClass { - E1 { - override fun foo() = 1 - override val bar: String = "a" - }, - - E2 { - - }; - - abstract fun foo(): Int - abstract val bar: String -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/enum/enumEntryInAbstractEnum.kt b/compiler/testData/diagnostics/tests/enum/enumEntryInAbstractEnum.kt index b72a2d5f69b..7981535c30f 100644 --- a/compiler/testData/diagnostics/tests/enum/enumEntryInAbstractEnum.kt +++ b/compiler/testData/diagnostics/tests/enum/enumEntryInAbstractEnum.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL enum class EnumClass { E1 { override fun foo() = 1 diff --git a/compiler/testData/diagnostics/tests/override/kt4763property.fir.kt b/compiler/testData/diagnostics/tests/override/kt4763property.fir.kt deleted file mode 100644 index 4d965b07528..00000000000 --- a/compiler/testData/diagnostics/tests/override/kt4763property.fir.kt +++ /dev/null @@ -1,11 +0,0 @@ -interface P { - var f: Number -} - -open class Q { - val x: Int = 42 -} - -class R : P, Q() - -val s: Q = object : Q(), P {} diff --git a/compiler/testData/diagnostics/tests/override/kt4763property.kt b/compiler/testData/diagnostics/tests/override/kt4763property.kt index 68689497fd3..c87c50130e4 100644 --- a/compiler/testData/diagnostics/tests/override/kt4763property.kt +++ b/compiler/testData/diagnostics/tests/override/kt4763property.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface P { var f: Number } diff --git a/compiler/testData/diagnostics/tests/thisAndSuper/thisInPropertyInitializer.fir.kt b/compiler/testData/diagnostics/tests/thisAndSuper/thisInPropertyInitializer.fir.kt index 9b5a0218325..e85a7755d10 100644 --- a/compiler/testData/diagnostics/tests/thisAndSuper/thisInPropertyInitializer.fir.kt +++ b/compiler/testData/diagnostics/tests/thisAndSuper/thisInPropertyInitializer.fir.kt @@ -1,7 +1,7 @@ interface Base { fun foo() } -val String.test: Base = object: Base { +val String.test: Base = object: Base { override fun foo() { this@test } diff --git a/compiler/testData/diagnostics/testsWithStdLib/kt9078.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/kt9078.fir.kt index 12aa7946ceb..37b51abd332 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/kt9078.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/kt9078.fir.kt @@ -4,7 +4,7 @@ abstract class KFunctionKt9005WorkAround(private val _functionInsta private val _parameters: List = run { _functionInstance.javaClass.methods.first().parameters.map { - object : kotlin.reflect.KParameter { + object : kotlin.reflect.KParameter { override val index: Int = 0 } } diff --git a/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.10.fir.kt b/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.10.fir.kt index 961f7fee104..7c7c9d71819 100644 --- a/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.10.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.10.fir.kt @@ -33,7 +33,7 @@ class Case2Outer { // TESTCASE NUMBER: 3 fun case3() { - object : CaseOuter.CaseBase() {}.outerFoo() + object : CaseOuter.CaseBase() {}.outerFoo() } class B() : CaseOuter.CaseBase() {} diff --git a/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.2.fir.kt b/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.2.fir.kt index 8fd15d1f07f..ca030a3ca1e 100644 --- a/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.2.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.2.fir.kt @@ -44,7 +44,7 @@ fun case1() { * NOTE: property is not implemented */ fun case2() { - val impl = object : Base() { + val impl = object : Base() { override var b: Any get() = TODO() set(value) {} @@ -71,7 +71,7 @@ fun case2() { */ fun case3() { - val impl = object : Base() { + val impl = object : Base() { override var b: Any get() = TODO() set(value) {} diff --git a/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.4.fir.kt b/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.4.fir.kt index 445d979cfd6..9059098dd66 100644 --- a/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.4.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.4.fir.kt @@ -44,7 +44,7 @@ class Case2() { abstract inner class Impl(override val a: CharSequence) : MainClass.Base3(a) {} fun boo() { - val impl = object : Impl("a") { + val impl = object : Impl("a") { override fun foo(): CharSequence = "foo" } } diff --git a/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.7.fir.kt b/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.7.fir.kt index b8265bf23f0..e62896b2f42 100644 --- a/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.7.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.7.fir.kt @@ -65,7 +65,7 @@ fun case3() { val v = Case3() v.boo(true) - val o = object : BaseKotlin() {} + val o = object : BaseKotlin() {} } /* @@ -78,6 +78,6 @@ abstract class AbstractClassCase4 : BaseKotlin() {} fun case4() { val v = Case4() v.boo(true) - val o = object : AbstractClassCase4() {} + val o = object : AbstractClassCase4() {} } diff --git a/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.9.fir.kt b/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.9.fir.kt index b8ddea1d794..2acb7ce0632 100644 --- a/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.9.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/linked/declarations/classifier-declaration/class-declaration/abstract-classes/p-2/neg/1.9.fir.kt @@ -59,7 +59,7 @@ import libModule.* // TESTCASE NUMBER: 2 class KotlinClassWithAbstractJavaClass() { fun foo() { - val baseJava1 = object : BaseJava1() {} - val baseKotlin = object : BaseKotlin1() {} + val baseJava1 = object : BaseJava1() {} + val baseKotlin = object : BaseKotlin1() {} } } 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 7a83a6ead3d..e10fef36bcd 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 @@ -882,48 +882,48 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.ABSTRACT_MEMBER_NOT_IMPLEMENTED) { firDiagnostic -> AbstractMemberNotImplementedImpl( - firSymbolBuilder.buildClassLikeSymbol(firDiagnostic.a), - firSymbolBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), firDiagnostic as FirPsiDiagnostic<*>, token, ) } add(FirErrors.ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED) { firDiagnostic -> AbstractClassMemberNotImplementedImpl( - firSymbolBuilder.buildClassLikeSymbol(firDiagnostic.a), - firSymbolBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), firDiagnostic as FirPsiDiagnostic<*>, token, ) } add(FirErrors.INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER) { firDiagnostic -> InvisibleAbstractMemberFromSuperImpl( - firSymbolBuilder.buildClassLikeSymbol(firDiagnostic.a), - firSymbolBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), firDiagnostic as FirPsiDiagnostic<*>, token, ) } add(FirErrors.INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_WARNING) { firDiagnostic -> InvisibleAbstractMemberFromSuperWarningImpl( - firSymbolBuilder.buildClassLikeSymbol(firDiagnostic.a), - firSymbolBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), firDiagnostic as FirPsiDiagnostic<*>, token, ) } add(FirErrors.MANY_IMPL_MEMBER_NOT_IMPLEMENTED) { firDiagnostic -> ManyImplMemberNotImplementedImpl( - firSymbolBuilder.buildClassLikeSymbol(firDiagnostic.a), - firSymbolBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), firDiagnostic as FirPsiDiagnostic<*>, token, ) } add(FirErrors.MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED) { firDiagnostic -> ManyInterfacesMemberNotImplementedImpl( - firSymbolBuilder.buildClassLikeSymbol(firDiagnostic.a), - firSymbolBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), firDiagnostic as FirPsiDiagnostic<*>, token, ) diff --git a/idea/testData/checker/ObjectLiteralInDelegate.kt b/idea/testData/checker/ObjectLiteralInDelegate.kt index f867b531175..8fd559cb597 100644 --- a/idea/testData/checker/ObjectLiteralInDelegate.kt +++ b/idea/testData/checker/ObjectLiteralInDelegate.kt @@ -1,3 +1,4 @@ +// FIR_COMPARISON // Test for KT-8187 interface A { fun get(x: Int)