FIR: load type qualifiers from module, package, and parent classes
This commit is contained in:
@@ -42,6 +42,7 @@ import org.jetbrains.kotlin.load.java.JavaClassFinder
|
||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
||||
import org.jetbrains.kotlin.load.java.structure.*
|
||||
import org.jetbrains.kotlin.load.java.structure.impl.JavaElementImpl
|
||||
import org.jetbrains.kotlin.load.java.structure.impl.JavaPackageImpl
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
@@ -214,6 +215,7 @@ class JavaSymbolProvider(
|
||||
modality = if (classKind == ClassKind.ANNOTATION_CLASS || classKind == ClassKind.ENUM_CLASS) Modality.FINAL else javaClass.modality
|
||||
this.isTopLevel = outerClassId == null
|
||||
isStatic = javaClass.isStatic
|
||||
javaPackage = packageCache.getValue(classSymbol.classId.packageFqName)
|
||||
this.javaTypeParameterStack = javaTypeParameterStack
|
||||
existingNestedClassifierNames += javaClass.innerClassNames
|
||||
scopeProvider = this@JavaSymbolProvider.scopeProvider
|
||||
@@ -390,7 +392,7 @@ class JavaSymbolProvider(
|
||||
returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session, javaTypeParameterStack)
|
||||
isVar = !javaField.isFinal
|
||||
isStatic = javaField.isStatic
|
||||
annotationBuilder = { javaField.annotations.map { it.toFirAnnotationCall(session, javaTypeParameterStack) } }
|
||||
annotationBuilder = { javaField.convertAnnotationsToFir(session, javaTypeParameterStack) }
|
||||
initializer = convertJavaInitializerToFir(javaField.initializerValue)
|
||||
|
||||
if (!javaField.isStatic) {
|
||||
@@ -432,7 +434,7 @@ class JavaSymbolProvider(
|
||||
this@JavaSymbolProvider.session, moduleData, index, javaTypeParameterStack,
|
||||
)
|
||||
}
|
||||
annotationBuilder = { javaMethod.annotations.map { it.toFirAnnotationCall(session, javaTypeParameterStack) } }
|
||||
annotationBuilder = { javaMethod.convertAnnotationsToFir(session, javaTypeParameterStack) }
|
||||
status = FirResolvedDeclarationStatusImpl(
|
||||
javaMethod.visibility,
|
||||
javaMethod.modality,
|
||||
@@ -508,7 +510,7 @@ class JavaSymbolProvider(
|
||||
|
||||
if (javaConstructor != null) {
|
||||
this.typeParameters += javaConstructor.typeParameters.convertTypeParameters(javaTypeParameterStack)
|
||||
annotationBuilder = { javaConstructor.annotations.map { it.toFirAnnotationCall(session, javaTypeParameterStack) } }
|
||||
annotationBuilder = { javaConstructor.convertAnnotationsToFir(session, javaTypeParameterStack) }
|
||||
for ((index, valueParameter) in javaConstructor.valueParameters.withIndex()) {
|
||||
valueParameters += valueParameter.toFirValueParameter(
|
||||
this@JavaSymbolProvider.session, moduleData, index, javaTypeParameterStack,
|
||||
@@ -554,14 +556,14 @@ class JavaSymbolProvider(
|
||||
)
|
||||
|
||||
override fun getPackage(fqName: FqName): FqName? {
|
||||
return packageCache.getValue(fqName)
|
||||
return packageCache.getValue(fqName)?.fqName
|
||||
}
|
||||
|
||||
private fun findPackage(fqName: FqName): FqName? {
|
||||
private fun findPackage(fqName: FqName): JavaPackage? {
|
||||
return try {
|
||||
val facade = KotlinJavaPsiFacade.getInstance(project)
|
||||
val javaPackage = facade.findPackage(fqName.asString(), searchScope) ?: return null
|
||||
FqName(javaPackage.qualifiedName)
|
||||
JavaPackageImpl(javaPackage, searchScope)
|
||||
} catch (e: ProcessCanceledException) {
|
||||
return null
|
||||
}
|
||||
|
||||
@@ -65,11 +65,7 @@ internal fun FirTypeRef.toConeKotlinTypeProbablyFlexible(
|
||||
|
||||
internal fun JavaType.toFirJavaTypeRef(session: FirSession, javaTypeParameterStack: JavaTypeParameterStack): FirJavaTypeRef {
|
||||
return buildJavaTypeRef {
|
||||
annotationBuilder = {
|
||||
(this@toFirJavaTypeRef as? JavaClassifierType)?.annotations.orEmpty().map {
|
||||
it.toFirAnnotationCall(session, javaTypeParameterStack)
|
||||
}
|
||||
}
|
||||
annotationBuilder = { convertAnnotationsToFir(session, javaTypeParameterStack) }
|
||||
type = this@toFirJavaTypeRef
|
||||
}
|
||||
}
|
||||
@@ -89,13 +85,11 @@ private fun JavaType?.toConeKotlinTypeWithoutEnhancement(
|
||||
session: FirSession, javaTypeParameterStack: JavaTypeParameterStack,
|
||||
mode: FirJavaTypeConversionMode
|
||||
): ConeKotlinType {
|
||||
val attributes = if (this != null && annotations.isNotEmpty()) {
|
||||
ConeAttributes.create(
|
||||
listOf(CustomAnnotationTypeAttribute(annotations.map { it.toFirAnnotationCall(session, javaTypeParameterStack) }))
|
||||
)
|
||||
} else {
|
||||
val attributes = if (this != null && annotations.isNotEmpty())
|
||||
ConeAttributes.create(listOf(CustomAnnotationTypeAttribute(convertAnnotationsToFir(session, javaTypeParameterStack))))
|
||||
else
|
||||
ConeAttributes.Empty
|
||||
}
|
||||
|
||||
return when (this) {
|
||||
is JavaClassifierType ->
|
||||
toConeKotlinTypeWithoutEnhancement(session, javaTypeParameterStack, mode, attributes)
|
||||
|
||||
@@ -148,7 +148,23 @@ private fun buildArgumentMapping(
|
||||
return buildResolvedArgumentList(mapping)
|
||||
}
|
||||
|
||||
internal fun JavaAnnotation.toFirAnnotationCall(
|
||||
internal fun Iterable<JavaAnnotation>.convertAnnotationsToFir(
|
||||
session: FirSession, javaTypeParameterStack: JavaTypeParameterStack
|
||||
): List<FirAnnotationCall> = map { it.toFirAnnotationCall(session, javaTypeParameterStack) }
|
||||
|
||||
internal fun JavaAnnotationOwner.convertAnnotationsToFir(
|
||||
session: FirSession, javaTypeParameterStack: JavaTypeParameterStack
|
||||
): List<FirAnnotationCall> = annotations.convertAnnotationsToFir(session, javaTypeParameterStack)
|
||||
|
||||
internal fun MutableList<FirAnnotationCall>.addFromJava(
|
||||
session: FirSession,
|
||||
javaAnnotationOwner: JavaAnnotationOwner,
|
||||
javaTypeParameterStack: JavaTypeParameterStack
|
||||
) {
|
||||
javaAnnotationOwner.annotations.mapTo(this) { it.toFirAnnotationCall(session, javaTypeParameterStack) }
|
||||
}
|
||||
|
||||
private fun JavaAnnotation.toFirAnnotationCall(
|
||||
session: FirSession, javaTypeParameterStack: JavaTypeParameterStack
|
||||
): FirAnnotationCall {
|
||||
return buildAnnotationCall {
|
||||
@@ -187,14 +203,6 @@ internal fun JavaAnnotation.toFirAnnotationCall(
|
||||
}
|
||||
}
|
||||
|
||||
internal fun MutableList<FirAnnotationCall>.addFromJava(
|
||||
session: FirSession,
|
||||
javaAnnotationOwner: JavaAnnotationOwner,
|
||||
javaTypeParameterStack: JavaTypeParameterStack
|
||||
) {
|
||||
javaAnnotationOwner.annotations.mapTo(this) { it.toFirAnnotationCall(session, javaTypeParameterStack) }
|
||||
}
|
||||
|
||||
internal fun JavaValueParameter.toFirValueParameter(
|
||||
session: FirSession, moduleData: FirModuleData, index: Int, javaTypeParameterStack: JavaTypeParameterStack
|
||||
): FirValueParameter {
|
||||
@@ -204,7 +212,7 @@ internal fun JavaValueParameter.toFirValueParameter(
|
||||
name = this@toFirValueParameter.name ?: Name.identifier("p$index")
|
||||
returnTypeRef = type.toFirJavaTypeRef(session, javaTypeParameterStack)
|
||||
isVararg = this@toFirValueParameter.isVararg
|
||||
annotationBuilder = { annotations.map { it.toFirAnnotationCall(session, javaTypeParameterStack) }}
|
||||
annotationBuilder = { convertAnnotationsToFir(session, javaTypeParameterStack) }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ 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.fir.visitors.transformSingle
|
||||
import org.jetbrains.kotlin.load.java.structure.JavaPackage
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
@@ -43,6 +44,7 @@ class FirJavaClass @FirImplementationDetail internal constructor(
|
||||
override val symbol: FirRegularClassSymbol,
|
||||
override val superTypeRefs: MutableList<FirTypeRef>,
|
||||
override val typeParameters: MutableList<FirTypeParameterRef>,
|
||||
internal val javaPackage: JavaPackage?,
|
||||
internal val javaTypeParameterStack: JavaTypeParameterStack,
|
||||
internal val existingNestedClassifierNames: List<Name>
|
||||
) : FirRegularClass() {
|
||||
@@ -131,6 +133,7 @@ internal class FirJavaClassBuilder : FirRegularClassBuilder(), FirAnnotationCont
|
||||
var isTopLevel: Boolean by Delegates.notNull()
|
||||
var isStatic: Boolean by Delegates.notNull()
|
||||
var isNotSam: Boolean by Delegates.notNull()
|
||||
var javaPackage: JavaPackage? = null
|
||||
lateinit var javaTypeParameterStack: JavaTypeParameterStack
|
||||
val existingNestedClassifierNames: MutableList<Name> = mutableListOf()
|
||||
|
||||
@@ -157,6 +160,7 @@ internal class FirJavaClassBuilder : FirRegularClassBuilder(), FirAnnotationCont
|
||||
symbol,
|
||||
superTypeRefs,
|
||||
typeParameters,
|
||||
javaPackage,
|
||||
javaTypeParameterStack,
|
||||
existingNestedClassifierNames
|
||||
)
|
||||
|
||||
+33
-3
@@ -6,16 +6,28 @@
|
||||
package org.jetbrains.kotlin.fir.java.enhancement
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSessionComponent
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
|
||||
import org.jetbrains.kotlin.fir.java.convertAnnotationsToFir
|
||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
|
||||
import org.jetbrains.kotlin.fir.resolve.symbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.load.java.AbstractAnnotationTypeQualifierResolver
|
||||
import org.jetbrains.kotlin.load.java.JavaModuleAnnotationsProvider
|
||||
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
|
||||
import org.jetbrains.kotlin.load.java.JavaTypeQualifiersByElementType
|
||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.DEFAULT_ANNOTATION_MEMBER_NAME
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
|
||||
@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
|
||||
class FirAnnotationTypeQualifierResolver(private val session: FirSession) :
|
||||
AbstractAnnotationTypeQualifierResolver<FirAnnotationCall>(session.javaTypeEnhancementState)
|
||||
{
|
||||
class FirAnnotationTypeQualifierResolver(
|
||||
private val session: FirSession,
|
||||
javaTypeEnhancementState: JavaTypeEnhancementState,
|
||||
private val javaModuleAnnotationsProvider: JavaModuleAnnotationsProvider,
|
||||
) : AbstractAnnotationTypeQualifierResolver<FirAnnotationCall>(javaTypeEnhancementState), FirSessionComponent {
|
||||
|
||||
override val FirAnnotationCall.annotations: Iterable<FirAnnotationCall>
|
||||
get() = coneClassLikeType?.lookupTag?.toSymbol(session)?.fir?.annotations.orEmpty()
|
||||
|
||||
@@ -38,4 +50,22 @@ class FirAnnotationTypeQualifierResolver(private val session: FirSession) :
|
||||
is FirArrayOfCall -> arguments.flatMap { it.toEnumNames() }
|
||||
else -> listOfNotNull(toResolvedCallableSymbol()?.callableId?.callableName?.asString())
|
||||
}
|
||||
|
||||
fun extractDefaultQualifiers(firClass: FirRegularClass): JavaTypeQualifiersByElementType? {
|
||||
val classId = firClass.symbol.classId
|
||||
val outerClassId = classId.outerClassId
|
||||
val parentQualifiers = if (outerClassId != null) {
|
||||
(session.symbolProvider.getClassLikeSymbolByFqName(outerClassId)?.fir as? FirRegularClass)
|
||||
?.let { extractDefaultQualifiers(it) }
|
||||
} else {
|
||||
val forModule = javaModuleAnnotationsProvider.getAnnotationsForModuleOwnerOfClass(classId)
|
||||
?.let { extractAndMergeDefaultQualifiers(null, it.convertAnnotationsToFir(session, JavaTypeParameterStack.EMPTY)) }
|
||||
val forPackage = (firClass as? FirJavaClass)?.javaPackage
|
||||
?.let { extractAndMergeDefaultQualifiers(forModule, it.convertAnnotationsToFir(session, JavaTypeParameterStack.EMPTY)) }
|
||||
forPackage ?: forModule
|
||||
}
|
||||
return extractAndMergeDefaultQualifiers(parentQualifiers, firClass.annotations)
|
||||
}
|
||||
}
|
||||
|
||||
val FirSession.javaAnnotationTypeQualifierResolver: FirAnnotationTypeQualifierResolver by FirSession.sessionComponentAccessor()
|
||||
|
||||
-18
@@ -1,18 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2020 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.enhancement
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSessionComponent
|
||||
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
|
||||
|
||||
class FirJsr305StateContainer(val javaTypeEnhancementState: JavaTypeEnhancementState) : FirSessionComponent {
|
||||
companion object {
|
||||
val Default: FirJsr305StateContainer = FirJsr305StateContainer(JavaTypeEnhancementState.DEFAULT)
|
||||
}
|
||||
}
|
||||
|
||||
val FirSession.jsr305StateContainer: FirJsr305StateContainer by FirSession.sessionComponentAccessor()
|
||||
-17
@@ -1,17 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2021 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.enhancement
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.FirSessionComponent
|
||||
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
|
||||
|
||||
class FirJavaTypeEnhancementStateComponent(val javaTypeEnhancementState: JavaTypeEnhancementState) : FirSessionComponent
|
||||
|
||||
private val FirSession.javaTypeEnhancementStateComponent: FirJavaTypeEnhancementStateComponent by FirSession.sessionComponentAccessor()
|
||||
|
||||
val FirSession.javaTypeEnhancementState: JavaTypeEnhancementState
|
||||
get() = javaTypeEnhancementStateComponent.javaTypeEnhancementState
|
||||
+2
-2
@@ -62,10 +62,10 @@ class FirSignatureEnhancement(
|
||||
private val javaTypeParameterStack: JavaTypeParameterStack =
|
||||
if (owner is FirJavaClass) owner.javaTypeParameterStack else JavaTypeParameterStack.EMPTY
|
||||
|
||||
private val typeQualifierResolver = FirAnnotationTypeQualifierResolver(session)
|
||||
private val typeQualifierResolver = session.javaAnnotationTypeQualifierResolver
|
||||
|
||||
private val contextQualifiers: JavaTypeQualifiersByElementType? =
|
||||
typeQualifierResolver.extractAndMergeDefaultQualifiers(null, owner.annotations)
|
||||
typeQualifierResolver.extractDefaultQualifiers(owner)
|
||||
|
||||
private val enhancements = mutableMapOf<FirCallableSymbol<*>, FirCallableSymbol<*>>()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user