FIR: set isConst on primary constructor properties

This commit is contained in:
Mikhail Glukhikh
2021-03-04 12:09:14 +03:00
parent d7a6fc80b0
commit 6470b713d5
7 changed files with 32 additions and 16 deletions
@@ -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<R|kotlin/Any|>()
}
public final const val b: R|kotlin/Boolean| = R|<local>/b|
public get(): R|kotlin/Boolean|
public final const val c: R|kotlin/Int| = Int(3)
public get(): R|kotlin/Int|
@@ -4,7 +4,7 @@ object B {
const val b = 2
}
class C {
class C(<!CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT!>const<!> val b: Boolean) {
<!CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT!>const<!> val c = 3
}
@@ -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
@@ -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<ClassModifier> = 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)
}
}
@@ -51,7 +51,8 @@ enum class InheritanceModifier {
enum class ParameterModifier {
VARARG,
NOINLINE,
CROSSINLINE
CROSSINLINE,
CONST
}
enum class PlatformModifier {
@@ -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)
@@ -12,7 +12,7 @@ object A {
const val inObject: Int = 4
}
class B(const val constructor: Int = 5)
class B(<!CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT!>const<!> val constructor: Int = 5)
abstract class C {
<!INCOMPATIBLE_MODIFIERS!>open<!> <!CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT, INCOMPATIBLE_MODIFIERS!>const<!> val x: Int = 6