Generate const val initializers as IrConst expressions
This commit is contained in:
+10
-3
@@ -16,7 +16,6 @@
|
||||
|
||||
package org.jetbrains.kotlin.psi2ir.generators
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrPropertyImpl
|
||||
@@ -32,7 +31,6 @@ import org.jetbrains.kotlin.psi2ir.pureEndOffsetOrUndefined
|
||||
import org.jetbrains.kotlin.psi2ir.pureStartOffsetOrUndefined
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.hasBackingField
|
||||
import org.jetbrains.kotlin.resolve.source.KotlinSourceElement
|
||||
|
||||
class PropertyGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) {
|
||||
fun generatePropertyDeclaration(ktProperty: KtProperty): IrProperty {
|
||||
@@ -112,7 +110,16 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
|
||||
if (propertyDescriptor.hasBackingField(context.bindingContext))
|
||||
generatePropertyBackingField(ktProperty, propertyDescriptor) { irField ->
|
||||
ktProperty.initializer?.let { ktInitializer ->
|
||||
declarationGenerator.generateInitializerBody(irField.symbol, ktInitializer)
|
||||
val compileTimeConst = propertyDescriptor.compileTimeInitializer
|
||||
if (propertyDescriptor.isConst && compileTimeConst != null)
|
||||
IrExpressionBodyImpl(
|
||||
context.constantValueGenerator.generateConstantValueAsExpression(
|
||||
ktInitializer.startOffset, ktInitializer.endOffset,
|
||||
compileTimeConst
|
||||
)
|
||||
)
|
||||
else
|
||||
declarationGenerator.generateInitializerBody(irField.symbol, ktInitializer)
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
const val I0 = 0
|
||||
const val I1 = 1
|
||||
const val I2 = I0 + I1 + I1
|
||||
|
||||
const val STR1 = "String1"
|
||||
const val STR2 = "String" + "2"
|
||||
const val STR3 = STR1 + STR2
|
||||
const val STR4 = "$STR1$STR2"
|
||||
@@ -0,0 +1,64 @@
|
||||
FILE fqName:<root> fileName:/constValInitializers.kt
|
||||
PROPERTY name:I0 visibility:public modality:FINAL flags:const,val
|
||||
FIELD PROPERTY_BACKING_FIELD name:I0 type:kotlin.Int visibility:public flags:final,static
|
||||
EXPRESSION_BODY
|
||||
CONST Int type=kotlin.Int value=0
|
||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-I0> visibility:public modality:FINAL <> () returnType:kotlin.Int flags:
|
||||
correspondingProperty: PROPERTY name:I0 visibility:public modality:FINAL flags:const,val
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-I0>(): Int'
|
||||
GET_FIELD 'I0: Int' type=kotlin.Int origin=null
|
||||
PROPERTY name:I1 visibility:public modality:FINAL flags:const,val
|
||||
FIELD PROPERTY_BACKING_FIELD name:I1 type:kotlin.Int visibility:public flags:final,static
|
||||
EXPRESSION_BODY
|
||||
CONST Int type=kotlin.Int value=1
|
||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-I1> visibility:public modality:FINAL <> () returnType:kotlin.Int flags:
|
||||
correspondingProperty: PROPERTY name:I1 visibility:public modality:FINAL flags:const,val
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-I1>(): Int'
|
||||
GET_FIELD 'I1: Int' type=kotlin.Int origin=null
|
||||
PROPERTY name:I2 visibility:public modality:FINAL flags:const,val
|
||||
FIELD PROPERTY_BACKING_FIELD name:I2 type:kotlin.Int visibility:public flags:final,static
|
||||
EXPRESSION_BODY
|
||||
CONST Int type=kotlin.Int value=2
|
||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-I2> visibility:public modality:FINAL <> () returnType:kotlin.Int flags:
|
||||
correspondingProperty: PROPERTY name:I2 visibility:public modality:FINAL flags:const,val
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-I2>(): Int'
|
||||
GET_FIELD 'I2: Int' type=kotlin.Int origin=null
|
||||
PROPERTY name:STR1 visibility:public modality:FINAL flags:const,val
|
||||
FIELD PROPERTY_BACKING_FIELD name:STR1 type:kotlin.String visibility:public flags:final,static
|
||||
EXPRESSION_BODY
|
||||
CONST String type=kotlin.String value=String1
|
||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-STR1> visibility:public modality:FINAL <> () returnType:kotlin.String flags:
|
||||
correspondingProperty: PROPERTY name:STR1 visibility:public modality:FINAL flags:const,val
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-STR1>(): String'
|
||||
GET_FIELD 'STR1: String' type=kotlin.String origin=null
|
||||
PROPERTY name:STR2 visibility:public modality:FINAL flags:const,val
|
||||
FIELD PROPERTY_BACKING_FIELD name:STR2 type:kotlin.String visibility:public flags:final,static
|
||||
EXPRESSION_BODY
|
||||
CONST String type=kotlin.String value=String2
|
||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-STR2> visibility:public modality:FINAL <> () returnType:kotlin.String flags:
|
||||
correspondingProperty: PROPERTY name:STR2 visibility:public modality:FINAL flags:const,val
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-STR2>(): String'
|
||||
GET_FIELD 'STR2: String' type=kotlin.String origin=null
|
||||
PROPERTY name:STR3 visibility:public modality:FINAL flags:const,val
|
||||
FIELD PROPERTY_BACKING_FIELD name:STR3 type:kotlin.String visibility:public flags:final,static
|
||||
EXPRESSION_BODY
|
||||
CONST String type=kotlin.String value=String1String2
|
||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-STR3> visibility:public modality:FINAL <> () returnType:kotlin.String flags:
|
||||
correspondingProperty: PROPERTY name:STR3 visibility:public modality:FINAL flags:const,val
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-STR3>(): String'
|
||||
GET_FIELD 'STR3: String' type=kotlin.String origin=null
|
||||
PROPERTY name:STR4 visibility:public modality:FINAL flags:const,val
|
||||
FIELD PROPERTY_BACKING_FIELD name:STR4 type:kotlin.String visibility:public flags:final,static
|
||||
EXPRESSION_BODY
|
||||
CONST String type=kotlin.String value=String1String2
|
||||
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-STR4> visibility:public modality:FINAL <> () returnType:kotlin.String flags:
|
||||
correspondingProperty: PROPERTY name:STR4 visibility:public modality:FINAL flags:const,val
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-STR4>(): String'
|
||||
GET_FIELD 'STR4: String' type=kotlin.String origin=null
|
||||
@@ -229,6 +229,11 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase {
|
||||
runTest("compiler/testData/ir/irText/declarations/classLevelProperties.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("constValInitializers.kt")
|
||||
public void testConstValInitializers() throws Exception {
|
||||
runTest("compiler/testData/ir/irText/declarations/constValInitializers.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("defaultArguments.kt")
|
||||
public void testDefaultArguments() throws Exception {
|
||||
runTest("compiler/testData/ir/irText/declarations/defaultArguments.kt");
|
||||
|
||||
Reference in New Issue
Block a user