diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index c8aaf312270..8c4f12a2ce6 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -266,7 +266,9 @@ class Fir2IrConverter( val components = Fir2IrComponentsStorage(session, scopeSession, symbolTable, irBuiltIns, irFactory, mangler) val conversionScope = Fir2IrConversionScope() val classifierStorage = Fir2IrClassifierStorage(components) - val declarationStorage = Fir2IrDeclarationStorage(components, moduleDescriptor) + val converter = Fir2IrConverter(moduleDescriptor, sourceManager, components) + val fir2irVisitor = Fir2IrVisitor(converter, components, conversionScope) + val declarationStorage = Fir2IrDeclarationStorage(components, fir2irVisitor, moduleDescriptor) val typeConverter = Fir2IrTypeConverter(components) val builtIns = Fir2IrBuiltIns(components, session) components.declarationStorage = declarationStorage @@ -276,7 +278,6 @@ class Fir2IrConverter( components.builtIns = builtIns val irFiles = mutableListOf() - val converter = Fir2IrConverter(moduleDescriptor, sourceManager, components) for (firFile in firFiles) { irFiles += converter.registerFileAndClasses(firFile) } @@ -295,7 +296,6 @@ class Fir2IrConverter( session, scopeSession, classifierStorage, declarationStorage, conversionScope ) components.fakeOverrideGenerator = fakeOverrideGenerator - val fir2irVisitor = Fir2IrVisitor(converter, components, conversionScope) val callGenerator = CallAndReferenceGenerator(components, fir2irVisitor, conversionScope) components.callGenerator = callGenerator declarationStorage.annotationGenerator = AnnotationGenerator(components) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index e92d8a81a56..5503cbfeb4f 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -54,6 +54,7 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ @OptIn(ObsoleteDescriptorBasedAPI::class) class Fir2IrDeclarationStorage( private val components: Fir2IrComponents, + private val visitor: Fir2IrVisitor, private val moduleDescriptor: FirModuleDescriptor ) : Fir2IrComponents by components { @@ -812,6 +813,11 @@ class Fir2IrDeclarationStorage( isExternal = false, isStatic = field.isStatic ).apply { + field.initializer?.let { + val expression = visitor.convertToIrExpression(it) + expression.type = type + initializer = irFactory.createExpressionBody(expression) + } descriptor.bind(this) fieldCache[field] = this } diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrCompileTimeChecker.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrCompileTimeChecker.kt index 2feeda83f93..1ed952850aa 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrCompileTimeChecker.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrCompileTimeChecker.kt @@ -12,10 +12,7 @@ import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* -import org.jetbrains.kotlin.ir.types.classifierOrNull -import org.jetbrains.kotlin.ir.types.isAny -import org.jetbrains.kotlin.ir.types.isPrimitiveType -import org.jetbrains.kotlin.ir.types.isString +import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.name.FqName @@ -173,19 +170,10 @@ class IrCompileTimeChecker( val owner = expression.symbol.owner val parent = owner.parent as IrSymbolOwner val isJavaPrimitiveStatic = owner.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB && owner.isStatic && - owner.parentAsClass.fqNameWhenAvailable.isJavaPrimitive() + (owner.type.isPrimitiveType() || owner.type.isStringClassType()) return visitedStack.contains(parent) || isJavaPrimitiveStatic } - // TODO find similar method in utils - private fun FqName?.isJavaPrimitive(): Boolean { - this ?: return false - return this.toString() in setOf( - "java.lang.Byte", "java.lang.Short", "java.lang.Integer", "java.lang.Long", - "java.lang.Float", "java.lang.Double", "java.lang.Boolean", "java.lang.Character" - ) - } - override fun visitSetField(expression: IrSetField, data: Nothing?): Boolean { //todo check receiver? val parent = expression.symbol.owner.parent as IrSymbolOwner diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt index babb4fe6c2c..265f501f68f 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/IrInterpreter.kt @@ -533,6 +533,10 @@ class IrInterpreter(private val irBuiltIns: IrBuiltIns, private val bodyMap: Map val field = expression.symbol.owner // for java static variables if (field.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB && field.isStatic) { + val initializerExpression = field.initializer?.expression + if (initializerExpression is IrConst<*>) { + return interpretConst(initializerExpression) + } stack.pushReturnValue(Wrapper.getStaticGetter(field)!!.invokeWithArguments().toState(field.type)) return Next } diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/javaNegativePropertyAsAnnotationParameter.kt b/compiler/testData/codegen/boxAgainstJava/annotations/javaNegativePropertyAsAnnotationParameter.kt index 4c26f631269..241abdd9483 100644 --- a/compiler/testData/codegen/boxAgainstJava/annotations/javaNegativePropertyAsAnnotationParameter.kt +++ b/compiler/testData/codegen/boxAgainstJava/annotations/javaNegativePropertyAsAnnotationParameter.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // WITH_RUNTIME // FILE: Foo.java diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/javaPropertyAsAnnotationParameter.kt b/compiler/testData/codegen/boxAgainstJava/annotations/javaPropertyAsAnnotationParameter.kt index 5eef50e4eb1..a8b3750b2a5 100644 --- a/compiler/testData/codegen/boxAgainstJava/annotations/javaPropertyAsAnnotationParameter.kt +++ b/compiler/testData/codegen/boxAgainstJava/annotations/javaPropertyAsAnnotationParameter.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // WITH_RUNTIME // FILE: Foo.java diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/javaPropertyWithIntInitializer.kt b/compiler/testData/codegen/boxAgainstJava/annotations/javaPropertyWithIntInitializer.kt index 77eafd2b22e..9c51d9dd7af 100644 --- a/compiler/testData/codegen/boxAgainstJava/annotations/javaPropertyWithIntInitializer.kt +++ b/compiler/testData/codegen/boxAgainstJava/annotations/javaPropertyWithIntInitializer.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // WITH_RUNTIME // FILE: Foo.java diff --git a/compiler/testData/codegen/bytecodeText/inlineJavaConstantFromSubclass.kt b/compiler/testData/codegen/bytecodeText/inlineJavaConstantFromSubclass.kt index 98a5040ed25..7511d6c1903 100644 --- a/compiler/testData/codegen/bytecodeText/inlineJavaConstantFromSubclass.kt +++ b/compiler/testData/codegen/bytecodeText/inlineJavaConstantFromSubclass.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // FILE: first/JavaSuperclass.java package first; diff --git a/compiler/testData/codegen/bytecodeText/inlineProtectedJavaConstantFromOtherPackage.kt b/compiler/testData/codegen/bytecodeText/inlineProtectedJavaConstantFromOtherPackage.kt index d15d3b71281..e81e9b6375a 100644 --- a/compiler/testData/codegen/bytecodeText/inlineProtectedJavaConstantFromOtherPackage.kt +++ b/compiler/testData/codegen/bytecodeText/inlineProtectedJavaConstantFromOtherPackage.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // FILE: first/Foo.java package first; diff --git a/compiler/testData/codegen/bytecodeText/preEvaluateInlineJavaStaticFields.kt b/compiler/testData/codegen/bytecodeText/preEvaluateInlineJavaStaticFields.kt index 26933655c8d..a1acf41d438 100644 --- a/compiler/testData/codegen/bytecodeText/preEvaluateInlineJavaStaticFields.kt +++ b/compiler/testData/codegen/bytecodeText/preEvaluateInlineJavaStaticFields.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // FILE: JClass.java import org.jetbrains.annotations.NotNull; diff --git a/compiler/testData/codegen/bytecodeText/when/integralWhenWithNoInlinedConstants.kt b/compiler/testData/codegen/bytecodeText/when/integralWhenWithNoInlinedConstants.kt index e350aa424a0..dac7c856c92 100644 --- a/compiler/testData/codegen/bytecodeText/when/integralWhenWithNoInlinedConstants.kt +++ b/compiler/testData/codegen/bytecodeText/when/integralWhenWithNoInlinedConstants.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR fun foo1(x: Int): Boolean { when(x) { 0 -> return true diff --git a/compiler/testData/ir/irText/declarations/kt29833.fir.txt b/compiler/testData/ir/irText/declarations/kt29833.fir.txt index 431163a2fea..1035021a908 100644 --- a/compiler/testData/ir/irText/declarations/kt29833.fir.txt +++ b/compiler/testData/ir/irText/declarations/kt29833.fir.txt @@ -8,7 +8,7 @@ FILE fqName:interop fileName:/Definitions.kt PROPERTY name:KT_CONSTANT visibility:public modality:FINAL [const,val] FIELD PROPERTY_BACKING_FIELD name:KT_CONSTANT type:kotlin.String? visibility:public [final] EXPRESSION_BODY - GET_FIELD 'FIELD IR_EXTERNAL_JAVA_DECLARATION_STUB name:CONSTANT type:kotlin.String? visibility:public [final,static]' type=kotlin.String? origin=GET_PROPERTY + CONST String type=kotlin.String value="constant" FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:interop.Definitions) returnType:kotlin.String? correspondingProperty: PROPERTY name:KT_CONSTANT visibility:public modality:FINAL [const,val] $this: VALUE_PARAMETER name: type:interop.Definitions