Generate const val initializers as IrConst expressions

This commit is contained in:
Dmitry Petrov
2018-09-21 13:30:13 +03:00
parent 75b27f890a
commit 8891733074
4 changed files with 87 additions and 3 deletions
@@ -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");