diff --git a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java index 60572a256b5..f1192a0bd3b 100644 --- a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java +++ b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java @@ -920,6 +920,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract public void testConstValNotTopLevelOrObject() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/constVal/constValNotTopLevelOrObject.kt"); } + + @TestMetadata("constValWithGetterOrDelegate.kt") + public void testConstValWithGetterOrDelegate() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/constVal/constValWithGetterOrDelegate.kt"); + } } @TestMetadata("compiler/fir/analysis-tests/testData/resolve/constructors") diff --git a/compiler/fir/analysis-tests/testData/resolve/constVal/constValWithGetterOrDelegate.fir.txt b/compiler/fir/analysis-tests/testData/resolve/constVal/constValWithGetterOrDelegate.fir.txt new file mode 100644 index 00000000000..0f130a09388 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/constVal/constValWithGetterOrDelegate.fir.txt @@ -0,0 +1,33 @@ +FILE: constValWithGetterOrDelegate.kt + public final const val f: R|kotlin/Int| = Int(24) + public get(): R|kotlin/Int| + public final const val l: R|kotlin/Int| = Int(3) + public get(): R|kotlin/Int| + public final const val k: R|kotlin/Int| + public get(): R|kotlin/Int| + public final const val t: R|kotlin/Int| + public get(): R|kotlin/Int| { + ^ Int(24) + } + public final class Test : R|kotlin/Any| { + public constructor(): R|Test| { + super() + } + + public final operator fun getValue(nothing: R|kotlin/Nothing?|, property: R|kotlin/reflect/KProperty<*>|): R|kotlin/Int| { + ^getValue Int(123) + } + + } + public final const val delegated: R|kotlin/Int|by R|/Test.Test|() + public get(): R|kotlin/Int| { + ^ D|/delegated|.R|/Test.getValue|(Null(null), ::R|/delegated|) + } + public final const val e: R|kotlin/Boolean| + public get(): R|kotlin/Boolean| { + ^ Boolean(false) + } + public final const val property: R|kotlin/String| = String(123) + public get(): R|kotlin/String| { + ^ F|/property|.R|kotlin/String.plus|(String( 123 123)) + } diff --git a/compiler/fir/analysis-tests/testData/resolve/constVal/constValWithGetterOrDelegate.kt b/compiler/fir/analysis-tests/testData/resolve/constVal/constValWithGetterOrDelegate.kt new file mode 100644 index 00000000000..f121923a22d --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/constVal/constValWithGetterOrDelegate.kt @@ -0,0 +1,26 @@ +import kotlin.reflect.KProperty + +const val f = 24 + +const val l = 3 + get + +const val k: Int + get + +const val t: Int + get() = 24 + +class Test { + operator fun getValue(nothing: Nothing?, property: KProperty<*>): Int { + return 123 + } +} + +const val delegated: Int by Test() + +const val e: Boolean + get() = false + +const val property: String = "123" + get() = field + " 123 123" diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java index f981b0a3753..f49b6317d0f 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java @@ -1062,6 +1062,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { public void testConstValNotTopLevelOrObject() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/constVal/constValNotTopLevelOrObject.kt"); } + + @Test + @TestMetadata("constValWithGetterOrDelegate.kt") + public void testConstValWithGetterOrDelegate() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/constVal/constValWithGetterOrDelegate.kt"); + } } @Nested diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java index 31bdc2aca4f..7695c53beca 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java @@ -1071,6 +1071,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos public void testConstValNotTopLevelOrObject() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/constVal/constValNotTopLevelOrObject.kt"); } + + @Test + @TestMetadata("constValWithGetterOrDelegate.kt") + public void testConstValWithGetterOrDelegate() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/constVal/constValWithGetterOrDelegate.kt"); + } } @Nested 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 52ab0d5610e..28956af4663 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 @@ -391,6 +391,8 @@ object DIAGNOSTICS_LIST : DiagnosticList() { val EXPECTED_PRIVATE_DECLARATION by error(PositioningStrategy.VISIBILITY_MODIFIER) val VAL_WITH_SETTER by error() val CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT by error(PositioningStrategy.CONST_MODIFIER) + val CONST_VAL_WITH_GETTER by error() + val CONST_VAL_WITH_DELEGATE by error() } val MPP_PROJECTS by object : DiagnosticGroup("Multi-platform projects") { 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 1109af04a32..eb8598e7be6 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 @@ -259,6 +259,8 @@ object FirErrors { val EXPECTED_PRIVATE_DECLARATION by error0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val VAL_WITH_SETTER by error0() val CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT by error0(SourceElementPositioningStrategies.CONST_MODIFIER) + val CONST_VAL_WITH_GETTER by error0() + val CONST_VAL_WITH_DELEGATE by error0() // Multi-platform projects val EXPECTED_DECLARATION_WITH_BODY by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstPropertyChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstPropertyChecker.kt index 130b10113b2..f9455a87124 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstPropertyChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstPropertyChecker.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.fir.FirFakeSourceElementKind 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 @@ -31,9 +32,15 @@ object FirConstPropertyChecker : FirPropertyChecker() { reporter.reportOn(declaration.source, FirErrors.CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT, context) } + if (declaration.getter?.source?.kind !is FirFakeSourceElementKind) { + reporter.reportOn(declaration.getter?.source, FirErrors.CONST_VAL_WITH_GETTER, context) + } + + if (declaration.delegate != null) { + reporter.reportOn(declaration.delegate?.source, FirErrors.CONST_VAL_WITH_DELEGATE, context) + } + // TODO: Implement checkers for these errors (see ConstModifierChecker in FE1.0): - // - CONST_VAL_WITH_DELEGATE - // - CONST_VAL_WITH_GETTER // - TYPE_CANT_BE_USED_FOR_CONST_VAL // - CONST_VAL_WITHOUT_INITIALIZER // - CONST_VAL_WITH_NON_CONST_INITIALIZER diff --git a/compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.fir.kt b/compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.fir.kt deleted file mode 100644 index fe6db488f48..00000000000 --- a/compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.fir.kt +++ /dev/null @@ -1,12 +0,0 @@ -// !DIAGNOSTICS: -CAST_NEVER_SUCCEEDS -UNUSED_PARAMETER - -class Foo - -fun getFoo(value: T) = null as Foo> -fun takeLambda(block: () -> R) {} - -fun main(x: Int) { - takeLambda { - getFoo(x) - } -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.kt b/compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.kt index fe6db488f48..20dc27e2090 100644 --- a/compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.kt +++ b/compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -CAST_NEVER_SUCCEEDS -UNUSED_PARAMETER class Foo diff --git a/compiler/testData/diagnostics/tests/modifiers/const/applicability.fir.kt b/compiler/testData/diagnostics/tests/modifiers/const/applicability.fir.kt index 2c8398c8ee9..e60620ff353 100644 --- a/compiler/testData/diagnostics/tests/modifiers/const/applicability.fir.kt +++ b/compiler/testData/diagnostics/tests/modifiers/const/applicability.fir.kt @@ -38,14 +38,14 @@ object D : C() { } } -const val delegated: Int by Delegate() +const val delegated: Int by Delegate() const val withGetter: Int - get() = 13 + get() = 13 const val withExplicitDefaultGetter: Int = 1 - get + get fun foo(): Int { const val local: Int = 14 @@ -68,7 +68,7 @@ class Outer { } const val defaultGetter = 19 - get + get const val nonConstInitializer1 = foo() const val nonConstInitializer2 = 1 as String diff --git a/compiler/testData/diagnostics/tests/modifiers/const/types.fir.kt b/compiler/testData/diagnostics/tests/modifiers/const/types.fir.kt index 6561f993d29..a47b3b67a78 100644 --- a/compiler/testData/diagnostics/tests/modifiers/const/types.fir.kt +++ b/compiler/testData/diagnostics/tests/modifiers/const/types.fir.kt @@ -14,4 +14,4 @@ const val intArrayConst: IntArray = intArrayOf() const val unresolvedConst1 = Unresolved const var unresolvedConst2 = Unresolved const val unresolvedConst3 = Unresolved -get() = 10 +get() = 10 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 bfba6ada004..16d4637f034 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 @@ -1160,6 +1160,18 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.CONST_VAL_WITH_GETTER) { firDiagnostic -> + ConstValWithGetterImpl( + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } + add(FirErrors.CONST_VAL_WITH_DELEGATE) { firDiagnostic -> + ConstValWithDelegateImpl( + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } add(FirErrors.EXPECTED_DECLARATION_WITH_BODY) { firDiagnostic -> ExpectedDeclarationWithBodyImpl( 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 2cd04548b8e..ae64f1a3794 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 @@ -815,6 +815,14 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = ConstValNotTopLevelOrObject::class } + abstract class ConstValWithGetter : KtFirDiagnostic() { + override val diagnosticClass get() = ConstValWithGetter::class + } + + abstract class ConstValWithDelegate : KtFirDiagnostic() { + override val diagnosticClass get() = ConstValWithDelegate::class + } + abstract class ExpectedDeclarationWithBody : KtFirDiagnostic() { override val diagnosticClass get() = ExpectedDeclarationWithBody::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 0afd391bf5b..142aded74fd 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 @@ -1326,6 +1326,20 @@ internal class ConstValNotTopLevelOrObjectImpl( override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } +internal class ConstValWithGetterImpl( + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.ConstValWithGetter(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + +internal class ConstValWithDelegateImpl( + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.ConstValWithDelegate(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + internal class ExpectedDeclarationWithBodyImpl( firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken,