diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrCompileTimeChecker.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrCompileTimeChecker.kt index cf9bdd15d16..dc9e02adf91 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrCompileTimeChecker.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/checker/IrCompileTimeChecker.kt @@ -197,12 +197,16 @@ class IrCompileTimeChecker( override fun visitFunctionReference(expression: IrFunctionReference, data: Nothing?): Boolean { val owner = expression.symbol.owner - if (!mode.canEvaluateFunction(owner)) return false - val dispatchReceiverComputable = expression.dispatchReceiver?.accept(this, null) ?: true val extensionReceiverComputable = expression.extensionReceiver?.accept(this, null) ?: true - val bodyComputable = owner.asVisited { if (mode.canEvaluateBody(owner)) owner.body?.accept(this, null) ?: true else true } + if (mode == EvaluationMode.ONLY_INTRINSIC_CONST) { + return dispatchReceiverComputable && extensionReceiverComputable + } else if (!mode.canEvaluateFunction(owner)) { + return false + } + + val bodyComputable = owner.asVisited { if (mode.canEvaluateBody(owner)) owner.body?.accept(this, null) ?: true else true } return dispatchReceiverComputable && extensionReceiverComputable && bodyComputable } @@ -269,7 +273,14 @@ class IrCompileTimeChecker( } override fun visitPropertyReference(expression: IrPropertyReference, data: Nothing?): Boolean { - return mode.canEvaluateFunction(expression.getter!!.owner) + val dispatchReceiverComputable = expression.dispatchReceiver?.accept(this, null) ?: true + val extensionReceiverComputable = expression.extensionReceiver?.accept(this, null) ?: true + + if (mode == EvaluationMode.ONLY_INTRINSIC_CONST) { + return dispatchReceiverComputable && extensionReceiverComputable + } + val getterIsComputable = expression.getter?.let { mode.canEvaluateFunction(it.owner) } ?: false + return dispatchReceiverComputable && extensionReceiverComputable && getterIsComputable } override fun visitClassReference(expression: IrClassReference, data: Nothing?): Boolean { diff --git a/compiler/testData/ir/loweredIr/interpreter/constTrimIndent.kt b/compiler/testData/ir/loweredIr/interpreter/constTrimIndent.kt new file mode 100644 index 00000000000..7572b0435e1 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/constTrimIndent.kt @@ -0,0 +1,8 @@ +// WITH_STDLIB +const val trimIndent = "123".trimIndent() +const val complexTrimIndent = + """ + ABC + 123 + 456 + """.trimIndent() \ No newline at end of file diff --git a/compiler/testData/ir/loweredIr/interpreter/constTrimIndent_ConstEvaluationLowering.ir b/compiler/testData/ir/loweredIr/interpreter/constTrimIndent_ConstEvaluationLowering.ir new file mode 100644 index 00000000000..9742ecc8de5 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/constTrimIndent_ConstEvaluationLowering.ir @@ -0,0 +1,21 @@ +// --- IR for
after Evaluate functions that are marked as `Foldable` +MODULE_FRAGMENT name:
+ FILE fqName: fileName:/constTrimIndent.kt + PROPERTY name:trimIndent visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:trimIndent type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="123" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:trimIndent visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:trimIndent type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:complexTrimIndent visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:complexTrimIndent type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="ABC\n123\n456" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:complexTrimIndent visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:complexTrimIndent type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null diff --git a/compiler/testData/ir/loweredIr/interpreter/constTrimMargin.kt b/compiler/testData/ir/loweredIr/interpreter/constTrimMargin.kt new file mode 100644 index 00000000000..856c77bf169 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/constTrimMargin.kt @@ -0,0 +1,12 @@ +// WITH_STDLIB +const val trimMargin = "123".trimMargin() + +const val trimMarginDefault = """ABC + |123 + |456""".trimMargin() + +const val withoutMargin = """ + #XYZ + #foo + #bar +""".trimMargin("#") diff --git a/compiler/testData/ir/loweredIr/interpreter/constTrimMargin_ConstEvaluationLowering.ir b/compiler/testData/ir/loweredIr/interpreter/constTrimMargin_ConstEvaluationLowering.ir new file mode 100644 index 00000000000..6bb9e957a93 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/constTrimMargin_ConstEvaluationLowering.ir @@ -0,0 +1,30 @@ +// --- IR for
after Evaluate functions that are marked as `Foldable` +MODULE_FRAGMENT name:
+ FILE fqName: fileName:/constTrimMargin.kt + PROPERTY name:trimMargin visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:trimMargin type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="123" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:trimMargin visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:trimMargin type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:trimMarginDefault visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:trimMarginDefault type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="ABC\n123\n456" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:trimMarginDefault visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:trimMarginDefault type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:withoutMargin visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:withoutMargin type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="XYZ\nfoo\nbar" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:withoutMargin visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:withoutMargin type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null diff --git a/compiler/testData/ir/loweredIr/interpreter/enumName.kt b/compiler/testData/ir/loweredIr/interpreter/enumName.kt new file mode 100644 index 00000000000..86007e6142b --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/enumName.kt @@ -0,0 +1,8 @@ +enum class EnumClass { + OK, VALUE, anotherValue, WITH_UNDERSCORE +} + +const val name1 = EnumClass.OK.name +const val name2 = EnumClass.VALUE.name +const val name3 = EnumClass.anotherValue.name +const val name4 = EnumClass.WITH_UNDERSCORE.name diff --git a/compiler/testData/ir/loweredIr/interpreter/enumName_ConstEvaluationLowering.ir b/compiler/testData/ir/loweredIr/interpreter/enumName_ConstEvaluationLowering.ir new file mode 100644 index 00000000000..278f06ac307 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/enumName_ConstEvaluationLowering.ir @@ -0,0 +1,111 @@ +// --- IR for
after Evaluate functions that are marked as `Foldable` +MODULE_FRAGMENT name:
+ FILE fqName: fileName:/enumName.kt + CLASS ENUM_CLASS name:EnumClass modality:FINAL visibility:public superTypes:[kotlin.Enum<.EnumClass>] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.EnumClass + CONSTRUCTOR visibility:private <> () returnType:.EnumClass [primary] + BLOCK_BODY + ENUM_CONSTRUCTOR_CALL 'public constructor (name: kotlin.String, ordinal: kotlin.Int) [primary] declared in kotlin.Enum' + : .EnumClass + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS ENUM_CLASS name:EnumClass modality:FINAL visibility:public superTypes:[kotlin.Enum<.EnumClass>]' + ENUM_ENTRY name:OK + init: EXPRESSION_BODY + ENUM_CONSTRUCTOR_CALL 'private constructor () [primary] declared in .EnumClass' + ENUM_ENTRY name:VALUE + init: EXPRESSION_BODY + ENUM_CONSTRUCTOR_CALL 'private constructor () [primary] declared in .EnumClass' + ENUM_ENTRY name:anotherValue + init: EXPRESSION_BODY + ENUM_CONSTRUCTOR_CALL 'private constructor () [primary] declared in .EnumClass' + ENUM_ENTRY name:WITH_UNDERSCORE + init: EXPRESSION_BODY + ENUM_CONSTRUCTOR_CALL 'private constructor () [primary] declared in .EnumClass' + PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL [fake_override,val] + annotations: + Foldable + overridden: + public final name: kotlin.String [val] + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum<.EnumClass>) returnType:kotlin.String [fake_override] + correspondingProperty: PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL [fake_override,val] + overridden: + public final fun (): kotlin.String declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum<.EnumClass> + PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL [fake_override,val] + overridden: + public final ordinal: kotlin.Int [val] + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum<.EnumClass>) returnType:kotlin.Int [fake_override] + correspondingProperty: PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL [fake_override,val] + overridden: + public final fun (): kotlin.Int declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum<.EnumClass> + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum<.EnumClass>) returnType:kotlin.Any [fake_override] + overridden: + protected final fun clone (): kotlin.Any declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum<.EnumClass> + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum<.EnumClass>, other:.EnumClass) returnType:kotlin.Int [fake_override,operator] + overridden: + public final fun compareTo (other: E of kotlin.Enum): kotlin.Int [operator] declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum<.EnumClass> + VALUE_PARAMETER name:other index:0 type:.EnumClass + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum<.EnumClass>, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public final fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum<.EnumClass> + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:finalize visibility:protected/*protected and package*/ modality:FINAL <> ($this:kotlin.Enum<.EnumClass>) returnType:kotlin.Unit [fake_override] + overridden: + protected/*protected and package*/ final fun finalize (): kotlin.Unit declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum<.EnumClass> + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum<.EnumClass>) returnType:@[FlexibleNullability] java.lang.Class<@[FlexibleNullability] .EnumClass?>? [fake_override] + overridden: + public final fun getDeclaringClass (): @[FlexibleNullability] java.lang.Class<@[FlexibleNullability] E of kotlin.Enum?>? declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum<.EnumClass> + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum<.EnumClass>) returnType:kotlin.Int [fake_override] + overridden: + public final fun hashCode (): kotlin.Int declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum<.EnumClass> + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum<.EnumClass>) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum<.EnumClass> + FUN ENUM_CLASS_SPECIAL_MEMBER name:values visibility:public modality:FINAL <> () returnType:kotlin.Array<.EnumClass> + SYNTHETIC_BODY kind=ENUM_VALUES + FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:.EnumClass + VALUE_PARAMETER name:value index:0 type:kotlin.String + SYNTHETIC_BODY kind=ENUM_VALUEOF + PROPERTY name:name1 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:name1 type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="OK" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:name1 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:name1 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:name2 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:name2 type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="VALUE" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:name2 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:name2 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:name3 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:name3 type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="anotherValue" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:name3 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:name3 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:name4 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:name4 type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="WITH_UNDERSCORE" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:name4 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:name4 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null diff --git a/compiler/testData/ir/loweredIr/interpreter/ifConstVal.kt b/compiler/testData/ir/loweredIr/interpreter/ifConstVal.kt new file mode 100644 index 00000000000..c4a0fa72622 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/ifConstVal.kt @@ -0,0 +1,17 @@ +const val flag = true +const val value = 10 +const val condition = if (flag) "True" else "Error" +const val withWhen = when (flag) { + true -> "True" + else -> "Error" +} +const val withWhen2 = when { + flag == true -> "True" + else -> "Error" +} +const val withWhen3 = when(value) { + 10 -> "1" + 100 -> "2" + else -> "3" +} +const val multibranchIf = if (value == 100) 1 else if (value == 1000) 2 else 3 diff --git a/compiler/testData/ir/loweredIr/interpreter/ifConstVal_ConstEvaluationLowering.ir b/compiler/testData/ir/loweredIr/interpreter/ifConstVal_ConstEvaluationLowering.ir new file mode 100644 index 00000000000..1bd0ee74246 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/ifConstVal_ConstEvaluationLowering.ir @@ -0,0 +1,66 @@ +// --- IR for
after Evaluate functions that are marked as `Foldable` +MODULE_FRAGMENT name:
+ FILE fqName: fileName:/ifConstVal.kt + PROPERTY name:flag visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:flag type:kotlin.Boolean visibility:public [final,static] + EXPRESSION_BODY + CONST Boolean type=kotlin.Boolean value=true + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Boolean + correspondingProperty: PROPERTY name:flag visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Boolean declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:flag type:kotlin.Boolean visibility:public [final,static]' type=kotlin.Boolean origin=null + PROPERTY name:value visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:value type:kotlin.Int visibility:public [final,static] + EXPRESSION_BODY + CONST Int type=kotlin.Int value=10 + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Int + correspondingProperty: PROPERTY name:value visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:value type:kotlin.Int visibility:public [final,static]' type=kotlin.Int origin=null + PROPERTY name:condition visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:condition type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="True" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:condition visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:condition type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:withWhen visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:withWhen type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="True" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:withWhen visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:withWhen type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:withWhen2 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:withWhen2 type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="True" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:withWhen2 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:withWhen2 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:withWhen3 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:withWhen3 type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="1" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:withWhen3 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:withWhen3 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:multibranchIf visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:multibranchIf type:kotlin.Int visibility:public [final,static] + EXPRESSION_BODY + CONST Int type=kotlin.Int value=3 + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Int + correspondingProperty: PROPERTY name:multibranchIf visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:multibranchIf type:kotlin.Int visibility:public [final,static]' type=kotlin.Int origin=null diff --git a/compiler/testData/ir/loweredIr/interpreter/kCallableName.kt b/compiler/testData/ir/loweredIr/interpreter/kCallableName.kt new file mode 100644 index 00000000000..89115b32b6b --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/kCallableName.kt @@ -0,0 +1,10 @@ +class A(val OK: Int, val somePropertyWithLongName: String) { + fun foo() {} +} +val topLevelProp = 1 + +const val propertyName1 = A::OK.name +const val propertyName2 = A::somePropertyWithLongName.name +const val methodName = A::foo.name +const val className = ::A.name +const val topLevelPropName = ::topLevelProp.name diff --git a/compiler/testData/ir/loweredIr/interpreter/kCallableName_ConstEvaluationLowering.ir b/compiler/testData/ir/loweredIr/interpreter/kCallableName_ConstEvaluationLowering.ir new file mode 100644 index 00000000000..9a5f48b82b7 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/kCallableName_ConstEvaluationLowering.ir @@ -0,0 +1,103 @@ +// --- IR for
after Evaluate functions that are marked as `Foldable` +MODULE_FRAGMENT name:
+ FILE fqName: fileName:/kCallableName.kt + CLASS CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.A + CONSTRUCTOR visibility:public <> (OK:kotlin.Int, somePropertyWithLongName:kotlin.String) returnType:.A [primary] + VALUE_PARAMETER name:OK index:0 type:kotlin.Int + VALUE_PARAMETER name:somePropertyWithLongName index:1 type:kotlin.String + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' + PROPERTY name:OK visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:OK type:kotlin.Int visibility:private [final] + EXPRESSION_BODY + GET_VAR 'OK: kotlin.Int declared in .A.' type=kotlin.Int origin=INITIALIZE_PROPERTY_FROM_PARAMETER + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.A) returnType:kotlin.Int + correspondingProperty: PROPERTY name:OK visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:.A + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in .A' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:OK type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null + receiver: GET_VAR ': .A declared in .A.' type=.A origin=null + PROPERTY name:somePropertyWithLongName visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:somePropertyWithLongName type:kotlin.String visibility:private [final] + EXPRESSION_BODY + GET_VAR 'somePropertyWithLongName: kotlin.String declared in .A.' type=kotlin.String origin=INITIALIZE_PROPERTY_FROM_PARAMETER + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.A) returnType:kotlin.String + correspondingProperty: PROPERTY name:somePropertyWithLongName visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:.A + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in .A' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:somePropertyWithLongName type:kotlin.String visibility:private [final]' type=kotlin.String origin=null + receiver: GET_VAR ': .A declared in .A.' type=.A origin=null + FUN name:foo visibility:public modality:FINAL <> ($this:.A) returnType:kotlin.Unit + $this: VALUE_PARAMETER name: type:.A + BLOCK_BODY + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + PROPERTY name:topLevelProp visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:topLevelProp type:kotlin.Int visibility:private [final,static] + EXPRESSION_BODY + CONST Int type=kotlin.Int value=1 + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Int + correspondingProperty: PROPERTY name:topLevelProp visibility:public modality:FINAL [val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:topLevelProp type:kotlin.Int visibility:private [final,static]' type=kotlin.Int origin=null + PROPERTY name:propertyName1 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:propertyName1 type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="OK" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:propertyName1 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:propertyName1 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:propertyName2 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:propertyName2 type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="somePropertyWithLongName" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:propertyName2 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:propertyName2 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:methodName visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:methodName type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="foo" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:methodName visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:methodName type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:className visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:className type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:className visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:className type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:topLevelPropName visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:topLevelPropName type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="topLevelProp" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:topLevelPropName visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:topLevelPropName type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null diff --git a/compiler/testData/ir/loweredIr/interpreter/primitiveOperations.kt b/compiler/testData/ir/loweredIr/interpreter/primitiveOperations.kt new file mode 100644 index 00000000000..ea2d0fcdaef --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/primitiveOperations.kt @@ -0,0 +1,15 @@ +const val add = 1 + 2 + 3 + 4 +const val concat = "1" + 2 + 3 + 4 +const val divide = 1 / 2.0 +const val mul = 10 * 100L + +const val toString1 = 1.toString() +const val toString2 = "2".toString() +const val toString3 = '3'.toString() +const val toString4 = 4L.toString() +const val toString5 = 5.0.toString() + +const val equals1 = "1" == toString1 +const val equals2 = 2 == "2" +const val equals3 = 3 == 3L +const val equals4 = 4.0 == 4f diff --git a/compiler/testData/ir/loweredIr/interpreter/primitiveOperations_ConstEvaluationLowering.ir b/compiler/testData/ir/loweredIr/interpreter/primitiveOperations_ConstEvaluationLowering.ir new file mode 100644 index 00000000000..6b8ff41d2cf --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/primitiveOperations_ConstEvaluationLowering.ir @@ -0,0 +1,120 @@ +// --- IR for
after Evaluate functions that are marked as `Foldable` +MODULE_FRAGMENT name:
+ FILE fqName: fileName:/primitiveOperations.kt + PROPERTY name:add visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:add type:kotlin.Int visibility:public [final,static] + EXPRESSION_BODY + CONST Int type=kotlin.Int value=10 + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Int + correspondingProperty: PROPERTY name:add visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:add type:kotlin.Int visibility:public [final,static]' type=kotlin.Int origin=null + PROPERTY name:concat visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:concat type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="1234" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:concat visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:concat type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:divide visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:divide type:kotlin.Double visibility:public [final,static] + EXPRESSION_BODY + CONST Double type=kotlin.Double value=0.5 + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Double + correspondingProperty: PROPERTY name:divide visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Double declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:divide type:kotlin.Double visibility:public [final,static]' type=kotlin.Double origin=null + PROPERTY name:mul visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:mul type:kotlin.Long visibility:public [final,static] + EXPRESSION_BODY + CONST Long type=kotlin.Long value=1000 + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Long + correspondingProperty: PROPERTY name:mul visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Long declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:mul type:kotlin.Long visibility:public [final,static]' type=kotlin.Long origin=null + PROPERTY name:toString1 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:toString1 type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="1" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:toString1 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:toString1 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:toString2 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:toString2 type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="2" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:toString2 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:toString2 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:toString3 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:toString3 type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="3" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:toString3 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:toString3 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:toString4 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:toString4 type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="4" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:toString4 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:toString4 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:toString5 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:toString5 type:kotlin.String visibility:public [final,static] + EXPRESSION_BODY + CONST String type=kotlin.String value="5.0" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.String + correspondingProperty: PROPERTY name:toString5 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:toString5 type:kotlin.String visibility:public [final,static]' type=kotlin.String origin=null + PROPERTY name:equals1 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:equals1 type:kotlin.Boolean visibility:public [final,static] + EXPRESSION_BODY + CONST Boolean type=kotlin.Boolean value=true + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Boolean + correspondingProperty: PROPERTY name:equals1 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Boolean declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:equals1 type:kotlin.Boolean visibility:public [final,static]' type=kotlin.Boolean origin=null + PROPERTY name:equals2 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:equals2 type:kotlin.Boolean visibility:public [final,static] + EXPRESSION_BODY + CONST Boolean type=kotlin.Boolean value=false + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Boolean + correspondingProperty: PROPERTY name:equals2 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Boolean declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:equals2 type:kotlin.Boolean visibility:public [final,static]' type=kotlin.Boolean origin=null + PROPERTY name:equals3 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:equals3 type:kotlin.Boolean visibility:public [final,static] + EXPRESSION_BODY + CONST Boolean type=kotlin.Boolean value=false + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Boolean + correspondingProperty: PROPERTY name:equals3 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Boolean declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:equals3 type:kotlin.Boolean visibility:public [final,static]' type=kotlin.Boolean origin=null + PROPERTY name:equals4 visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:equals4 type:kotlin.Boolean visibility:public [final,static] + EXPRESSION_BODY + CONST Boolean type=kotlin.Boolean value=false + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Boolean + correspondingProperty: PROPERTY name:equals4 visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Boolean declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:equals4 type:kotlin.Boolean visibility:public [final,static]' type=kotlin.Boolean origin=null diff --git a/compiler/testData/ir/loweredIr/interpreter/stdlibConst.kt b/compiler/testData/ir/loweredIr/interpreter/stdlibConst.kt new file mode 100644 index 00000000000..ac770955966 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/stdlibConst.kt @@ -0,0 +1,5 @@ +// WITH_STDLIB + +const val code = '1'.code +const val floorDiv = 10.floorDiv(2) +const val mod = 5.mod(3) diff --git a/compiler/testData/ir/loweredIr/interpreter/stdlibConst_ConstEvaluationLowering.ir b/compiler/testData/ir/loweredIr/interpreter/stdlibConst_ConstEvaluationLowering.ir new file mode 100644 index 00000000000..0051d36caa0 --- /dev/null +++ b/compiler/testData/ir/loweredIr/interpreter/stdlibConst_ConstEvaluationLowering.ir @@ -0,0 +1,30 @@ +// --- IR for
after Evaluate functions that are marked as `Foldable` +MODULE_FRAGMENT name:
+ FILE fqName: fileName:/stdlibConst.kt + PROPERTY name:code visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:code type:kotlin.Int visibility:public [final,static] + EXPRESSION_BODY + CONST Int type=kotlin.Int value=49 + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Int + correspondingProperty: PROPERTY name:code visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:code type:kotlin.Int visibility:public [final,static]' type=kotlin.Int origin=null + PROPERTY name:floorDiv visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:floorDiv type:kotlin.Int visibility:public [final,static] + EXPRESSION_BODY + CONST Int type=kotlin.Int value=5 + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Int + correspondingProperty: PROPERTY name:floorDiv visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:floorDiv type:kotlin.Int visibility:public [final,static]' type=kotlin.Int origin=null + PROPERTY name:mod visibility:public modality:FINAL [const,val] + FIELD PROPERTY_BACKING_FIELD name:mod type:kotlin.Int visibility:public [final,static] + EXPRESSION_BODY + CONST Int type=kotlin.Int value=2 + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Int + correspondingProperty: PROPERTY name:mod visibility:public modality:FINAL [const,val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:mod type:kotlin.Int visibility:public [final,static]' type=kotlin.Int origin=null diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/DumpLoweredIrTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/DumpLoweredIrTestGenerated.java new file mode 100644 index 00000000000..531a0c9da75 --- /dev/null +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/DumpLoweredIrTestGenerated.java @@ -0,0 +1,79 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.test.runners.ir; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TargetBackend; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link GenerateNewCompilerTests.kt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("compiler/testData/ir/loweredIr") +@TestDataPath("$PROJECT_ROOT") +public class DumpLoweredIrTestGenerated extends AbstractDumpLoweredIrTest { + @Test + public void testAllFilesPresentInLoweredIr() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/ir/loweredIr"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + } + + @Nested + @TestMetadata("compiler/testData/ir/loweredIr/interpreter") + @TestDataPath("$PROJECT_ROOT") + public class Interpreter { + @Test + public void testAllFilesPresentInInterpreter() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/ir/loweredIr/interpreter"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); + } + + @Test + @TestMetadata("constTrimIndent.kt") + public void testConstTrimIndent() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/constTrimIndent.kt"); + } + + @Test + @TestMetadata("constTrimMargin.kt") + public void testConstTrimMargin() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/constTrimMargin.kt"); + } + + @Test + @TestMetadata("enumName.kt") + public void testEnumName() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/enumName.kt"); + } + + @Test + @TestMetadata("ifConstVal.kt") + public void testIfConstVal() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/ifConstVal.kt"); + } + + @Test + @TestMetadata("kCallableName.kt") + public void testKCallableName() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/kCallableName.kt"); + } + + @Test + @TestMetadata("primitiveOperations.kt") + public void testPrimitiveOperations() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/primitiveOperations.kt"); + } + + @Test + @TestMetadata("stdlibConst.kt") + public void testStdlibConst() throws Exception { + runTest("compiler/testData/ir/loweredIr/interpreter/stdlibConst.kt"); + } + } +} diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/ir/AbstractDumpLoweredIrTest.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/ir/AbstractDumpLoweredIrTest.kt new file mode 100644 index 00000000000..59a463d9c62 --- /dev/null +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/ir/AbstractDumpLoweredIrTest.kt @@ -0,0 +1,49 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.test.runners.ir + +import org.jetbrains.kotlin.backend.common.lower.constEvaluationPhase +import org.jetbrains.kotlin.platform.jvm.JvmPlatforms +import org.jetbrains.kotlin.test.TargetBackend +import org.jetbrains.kotlin.test.backend.handlers.PhasedIrDumpHandler +import org.jetbrains.kotlin.test.builders.* +import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.DUMP_IR_FOR_GIVEN_PHASES +import org.jetbrains.kotlin.test.model.ArtifactKinds +import org.jetbrains.kotlin.test.model.DependencyKind +import org.jetbrains.kotlin.test.model.FrontendKinds +import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerWithTargetBackendTest +import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator +import org.jetbrains.kotlin.test.services.configuration.JvmEnvironmentConfigurator + +open class AbstractDumpLoweredIrTest: AbstractKotlinCompilerWithTargetBackendTest(TargetBackend.JVM_IR) { + override fun TestConfigurationBuilder.configuration() { + globalDefaults { + frontend = FrontendKinds.ClassicFrontend + targetPlatform = JvmPlatforms.defaultJvmPlatform + artifactKind = ArtifactKinds.Jvm + targetBackend = TargetBackend.JVM_IR + dependencyKind = DependencyKind.Source + } + + useConfigurators( + ::CommonEnvironmentConfigurator, + ::JvmEnvironmentConfigurator + ) + + forTestsMatching("compiler/testData/ir/loweredIr/interpreter/*") { + defaultDirectives { + DUMP_IR_FOR_GIVEN_PHASES with constEvaluationPhase + } + } + + classicFrontendStep() + psi2IrStep() + jvmIrBackendStep() + jvmArtifactsHandlersStep { + useHandlers(::PhasedIrDumpHandler) + } + } +} \ No newline at end of file diff --git a/compiler/tests-for-compiler-generator/tests/org/jetbrains/kotlin/test/generators/GenerateJUnit5CompilerTests.kt b/compiler/tests-for-compiler-generator/tests/org/jetbrains/kotlin/test/generators/GenerateJUnit5CompilerTests.kt index fc39f6452cf..fd6760ec084 100644 --- a/compiler/tests-for-compiler-generator/tests/org/jetbrains/kotlin/test/generators/GenerateJUnit5CompilerTests.kt +++ b/compiler/tests-for-compiler-generator/tests/org/jetbrains/kotlin/test/generators/GenerateJUnit5CompilerTests.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.generators.util.TestGeneratorUtil import org.jetbrains.kotlin.test.TargetBackend import org.jetbrains.kotlin.test.runners.* import org.jetbrains.kotlin.test.runners.codegen.* +import org.jetbrains.kotlin.test.runners.ir.AbstractDumpLoweredIrTest import org.jetbrains.kotlin.test.runners.ir.AbstractFir2IrTextTest import org.jetbrains.kotlin.test.runners.ir.AbstractIrTextTest import org.jetbrains.kotlin.test.runners.ir.AbstractLightTreeFir2IrTextTest @@ -117,6 +118,10 @@ fun generateJUnit5CompilerTests(args: Array) { model("ir/irText") } + testClass { + model("ir/loweredIr") + } + testClass { model("codegen/bytecodeText") }