diff --git a/compiler/fir/analysis-tests/testData/resolve/constVal/constValNotTopLevelOrObject.fir.txt b/compiler/fir/analysis-tests/testData/resolve/constVal/constValNotTopLevelOrObject.fir.txt index 2d2712c64fc..e3dc4423ed9 100644 --- a/compiler/fir/analysis-tests/testData/resolve/constVal/constValNotTopLevelOrObject.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/constVal/constValNotTopLevelOrObject.fir.txt @@ -11,10 +11,13 @@ FILE: constValNotTopLevelOrObject.kt } public final class C : R|kotlin/Any| { - public constructor(): R|C| { + public constructor(b: R|kotlin/Boolean|): R|C| { super() } + public final const val b: R|kotlin/Boolean| = R|/b| + public get(): R|kotlin/Boolean| + public final const val c: R|kotlin/Int| = Int(3) public get(): R|kotlin/Int| diff --git a/compiler/fir/analysis-tests/testData/resolve/constVal/constValNotTopLevelOrObject.kt b/compiler/fir/analysis-tests/testData/resolve/constVal/constValNotTopLevelOrObject.kt index 081508292d2..6a95133f9a6 100644 --- a/compiler/fir/analysis-tests/testData/resolve/constVal/constValNotTopLevelOrObject.kt +++ b/compiler/fir/analysis-tests/testData/resolve/constVal/constValNotTopLevelOrObject.kt @@ -4,7 +4,7 @@ object B { const val b = 2 } -class C { +class C(const val b: Boolean) { const val c = 3 } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt index 653140a46cf..031eba0172b 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ValueParameter.kt @@ -66,7 +66,7 @@ class ValueParameter( this.isExpect = isExpect isActual = modifiers.hasActual() isOverride = modifiers.hasOverride() - isConst = false + isConst = modifiers.hasConst() isLateInit = false } annotations += this@ValueParameter.firValueParameter.annotations diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/Modifier.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/Modifier.kt index 0abdafe02b5..e8fcfed057f 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/Modifier.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/Modifier.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.PARAMETER_MO import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.PLATFORM_MODIFIER import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.PROPERTY_MODIFIER import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.VISIBILITY_MODIFIER +import org.jetbrains.kotlin.lexer.KtTokens class Modifier( private val classModifiers: MutableList = mutableListOf(), @@ -34,23 +35,30 @@ class Modifier( fun addModifier(modifier: LighterASTNode, isInClass: Boolean = false) { val tokenType = modifier.tokenType + if (tokenType == KtTokens.CONST_KEYWORD) { + // Specific case because CONST may exist both on parameter and property + propertyModifier = PropertyModifier.CONST + parameterModifiers += ParameterModifier.CONST + return + } + val upperCasedModifier = modifier.toString().toUpperCase() when { INLINE_MODIFIER.contains(tokenType) -> { if (isInClass) - this.classModifiers += ClassModifier.valueOf(modifier.toString().toUpperCase()) + this.classModifiers += ClassModifier.valueOf(upperCasedModifier) else - this.functionModifiers += FunctionModifier.valueOf(modifier.toString().toUpperCase()) + this.functionModifiers += FunctionModifier.valueOf(upperCasedModifier) } - CLASS_MODIFIER.contains(tokenType) -> this.classModifiers += ClassModifier.valueOf(modifier.toString().toUpperCase()) - MEMBER_MODIFIER.contains(tokenType) -> this.memberModifiers += MemberModifier.valueOf(modifier.toString().toUpperCase()) + CLASS_MODIFIER.contains(tokenType) -> this.classModifiers += ClassModifier.valueOf(upperCasedModifier) + MEMBER_MODIFIER.contains(tokenType) -> this.memberModifiers += MemberModifier.valueOf(upperCasedModifier) VISIBILITY_MODIFIER.contains(tokenType) -> this.visibilityModifiers += - VisibilityModifier.valueOf(modifier.toString().toUpperCase()) - FUNCTION_MODIFIER.contains(tokenType) -> this.functionModifiers += FunctionModifier.valueOf(modifier.toString().toUpperCase()) - PROPERTY_MODIFIER.contains(tokenType) -> this.propertyModifier = PropertyModifier.valueOf(modifier.toString().toUpperCase()) + VisibilityModifier.valueOf(upperCasedModifier) + FUNCTION_MODIFIER.contains(tokenType) -> this.functionModifiers += FunctionModifier.valueOf(upperCasedModifier) + PROPERTY_MODIFIER.contains(tokenType) -> this.propertyModifier = PropertyModifier.valueOf(upperCasedModifier) INHERITANCE_MODIFIER.contains(tokenType) -> this.inheritanceModifiers += - InheritanceModifier.valueOf(modifier.toString().toUpperCase()) - PARAMETER_MODIFIER.contains(tokenType) -> this.parameterModifiers += ParameterModifier.valueOf(modifier.toString().toUpperCase()) - PLATFORM_MODIFIER.contains(tokenType) -> this.platformModifiers += PlatformModifier.valueOf(modifier.toString().toUpperCase()) + InheritanceModifier.valueOf(upperCasedModifier) + PARAMETER_MODIFIER.contains(tokenType) -> this.parameterModifiers += ParameterModifier.valueOf(upperCasedModifier) + PLATFORM_MODIFIER.contains(tokenType) -> this.platformModifiers += PlatformModifier.valueOf(upperCasedModifier) } } @@ -167,4 +175,8 @@ class Modifier( fun hasActual(): Boolean { return platformModifiers.contains(PlatformModifier.ACTUAL) || platformModifiers.contains(PlatformModifier.IMPL) } + + fun hasConst(): Boolean { + return parameterModifiers.contains(ParameterModifier.CONST) + } } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/ModifiersEnumSet.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/ModifiersEnumSet.kt index 779d27566d0..3700eaa1ef1 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/ModifiersEnumSet.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/modifier/ModifiersEnumSet.kt @@ -51,7 +51,8 @@ enum class InheritanceModifier { enum class ParameterModifier { VARARG, NOINLINE, - CROSSINLINE + CROSSINLINE, + CONST } enum class PlatformModifier { 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 1cb0e282638..4550ff88108 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 @@ -450,7 +450,7 @@ class RawFirBuilder( this.isExpect = isExpect isActual = hasActualModifier() isOverride = hasModifier(OVERRIDE_KEYWORD) - isConst = false + isConst = hasModifier(CONST_KEYWORD) isLateInit = false } val propertySource = toFirSourceElement(FirFakeSourceElementKind.PropertyFromParameter) diff --git a/compiler/testData/diagnostics/tests/modifiers/const/applicability.fir.kt b/compiler/testData/diagnostics/tests/modifiers/const/applicability.fir.kt index 28e7c7e45b6..1ef655c62fe 100644 --- a/compiler/testData/diagnostics/tests/modifiers/const/applicability.fir.kt +++ b/compiler/testData/diagnostics/tests/modifiers/const/applicability.fir.kt @@ -12,7 +12,7 @@ object A { const val inObject: Int = 4 } -class B(const val constructor: Int = 5) +class B(const val constructor: Int = 5) abstract class C { open const val x: Int = 6