FIR Java: support read of field constant initializers
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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 <T> List<T>.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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@ class FirJavaField @FirImplementationDetail constructor(
|
||||
override val isVar: Boolean,
|
||||
override val annotations: MutableList<FirAnnotationCall>,
|
||||
override val typeParameters: MutableList<FirTypeParameter>,
|
||||
override var initializer: FirExpression?,
|
||||
) : FirField() {
|
||||
init {
|
||||
symbol.bind(this)
|
||||
@@ -71,6 +72,7 @@ class FirJavaField @FirImplementationDetail constructor(
|
||||
|
||||
override fun <D> transformOtherChildren(transformer: FirTransformer<D>, 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 <D> transformChildren(transformer: FirTransformer<D>, 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<FirField>?
|
||||
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,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
@@ -102,6 +102,7 @@ class FirSignatureEnhancement(
|
||||
isStatic = firElement.isStatic
|
||||
annotations += firElement.annotations
|
||||
status = firElement.status
|
||||
initializer = firElement.initializer
|
||||
}
|
||||
return symbol
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user