diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/incompatibleModifiers.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/incompatibleModifiers.kt index 4eddabe933f..91e10ac0ec7 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/incompatibleModifiers.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/incompatibleModifiers.kt @@ -1,5 +1,5 @@ private public class B -protected internal class C +protected internal class C final abstract class D final open class E diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantModalityModifierChecker.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantModalityModifierChecker.kt index 483dc715a00..fd0cdf04d80 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantModalityModifierChecker.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantModalityModifierChecker.kt @@ -10,7 +10,7 @@ interface Interface { // Redundant abstract fun foo() // error - private final fun bar() + private final fun bar() open fun goo() {} abstract fun tar() @@ -63,7 +63,7 @@ interface Derived : Interface { // Redundant override open fun foo() {} // error - final class Nested + final class Nested } // Derived abstract class abstract class AbstractDerived1(override final val gav: Int) : Interface { diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantSetterParameterTypeChecker.kt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantSetterParameterTypeChecker.kt index 924d58c56d9..4ee0cb63b8e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantSetterParameterTypeChecker.kt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantSetterParameterTypeChecker.kt @@ -4,7 +4,7 @@ annotation class Ann var x: Int get() = 1 - set(@Ann private x) { } + set(@Ann private x) { } var x: String = "" 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 389447fd655..16c762b1616 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 @@ -339,6 +339,14 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val INFIX_MODIFIER_REQUIRED by error { parameter("functionSymbol") } + val WRONG_MODIFIER_CONTAINING_DECLARATION by error { + parameter("modifier") + parameter("target") + } + val DEPRECATED_MODIFIER_CONTAINING_DECLARATION by warning { + parameter("modifier") + parameter("target") + } } val INLINE_CLASSES by object : DiagnosticGroup("Inline classes") { 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 a76a67cf0e8..49266fcf60b 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 @@ -264,6 +264,8 @@ object FirErrors { val WRONG_MODIFIER_TARGET by error2() val OPERATOR_MODIFIER_REQUIRED by error2() val INFIX_MODIFIER_REQUIRED by error1() + val WRONG_MODIFIER_CONTAINING_DECLARATION by error2() + val DEPRECATED_MODIFIER_CONTAINING_DECLARATION by warning2() // Inline classes val INLINE_CLASS_NOT_TOP_LEVEL by error0(SourceElementPositioningStrategies.INLINE_OR_VALUE_MODIFIER) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt index 14bca5dbd79..38ebcf55443 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt @@ -6,9 +6,13 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget +import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget.* +import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget.Companion.classActualTargets +import org.jetbrains.kotlin.fir.FirFakeSourceElementKind import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.analysis.checkers.* import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.context.findClosest import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticFactory2 import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors @@ -54,12 +58,34 @@ object FirModifierChecker : FirBasicDeclarationChecker() { val reportedNodes = hashSetOf>() val actualTargets = getActualTargetList(owner).defaultTargets + val parent = context.findClosest { + it !is FirPrimaryConstructor && + it !is FirProperty && + it.source?.kind !is FirFakeSourceElementKind + } + + val actualParents = when (parent) { + is FirAnonymousObject -> listOf(LOCAL_CLASS, CLASS) + is FirClass -> classActualTargets( + parent.classKind, + isInnerClass = (parent as? FirMemberDeclaration)?.isInner ?: false, + isCompanionObject = (parent as? FirRegularClass)?.isCompanion ?: false, + isLocalClass = parent.isLocal + ) + is FirPropertyAccessor -> listOf(if (parent.isSetter) PROPERTY_SETTER else PROPERTY_GETTER) + is FirFunction -> listOf(FUNCTION) + is FirEnumEntry -> listOf(ENUM_ENTRY, PROPERTY, FIELD) + else -> listOf(FILE) + } + val modifiers = list.modifiers for ((secondIndex, secondModifier) in modifiers.withIndex()) { for (firstIndex in 0 until secondIndex) { checkCompatibilityType(modifiers[firstIndex], secondModifier, reporter, reportedNodes, owner, context) } if (secondModifier !in reportedNodes) { + val modifierSource = secondModifier.source + val modifierType = getKeywordType(secondModifier) when { !checkTarget(modifierSource, modifierType, actualTargets, parent, context, reporter) -> reportedNodes += secondModifier !checkParent(modifierSource, modifierType, actualParents, context, reporter) -> reportedNodes += secondModifier @@ -146,14 +172,13 @@ object FirModifierChecker : FirBasicDeclarationChecker() { } private fun checkTarget( - modifier: FirModifier<*>, + modifierSource: FirSourceElement, + modifierType: KeywordType, actualTargets: List, parent: FirDeclaration?, context: CheckerContext, reporter: DiagnosticReporter ): Boolean { - val modifierType = getKeywordType(modifier) - fun checkModifier(factory: FirDiagnosticFactory2): Boolean { val map = when (factory) { FirErrors.WRONG_MODIFIER_TARGET -> possibleTargetMap @@ -168,7 +193,7 @@ object FirModifierChecker : FirBasicDeclarationChecker() { } if (checkResult) { reporter.reportOn( - modifier.source, + modifierSource, factory, modifierType.render(), actualTargets.firstOrThis(), @@ -193,7 +218,7 @@ object FirModifierChecker : FirBasicDeclarationChecker() { val deprecatedModifierReplacement = deprecatedModifierMap[modifierType] if (deprecatedModifierReplacement != null) { reporter.reportOn( - modifier.source, + modifierSource, FirErrors.DEPRECATED_MODIFIER, modifierType.render(), deprecatedModifierReplacement.render(), @@ -206,6 +231,39 @@ object FirModifierChecker : FirBasicDeclarationChecker() { return true } + private fun checkParent( + modifierSource: FirSourceElement, + modifierType: KeywordType, + actualParents: List, + context: CheckerContext, + reporter: DiagnosticReporter + ): Boolean { + val deprecatedParents = deprecatedParentTargetMap[modifierType] + if (deprecatedParents != null && actualParents.any { it in deprecatedParents }) { + reporter.reportOn( + modifierSource, + FirErrors.DEPRECATED_MODIFIER_CONTAINING_DECLARATION, + modifierType.render(), + actualParents.firstOrThis(), + context + ) + return true + } + + val possibleParentPredicate = possibleParentTargetPredicateMap[modifierType] ?: return true + if (actualParents.any { possibleParentPredicate.isAllowed(it, context.session.languageVersionSettings) }) return true + + reporter.reportOn( + modifierSource, + FirErrors.WRONG_MODIFIER_CONTAINING_DECLARATION, + modifierType.render(), + actualParents.firstOrThis(), + context + ) + + return false + } + private fun List.firstOrThis(): String { return firstOrNull()?.description ?: "this" } 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 1427580d03c..8bc8c489322 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 @@ -126,6 +126,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATION_IN_INT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATION_NOT_TO_INTERFACE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DELEGATION_SUPER_CALL_IN_ENUM_CONSTRUCTOR import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_MODIFIER +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_MODIFIER_CONTAINING_DECLARATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_MODIFIER_FOR_TARGET import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_MODIFIER_PAIR import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_SINCE_KOTLIN_OUTSIDE_KOTLIN_SUBPACKAGE @@ -465,6 +466,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_ANNOTATION_ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_GETTER_RETURN_TYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_INVOCATION_KIND +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_MODIFIER_CONTAINING_DECLARATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_MODIFIER_TARGET import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_NUMBER_OF_TYPE_ARGUMENTS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.WRONG_SETTER_PARAMETER_TYPE @@ -737,6 +739,8 @@ class FirDefaultErrorMessages { map.put(REDUNDANT_OPEN_IN_INTERFACE, "Modifier 'open' is redundant for abstract interface members") map.put(WRONG_MODIFIER_TARGET, "Modifier ''{0}'' is not applicable to ''{1}''", STRING, STRING) map.put(INFIX_MODIFIER_REQUIRED, "''infix'' modifier is required on ''{0}''", TO_STRING) + map.put(WRONG_MODIFIER_CONTAINING_DECLARATION, "Modifier ''{0}'' is not applicable inside ''{1}''", STRING, STRING) + map.put(DEPRECATED_MODIFIER_CONTAINING_DECLARATION, "Modifier ''{0}'' is deprecated inside ''{1}''", STRING, STRING) // Classes and interfaces map.put(SUPERTYPE_NOT_INITIALIZED, "This type has a constructor, and thus must be initialized here") diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPrimaryConstructorBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPrimaryConstructorBuilder.kt index 05d5bb0c751..1049561902f 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPrimaryConstructorBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/builder/FirPrimaryConstructorBuilder.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.declarations.builder import kotlin.contracts.* +import org.jetbrains.kotlin.fir.FirImplementationDetail import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder @@ -55,6 +56,7 @@ class FirPrimaryConstructorBuilder : FirAbstractConstructorBuilder, FirAnnotatio override var delegatedConstructor: FirDelegatedConstructorCall? = null override var body: FirBlock? = null + @OptIn(FirImplementationDetail::class) override fun build(): FirConstructor { return FirPrimaryConstructor( source, diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPrimaryConstructor.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPrimaryConstructor.kt index 57638d8e42b..63839ec8bd2 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPrimaryConstructor.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/declarations/impl/FirPrimaryConstructor.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.declarations.impl +import org.jetbrains.kotlin.fir.FirImplementationDetail import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.declarations.DeprecationsPerUseSite @@ -30,7 +31,7 @@ import org.jetbrains.kotlin.fir.visitors.* * DO NOT MODIFY IT MANUALLY */ -internal class FirPrimaryConstructor( +class FirPrimaryConstructor @FirImplementationDetail constructor( override val source: FirSourceElement?, override val moduleData: FirModuleData, @Volatile diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 0e3eec7fbd9..74f1a1f53f1 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt @@ -22,6 +22,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator() } impl(constructor, "FirPrimaryConstructor") { + publicImplementation() defaultTrue("isPrimary", withGetter = true) } diff --git a/compiler/testData/diagnostics/tests/annotations/nestedClassesInAnnotations.fir.kt b/compiler/testData/diagnostics/tests/annotations/nestedClassesInAnnotations.fir.kt deleted file mode 100644 index 15ecebd3b50..00000000000 --- a/compiler/testData/diagnostics/tests/annotations/nestedClassesInAnnotations.fir.kt +++ /dev/null @@ -1,23 +0,0 @@ -// !LANGUAGE: +NestedClassesInAnnotations - -annotation class Foo { - class Nested - - inner class Inner - - enum class E { A, B } - object O - interface I - annotation class Anno(val e: E) - - companion object { - val x = 1 - const val y = "" - } - - - constructor(s: Int) {} - init {} - fun function() {} - val property get() = Unit -} diff --git a/compiler/testData/diagnostics/tests/annotations/nestedClassesInAnnotations.kt b/compiler/testData/diagnostics/tests/annotations/nestedClassesInAnnotations.kt index dac8f1ed1c5..14801a4af9a 100644 --- a/compiler/testData/diagnostics/tests/annotations/nestedClassesInAnnotations.kt +++ b/compiler/testData/diagnostics/tests/annotations/nestedClassesInAnnotations.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !LANGUAGE: +NestedClassesInAnnotations annotation class Foo { diff --git a/compiler/testData/diagnostics/tests/classObjects/ClassObjects.fir.kt b/compiler/testData/diagnostics/tests/classObjects/ClassObjects.fir.kt deleted file mode 100644 index 0928188e162..00000000000 --- a/compiler/testData/diagnostics/tests/classObjects/ClassObjects.fir.kt +++ /dev/null @@ -1,43 +0,0 @@ -// !DIAGNOSTICS: -DUPLICATE_CLASS_NAMES -package Jet86 - -class A { - companion object { - val x = 1 - } - companion object { - val x = 1 - } -} - -class AA { - companion object { - val x = 1 - } - companion object A { - val x = 1 - } - companion object AA { - val x = 1 - } -} - -class B() { - val x = 12 -} - -object b { - companion object { - val x = 1 - } // error -} - -val a = A.x -val c = B.x -val d = b.x - -val s = System // error -fun test() { - System.out.println() - java.lang.System.out.println() -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/classObjects/ClassObjects.kt b/compiler/testData/diagnostics/tests/classObjects/ClassObjects.kt index 95191baeb53..b359d38303d 100644 --- a/compiler/testData/diagnostics/tests/classObjects/ClassObjects.kt +++ b/compiler/testData/diagnostics/tests/classObjects/ClassObjects.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -DUPLICATE_CLASS_NAMES package Jet86 diff --git a/compiler/testData/diagnostics/tests/classObjects/classObjectInLocalClass.fir.kt b/compiler/testData/diagnostics/tests/classObjects/classObjectInLocalClass.fir.kt deleted file mode 100644 index 5b91a35a64e..00000000000 --- a/compiler/testData/diagnostics/tests/classObjects/classObjectInLocalClass.fir.kt +++ /dev/null @@ -1,9 +0,0 @@ -fun test() { - class A { - companion object {} - } - - object { - companion object {} - } -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/classObjects/classObjectInLocalClass.kt b/compiler/testData/diagnostics/tests/classObjects/classObjectInLocalClass.kt index d9d28a48188..f775b4e0440 100644 --- a/compiler/testData/diagnostics/tests/classObjects/classObjectInLocalClass.kt +++ b/compiler/testData/diagnostics/tests/classObjects/classObjectInLocalClass.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun test() { class A { companion object {} diff --git a/compiler/testData/diagnostics/tests/classObjects/multipleDissallowedDefaultObjects.fir.kt b/compiler/testData/diagnostics/tests/classObjects/multipleDissallowedDefaultObjects.fir.kt index d5b96e7c186..0c514c91c41 100644 --- a/compiler/testData/diagnostics/tests/classObjects/multipleDissallowedDefaultObjects.fir.kt +++ b/compiler/testData/diagnostics/tests/classObjects/multipleDissallowedDefaultObjects.fir.kt @@ -9,9 +9,9 @@ class A { } object O { - companion object A + companion object A - companion object B + companion object B - companion object C + companion object C } diff --git a/compiler/testData/diagnostics/tests/dataClasses/implementTraitWhichHasFinalComponent1.fir.kt b/compiler/testData/diagnostics/tests/dataClasses/implementTraitWhichHasFinalComponent1.fir.kt deleted file mode 100644 index 8efc12249f6..00000000000 --- a/compiler/testData/diagnostics/tests/dataClasses/implementTraitWhichHasFinalComponent1.fir.kt +++ /dev/null @@ -1,5 +0,0 @@ -interface T { - final fun component1(): Int = 42 -} - -data class A(val x: Int) : T diff --git a/compiler/testData/diagnostics/tests/dataClasses/implementTraitWhichHasFinalComponent1.kt b/compiler/testData/diagnostics/tests/dataClasses/implementTraitWhichHasFinalComponent1.kt index 40eb1b8e496..3bcc1993bb4 100644 --- a/compiler/testData/diagnostics/tests/dataClasses/implementTraitWhichHasFinalComponent1.kt +++ b/compiler/testData/diagnostics/tests/dataClasses/implementTraitWhichHasFinalComponent1.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface T { final fun component1(): Int = 42 } diff --git a/compiler/testData/diagnostics/tests/dataClasses/innerOuterDataClass.fir.kt b/compiler/testData/diagnostics/tests/dataClasses/innerOuterDataClass.fir.kt deleted file mode 100644 index a7a16e75490..00000000000 --- a/compiler/testData/diagnostics/tests/dataClasses/innerOuterDataClass.fir.kt +++ /dev/null @@ -1 +0,0 @@ -inner data class Outer(val x: Int) \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/dataClasses/innerOuterDataClass.kt b/compiler/testData/diagnostics/tests/dataClasses/innerOuterDataClass.kt index 1695db0dcfc..5f70eef5645 100644 --- a/compiler/testData/diagnostics/tests/dataClasses/innerOuterDataClass.kt +++ b/compiler/testData/diagnostics/tests/dataClasses/innerOuterDataClass.kt @@ -1 +1,2 @@ +// FIR_IDENTICAL inner data class Outer(val x: Int) \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/declarationChecks/kt2397.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/kt2397.fir.kt deleted file mode 100644 index 2de9ebda214..00000000000 --- a/compiler/testData/diagnostics/tests/declarationChecks/kt2397.fir.kt +++ /dev/null @@ -1,17 +0,0 @@ -//KT-2397 Prohibit final methods in traits with no implementation -package a - -interface T { - final fun foo() - final val b : Int - - final fun bar() {} - final val c : Int - get() = 42 - - final val d = 1 -} - -class A { - final fun foo() -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/declarationChecks/kt2397.kt b/compiler/testData/diagnostics/tests/declarationChecks/kt2397.kt index a7e8aabcda4..0ed0c001443 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/kt2397.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/kt2397.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL //KT-2397 Prohibit final methods in traits with no implementation package a diff --git a/compiler/testData/diagnostics/tests/declarationChecks/propertyInPackageHasNoInheritVisibility.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/propertyInPackageHasNoInheritVisibility.fir.kt deleted file mode 100644 index 470d27bd13a..00000000000 --- a/compiler/testData/diagnostics/tests/declarationChecks/propertyInPackageHasNoInheritVisibility.fir.kt +++ /dev/null @@ -1,10 +0,0 @@ -package d - -override val f : ()-> Int = { 12 } - -fun test() { - f() -} - -var g: Int = 1 - protected set(i: Int) {} diff --git a/compiler/testData/diagnostics/tests/declarationChecks/propertyInPackageHasNoInheritVisibility.kt b/compiler/testData/diagnostics/tests/declarationChecks/propertyInPackageHasNoInheritVisibility.kt index b086dbaaaa0..cc8a740db0f 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/propertyInPackageHasNoInheritVisibility.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/propertyInPackageHasNoInheritVisibility.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL package d override val f : ()-> Int = { 12 } diff --git a/compiler/testData/diagnostics/tests/enum/enumEntryCannotHaveClassObject.fir.kt b/compiler/testData/diagnostics/tests/enum/enumEntryCannotHaveClassObject.fir.kt deleted file mode 100644 index 308f3146a45..00000000000 --- a/compiler/testData/diagnostics/tests/enum/enumEntryCannotHaveClassObject.fir.kt +++ /dev/null @@ -1,11 +0,0 @@ -enum class E { - FIRST, - - SECOND { - companion object { - fun foo() = 42 - } - }; -} - -fun f() = E.SECOND.foo() diff --git a/compiler/testData/diagnostics/tests/enum/enumEntryCannotHaveClassObject.kt b/compiler/testData/diagnostics/tests/enum/enumEntryCannotHaveClassObject.kt index e65fd1ed973..d1add84ef55 100644 --- a/compiler/testData/diagnostics/tests/enum/enumEntryCannotHaveClassObject.kt +++ b/compiler/testData/diagnostics/tests/enum/enumEntryCannotHaveClassObject.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL enum class E { FIRST, diff --git a/compiler/testData/diagnostics/tests/inlineClasses/inlineClassDeclarationCheck.fir.kt b/compiler/testData/diagnostics/tests/inlineClasses/inlineClassDeclarationCheck.fir.kt index b8e4a77d9da..8f6a1027058 100644 --- a/compiler/testData/diagnostics/tests/inlineClasses/inlineClassDeclarationCheck.fir.kt +++ b/compiler/testData/diagnostics/tests/inlineClasses/inlineClassDeclarationCheck.fir.kt @@ -16,7 +16,7 @@ inline class A9(final val x: Int) class B1 { companion object { inline class C1(val x: Int) - inner inline class C11(val x: Int) + inner inline class C11(val x: Int) } inline class C2(val x: Int) @@ -25,7 +25,7 @@ class B1 { object B2 { inline class C3(val x: Int) - inner inline class C31(val x: Int) + inner inline class C31(val x: Int) } fun foo() { diff --git a/compiler/testData/diagnostics/tests/inner/deepInnerClass.fir.kt b/compiler/testData/diagnostics/tests/inner/deepInnerClass.fir.kt index bacd454df96..abf66cb2ff0 100644 --- a/compiler/testData/diagnostics/tests/inner/deepInnerClass.fir.kt +++ b/compiler/testData/diagnostics/tests/inner/deepInnerClass.fir.kt @@ -4,11 +4,11 @@ class A { class B { fun test() { class C() : PT> { - companion object : PT> { + companion object : PT> { } inner class D : PT> } } } -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inner/illegalModifier.fir.kt b/compiler/testData/diagnostics/tests/inner/illegalModifier.fir.kt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/compiler/testData/diagnostics/tests/inner/illegalModifier_lv12.fir.kt b/compiler/testData/diagnostics/tests/inner/illegalModifier_lv12.fir.kt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/compiler/testData/diagnostics/tests/inner/innerClassInEnumEntryClass_lv11.fir.kt b/compiler/testData/diagnostics/tests/inner/innerClassInEnumEntryClass_lv11.fir.kt index 56810f3209f..f0125c67b6d 100644 --- a/compiler/testData/diagnostics/tests/inner/innerClassInEnumEntryClass_lv11.fir.kt +++ b/compiler/testData/diagnostics/tests/inner/innerClassInEnumEntryClass_lv11.fir.kt @@ -2,7 +2,7 @@ enum class Enum { ENTRY_WITH_CLASS { - inner class TestInner + inner class TestInner class TestNested @@ -14,6 +14,6 @@ enum class Enum { OTHER_ENTRY } - companion object {} + companion object {} } } diff --git a/compiler/testData/diagnostics/tests/inner/innerClassInEnumEntryClass_lv12.fir.kt b/compiler/testData/diagnostics/tests/inner/innerClassInEnumEntryClass_lv12.fir.kt index 05805836b63..ddbafdd925b 100644 --- a/compiler/testData/diagnostics/tests/inner/innerClassInEnumEntryClass_lv12.fir.kt +++ b/compiler/testData/diagnostics/tests/inner/innerClassInEnumEntryClass_lv12.fir.kt @@ -14,6 +14,6 @@ enum class Enum { OTHER_ENTRY } - companion object {} + companion object {} } } diff --git a/compiler/testData/diagnostics/tests/inner/innerClassInEnumEntryClass_lv13.fir.kt b/compiler/testData/diagnostics/tests/inner/innerClassInEnumEntryClass_lv13.fir.kt index 96a4be9033e..7632eae4f5d 100644 --- a/compiler/testData/diagnostics/tests/inner/innerClassInEnumEntryClass_lv13.fir.kt +++ b/compiler/testData/diagnostics/tests/inner/innerClassInEnumEntryClass_lv13.fir.kt @@ -14,6 +14,6 @@ enum class Enum { OTHER_ENTRY } - companion object {} + companion object {} } } diff --git a/compiler/testData/diagnostics/tests/modifiers/annotations.fir.kt b/compiler/testData/diagnostics/tests/modifiers/annotations.fir.kt deleted file mode 100644 index 6d86371ce29..00000000000 --- a/compiler/testData/diagnostics/tests/modifiers/annotations.fir.kt +++ /dev/null @@ -1,12 +0,0 @@ -annotation class My( - public val x: Int, - protected val y: Int, - internal val z: Int, - private val w: Int -) - -open class Your { - open val x: Int = 0 -} - -annotation class His(override val x: Int): Your() diff --git a/compiler/testData/diagnostics/tests/modifiers/annotations.kt b/compiler/testData/diagnostics/tests/modifiers/annotations.kt index 65427abc29c..127aed1e44d 100644 --- a/compiler/testData/diagnostics/tests/modifiers/annotations.kt +++ b/compiler/testData/diagnostics/tests/modifiers/annotations.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL annotation class My( public val x: Int, protected val y: Int, diff --git a/compiler/testData/diagnostics/tests/modifiers/defaultModifier.fir.kt b/compiler/testData/diagnostics/tests/modifiers/defaultModifier.fir.kt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/compiler/testData/diagnostics/tests/modifiers/internalInInterface.fir.kt b/compiler/testData/diagnostics/tests/modifiers/internalInInterface.fir.kt deleted file mode 100644 index 5b1a334f17a..00000000000 --- a/compiler/testData/diagnostics/tests/modifiers/internalInInterface.fir.kt +++ /dev/null @@ -1,7 +0,0 @@ -interface My { - internal val x: Int - internal val xxx: Int - get() = 0 - internal fun foo(): Int - internal fun bar() = 42 -} diff --git a/compiler/testData/diagnostics/tests/modifiers/internalInInterface.kt b/compiler/testData/diagnostics/tests/modifiers/internalInInterface.kt index 144a361742f..3d0bfd68317 100644 --- a/compiler/testData/diagnostics/tests/modifiers/internalInInterface.kt +++ b/compiler/testData/diagnostics/tests/modifiers/internalInInterface.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface My { internal val x: Int internal val xxx: Int diff --git a/compiler/testData/diagnostics/tests/modifiers/modifierOnParameterInFunctionType.fir.kt b/compiler/testData/diagnostics/tests/modifiers/modifierOnParameterInFunctionType.fir.kt index eef65241792..ebcab0ac6d5 100644 --- a/compiler/testData/diagnostics/tests/modifiers/modifierOnParameterInFunctionType.fir.kt +++ b/compiler/testData/diagnostics/tests/modifiers/modifierOnParameterInFunctionType.fir.kt @@ -2,11 +2,11 @@ fun f(vararg x: Int) {} -val inVal: (vararg x: Int)->Unit = {} +val inVal: (vararg x: Int)->Unit = {} -fun inParam(fn: (vararg x: Int)->Unit) {} +fun inParam(fn: (vararg x: Int)->Unit) {} -fun inParamNested(fn1: (fn2: (vararg n: Int)->Unit)->Unit) {} +fun inParamNested(fn1: (fn2: (vararg n: Int)->Unit)->Unit) {} fun inReturn(): (vararg x: Int)->Unit = {} @@ -16,7 +16,7 @@ class A : (vararg Int)->Unit { } val prop: (vararg x: Int)->Unit - get(): (vararg x: Int)->Unit = {} + get(): (vararg x: Int)->Unit = {} } val allProhibited: (abstract @@ -44,7 +44,7 @@ val allProhibited: (abstract reified sealed tailrec - vararg + vararg x: Int)->Unit = {} diff --git a/compiler/testData/diagnostics/tests/modifiers/privateInInterface.fir.kt b/compiler/testData/diagnostics/tests/modifiers/privateInInterface.fir.kt deleted file mode 100644 index ab643640a12..00000000000 --- a/compiler/testData/diagnostics/tests/modifiers/privateInInterface.fir.kt +++ /dev/null @@ -1,12 +0,0 @@ -interface My { - private val x: Int - private abstract val xx: Int - private val xxx: Int - get() = 0 - final val y: Int - final val yy: Int - get() = 1 - private fun foo(): Int - // ok - private fun bar() = 42 -} diff --git a/compiler/testData/diagnostics/tests/modifiers/privateInInterface.kt b/compiler/testData/diagnostics/tests/modifiers/privateInInterface.kt index 2201fb23911..ea5095b3525 100644 --- a/compiler/testData/diagnostics/tests/modifiers/privateInInterface.kt +++ b/compiler/testData/diagnostics/tests/modifiers/privateInInterface.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface My { private val x: Int private abstract val xx: Int diff --git a/compiler/testData/diagnostics/tests/modifiers/protected.fir.kt b/compiler/testData/diagnostics/tests/modifiers/protected.fir.kt deleted file mode 100644 index 203b968c732..00000000000 --- a/compiler/testData/diagnostics/tests/modifiers/protected.fir.kt +++ /dev/null @@ -1,21 +0,0 @@ -class My(protected val x: Int) { - class Her(protected val x: Int) - - inner class Its(protected val x: Int) -} - -object Your { - protected fun foo() = 3 -} - -annotation class His(protected val x: Int) - -enum class Our(protected val x: Int) { - FIRST(42) { - protected fun foo() = 13 - } -} - -interface Their { - protected fun foo() = 7 -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/modifiers/protected.kt b/compiler/testData/diagnostics/tests/modifiers/protected.kt index 97b39c3169a..3edc611ba4c 100644 --- a/compiler/testData/diagnostics/tests/modifiers/protected.kt +++ b/compiler/testData/diagnostics/tests/modifiers/protected.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL class My(protected val x: Int) { class Her(protected val x: Int) diff --git a/compiler/testData/diagnostics/tests/scopes/kt1822.fir.kt b/compiler/testData/diagnostics/tests/scopes/kt1822.fir.kt index ed18d966a00..3b9ba501690 100644 --- a/compiler/testData/diagnostics/tests/scopes/kt1822.fir.kt +++ b/compiler/testData/diagnostics/tests/scopes/kt1822.fir.kt @@ -6,7 +6,7 @@ open class C { } interface T { - protected fun foo() {} + protected fun foo() {} } class G : C(), T { @@ -18,7 +18,7 @@ open class A { } interface B { - protected fun foo() {} + protected fun foo() {} } interface D { @@ -27,4 +27,4 @@ interface D { class E : A(), B, D { override fun foo() {} -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/scopes/visibility.fir.kt b/compiler/testData/diagnostics/tests/scopes/visibility.fir.kt index 734a85b1bed..c9c1589337a 100644 --- a/compiler/testData/diagnostics/tests/scopes/visibility.fir.kt +++ b/compiler/testData/diagnostics/tests/scopes/visibility.fir.kt @@ -3,8 +3,8 @@ //FILE:a.kt package test_visibility -protected class ProtectedClass -protected interface ProtectedTrait +protected class ProtectedClass +protected interface ProtectedTrait protected val protected_val : Int = 4 protected fun protected_fun() {} diff --git a/compiler/testData/diagnostics/tests/varargs/varargInSetter.fir.kt b/compiler/testData/diagnostics/tests/varargs/varargInSetter.fir.kt index 56b49f5cd9c..8dff30b3190 100644 --- a/compiler/testData/diagnostics/tests/varargs/varargInSetter.fir.kt +++ b/compiler/testData/diagnostics/tests/varargs/varargInSetter.fir.kt @@ -1,6 +1,6 @@ class My { var x: String = "" - set(vararg value) { + set(vararg value) { x = value } } diff --git a/compiler/testData/diagnostics/tests/variance/Visibility.fir.kt b/compiler/testData/diagnostics/tests/variance/Visibility.fir.kt deleted file mode 100644 index 9079ddad14d..00000000000 --- a/compiler/testData/diagnostics/tests/variance/Visibility.fir.kt +++ /dev/null @@ -1,20 +0,0 @@ -interface Test { - val internal_val: I - public val public_val: I - protected val protected_val: I - private val private_val: I - - var interlan_private_set: O - private set - public var public_private_set: O - private set - protected var protected_private_set: O - private set - private var private_private_set: O - private set - - fun internal_fun(i: O) : I - public fun public_fun(i: O) : I - protected fun protected_fun(i: O) : I - private fun private_fun(i: O) : I -} diff --git a/compiler/testData/diagnostics/tests/variance/Visibility.kt b/compiler/testData/diagnostics/tests/variance/Visibility.kt index 4c7fa06385a..15792ecb19d 100644 --- a/compiler/testData/diagnostics/tests/variance/Visibility.kt +++ b/compiler/testData/diagnostics/tests/variance/Visibility.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface Test { val internal_val: I public val public_val: I 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 4ec567ed5bd..28138755d2b 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 @@ -1083,6 +1083,22 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.WRONG_MODIFIER_CONTAINING_DECLARATION) { firDiagnostic -> + WrongModifierContainingDeclarationImpl( + firDiagnostic.a, + firDiagnostic.b, + firDiagnostic as FirPsiDiagnostic, + token, + ) + } + add(FirErrors.DEPRECATED_MODIFIER_CONTAINING_DECLARATION) { firDiagnostic -> + DeprecatedModifierContainingDeclarationImpl( + firDiagnostic.a, + firDiagnostic.b, + firDiagnostic as FirPsiDiagnostic, + token, + ) + } add(FirErrors.INLINE_CLASS_NOT_TOP_LEVEL) { firDiagnostic -> InlineClassNotTopLevelImpl( 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 9b1c2939e99..dacb46a7361 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 @@ -783,6 +783,18 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract val functionSymbol: KtFunctionLikeSymbol } + abstract class WrongModifierContainingDeclaration : KtFirDiagnostic() { + override val diagnosticClass get() = WrongModifierContainingDeclaration::class + abstract val modifier: String + abstract val target: String + } + + abstract class DeprecatedModifierContainingDeclaration : KtFirDiagnostic() { + override val diagnosticClass get() = DeprecatedModifierContainingDeclaration::class + abstract val modifier: String + abstract val target: String + } + abstract class InlineClassNotTopLevel : KtFirDiagnostic() { override val diagnosticClass get() = InlineClassNotTopLevel::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 d170e3fd74c..2e6aa4b72da 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 @@ -1243,6 +1243,24 @@ internal class InfixModifierRequiredImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class WrongModifierContainingDeclarationImpl( + override val modifier: String, + override val target: String, + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.WrongModifierContainingDeclaration(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + +internal class DeprecatedModifierContainingDeclarationImpl( + override val modifier: String, + override val target: String, + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.DeprecatedModifierContainingDeclaration(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + internal class InlineClassNotTopLevelImpl( firDiagnostic: FirPsiDiagnostic, override val token: ValidityToken,