FIR Java: make type annotations lazy

This commit is contained in:
Mikhail Glukhikh
2020-12-24 13:32:07 +03:00
parent 776c4ba6ca
commit 1239a8629e
3 changed files with 46 additions and 23 deletions
@@ -92,9 +92,12 @@ internal fun FirTypeRef.toConeKotlinTypeProbablyFlexible(
} }
internal fun JavaType.toFirJavaTypeRef(session: FirSession, javaTypeParameterStack: JavaTypeParameterStack): FirJavaTypeRef { internal fun JavaType.toFirJavaTypeRef(session: FirSession, javaTypeParameterStack: JavaTypeParameterStack): FirJavaTypeRef {
val annotations = (this as? JavaClassifierType)?.annotations.orEmpty()
return buildJavaTypeRef { return buildJavaTypeRef {
annotations.mapTo(this.annotations) { it.toFirAnnotationCall(session, javaTypeParameterStack) } annotationBuilder = {
(this@toFirJavaTypeRef as? JavaClassifierType)?.annotations.orEmpty().map {
it.toFirAnnotationCall(session, javaTypeParameterStack)
}
}
type = this@toFirJavaTypeRef type = this@toFirJavaTypeRef
} }
} }
@@ -5,39 +5,59 @@
package org.jetbrains.kotlin.fir.types.jvm package org.jetbrains.kotlin.fir.types.jvm
import org.jetbrains.kotlin.fir.FirAnnotationContainer
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.builder.FirBuilderDsl
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.types.FirQualifierPart import org.jetbrains.kotlin.fir.types.FirQualifierPart
import org.jetbrains.kotlin.fir.types.builder.FirUserTypeRefBuilder import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.impl.FirUserTypeRefImpl import org.jetbrains.kotlin.fir.types.FirUserTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.fir.visitors.transformInplace
import org.jetbrains.kotlin.load.java.structure.JavaType import org.jetbrains.kotlin.load.java.structure.JavaType
class FirJavaTypeRef( class FirJavaTypeRef(
val type: JavaType, val type: JavaType,
annotations: MutableList<FirAnnotationCall>, annotationBuilder: () -> List<FirAnnotationCall>,
qualifier: MutableList<FirQualifierPart> override val qualifier: MutableList<FirQualifierPart>
) : FirUserTypeRefImpl( ) : FirUserTypeRef(), FirAnnotationContainer {
source = null, override val isMarkedNullable: Boolean
isMarkedNullable = false, get() = false
qualifier,
annotations
)
@FirBuilderDsl override val source: FirSourceElement?
class FirJavaTypeRefBuilder : FirUserTypeRefBuilder() { get() = null
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
lateinit var type: JavaType
override fun build(): FirJavaTypeRef { override val annotations: List<FirAnnotationCall> by lazy { annotationBuilder() }
return FirJavaTypeRef(type, annotations, qualifier)
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
for (part in qualifier) {
part.typeArgumentList.typeArguments.forEach { it.accept(visitor, data) }
}
annotations.forEach { it.accept(visitor, data) }
} }
@Deprecated("Modification of 'source' has no impact for FirJavaTypeRefBuilder", level = DeprecationLevel.HIDDEN) override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirUserTypeRef {
override var source: FirSourceElement? = null for (part in qualifier) {
(part.typeArgumentList.typeArguments as MutableList<FirTypeProjection>).transformInplace(transformer, data)
}
return this
}
@Deprecated("Modification of 'isMarkedNullable' has no impact for FirJavaTypeRefBuilder", level = DeprecationLevel.HIDDEN) override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirUserTypeRef {
override var isMarkedNullable: Boolean = false return this
}
}
@FirBuilderDsl
class FirJavaTypeRefBuilder {
lateinit var annotationBuilder: () -> List<FirAnnotationCall>
lateinit var type: JavaType
val qualifier: MutableList<FirQualifierPart> = mutableListOf()
fun build(): FirJavaTypeRef {
return FirJavaTypeRef(type, annotationBuilder, qualifier)
}
} }
inline fun buildJavaTypeRef(init: FirJavaTypeRefBuilder.() -> Unit): FirJavaTypeRef { inline fun buildJavaTypeRef(init: FirJavaTypeRefBuilder.() -> Unit): FirJavaTypeRef {
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor
import org.jetbrains.kotlin.fir.visitors.transformInplace import org.jetbrains.kotlin.fir.visitors.transformInplace
open class FirUserTypeRefImpl( class FirUserTypeRefImpl(
override val source: FirSourceElement?, override val source: FirSourceElement?,
override val isMarkedNullable: Boolean, override val isMarkedNullable: Boolean,
override val qualifier: MutableList<FirQualifierPart>, override val qualifier: MutableList<FirQualifierPart>,