Get rid of FirElement.session usages inside fir:java

This commit is contained in:
Mikhail Glukhikh
2019-03-07 12:24:03 +03:00
parent 6c12fabf74
commit 5f3a01c25a
7 changed files with 58 additions and 58 deletions
@@ -80,11 +80,11 @@ class JavaSymbolProvider(
isTopLevel = classId.relativeClassName.parent().isRoot, isStatic = javaClass.isStatic isTopLevel = classId.relativeClassName.parent().isRoot, isStatic = javaClass.isStatic
).apply { ).apply {
for (typeParameter in javaClass.typeParameters) { for (typeParameter in javaClass.typeParameters) {
typeParameters += createTypeParameterSymbol(session, typeParameter.name).fir typeParameters += createTypeParameterSymbol(this@JavaSymbolProvider.session, typeParameter.name).fir
} }
addAnnotationsFrom(javaClass) addAnnotationsFrom(this@JavaSymbolProvider.session, javaClass)
for (supertype in javaClass.supertypes) { for (supertype in javaClass.supertypes) {
superTypeRefs += supertype.toFirResolvedTypeRef(session) superTypeRefs += supertype.toFirResolvedTypeRef(this@JavaSymbolProvider.session)
} }
// TODO: may be we can process fields & methods later. // TODO: may be we can process fields & methods later.
// However, they should be built up to override resolve stage // However, they should be built up to override resolve stage
@@ -94,13 +94,13 @@ class JavaSymbolProvider(
val fieldSymbol = FirFieldSymbol(fieldId) val fieldSymbol = FirFieldSymbol(fieldId)
val returnType = javaField.type val returnType = javaField.type
val firJavaField = FirJavaField( val firJavaField = FirJavaField(
session, fieldSymbol, fieldName, this@JavaSymbolProvider.session, fieldSymbol, fieldName,
javaField.visibility, javaField.modality, javaField.visibility, javaField.modality,
returnTypeRef = returnType.toFirJavaTypeRef(session), returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session),
isVar = !javaField.isFinal, isVar = !javaField.isFinal,
isStatic = javaField.isStatic isStatic = javaField.isStatic
).apply { ).apply {
addAnnotationsFrom(javaField) addAnnotationsFrom(this@JavaSymbolProvider.session, javaField)
} }
declarations += firJavaField declarations += firJavaField
} }
@@ -110,17 +110,17 @@ class JavaSymbolProvider(
val methodSymbol = FirFunctionSymbol(methodId) val methodSymbol = FirFunctionSymbol(methodId)
val returnType = javaMethod.returnType val returnType = javaMethod.returnType
val firJavaMethod = FirJavaMethod( val firJavaMethod = FirJavaMethod(
session, methodSymbol, methodName, this@JavaSymbolProvider.session, methodSymbol, methodName,
javaMethod.visibility, javaMethod.modality, javaMethod.visibility, javaMethod.modality,
returnTypeRef = returnType.toFirJavaTypeRef(session), returnTypeRef = returnType.toFirJavaTypeRef(this@JavaSymbolProvider.session),
isStatic = javaMethod.isStatic isStatic = javaMethod.isStatic
).apply { ).apply {
for (typeParameter in javaMethod.typeParameters) { for (typeParameter in javaMethod.typeParameters) {
typeParameters += createTypeParameterSymbol(session, typeParameter.name).fir typeParameters += createTypeParameterSymbol(this@JavaSymbolProvider.session, typeParameter.name).fir
} }
addAnnotationsFrom(javaMethod) addAnnotationsFrom(this@JavaSymbolProvider.session, javaMethod)
for (valueParameter in javaMethod.valueParameters) { for (valueParameter in javaMethod.valueParameters) {
valueParameters += valueParameter.toFirValueParameters(session) valueParameters += valueParameter.toFirValueParameters(this@JavaSymbolProvider.session)
} }
} }
declarations += firJavaMethod declarations += firJavaMethod
@@ -129,19 +129,19 @@ class JavaSymbolProvider(
val constructorId = CallableId(classId.packageFqName, classId.relativeClassName, classId.shortClassName) val constructorId = CallableId(classId.packageFqName, classId.relativeClassName, classId.shortClassName)
val constructorSymbol = FirFunctionSymbol(constructorId) val constructorSymbol = FirFunctionSymbol(constructorId)
val firJavaConstructor = FirJavaConstructor( val firJavaConstructor = FirJavaConstructor(
session, constructorSymbol, javaConstructor.visibility, this@JavaSymbolProvider.session, constructorSymbol, javaConstructor.visibility,
FirResolvedTypeRefImpl( FirResolvedTypeRefImpl(
session, null, this@JavaSymbolProvider.session, null,
firSymbol.constructType(emptyArray(), false), firSymbol.constructType(emptyArray(), false),
false, emptyList() false, emptyList()
) )
).apply { ).apply {
for (typeParameter in javaConstructor.typeParameters) { for (typeParameter in javaConstructor.typeParameters) {
typeParameters += createTypeParameterSymbol(session, typeParameter.name).fir typeParameters += createTypeParameterSymbol(this@JavaSymbolProvider.session, typeParameter.name).fir
} }
addAnnotationsFrom(javaConstructor) addAnnotationsFrom(this@JavaSymbolProvider.session, javaConstructor)
for (valueParameter in javaConstructor.valueParameters) { for (valueParameter in javaConstructor.valueParameters) {
valueParameters += valueParameter.toFirValueParameters(session) valueParameters += valueParameter.toFirValueParameters(this@JavaSymbolProvider.session)
} }
} }
declarations += firJavaConstructor declarations += firJavaConstructor
@@ -60,7 +60,7 @@ internal fun ClassId.toConeKotlinType(
return ConeClassTypeImpl(lookupTag, typeArguments, isNullable) return ConeClassTypeImpl(lookupTag, typeArguments, isNullable)
} }
internal fun FirTypeRef.toNotNullConeKotlinType(): ConeKotlinType = internal fun FirTypeRef.toNotNullConeKotlinType(session: FirSession): ConeKotlinType =
when (this) { when (this) {
is FirResolvedTypeRef -> type is FirResolvedTypeRef -> type
is FirJavaTypeRef -> { is FirJavaTypeRef -> {
@@ -159,7 +159,7 @@ internal fun JavaAnnotation.toFirAnnotationCall(session: FirSession): FirAnnotat
return FirAnnotationCallImpl( return FirAnnotationCallImpl(
session, psi = null, useSiteTarget = null, session, psi = null, useSiteTarget = null,
annotationTypeRef = FirResolvedTypeRefImpl( annotationTypeRef = FirResolvedTypeRefImpl(
session = session, session,
psi = null, psi = null,
type = ConeClassTypeImpl(FirClassSymbol(classId!!).toLookupTag(), emptyArray(), isNullable = false), type = ConeClassTypeImpl(FirClassSymbol(classId!!).toLookupTag(), emptyArray(), isNullable = false),
isMarkedNullable = true, isMarkedNullable = true,
@@ -172,7 +172,7 @@ internal fun JavaAnnotation.toFirAnnotationCall(session: FirSession): FirAnnotat
} }
} }
internal fun FirAbstractAnnotatedElement.addAnnotationsFrom(javaAnnotationOwner: JavaAnnotationOwner) { internal fun FirAbstractAnnotatedElement.addAnnotationsFrom(session: FirSession, javaAnnotationOwner: JavaAnnotationOwner) {
for (annotation in javaAnnotationOwner.annotations) { for (annotation in javaAnnotationOwner.annotations) {
annotations += annotation.toFirAnnotationCall(session) annotations += annotation.toFirAnnotationCall(session)
} }
@@ -184,7 +184,7 @@ internal fun JavaValueParameter.toFirValueParameters(session: FirSession): FirVa
returnTypeRef = type.toFirJavaTypeRef(session), returnTypeRef = type.toFirJavaTypeRef(session),
isVararg = isVararg isVararg = isVararg
).apply { ).apply {
addAnnotationsFrom(this@toFirValueParameters) addAnnotationsFrom(session, this@toFirValueParameters)
} }
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.java.enhancement package org.jetbrains.kotlin.fir.java.enhancement
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.FirValueParameter
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirAnnotationContainer import org.jetbrains.kotlin.fir.expressions.FirAnnotationContainer
@@ -41,10 +42,11 @@ internal class EnhancementSignatureParts(
((this as? ConeLookupTagBasedType)?.lookupTag as? ConeClassLikeLookupTag)?.classId?.asSingleFqName()?.toUnsafe() ((this as? ConeLookupTagBasedType)?.lookupTag as? ConeClassLikeLookupTag)?.classId?.asSingleFqName()?.toUnsafe()
internal fun enhance( internal fun enhance(
session: FirSession,
jsr305State: Jsr305State, jsr305State: Jsr305State,
predefined: TypeEnhancementInfo? = null predefined: TypeEnhancementInfo? = null
): PartEnhancementResult { ): PartEnhancementResult {
val qualifiers = computeIndexedQualifiersForOverride(jsr305State) val qualifiers = computeIndexedQualifiersForOverride(session, jsr305State)
val qualifiersWithPredefined = predefined?.let { val qualifiersWithPredefined = predefined?.let {
IndexedJavaTypeQualifiers(qualifiers.size) { index -> IndexedJavaTypeQualifiers(qualifiers.size) { index ->
@@ -52,7 +54,7 @@ internal class EnhancementSignatureParts(
} }
} }
val containsFunctionN = current.toNotNullConeKotlinType().contains { val containsFunctionN = current.toNotNullConeKotlinType(session).contains {
if (it is ConeClassErrorType) false if (it is ConeClassErrorType) false
else { else {
val classId = it.lookupTag.classId val classId = it.lookupTag.classId
@@ -61,7 +63,7 @@ internal class EnhancementSignatureParts(
} }
} }
val enhancedCurrent = current.enhance(qualifiersWithPredefined ?: qualifiers) val enhancedCurrent = current.enhance(session, qualifiersWithPredefined ?: qualifiers)
return PartEnhancementResult( return PartEnhancementResult(
enhancedCurrent, wereChanges = true, containsFunctionN = containsFunctionN enhancedCurrent, wereChanges = true, containsFunctionN = containsFunctionN
) )
@@ -133,7 +135,7 @@ internal class EnhancementSignatureParts(
) )
} }
private fun FirTypeRef.extractQualifiers(): JavaTypeQualifiers { private fun FirTypeRef.extractQualifiers(session: FirSession): JavaTypeQualifiers {
val (lower, upper) = when (this) { val (lower, upper) = when (this) {
is FirResolvedTypeRef -> { is FirResolvedTypeRef -> {
val type = this.type val type = this.type
@@ -214,16 +216,17 @@ internal class EnhancementSignatureParts(
} }
private fun FirTypeRef.computeQualifiersForOverride( private fun FirTypeRef.computeQualifiersForOverride(
session: FirSession,
fromSupertypes: Collection<FirTypeRef>, fromSupertypes: Collection<FirTypeRef>,
defaultQualifiersForType: JavaTypeQualifiers?, defaultQualifiersForType: JavaTypeQualifiers?,
isHeadTypeConstructor: Boolean, isHeadTypeConstructor: Boolean,
jsr305State: Jsr305State jsr305State: Jsr305State
): JavaTypeQualifiers { ): JavaTypeQualifiers {
val superQualifiers = fromSupertypes.map { it.extractQualifiers() } val superQualifiers = fromSupertypes.map { it.extractQualifiers(session) }
val mutabilityFromSupertypes = superQualifiers.mapNotNull { it.mutability }.toSet() val mutabilityFromSupertypes = superQualifiers.mapNotNull { it.mutability }.toSet()
val nullabilityFromSupertypes = superQualifiers.mapNotNull { it.nullability }.toSet() val nullabilityFromSupertypes = superQualifiers.mapNotNull { it.nullability }.toSet()
val nullabilityFromSupertypesWithWarning = fromOverridden val nullabilityFromSupertypesWithWarning = fromOverridden
.mapNotNull { it.extractQualifiers().nullability } .mapNotNull { it.extractQualifiers(session).nullability }
.toSet() .toSet()
val own = extractQualifiersFromAnnotations(isHeadTypeConstructor, defaultQualifiersForType, jsr305State) val own = extractQualifiersFromAnnotations(isHeadTypeConstructor, defaultQualifiersForType, jsr305State)
@@ -260,7 +263,7 @@ internal class EnhancementSignatureParts(
) )
} }
private fun computeIndexedQualifiersForOverride(jsr305State: Jsr305State): IndexedJavaTypeQualifiers { private fun computeIndexedQualifiersForOverride(session: FirSession, jsr305State: Jsr305State): IndexedJavaTypeQualifiers {
val indexedFromSupertypes = fromOverridden.map { it.toIndexed(typeQualifierResolver, jsr305State, context) } val indexedFromSupertypes = fromOverridden.map { it.toIndexed(typeQualifierResolver, jsr305State, context) }
val indexedThisType = current.toIndexed(typeQualifierResolver, jsr305State, context) val indexedThisType = current.toIndexed(typeQualifierResolver, jsr305State, context)
@@ -280,7 +283,7 @@ internal class EnhancementSignatureParts(
val verticalSlice = indexedFromSupertypes.mapNotNull { it.getOrNull(index)?.type } val verticalSlice = indexedFromSupertypes.mapNotNull { it.getOrNull(index)?.type }
// Only the head type constructor is safely co-variant // Only the head type constructor is safely co-variant
qualifiers.computeQualifiersForOverride(verticalSlice, defaultQualifiers, isHeadTypeConstructor, jsr305State) qualifiers.computeQualifiersForOverride(session, verticalSlice, defaultQualifiers, isHeadTypeConstructor, jsr305State)
} }
return IndexedJavaTypeQualifiers(computedResult) return IndexedJavaTypeQualifiers(computedResult)
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.java.enhancement package org.jetbrains.kotlin.fir.java.enhancement
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.toSymbol
@@ -16,7 +17,7 @@ import org.jetbrains.kotlin.utils.Jsr305State
import org.jetbrains.kotlin.utils.ReportLevel import org.jetbrains.kotlin.utils.ReportLevel
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
class FirAnnotationTypeQualifierResolver(private val jsr305State: Jsr305State) { class FirAnnotationTypeQualifierResolver(private val session: FirSession, private val jsr305State: Jsr305State) {
class TypeQualifierWithApplicability( class TypeQualifierWithApplicability(
private val typeQualifier: FirAnnotationCall, private val typeQualifier: FirAnnotationCall,
@@ -48,7 +49,7 @@ class FirAnnotationTypeQualifierResolver(private val jsr305State: Jsr305State) {
} }
private val FirAnnotationCall.resolvedClass: FirRegularClass? private val FirAnnotationCall.resolvedClass: FirRegularClass?
get() = (coneClassLikeType?.lookupTag?.toSymbol(session) as? FirClassSymbol)?.fir get() = (coneClassLikeType?.lookupTag?.toSymbol(this@FirAnnotationTypeQualifierResolver.session) as? FirClassSymbol)?.fir
fun resolveTypeQualifierAnnotation(annotationCall: FirAnnotationCall): FirAnnotationCall? { fun resolveTypeQualifierAnnotation(annotationCall: FirAnnotationCall): FirAnnotationCall? {
if (jsr305State.disabled) { if (jsr305State.disabled) {
@@ -46,9 +46,7 @@ internal class IndexedJavaTypeQualifiers(private val data: Array<JavaTypeQualifi
val size: Int get() = data.size val size: Int get() = data.size
} }
internal fun FirJavaTypeRef.enhance( internal fun FirJavaTypeRef.enhance(session: FirSession, qualifiers: IndexedJavaTypeQualifiers): FirResolvedTypeRef {
qualifiers: IndexedJavaTypeQualifiers
): FirResolvedTypeRef {
return type.enhancePossiblyFlexible(session, annotations, qualifiers, 0) return type.enhancePossiblyFlexible(session, annotations, qualifiers, 0)
} }
@@ -37,14 +37,14 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.Jsr305State import org.jetbrains.kotlin.utils.Jsr305State
class JavaClassEnhancementScope( class JavaClassEnhancementScope(
session: FirSession, private val session: FirSession,
private val useSiteScope: JavaClassUseSiteScope private val useSiteScope: JavaClassUseSiteScope
) : FirScope { ) : FirScope {
private val owner: FirRegularClass get() = useSiteScope.symbol.fir private val owner: FirRegularClass get() = useSiteScope.symbol.fir
private val jsr305State: Jsr305State = session.jsr305State ?: Jsr305State.DEFAULT private val jsr305State: Jsr305State = session.jsr305State ?: Jsr305State.DEFAULT
private val typeQualifierResolver = FirAnnotationTypeQualifierResolver(jsr305State) private val typeQualifierResolver = FirAnnotationTypeQualifierResolver(session, jsr305State)
private val context: FirJavaEnhancementContext = private val context: FirJavaEnhancementContext =
FirJavaEnhancementContext(session) { null }.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, owner.annotations) FirJavaEnhancementContext(session) { null }.copyWithNewDefaultTypeQualifiers(typeQualifierResolver, jsr305State, owner.annotations)
@@ -83,14 +83,14 @@ class JavaClassEnhancementScope(
val symbol = FirPropertySymbol(original.callableId) val symbol = FirPropertySymbol(original.callableId)
with(firField) { with(firField) {
FirMemberPropertyImpl( FirMemberPropertyImpl(
session, null, symbol, name, this@JavaClassEnhancementScope.session, null, symbol, name,
visibility, modality, isExpect, isActual, isOverride, visibility, modality, isExpect, isActual, isOverride,
isConst = false, isLateInit = false, isConst = false, isLateInit = false,
receiverTypeRef = null, receiverTypeRef = null,
returnTypeRef = newReturnTypeRef, returnTypeRef = newReturnTypeRef,
isVar = isVar, initializer = null, isVar = isVar, initializer = null,
getter = FirDefaultPropertyGetter(session, null, newReturnTypeRef, visibility), getter = FirDefaultPropertyGetter(this@JavaClassEnhancementScope.session, null, newReturnTypeRef, visibility),
setter = FirDefaultPropertySetter(session, null, newReturnTypeRef, visibility), setter = FirDefaultPropertySetter(this@JavaClassEnhancementScope.session, null, newReturnTypeRef, visibility),
delegate = null delegate = null
).apply { ).apply {
annotations += firField.annotations annotations += firField.annotations
@@ -139,22 +139,20 @@ class JavaClassEnhancementScope(
} }
val symbol = FirFunctionSymbol(original.callableId) val symbol = FirFunctionSymbol(original.callableId)
with(firMethod) { FirMemberFunctionImpl(
FirMemberFunctionImpl( this@JavaClassEnhancementScope.session, null, symbol, name,
session, null, symbol, name, newReceiverTypeRef, newReturnTypeRef
newReceiverTypeRef, newReturnTypeRef ).apply {
).apply { status = firMethod.status as FirDeclarationStatusImpl
status = firMethod.status as FirDeclarationStatusImpl annotations += firMethod.annotations
annotations += firMethod.annotations valueParameters += firMethod.valueParameters.zip(newValueParameterTypeRefs) { valueParameter, newTypeRef ->
valueParameters += firMethod.valueParameters.zip(newValueParameterTypeRefs) { valueParameter, newTypeRef -> with(valueParameter) {
with(valueParameter) { FirValueParameterImpl(
FirValueParameterImpl( this@JavaClassEnhancementScope.session, psi,
session, psi, this.name, newTypeRef,
this.name, newTypeRef, defaultValue, isCrossinline, isNoinline, isVararg
defaultValue, isCrossinline, isNoinline, isVararg ).apply {
).apply { annotations += valueParameter.annotations
annotations += valueParameter.annotations
}
} }
} }
} }
@@ -198,7 +196,7 @@ class JavaClassEnhancementScope(
parameterContainer = ownerFunction, parameterContainer = ownerFunction,
methodContext = memberContext, methodContext = memberContext,
typeInSignature = TypeInSignature.Receiver typeInSignature = TypeInSignature.Receiver
).enhance(jsr305State) ).enhance(session, jsr305State)
return signatureParts.type return signatureParts.type
} }
@@ -214,7 +212,7 @@ class JavaClassEnhancementScope(
parameterContainer = ownerParameter, parameterContainer = ownerParameter,
methodContext = memberContext, methodContext = memberContext,
typeInSignature = TypeInSignature.ValueParameter(index) typeInSignature = TypeInSignature.ValueParameter(index)
).enhance(jsr305State, predefinedEnhancementInfo?.parametersInfo?.getOrNull(index)) ).enhance(session, jsr305State, predefinedEnhancementInfo?.parametersInfo?.getOrNull(index))
return signatureParts.type return signatureParts.type
} }
@@ -231,7 +229,7 @@ class JavaClassEnhancementScope(
if (owner is FirJavaField) AnnotationTypeQualifierResolver.QualifierApplicabilityType.FIELD if (owner is FirJavaField) AnnotationTypeQualifierResolver.QualifierApplicabilityType.FIELD
else AnnotationTypeQualifierResolver.QualifierApplicabilityType.METHOD_RETURN_TYPE, else AnnotationTypeQualifierResolver.QualifierApplicabilityType.METHOD_RETURN_TYPE,
typeInSignature = TypeInSignature.Return typeInSignature = TypeInSignature.Return
).enhance(jsr305State, predefinedEnhancementInfo?.returnTypeInfo) ).enhance(session, jsr305State, predefinedEnhancementInfo?.returnTypeInfo)
return signatureParts.type return signatureParts.type
} }
@@ -40,7 +40,7 @@ class JavaClassUseSiteScope(
} }
private fun isEqualTypes(a: FirTypeRef, b: FirTypeRef) = private fun isEqualTypes(a: FirTypeRef, b: FirTypeRef) =
isEqualTypes(a.toNotNullConeKotlinType(), b.toNotNullConeKotlinType()) isEqualTypes(a.toNotNullConeKotlinType(session), b.toNotNullConeKotlinType(session))
private fun isOverriddenFunCheck(member: FirNamedFunction, self: FirNamedFunction): Boolean { private fun isOverriddenFunCheck(member: FirNamedFunction, self: FirNamedFunction): Boolean {
return member.valueParameters.size == self.valueParameters.size && return member.valueParameters.size == self.valueParameters.size &&