FIR: Optimize unnecessary interface casts by adding relevant overload

This commit is contained in:
Denis.Zharkov
2021-02-24 15:16:55 +03:00
parent f141c276be
commit c09fe3ea6f
2 changed files with 9 additions and 3 deletions
@@ -61,7 +61,7 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu
if (declaration is FirRegularClass && declaration.classId.isLocal) return null if (declaration is FirRegularClass && declaration.classId.isLocal) return null
if (declaration is FirCallableMemberDeclaration<*>) { if (declaration is FirCallableMemberDeclaration<*>) {
if (declaration.visibility == Visibilities.Local) return null if (declaration.visibility == Visibilities.Local) return null
if (declaration.symbol.dispatchReceiverClassOrNull()?.classId?.isLocal == true || containingClass?.classId?.isLocal == true) return null if (declaration.dispatchReceiverClassOrNull()?.classId?.isLocal == true || containingClass?.classId?.isLocal == true) return null
} }
val builder = SignatureBuilder() val builder = SignatureBuilder()
try { try {
@@ -15,8 +15,10 @@ import org.jetbrains.kotlin.fir.types.ConeIntersectionType
fun FirCallableSymbol<*>.dispatchReceiverClassOrNull(): ConeClassLikeLookupTag? = fun FirCallableSymbol<*>.dispatchReceiverClassOrNull(): ConeClassLikeLookupTag? =
(fir as? FirCallableMemberDeclaration<*>)?.dispatchReceiverClassOrNull() (fir as? FirCallableMemberDeclaration<*>)?.dispatchReceiverClassOrNull()
fun FirCallableDeclaration<*>.dispatchReceiverClassOrNull(): ConeClassLikeLookupTag? { fun FirCallableDeclaration<*>.dispatchReceiverClassOrNull(): ConeClassLikeLookupTag? =
if (this !is FirCallableMemberDeclaration<*>) return null (this as? FirCallableMemberDeclaration<*>)?.dispatchReceiverClassOrNull()
fun FirCallableMemberDeclaration<*>.dispatchReceiverClassOrNull(): ConeClassLikeLookupTag? {
if (dispatchReceiverType is ConeIntersectionType && isIntersectionOverride) return symbol.baseForIntersectionOverride!!.fir.dispatchReceiverClassOrNull() if (dispatchReceiverType is ConeIntersectionType && isIntersectionOverride) return symbol.baseForIntersectionOverride!!.fir.dispatchReceiverClassOrNull()
return (dispatchReceiverType as? ConeClassLikeType)?.lookupTag return (dispatchReceiverType as? ConeClassLikeType)?.lookupTag
@@ -27,6 +29,10 @@ fun FirCallableDeclaration<*>.containingClass(): ConeClassLikeLookupTag? {
return (containingClassAttr ?: dispatchReceiverClassOrNull()) return (containingClassAttr ?: dispatchReceiverClassOrNull())
} }
fun FirCallableMemberDeclaration<*>.containingClass(): ConeClassLikeLookupTag? {
return (containingClassAttr ?: dispatchReceiverClassOrNull())
}
private object ContainingClassKey : FirDeclarationDataKey() private object ContainingClassKey : FirDeclarationDataKey()
var FirCallableDeclaration<*>.containingClassAttr: ConeClassLikeLookupTag? by FirDeclarationDataRegistry.data(ContainingClassKey) var FirCallableDeclaration<*>.containingClassAttr: ConeClassLikeLookupTag? by FirDeclarationDataRegistry.data(ContainingClassKey)