FIR2IR: handle deserialized class reference inside GetClassCall

This commit is contained in:
Jinseong Jeon
2020-06-12 01:05:08 -07:00
committed by Denis Zharkov
parent 781bfa20e8
commit 955c7a1e5b
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
import org.jetbrains.kotlin.fir.resolve.isIteratorNext import org.jetbrains.kotlin.fir.resolve.isIteratorNext
import org.jetbrains.kotlin.fir.resolve.scope import org.jetbrains.kotlin.fir.resolve.scope
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.resolve.transformers.IntegerLiteralTypeApproximationTransformer import org.jetbrains.kotlin.fir.resolve.transformers.IntegerLiteralTypeApproximationTransformer
import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerOperator import org.jetbrains.kotlin.fir.scopes.impl.FirIntegerOperator
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
@@ -780,7 +781,12 @@ class Fir2IrVisitor(
override fun visitGetClassCall(getClassCall: FirGetClassCall, data: Any?): IrElement { override fun visitGetClassCall(getClassCall: FirGetClassCall, data: Any?): IrElement {
val argument = getClassCall.argument val argument = getClassCall.argument
val irType = getClassCall.typeRef.toIrType() val irType = getClassCall.typeRef.toIrType()
val irClassType = argument.typeRef.toIrType() val irClassType =
if (argument is FirClassReferenceExpression) {
argument.classTypeRef.toIrType()
} else {
argument.typeRef.toIrType()
}
val irClassReferenceSymbol = when (argument) { val irClassReferenceSymbol = when (argument) {
is FirResolvedReifiedParameterReference -> { is FirResolvedReifiedParameterReference -> {
classifierStorage.getIrTypeParameterSymbol(argument.symbol, ConversionTypeContext.DEFAULT) classifierStorage.getIrTypeParameterSymbol(argument.symbol, ConversionTypeContext.DEFAULT)
@@ -794,6 +800,12 @@ class Fir2IrVisitor(
} }
classifierStorage.getIrClassSymbol(symbol) classifierStorage.getIrClassSymbol(symbol)
} }
is FirClassReferenceExpression -> {
val type = argument.classTypeRef.coneTypeSafe<ConeClassLikeType>()
(type?.lookupTag?.toSymbol(session) as? FirClassSymbol<*>)?.let {
classifierStorage.getIrClassSymbol(it)
}
}
else -> null else -> null
} }
return getClassCall.convertWithOffsets { startOffset, endOffset -> return getClassCall.convertWithOffsets { startOffset, endOffset ->