[FIR] Hide local type for return type of single expression function ^KT-51418 Fixed
This commit is contained in:
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.copyWithNewSourceKind
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.resolvedTypeFromPrototype
|
||||
@@ -22,6 +23,7 @@ import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLookupTagWithFixedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
@@ -318,13 +320,14 @@ fun FirTypeRef.approximated(
|
||||
fun FirTypeRef.approximatedIfNeededOrSelf(
|
||||
approximator: ConeTypeApproximator,
|
||||
containingCallableVisibility: Visibility?,
|
||||
isInlineFunction: Boolean = false,
|
||||
session: FirSession,
|
||||
isInlineFunction: Boolean = false
|
||||
): FirTypeRef {
|
||||
val approximated = if (containingCallableVisibility == Visibilities.Public || containingCallableVisibility == Visibilities.Protected)
|
||||
approximatedForPublicPosition(approximator)
|
||||
else
|
||||
this
|
||||
return approximated.hideLocalTypeIfNeeded(containingCallableVisibility, isInlineFunction).withoutEnhancedNullability()
|
||||
return approximated.hideLocalTypeIfNeeded(containingCallableVisibility, session, isInlineFunction).withoutEnhancedNullability()
|
||||
}
|
||||
|
||||
fun FirTypeRef.approximatedForPublicPosition(approximator: ConeTypeApproximator): FirTypeRef =
|
||||
@@ -350,9 +353,11 @@ private fun ConeKotlinType.requiresApproximationInPublicPosition(): Boolean = co
|
||||
*/
|
||||
private fun FirTypeRef.hideLocalTypeIfNeeded(
|
||||
containingCallableVisibility: Visibility?,
|
||||
session: FirSession,
|
||||
isInlineFunction: Boolean = false
|
||||
): FirTypeRef {
|
||||
if (!shouldHideLocalType(containingCallableVisibility, isInlineFunction)) return this
|
||||
|
||||
val firClass =
|
||||
(((this as? FirResolvedTypeRef)
|
||||
?.type as? ConeClassLikeType)
|
||||
@@ -369,7 +374,23 @@ private fun FirTypeRef.hideLocalTypeIfNeeded(
|
||||
val superType = firClass.superTypeRefs.single()
|
||||
if (superType is FirResolvedTypeRef) {
|
||||
val newKind = source?.kind
|
||||
return if (newKind is KtFakeSourceElementKind) superType.copyWithNewSourceKind(newKind) else superType
|
||||
var result = superType
|
||||
val resultTypeArguments = result.type.typeArguments
|
||||
|
||||
if (resultTypeArguments.isNotEmpty() && resultTypeArguments.size == coneType.typeArguments.size) {
|
||||
val substitution = mutableMapOf<FirTypeParameterSymbol, ConeKotlinType>()
|
||||
for (index in resultTypeArguments.indices) {
|
||||
val key = resultTypeArguments[index]
|
||||
val value = coneType.typeArguments[index]
|
||||
val symbol = (key as? ConeTypeParameterType)?.lookupTag?.typeParameterSymbol ?: continue
|
||||
substitution[symbol] = value.type!!
|
||||
}
|
||||
|
||||
val substituted = ConeSubstitutorByMap(substitution, session).substituteOrSelf(result.type)
|
||||
result = substituted.toFirResolvedTypeRef(superType.source, superType.delegatedTypeRef)
|
||||
}
|
||||
|
||||
return if (newKind is KtFakeSourceElementKind) result.copyWithNewSourceKind(newKind) else result
|
||||
}
|
||||
return this
|
||||
}
|
||||
@@ -383,7 +404,7 @@ fun shouldHideLocalType(containingCallableVisibility: Visibility?, isInlineFunct
|
||||
return containingCallableVisibility == Visibilities.Public ||
|
||||
containingCallableVisibility == Visibilities.Protected ||
|
||||
containingCallableVisibility == Visibilities.Internal ||
|
||||
(containingCallableVisibility == Visibilities.Private && isInlineFunction)
|
||||
containingCallableVisibility == Visibilities.Private && isInlineFunction
|
||||
}
|
||||
|
||||
fun FirDeclaration.visibilityForApproximation(container: FirDeclaration?): Visibility {
|
||||
|
||||
Reference in New Issue
Block a user