diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index f518225553a..b221900a51c 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.* import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl +import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.builder.* import org.jetbrains.kotlin.fir.java.declarations.* import org.jetbrains.kotlin.fir.resolve.constructType @@ -309,10 +310,16 @@ class JavaSymbolProvider( isVar = !javaField.isFinal isStatic = javaField.isStatic addAnnotationsFrom(this@JavaSymbolProvider.session, javaField, javaTypeParameterStack) + initializer = convertJavaInitializerToFir(javaField.initializerValue) } } } + private fun convertJavaInitializerToFir(value: Any?): FirExpression? { + // NB: null should be converted to null + return value?.createConstantIfAny(session) + } + private fun convertJavaMethodToFir( javaMethod: JavaMethod, classId: ClassId, diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt index 3510d170105..4fce25120f5 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaUtils.kt @@ -451,7 +451,7 @@ private fun JavaAnnotationArgument.toFirExpression( // TODO: this.name return when (this) { is JavaLiteralAnnotationArgument -> { - value.createConstant(session) + value.createConstantOrError(session) } is JavaArrayAnnotationArgument -> buildArrayOfCall { argumentList = buildArgumentList { @@ -503,13 +503,19 @@ private fun List.createArrayOfCall(session: FirSession, @Suppress("UNUSED return buildArrayOfCall { argumentList = buildArgumentList { for (element in this@createArrayOfCall) { - arguments += element.createConstant(session) + arguments += element.createConstantOrError(session) } } } } -internal fun Any?.createConstant(session: FirSession): FirExpression { +internal fun Any?.createConstantOrError(session: FirSession): FirExpression { + return createConstantIfAny(session) ?: buildErrorExpression { + diagnostic = ConeSimpleDiagnostic("Unknown value in JavaLiteralAnnotationArgument: $this", DiagnosticKind.Java) + } +} + +internal fun Any?.createConstantIfAny(session: FirSession): FirExpression? { return when (this) { is Byte -> buildConstExpression(null, FirConstKind.Byte, this) is Short -> buildConstExpression(null, FirConstKind.Short, this) @@ -530,9 +536,7 @@ internal fun Any?.createConstant(session: FirSession): FirExpression { is BooleanArray -> toList().createArrayOfCall(session, FirConstKind.Boolean) null -> buildConstExpression(null, FirConstKind.Null, null) - else -> buildErrorExpression { - diagnostic = ConeSimpleDiagnostic("Unknown value in JavaLiteralAnnotationArgument: $this", DiagnosticKind.Java) - } + else -> null } } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt index fd63f2db8ef..317cc3eb0c6 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaField.kt @@ -41,6 +41,7 @@ class FirJavaField @FirImplementationDetail constructor( override val isVar: Boolean, override val annotations: MutableList, override val typeParameters: MutableList, + override var initializer: FirExpression?, ) : FirField() { init { symbol.bind(this) @@ -71,6 +72,7 @@ class FirJavaField @FirImplementationDetail constructor( override fun transformOtherChildren(transformer: FirTransformer, data: D): FirField { transformAnnotations(transformer, data) + initializer = initializer?.transformSingle(transformer, data) return this } @@ -86,6 +88,7 @@ class FirJavaField @FirImplementationDetail constructor( returnTypeRef.accept(visitor, data) annotations.forEach { it.accept(visitor, data) } typeParameters.forEach { it.accept(visitor, data) } + initializer?.accept(visitor, data) } override fun transformChildren(transformer: FirTransformer, data: D): FirJavaField { @@ -117,9 +120,6 @@ class FirJavaField @FirImplementationDetail constructor( override val delegate: FirExpression? get() = null - override val initializer: FirExpression? - get() = null - override val delegateFieldSymbol: FirDelegateFieldSymbol? get() = null @@ -141,6 +141,7 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() { var modality: Modality? = null lateinit var visibility: Visibility var isStatic: Boolean by Delegates.notNull() + var initializer: FirExpression? = null override var resolvePhase: FirResolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES @@ -157,6 +158,7 @@ internal class FirJavaFieldBuilder : FirFieldBuilder() { isVar, annotations, typeParameters, + initializer, ) } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt index 1e893637cbb..eb799242de0 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/deserialization/KotlinDeserializedJvmSymbolsProvider.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.builder.* import org.jetbrains.kotlin.fir.java.JavaSymbolProvider -import org.jetbrains.kotlin.fir.java.createConstant +import org.jetbrains.kotlin.fir.java.createConstantOrError import org.jetbrains.kotlin.fir.java.topLevelName import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference @@ -288,7 +288,7 @@ class KotlinDeserializedJvmSymbolsProvider( } private fun createConstant(value: Any?): FirExpression { - return value.createConstant(session) + return value.createConstantOrError(session) } } } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt index e6c2d0483e3..fe44a7f7206 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt @@ -102,6 +102,7 @@ class FirSignatureEnhancement( isStatic = firElement.isStatic annotations += firElement.annotations status = firElement.status + initializer = firElement.initializer } return symbol } diff --git a/compiler/testData/loadJava/compiledJava/ClassWithConstVal.fir.txt b/compiler/testData/loadJava/compiledJava/ClassWithConstVal.fir.txt index 442a0cbee86..b83568d45a5 100644 --- a/compiler/testData/loadJava/compiledJava/ClassWithConstVal.fir.txt +++ b/compiler/testData/loadJava/compiledJava/ClassWithConstVal.fir.txt @@ -1,7 +1,7 @@ public final class ClassWithConstVal : R|kotlin/Any| { - public final field f: R|kotlin/Int| + public final field f: R|kotlin/Int| = Int(1) - public final field f2: R|kotlin/Int| + public final field f2: R|kotlin/Int| = Int(1) public constructor(): R|test/ClassWithConstVal| diff --git a/compiler/testData/loadJava/compiledJava/FinalFieldAsVal.fir.txt b/compiler/testData/loadJava/compiledJava/FinalFieldAsVal.fir.txt index a5bce6ba62c..f5eb893f872 100644 --- a/compiler/testData/loadJava/compiledJava/FinalFieldAsVal.fir.txt +++ b/compiler/testData/loadJava/compiledJava/FinalFieldAsVal.fir.txt @@ -1,5 +1,5 @@ public final class FinalFieldAsVal : R|kotlin/Any| { - public final field f: R|kotlin/Int| + public final field f: R|kotlin/Int| = Int(1) public constructor(): R|test/FinalFieldAsVal| diff --git a/compiler/testData/loadJava/compiledJava/annotations/AnnotatedField.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/AnnotatedField.fir.txt index fc0a1a9ebfa..feaa566865e 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/AnnotatedField.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/AnnotatedField.fir.txt @@ -1,7 +1,7 @@ public open class AnnotatedField : R|kotlin/Any| { - @R|test/AnnotatedField.Anno|(String(static)) public final static field x: R|kotlin/Int| + @R|test/AnnotatedField.Anno|(String(static)) public final static field x: R|kotlin/Int| = Int(0) - @R|test/AnnotatedField.Anno|(String(member)) public final field y: R|kotlin/Int| + @R|test/AnnotatedField.Anno|(String(member)) public final field y: R|kotlin/Int| = Int(0) public constructor(): R|test/AnnotatedField| diff --git a/compiler/testData/loadJava/compiledJava/annotations/StringConstantInParam.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/StringConstantInParam.fir.txt index 3bd585ef114..582e76ca52c 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/StringConstantInParam.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/StringConstantInParam.fir.txt @@ -1,4 +1,4 @@ public abstract interface StringConstantInParam : R|kotlin/Any| { - public final static field HEL: R|ft!| + public final static field HEL: R|ft!| = String(hel) } diff --git a/compiler/testData/loadJava/compiledJava/static/StaticFinal.fir.txt b/compiler/testData/loadJava/compiledJava/static/StaticFinal.fir.txt index 96c80c56dda..2f10d610e16 100644 --- a/compiler/testData/loadJava/compiledJava/static/StaticFinal.fir.txt +++ b/compiler/testData/loadJava/compiledJava/static/StaticFinal.fir.txt @@ -1,13 +1,13 @@ public open class StaticFinal : R|kotlin/Any| { - public final static field publicNonNull: R|ft!| + public final static field publicNonNull: R|ft!| = String(aaa) public final static field publicNull: R|ft!| - public/*package*/ final static field packageNonNull: R|ft!| + public/*package*/ final static field packageNonNull: R|ft!| = String(bbb) public/*package*/ final static field packageNull: R|ft!| - private final static field privateNonNull: R|ft!| + private final static field privateNonNull: R|ft!| = String(bbb) private final static field privateNull: R|ft!|