Use resulting descriptor for old callable references to substitute stub type variables

This commit is contained in:
Victor Petukhov
2021-05-21 15:07:01 +03:00
parent 3ff22b67f7
commit 26cbb020db
2 changed files with 12 additions and 5 deletions
@@ -35,6 +35,7 @@ import org.jetbrains.kotlin.resolve.calls.results.ResolutionStatus;
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind;
import org.jetbrains.kotlin.resolve.calls.tasks.ResolutionCandidate;
import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy;
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
import org.jetbrains.kotlin.resolve.scopes.receivers.*;
import org.jetbrains.kotlin.types.KotlinType;
import org.jetbrains.kotlin.types.TypeProjection;
@@ -197,7 +198,10 @@ public class ResolvedCallImpl<D extends CallableDescriptor> implements MutableRe
@Override
@SuppressWarnings("unchecked")
public void setResultingSubstitutor(@NotNull TypeSubstitutor substitutor) {
resultingDescriptor = (D) candidateDescriptor.substitute(substitutor);
D descriptorToSubstitute = resultingDescriptor != null && DescriptorUtilsKt.shouldBeUsedToSubstitute(resultingDescriptor)
? resultingDescriptor
: candidateDescriptor;
resultingDescriptor = (D) descriptorToSubstitute.substitute(substitutor);
//noinspection ConstantConditions
if (resultingDescriptor == null) {
throw new AssertionError(
@@ -27,10 +27,7 @@ import org.jetbrains.kotlin.resolve.constants.EnumValue
import org.jetbrains.kotlin.resolve.isInlineClass
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeProjection
import org.jetbrains.kotlin.types.TypeSubstitutor
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
import org.jetbrains.kotlin.types.checker.REFINER_CAPABILITY
@@ -426,3 +423,9 @@ fun ModuleDescriptor.isTypeRefinementEnabled(): Boolean = getCapability(REFINER_
val VariableDescriptor.isUnderscoreNamed
get() = !name.isSpecial && name.identifier == "_"
fun <D : CallableDescriptor> D.shouldBeUsedToSubstitute() =
valueParameters.none { it.type.isError }
&& returnType?.isError != true
&& dispatchReceiverParameter?.type?.isError != true
&& extensionReceiverParameter?.type?.isError != true