[AA] KT-55098 Add context receivers to KtFunctionalType

- Context receivers in function types may not be labeled, so the created
  `KtContextReceiver`s have `null` labels. Such labels currently only
  compile due to a bug (see KT-55187).
This commit is contained in:
Marco Pennekamp
2022-11-30 13:55:56 +01:00
committed by Space Team
parent 2851622a6f
commit e2804693bf
4 changed files with 46 additions and 14 deletions
@@ -5,7 +5,9 @@
package org.jetbrains.kotlin.analysis.api.descriptors.types
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
import org.jetbrains.kotlin.analysis.api.KtTypeProjection
import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescNamedClassOrObjectSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktNullability
@@ -15,16 +17,15 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.bas
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.asStringForDebugging
import org.jetbrains.kotlin.analysis.api.descriptors.utils.KtFe10JvmTypeMapperContext
import org.jetbrains.kotlin.analysis.api.impl.base.KtContextReceiverImpl
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
import org.jetbrains.kotlin.analysis.api.types.KtClassTypeQualifier
import org.jetbrains.kotlin.analysis.api.types.KtFunctionalType
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
import org.jetbrains.kotlin.builtins.*
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType
import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType
import org.jetbrains.kotlin.builtins.getValueParameterTypesFromFunctionType
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.types.SimpleType
@@ -55,6 +56,22 @@ internal class KtFe10FunctionalType(
override val arity: Int
get() = withValidityAssertion { descriptor.arity }
override val hasContextReceivers: Boolean
get() = withValidityAssertion { type.contextFunctionTypeParamsCount() > 0 }
@OptIn(KtAnalysisApiInternals::class)
override val contextReceivers: List<KtContextReceiver>
get() = withValidityAssertion {
type.getContextReceiverTypesFromFunctionType().map { receiverType ->
// Context receivers in function types may not have labels, hence the `null` label.
KtContextReceiverImpl(
receiverType.toKtType(analysisContext),
_label = null,
analysisContext.token,
)
}
}
override val hasReceiver: Boolean
get() = withValidityAssertion {
if (descriptor.functionKind.isReflectType) false