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 final class C : R|kotlin/Any| {
public constructor(): R|C| { public constructor(b: R|kotlin/Boolean|): R|C| {
super<R|kotlin/Any|>() 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 final const val c: R|kotlin/Int| = Int(3)
public get(): R|kotlin/Int| public get(): R|kotlin/Int|
@@ -4,7 +4,7 @@ object B {
const val b = 2 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 <!CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT!>const<!> val c = 3
} }
@@ -66,7 +66,7 @@ class ValueParameter(
this.isExpect = isExpect this.isExpect = isExpect
isActual = modifiers.hasActual() isActual = modifiers.hasActual()
isOverride = modifiers.hasOverride() isOverride = modifiers.hasOverride()
isConst = false isConst = modifiers.hasConst()
isLateInit = false isLateInit = false
} }
annotations += this@ValueParameter.firValueParameter.annotations 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.PLATFORM_MODIFIER
import org.jetbrains.kotlin.fir.lightTree.fir.modifier.ModifierSets.PROPERTY_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.fir.lightTree.fir.modifier.ModifierSets.VISIBILITY_MODIFIER
import org.jetbrains.kotlin.lexer.KtTokens
class Modifier( class Modifier(
private val classModifiers: MutableList<ClassModifier> = mutableListOf(), private val classModifiers: MutableList<ClassModifier> = mutableListOf(),
@@ -34,23 +35,30 @@ class Modifier(
fun addModifier(modifier: LighterASTNode, isInClass: Boolean = false) { fun addModifier(modifier: LighterASTNode, isInClass: Boolean = false) {
val tokenType = modifier.tokenType 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 { when {
INLINE_MODIFIER.contains(tokenType) -> { INLINE_MODIFIER.contains(tokenType) -> {
if (isInClass) if (isInClass)
this.classModifiers += ClassModifier.valueOf(modifier.toString().toUpperCase()) this.classModifiers += ClassModifier.valueOf(upperCasedModifier)
else else
this.functionModifiers += FunctionModifier.valueOf(modifier.toString().toUpperCase()) this.functionModifiers += FunctionModifier.valueOf(upperCasedModifier)
} }
CLASS_MODIFIER.contains(tokenType) -> this.classModifiers += ClassModifier.valueOf(modifier.toString().toUpperCase()) CLASS_MODIFIER.contains(tokenType) -> this.classModifiers += ClassModifier.valueOf(upperCasedModifier)
MEMBER_MODIFIER.contains(tokenType) -> this.memberModifiers += MemberModifier.valueOf(modifier.toString().toUpperCase()) MEMBER_MODIFIER.contains(tokenType) -> this.memberModifiers += MemberModifier.valueOf(upperCasedModifier)
VISIBILITY_MODIFIER.contains(tokenType) -> this.visibilityModifiers += VISIBILITY_MODIFIER.contains(tokenType) -> this.visibilityModifiers +=
VisibilityModifier.valueOf(modifier.toString().toUpperCase()) VisibilityModifier.valueOf(upperCasedModifier)
FUNCTION_MODIFIER.contains(tokenType) -> this.functionModifiers += FunctionModifier.valueOf(modifier.toString().toUpperCase()) FUNCTION_MODIFIER.contains(tokenType) -> this.functionModifiers += FunctionModifier.valueOf(upperCasedModifier)
PROPERTY_MODIFIER.contains(tokenType) -> this.propertyModifier = PropertyModifier.valueOf(modifier.toString().toUpperCase()) PROPERTY_MODIFIER.contains(tokenType) -> this.propertyModifier = PropertyModifier.valueOf(upperCasedModifier)
INHERITANCE_MODIFIER.contains(tokenType) -> this.inheritanceModifiers += INHERITANCE_MODIFIER.contains(tokenType) -> this.inheritanceModifiers +=
InheritanceModifier.valueOf(modifier.toString().toUpperCase()) InheritanceModifier.valueOf(upperCasedModifier)
PARAMETER_MODIFIER.contains(tokenType) -> this.parameterModifiers += ParameterModifier.valueOf(modifier.toString().toUpperCase()) PARAMETER_MODIFIER.contains(tokenType) -> this.parameterModifiers += ParameterModifier.valueOf(upperCasedModifier)
PLATFORM_MODIFIER.contains(tokenType) -> this.platformModifiers += PlatformModifier.valueOf(modifier.toString().toUpperCase()) PLATFORM_MODIFIER.contains(tokenType) -> this.platformModifiers += PlatformModifier.valueOf(upperCasedModifier)
} }
} }
@@ -167,4 +175,8 @@ class Modifier(
fun hasActual(): Boolean { fun hasActual(): Boolean {
return platformModifiers.contains(PlatformModifier.ACTUAL) || platformModifiers.contains(PlatformModifier.IMPL) 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 { enum class ParameterModifier {
VARARG, VARARG,
NOINLINE, NOINLINE,
CROSSINLINE CROSSINLINE,
CONST
} }
enum class PlatformModifier { enum class PlatformModifier {
@@ -450,7 +450,7 @@ class RawFirBuilder(
this.isExpect = isExpect this.isExpect = isExpect
isActual = hasActualModifier() isActual = hasActualModifier()
isOverride = hasModifier(OVERRIDE_KEYWORD) isOverride = hasModifier(OVERRIDE_KEYWORD)
isConst = false isConst = hasModifier(CONST_KEYWORD)
isLateInit = false isLateInit = false
} }
val propertySource = toFirSourceElement(FirFakeSourceElementKind.PropertyFromParameter) val propertySource = toFirSourceElement(FirFakeSourceElementKind.PropertyFromParameter)
@@ -12,7 +12,7 @@ object A {
const val inObject: Int = 4 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 { abstract class C {
<!INCOMPATIBLE_MODIFIERS!>open<!> <!CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT, INCOMPATIBLE_MODIFIERS!>const<!> val x: Int = 6 <!INCOMPATIBLE_MODIFIERS!>open<!> <!CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT, INCOMPATIBLE_MODIFIERS!>const<!> val x: Int = 6