From 8891733074821c9a4db2595ca04b46a8f2363461 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 21 Sep 2018 13:30:13 +0300 Subject: [PATCH] Generate const val initializers as IrConst expressions --- .../psi2ir/generators/PropertyGenerator.kt | 13 +++- .../declarations/constValInitializers.kt | 8 +++ .../declarations/constValInitializers.txt | 64 +++++++++++++++++++ .../kotlin/ir/IrTextTestCaseGenerated.java | 5 ++ 4 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/ir/irText/declarations/constValInitializers.kt create mode 100644 compiler/testData/ir/irText/declarations/constValInitializers.txt diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt index ab53ad8220a..d549ea73b5e 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt @@ -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 diff --git a/compiler/testData/ir/irText/declarations/constValInitializers.kt b/compiler/testData/ir/irText/declarations/constValInitializers.kt new file mode 100644 index 00000000000..f8f885d9b8a --- /dev/null +++ b/compiler/testData/ir/irText/declarations/constValInitializers.kt @@ -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" diff --git a/compiler/testData/ir/irText/declarations/constValInitializers.txt b/compiler/testData/ir/irText/declarations/constValInitializers.txt new file mode 100644 index 00000000000..8571982cf1e --- /dev/null +++ b/compiler/testData/ir/irText/declarations/constValInitializers.txt @@ -0,0 +1,64 @@ +FILE fqName: 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: 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='(): 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: 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='(): 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: 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='(): 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: 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='(): 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: 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='(): 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: 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='(): 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: 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='(): String' + GET_FIELD 'STR4: String' type=kotlin.String origin=null diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index 5f7feca1c15..def9ec3d30b 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -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");