[FIR] FirJavaFacade: calculate default value for annotations lazily
To avoid contract violation ^KT-62776 Fixed
This commit is contained in:
committed by
Space Team
parent
b90ff94451
commit
48c36ce475
@@ -6,7 +6,6 @@
|
||||
package org.jetbrains.kotlin.fir.java
|
||||
|
||||
import com.intellij.psi.PsiMethod
|
||||
import com.intellij.psi.impl.light.LightRecordCanonicalConstructor
|
||||
import com.intellij.psi.util.JavaPsiRecordUtil
|
||||
import org.jetbrains.kotlin.*
|
||||
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
|
||||
@@ -397,11 +396,13 @@ abstract class FirJavaFacade(
|
||||
}
|
||||
|
||||
if (classIsAnnotation) {
|
||||
val javaTypeParameterStackSnapshot = javaTypeParameterStack.snapshot()
|
||||
// Cannot load these until the symbol is bound because they may be self-referential.
|
||||
valueParametersForAnnotationConstructor.forEach { javaMethod, firValueParameter ->
|
||||
javaMethod.annotationParameterDefaultValue?.let { javaDefaultValue ->
|
||||
firValueParameter.defaultValue =
|
||||
javaDefaultValue.toFirExpression(session, javaTypeParameterStack, firValueParameter.returnTypeRef)
|
||||
firValueParameter.lazyDefaultValue = lazy {
|
||||
javaDefaultValue.toFirExpression(session, javaTypeParameterStackSnapshot, firValueParameter.returnTypeRef)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+9
-2
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
* Copyright 2010-2023 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.fir.java
|
||||
@@ -28,6 +28,13 @@ class MutableJavaTypeParameterStack : JavaTypeParameterStack() {
|
||||
return typeParameterMap.iterator()
|
||||
}
|
||||
|
||||
fun snapshot(): JavaTypeParameterStack {
|
||||
val snapshot = typeParameterMap.toMap()
|
||||
return object : JavaTypeParameterStack() {
|
||||
override fun get(javaTypeParameter: JavaTypeParameter): FirTypeParameterSymbol = snapshot.getValue(javaTypeParameter)
|
||||
override fun iterator(): Iterator<Map.Entry<JavaTypeParameter, FirTypeParameterSymbol>> = snapshot.iterator()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
abstract class JavaTypeParameterStack : Iterable<Map.Entry<JavaTypeParameter, FirTypeParameterSymbol>> {
|
||||
|
||||
+9
-3
@@ -39,10 +39,16 @@ class FirJavaValueParameter @FirImplementationDetail constructor(
|
||||
override val name: Name,
|
||||
override val symbol: FirValueParameterSymbol,
|
||||
annotationBuilder: () -> List<FirAnnotation>,
|
||||
override var defaultValue: FirExpression?,
|
||||
var lazyDefaultValue: Lazy<FirExpression>?,
|
||||
override val containingFunctionSymbol: FirFunctionSymbol<*>,
|
||||
override val isVararg: Boolean,
|
||||
) : FirValueParameter() {
|
||||
override var defaultValue: FirExpression?
|
||||
get() = lazyDefaultValue?.value
|
||||
set(value) {
|
||||
lazyDefaultValue = value?.let(::lazyOf)
|
||||
}
|
||||
|
||||
init {
|
||||
symbol.bind(this)
|
||||
|
||||
@@ -210,7 +216,7 @@ class FirJavaValueParameterBuilder {
|
||||
lateinit var returnTypeRef: FirTypeRef
|
||||
lateinit var name: Name
|
||||
lateinit var annotationBuilder: () -> List<FirAnnotation>
|
||||
var defaultValue: FirExpression? = null
|
||||
var defaultValue: Lazy<FirExpression>? = null
|
||||
lateinit var containingFunctionSymbol: FirFunctionSymbol<*>
|
||||
var isVararg: Boolean by Delegates.notNull()
|
||||
var isFromSource: Boolean by Delegates.notNull()
|
||||
@@ -252,7 +258,7 @@ inline fun buildJavaValueParameterCopy(original: FirValueParameter, init: FirJav
|
||||
copyBuilder.name = original.name
|
||||
val annotations = original.annotations
|
||||
copyBuilder.annotationBuilder = { annotations }
|
||||
copyBuilder.defaultValue = original.defaultValue
|
||||
copyBuilder.defaultValue = if (original is FirJavaValueParameter) original.lazyDefaultValue else original.defaultValue?.let(::lazyOf)
|
||||
copyBuilder.containingFunctionSymbol = original.containingFunctionSymbol
|
||||
copyBuilder.isVararg = original.isVararg
|
||||
return copyBuilder.apply(init).build()
|
||||
|
||||
Reference in New Issue
Block a user