Revert "K1: cleanup new inference constructor resolve in CallResolverUtil"
This reverts commit ec055eb418.
This commit is contained in:
@@ -52,7 +52,6 @@ import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
|||||||
import org.jetbrains.kotlin.types.typeUtil.contains
|
import org.jetbrains.kotlin.types.typeUtil.contains
|
||||||
import org.jetbrains.kotlin.util.buildNotFixedVariablesToPossibleResultType
|
import org.jetbrains.kotlin.util.buildNotFixedVariablesToPossibleResultType
|
||||||
import org.jetbrains.kotlin.utils.SmartList
|
import org.jetbrains.kotlin.utils.SmartList
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
|
||||||
|
|
||||||
enum class ResolveArgumentsMode {
|
enum class ResolveArgumentsMode {
|
||||||
RESOLVE_FUNCTION_ARGUMENTS,
|
RESOLVE_FUNCTION_ARGUMENTS,
|
||||||
@@ -284,30 +283,29 @@ fun isArrayOrArrayLiteral(argument: ValueArgument, trace: BindingTrace): Boolean
|
|||||||
return KotlinBuiltIns.isArrayOrPrimitiveArray(type)
|
return KotlinBuiltIns.isArrayOrPrimitiveArray(type)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun computeConstructorDispatchReceiver(
|
private fun computeConstructorDescriptorsToResolveAndReceiver(
|
||||||
|
constructors: Collection<ConstructorDescriptor>,
|
||||||
containingClass: ClassDescriptor,
|
containingClass: ClassDescriptor,
|
||||||
scope: LexicalScope,
|
scope: LexicalScope,
|
||||||
substitutor: TypeSubstitutor?
|
substitutor: TypeSubstitutor?,
|
||||||
): ReceiverValue? {
|
syntheticScopes: SyntheticScopes
|
||||||
return runIf(containingClass.isInner) {
|
): Pair<Collection<ConstructorDescriptor>, ReceiverValue?>? {
|
||||||
|
val dispatchReceiver: ReceiverValue? = if (containingClass.isInner) {
|
||||||
val outerClassType = (containingClass.containingDeclaration as? ClassDescriptor)?.defaultType ?: return null
|
val outerClassType = (containingClass.containingDeclaration as? ClassDescriptor)?.defaultType ?: return null
|
||||||
val substitutedOuterClassType = substitutor?.substitute(outerClassType, Variance.INVARIANT) ?: outerClassType
|
val substitutedOuterClassType = substitutor?.substitute(outerClassType, Variance.INVARIANT) ?: outerClassType
|
||||||
scope.getImplicitReceiversHierarchy().firstOrNull {
|
val receiver = scope.getImplicitReceiversHierarchy().firstOrNull {
|
||||||
KotlinTypeChecker.DEFAULT.isSubtypeOf(it.type, substitutedOuterClassType)
|
KotlinTypeChecker.DEFAULT.isSubtypeOf(it.type, substitutedOuterClassType)
|
||||||
}?.value
|
} ?: return null
|
||||||
}
|
|
||||||
}
|
receiver.value
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
val syntheticConstructors = constructors.flatMap { syntheticScopes.collectSyntheticConstructors(it) }
|
||||||
|
|
||||||
|
return constructors + syntheticConstructors to dispatchReceiver
|
||||||
|
|
||||||
private fun computeConstructorDescriptorsToResolve(
|
|
||||||
containingClass: ClassDescriptor,
|
|
||||||
typeAliasDescriptorIfAny: TypeAliasDescriptor?,
|
|
||||||
syntheticScopes: SyntheticScopes
|
|
||||||
): Collection<ConstructorDescriptor> {
|
|
||||||
val simpleConstructors =
|
|
||||||
typeAliasDescriptorIfAny?.constructors?.mapNotNull(TypeAliasConstructorDescriptor::withDispatchReceiver)
|
|
||||||
?: containingClass.constructors
|
|
||||||
val syntheticConstructors = simpleConstructors.flatMap { syntheticScopes.collectSyntheticConstructors(it) }
|
|
||||||
return simpleConstructors + syntheticConstructors
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun resolveConstructorCallWithGivenDescriptors(
|
fun resolveConstructorCallWithGivenDescriptors(
|
||||||
@@ -322,20 +320,25 @@ fun resolveConstructorCallWithGivenDescriptors(
|
|||||||
|
|
||||||
@Suppress("NAME_SHADOWING")
|
@Suppress("NAME_SHADOWING")
|
||||||
val constructorType = constructorType.unwrap()
|
val constructorType = constructorType.unwrap()
|
||||||
val constructorTypeAbbreviation = (constructorType as? AbbreviatedType)?.abbreviation
|
val knownSubstitutor = if (useKnownTypeSubstitutor) {
|
||||||
val knownSubstitutor = runIf(useKnownTypeSubstitutor) {
|
TypeSubstitutor.create((constructorType as? AbbreviatedType)?.abbreviation ?: constructorType)
|
||||||
TypeSubstitutor.create(constructorTypeAbbreviation ?: constructorType)
|
} else null
|
||||||
}
|
val typeAliasDescriptor = if (constructorType is AbbreviatedType) {
|
||||||
val typeAliasDescriptor = constructorTypeAbbreviation?.constructor?.declarationDescriptor as? TypeAliasDescriptor
|
constructorType.abbreviation.constructor.declarationDescriptor as? TypeAliasDescriptor
|
||||||
|
} else null
|
||||||
|
|
||||||
val receiver = computeConstructorDispatchReceiver(containingClass, context.scope, knownSubstitutor)
|
val (constructors, receiver) = computeConstructorDescriptorsToResolveAndReceiver(
|
||||||
val allConstructors = runIf(!containingClass.isInner || receiver != null) {
|
constructors = typeAliasDescriptor?.constructors?.mapNotNull(TypeAliasConstructorDescriptor::withDispatchReceiver)
|
||||||
computeConstructorDescriptorsToResolve(containingClass, typeAliasDescriptor, syntheticScopes)
|
?: containingClass.constructors,
|
||||||
}.orEmpty()
|
containingClass,
|
||||||
|
context.scope,
|
||||||
|
knownSubstitutor,
|
||||||
|
syntheticScopes
|
||||||
|
) ?: (emptyList<ConstructorDescriptor>() to null)
|
||||||
|
|
||||||
val resolutionResults = PSICallResolver.runResolutionAndInferenceForGivenDescriptors<ConstructorDescriptor>(
|
val resolutionResults = PSICallResolver.runResolutionAndInferenceForGivenDescriptors<ConstructorDescriptor>(
|
||||||
context,
|
context,
|
||||||
allConstructors,
|
constructors,
|
||||||
tracingStrategy,
|
tracingStrategy,
|
||||||
KotlinCallKind.FUNCTION,
|
KotlinCallKind.FUNCTION,
|
||||||
knownSubstitutor,
|
knownSubstitutor,
|
||||||
|
|||||||
Reference in New Issue
Block a user