Revert "[NI] Disable capturing/approximation type in TypeSubstitutor with enabled NI"

This reverts commit 7c4101e21c.

 #KT-31866 Fixed
 #KT-31868 Fixed
 #EA-125401 Fixed
 #KT-25290 Open
This commit is contained in:
Mikhail Zarechenskiy
2019-06-04 17:41:43 +03:00
parent f48640f91c
commit 787a8bb9bd
79 changed files with 197 additions and 887 deletions
@@ -42,7 +42,6 @@ import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.types.SubstitutingScopeProvider
import java.util.*
class JavaResolverComponents(
@@ -65,8 +64,7 @@ class JavaResolverComponents(
val annotationTypeQualifierResolver: AnnotationTypeQualifierResolver,
val signatureEnhancement: SignatureEnhancement,
val javaClassesTracker: JavaClassesTracker,
val settings: JavaResolverSettings,
val substitutingScopeProvider: SubstitutingScopeProvider
val settings: JavaResolverSettings
) {
fun replace(
javaResolverCache: JavaResolverCache = this.javaResolverCache
@@ -75,7 +73,7 @@ class JavaResolverComponents(
signaturePropagator, errorReporter, javaResolverCache,
javaPropertyInitializerEvaluator, samConversionResolver, sourceElementFactory,
moduleClassResolver, packagePartProvider, supertypeLoopChecker, lookupTracker, module, reflectionTypes,
annotationTypeQualifierResolver, signatureEnhancement, javaClassesTracker, settings, substitutingScopeProvider
annotationTypeQualifierResolver, signatureEnhancement, javaClassesTracker, settings
)
}
@@ -46,8 +46,7 @@ class LazyJavaClassDescriptor(
) : ClassDescriptorBase(
outerContext.storageManager, containingDeclaration, jClass.name,
outerContext.components.sourceElementFactory.source(jClass),
/* isExternal = */ false,
outerContext.components.substitutingScopeProvider
/* isExternal = */ false
), JavaClassDescriptor {
companion object {
@@ -43,7 +43,6 @@ import org.jetbrains.kotlin.serialization.deserialization.ContractDeserializer
import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents
import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration
import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.types.SubstitutingScopeProvider
import org.jetbrains.kotlin.utils.Jsr305State
class RuntimeModuleData private constructor(
@@ -71,7 +70,7 @@ class RuntimeModuleData private constructor(
singleModuleClassResolver, PackagePartProvider.Empty, SupertypeLoopChecker.EMPTY, LookupTracker.DO_NOTHING, module,
ReflectionTypes(module, notFoundClasses), annotationTypeQualifierResolver,
SignatureEnhancement(annotationTypeQualifierResolver, Jsr305State.DISABLED),
JavaClassesTracker.Default, JavaResolverSettings.Default, SubstitutingScopeProvider.DEFAULT
JavaClassesTracker.Default, JavaResolverSettings.Default
)
val lazyJavaPackageFragmentProvider = LazyJavaPackageFragmentProvider(javaResolverComponents)
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.resolve.scopes.InnerClassesScopeWrapper;
import org.jetbrains.kotlin.resolve.scopes.MemberScope;
import org.jetbrains.kotlin.resolve.scopes.SubstitutingScope;
import org.jetbrains.kotlin.storage.NotNullLazyValue;
import org.jetbrains.kotlin.storage.StorageManager;
import org.jetbrains.kotlin.types.*;
@@ -33,11 +34,10 @@ import java.util.List;
public abstract class AbstractClassDescriptor implements ClassDescriptor {
private final Name name;
protected final NotNullLazyValue<SimpleType> defaultType;
protected final SubstitutingScopeProvider substitutingScopeProvider;
private final NotNullLazyValue<MemberScope> unsubstitutedInnerClassesScope;
private final NotNullLazyValue<ReceiverParameterDescriptor> thisAsReceiverParameter;
public AbstractClassDescriptor(@NotNull StorageManager storageManager, @NotNull Name name, @NotNull SubstitutingScopeProvider substitutingScopeProvider) {
public AbstractClassDescriptor(@NotNull StorageManager storageManager, @NotNull Name name) {
this.name = name;
this.defaultType = storageManager.createLazyValue(new Function0<SimpleType>() {
@Override
@@ -57,11 +57,6 @@ public abstract class AbstractClassDescriptor implements ClassDescriptor {
return new LazyClassReceiverParameterDescriptor(AbstractClassDescriptor.this);
}
});
this.substitutingScopeProvider = substitutingScopeProvider;
}
public AbstractClassDescriptor(@NotNull StorageManager storageManager, @NotNull Name name) {
this(storageManager, name, SubstitutingScopeProvider.Companion.getDEFAULT());
}
@NotNull
@@ -97,7 +92,7 @@ public abstract class AbstractClassDescriptor implements ClassDescriptor {
if (typeArguments.isEmpty()) return getUnsubstitutedMemberScope();
TypeSubstitutor substitutor = TypeConstructorSubstitution.create(getTypeConstructor(), typeArguments).buildSubstitutor();
return substitutingScopeProvider.createSubstitutingScope(getUnsubstitutedMemberScope(), substitutor);
return new SubstitutingScope(getUnsubstitutedMemberScope(), substitutor);
}
@NotNull
@@ -106,7 +101,7 @@ public abstract class AbstractClassDescriptor implements ClassDescriptor {
if (typeSubstitution.isEmpty()) return getUnsubstitutedMemberScope();
TypeSubstitutor substitutor = TypeSubstitutor.create(typeSubstitution);
return substitutingScopeProvider.createSubstitutingScope(getUnsubstitutedMemberScope(), substitutor);
return new SubstitutingScope(getUnsubstitutedMemberScope(), substitutor);
}
@NotNull
@@ -115,7 +110,7 @@ public abstract class AbstractClassDescriptor implements ClassDescriptor {
if (substitutor.isEmpty()) {
return this;
}
return new LazySubstitutingClassDescriptor(this, substitutor, substitutingScopeProvider);
return new LazySubstitutingClassDescriptor(this, substitutor);
}
@NotNull
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
import org.jetbrains.kotlin.descriptors.SourceElement;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.storage.StorageManager;
import org.jetbrains.kotlin.types.SubstitutingScopeProvider;
public abstract class ClassDescriptorBase extends AbstractClassDescriptor {
@@ -36,18 +35,7 @@ public abstract class ClassDescriptorBase extends AbstractClassDescriptor {
@NotNull SourceElement source,
boolean isExternal
) {
this(storageManager, containingDeclaration, name, source, isExternal, SubstitutingScopeProvider.Companion.getDEFAULT());
}
protected ClassDescriptorBase(
@NotNull StorageManager storageManager,
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull Name name,
@NotNull SourceElement source,
boolean isExternal,
@NotNull SubstitutingScopeProvider substitutingScopeProvider
) {
super(storageManager, name, substitutingScopeProvider);
super(storageManager, name);
this.containingDeclaration = containingDeclaration;
this.source = source;
this.isExternal = isExternal;
@@ -324,21 +324,11 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
}
@Override
@Nullable
public FunctionDescriptor substitute(@NotNull TypeSubstitutor originalSubstitutor) {
return substitute(originalSubstitutor, SubstitutingScopeProvider.Companion.getDEFAULT());
}
@Nullable
public FunctionDescriptor substitute(@NotNull TypeSubstitutor originalSubstitutor, SubstitutingScopeProvider substitutingScopeProvider) {
if (originalSubstitutor.isEmpty()) {
return this;
}
return newCopyBuilder(originalSubstitutor)
.setOriginal(getOriginal())
.setJustForTypeSubstitution(true)
.setSubstitutingScopeProvider(substitutingScopeProvider)
.build();
return newCopyBuilder(originalSubstitutor).setOriginal(getOriginal()).setJustForTypeSubstitution(true).build();
}
@Nullable
@@ -375,7 +365,6 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
private Map<UserDataKey<?>, Object> userDataMap = new LinkedHashMap<UserDataKey<?>, Object>();
private Boolean newHasSynthesizedParameterNames = null;
protected boolean justForTypeSubstitution = false;
protected @NotNull SubstitutingScopeProvider substitutingScopeProvider;
public CopyConfiguration(
@NotNull TypeSubstitution substitution,
@@ -397,7 +386,6 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
this.newExtensionReceiverParameter = newExtensionReceiverParameter;
this.newReturnType = newReturnType;
this.name = name;
substitutingScopeProvider = SubstitutingScopeProvider.Companion.getDEFAULT();
}
@Override
@@ -566,12 +554,6 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
justForTypeSubstitution = value;
return this;
}
@NotNull
public CopyConfiguration setSubstitutingScopeProvider(@NotNull SubstitutingScopeProvider substitutingScopeProvider) {
this.substitutingScopeProvider = substitutingScopeProvider;
return this;
}
}
@Override
@@ -609,8 +591,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
List<TypeParameterDescriptor> substitutedTypeParameters =
new ArrayList<TypeParameterDescriptor>(unsubstitutedTypeParameters.size());
final TypeSubstitutor substitutor = DescriptorSubstitutor.substituteTypeParameters(
unsubstitutedTypeParameters, configuration.substitution, substitutedDescriptor, substitutedTypeParameters,
wereChanges, configuration.substitutingScopeProvider
unsubstitutedTypeParameters, configuration.substitution, substitutedDescriptor, substitutedTypeParameters, wereChanges
);
if (substitutor == null) return null;
@@ -28,12 +28,10 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
private List<TypeParameterDescriptor> typeConstructorParameters;
private List<TypeParameterDescriptor> declaredTypeParameters;
private TypeConstructor typeConstructor;
private final SubstitutingScopeProvider substitutingScopeProvider;
public LazySubstitutingClassDescriptor(ClassDescriptor descriptor, TypeSubstitutor substitutor, SubstitutingScopeProvider substitutingScopeProvider) {
public LazySubstitutingClassDescriptor(ClassDescriptor descriptor, TypeSubstitutor substitutor) {
this.original = descriptor;
this.originalSubstitutor = substitutor;
this.substitutingScopeProvider = substitutingScopeProvider;
}
private TypeSubstitutor getSubstitutor() {
@@ -89,7 +87,7 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
if (originalSubstitutor.isEmpty()) {
return memberScope;
}
return substitutingScopeProvider.createSubstitutingScope(memberScope, getSubstitutor());
return new SubstitutingScope(memberScope, getSubstitutor());
}
@NotNull
@@ -99,7 +97,7 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
if (originalSubstitutor.isEmpty()) {
return memberScope;
}
return substitutingScopeProvider.createSubstitutingScope(memberScope, getSubstitutor());
return new SubstitutingScope(memberScope, getSubstitutor());
}
@NotNull
@@ -109,7 +107,7 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
if (originalSubstitutor.isEmpty()) {
return memberScope;
}
return substitutingScopeProvider.createSubstitutingScope(memberScope, getSubstitutor());
return new SubstitutingScope(memberScope, getSubstitutor());
}
@NotNull
@@ -177,7 +175,7 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
@Override
public ClassDescriptor substitute(@NotNull TypeSubstitutor substitutor) {
if (substitutor.isEmpty()) return this;
return new LazySubstitutingClassDescriptor(this, TypeSubstitutor.createChainedSubstitutor(substitutor.getSubstitution(), getSubstitutor().getSubstitution()), substitutingScopeProvider);
return new LazySubstitutingClassDescriptor(this, TypeSubstitutor.createChainedSubstitutor(substitutor.getSubstitution(), getSubstitutor().getSubstitution()));
}
@Override
@@ -47,8 +47,6 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
private final boolean isExternal;
private final boolean isDelegated;
private final SubstitutingScopeProvider substitutingScopeProvider;
private ReceiverParameterDescriptor dispatchReceiverParameter;
private ReceiverParameterDescriptor extensionReceiverParameter;
private List<TypeParameterDescriptor> typeParameters;
@@ -74,28 +72,6 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
boolean isActual,
boolean isExternal,
boolean isDelegated
) {
this(containingDeclaration, original, annotations, modality, visibility, isVar, name, kind, source,
lateInit, isConst, isExpect, isActual, isExternal, isDelegated, SubstitutingScopeProvider.Companion.getDEFAULT());
}
protected PropertyDescriptorImpl(
@NotNull DeclarationDescriptor containingDeclaration,
@Nullable PropertyDescriptor original,
@NotNull Annotations annotations,
@NotNull Modality modality,
@NotNull Visibility visibility,
boolean isVar,
@NotNull Name name,
@NotNull Kind kind,
@NotNull SourceElement source,
boolean lateInit,
boolean isConst,
boolean isExpect,
boolean isActual,
boolean isExternal,
boolean isDelegated,
@NotNull SubstitutingScopeProvider substitutingScopeProvider
) {
super(containingDeclaration, annotations, name, null, isVar, source);
this.modality = modality;
@@ -108,7 +84,6 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
this.isActual = isActual;
this.isExternal = isExternal;
this.isDelegated = isDelegated;
this.substitutingScopeProvider = substitutingScopeProvider;
}
@NotNull
@@ -127,39 +102,10 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
boolean isActual,
boolean isExternal,
boolean isDelegated
) {
return create(containingDeclaration, annotations, modality, visibility, isVar, name, kind, source,
lateInit, isConst, isExpect, isActual, isExternal, isDelegated, SubstitutingScopeProvider.Companion.getDEFAULT());
}
@NotNull
public static PropertyDescriptorImpl create(
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull Annotations annotations,
@NotNull Modality modality,
@NotNull Visibility visibility,
boolean isVar,
@NotNull Name name,
@NotNull Kind kind,
@NotNull SourceElement source,
boolean lateInit,
boolean isConst,
boolean isExpect,
boolean isActual,
boolean isExternal,
boolean isDelegated,
@NotNull SubstitutingScopeProvider substitutingScopeProvider
) {
return new PropertyDescriptorImpl(containingDeclaration, null, annotations,
modality, visibility, isVar, name, kind, source, lateInit, isConst,
isExpect, isActual, isExternal, isDelegated, substitutingScopeProvider);
}
@NotNull
public PropertyDescriptorImpl getCopy() {
return new PropertyDescriptorImpl(getContainingDeclaration(), original, getAnnotations(),
modality, visibility, isVar(), getName(), kind, getSource(), lateInit, isConst,
isExpect, isActual, isExternal, isDelegated, substitutingScopeProvider);
isExpect, isActual, isExternal, isDelegated);
}
public void setType(
@@ -312,7 +258,6 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
private ReceiverParameterDescriptor dispatchReceiverParameter = PropertyDescriptorImpl.this.dispatchReceiverParameter;
private List<TypeParameterDescriptor> newTypeParameters = null;
private Name name = getName();
private boolean setterProjectedOut = PropertyDescriptorImpl.this.setterProjectedOut;
@NotNull
@Override
@@ -419,7 +364,6 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
TypeSubstitutor substitutor = DescriptorSubstitutor.substituteTypeParameters(
originalTypeParameters, copyConfiguration.substitution, substitutedDescriptor, substitutedTypeParameters
);
substitutor.setSubstitutingScopeProvider(substitutingScopeProvider);
KotlinType originalOutType = getType();
KotlinType outType = substitutor.substitute(originalOutType, Variance.OUT_VARIANCE);
@@ -516,8 +460,6 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
substitutedDescriptor.setCompileTimeInitializer(compileTimeInitializer);
}
substitutedDescriptor.setterProjectedOut = copyConfiguration.setterProjectedOut;
return substitutedDescriptor;
}
@@ -528,7 +470,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
return prev;
}
public static FunctionDescriptor getSubstitutedInitialSignatureDescriptor(
private static FunctionDescriptor getSubstitutedInitialSignatureDescriptor(
@NotNull TypeSubstitutor substitutor,
@NotNull PropertyAccessorDescriptor accessorDescriptor
) {
@@ -548,7 +490,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
) {
return new PropertyDescriptorImpl(
newOwner, original, getAnnotations(), newModality, newVisibility, isVar(), newName, kind, SourceElement.NO_SOURCE,
isLateInit(), isConst(), isExpect(), isActual(), isExternal(), isDelegated(), substitutingScopeProvider
isLateInit(), isConst(), isExpect(), isActual(), isExternal(), isDelegated()
);
}
@@ -622,9 +564,4 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
public <V> V getUserData(UserDataKey<V> key) {
return null;
}
@NotNull
public SubstitutingScopeProvider getSubstitutingScopeProvider() {
return substitutingScopeProvider;
}
}
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeSubstitutor
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.utils.join
open class ValueParameterDescriptorImpl(
@@ -103,7 +102,8 @@ open class ValueParameterDescriptorImpl(
override fun getOriginal() = if (original === this) this else original.original
override fun substitute(substitutor: TypeSubstitutor): ValueParameterDescriptor {
return this
if (substitutor.isEmpty) return this
throw UnsupportedOperationException() // TODO
}
override fun <R, D> accept(visitor: DeclarationDescriptorVisitor<R, D>, data: D): R {
@@ -100,25 +100,16 @@ class CapturedType(
CapturedType(typeProjection, constructor, isMarkedNullable, newAnnotations)
}
object OldCapturedTypeCreator : CapturedTypeCreator {
override fun createCapturedType(typeProjection: TypeProjection): TypeProjection {
return TypeProjectionImpl(CapturedType(typeProjection))
}
}
fun createCapturedType(typeProjection: TypeProjection): KotlinType = CapturedType(typeProjection)
fun KotlinType.isCaptured(): Boolean = constructor is CapturedTypeConstructor
fun TypeSubstitution.wrapWithCapturingSubstitution(
capturedTypeCreator: CapturedTypeCreator = OldCapturedTypeCreator,
needApproximation: Boolean = true
): TypeSubstitution =
fun TypeSubstitution.wrapWithCapturingSubstitution(needApproximation: Boolean = true): TypeSubstitution =
if (this is IndexedParametersSubstitution)
IndexedParametersSubstitution(
this.parameters,
this.arguments.zip(this.parameters).map {
it.first.createCapturedIfNeeded(it.second, capturedTypeCreator)
it.first.createCapturedIfNeeded(it.second)
}.toTypedArray(),
approximateCapturedTypes = needApproximation
)
@@ -126,16 +117,10 @@ fun TypeSubstitution.wrapWithCapturingSubstitution(
object : DelegatedTypeSubstitution(this@wrapWithCapturingSubstitution) {
override fun approximateContravariantCapturedTypes() = needApproximation
override fun get(key: KotlinType) =
super.get(key)?.createCapturedIfNeeded(
key.constructor.declarationDescriptor as? TypeParameterDescriptor,
capturedTypeCreator
)
super.get(key)?.createCapturedIfNeeded(key.constructor.declarationDescriptor as? TypeParameterDescriptor)
}
private fun TypeProjection.createCapturedIfNeeded(
typeParameterDescriptor: TypeParameterDescriptor?,
capturedTypeCreator: CapturedTypeCreator
): TypeProjection {
private fun TypeProjection.createCapturedIfNeeded(typeParameterDescriptor: TypeParameterDescriptor?): TypeProjection {
if (typeParameterDescriptor == null || projectionKind == Variance.INVARIANT) return this
// Treat consistent projections as invariant
@@ -149,5 +134,5 @@ private fun TypeProjection.createCapturedIfNeeded(
TypeProjectionImpl(this@createCapturedIfNeeded.type)
}
return capturedTypeCreator.createCapturedType(this)
return TypeProjectionImpl(createCapturedType(this))
}
@@ -18,24 +18,18 @@ package org.jetbrains.kotlin.resolve.scopes
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.Substitutable
import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.calls.inference.wrapWithCapturingSubstitution
import org.jetbrains.kotlin.types.ErrorUtils
import org.jetbrains.kotlin.types.SubstitutingScopeProvider
import org.jetbrains.kotlin.types.TypeSubstitutor
import org.jetbrains.kotlin.utils.Printer
import org.jetbrains.kotlin.utils.newLinkedHashSetWithExpectedSize
import org.jetbrains.kotlin.utils.sure
import java.util.*
class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor: TypeSubstitutor, private val substitutingScopeProvider: SubstitutingScopeProvider) : MemberScope {
class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor: TypeSubstitutor) : MemberScope {
private val substitutor: TypeSubstitutor = givenSubstitutor.substitution
.wrapWithCapturingSubstitution(capturedTypeCreator = substitutingScopeProvider.provideCapturedTypeCreator())
.buildSubstitutor().also { it.setSubstitutingScopeProvider(substitutingScopeProvider) }
private val substitutor = givenSubstitutor.substitution.wrapWithCapturingSubstitution().buildSubstitutor()
private var substitutedDescriptors: MutableMap<DeclarationDescriptor, DeclarationDescriptor>? = null
@@ -49,44 +43,11 @@ class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor:
}
val substituted = substitutedDescriptors!!.getOrPut(descriptor) {
val assertionMessage = {
"We expect that no conflict should happen while substitution is guaranteed to generate invariant projection, " +
"but $descriptor substitution fails"
}
when (descriptor) {
/*
* Here we can take null if NI enabled, because inside this place we have OI and NI collide. See following example:
*
* class Out<out T>
*
* class A<T> {
* fun T.foo() {}
* fun Out<T>.bar() {}
* }
*
* fun test(x: A<out CharSequence>, y: Out<CharSequence>) {
* with(x) {
* "".foo() <-- problem is here
* }
* }
*
* Because of we don't capture type projections, in call "".foo() we have `out CharSequence` as substituted type `T`
* (instead of `CapturedType(out CharSequence)`, and `in String` as type from receiver, so we have type variance error
* and can not substitute descriptor.
*
* So, fix of it is hack
*/
is FunctionDescriptorImpl -> {
val substitutedDescriptor = descriptor.substitute(substitutor, substitutingScopeProvider)
if (substitutingScopeProvider.isNewInferenceEnabled) {
substitutedDescriptor ?: ErrorUtils.createErrorScope("Cannot substitute functional descriptor")
.getContributedFunctions(descriptor.name, NoLookupLocation.WHEN_RESOLVE_DECLARATION).first()
} else {
substitutedDescriptor.sure(assertionMessage)
}
is Substitutable<*> -> descriptor.substitute(substitutor).sure {
"We expect that no conflict should happen while substitution is guaranteed to generate invariant projection, " +
"but $descriptor substitution fails"
}
is Substitutable<*> -> descriptor.substitute(substitutor).sure(assertionMessage)
else -> error("Unknown descriptor in scope: $descriptor")
}
}
@@ -111,7 +72,7 @@ class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor:
override fun getContributedVariables(name: Name, location: LookupLocation) = substitute(workerScope.getContributedVariables(name, location))
override fun getContributedClassifier(name: Name, location: LookupLocation) =
workerScope.getContributedClassifier(name, location)?.let { substitute(it) }
workerScope.getContributedClassifier(name, location)?.let { substitute(it) }
override fun getContributedFunctions(name: Name, location: LookupLocation) = substitute(workerScope.getContributedFunctions(name, location))
@@ -28,12 +28,6 @@ import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
import org.jetbrains.kotlin.types.typeUtil.builtIns
import java.util.*
class OldCaptureTypeApproximator : CapturedTypeApproximator {
override fun approximateCapturedTypes(typeProjection: TypeProjection?, approximateContravariant: Boolean): TypeProjection? {
return approximateCapturedTypesIfNecessary(typeProjection, approximateContravariant)
}
}
data class ApproximationBounds<out T>(
val lower: T,
val upper: T
@@ -40,7 +40,7 @@ public class DescriptorSubstitutor {
@NotNull DeclarationDescriptor newContainingDeclaration,
@NotNull @Mutable List<TypeParameterDescriptor> result
) {
TypeSubstitutor substitutor = substituteTypeParameters(typeParameters, originalSubstitution, newContainingDeclaration, result, null, SubstitutingScopeProvider.Companion.getDEFAULT());
TypeSubstitutor substitutor = substituteTypeParameters(typeParameters, originalSubstitution, newContainingDeclaration, result, null);
if (substitutor == null) throw new AssertionError("Substitution failed");
return substitutor;
}
@@ -51,8 +51,7 @@ public class DescriptorSubstitutor {
@NotNull TypeSubstitution originalSubstitution,
@NotNull DeclarationDescriptor newContainingDeclaration,
@NotNull @Mutable List<TypeParameterDescriptor> result,
@Nullable boolean[] wereChanges,
@NotNull SubstitutingScopeProvider substitutingScopeProvider
@Nullable boolean[] wereChanges
) {
Map<TypeConstructor, TypeProjection> mutableSubstitution = new HashMap<TypeConstructor, TypeProjection>();
@@ -77,7 +76,7 @@ public class DescriptorSubstitutor {
TypeSubstitutor substitutor = TypeSubstitutor.createChainedSubstitutor(
originalSubstitution, TypeConstructorSubstitution.createByConstructorsMap(mutableSubstitution)
).setSubstitutingScopeProvider(substitutingScopeProvider);
);
for (TypeParameterDescriptor descriptor : typeParameters) {
TypeParameterDescriptorImpl substituted = substitutedMap.get(descriptor);
@@ -1,47 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.types
import org.jetbrains.kotlin.resolve.calls.inference.OldCapturedTypeCreator
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.resolve.scopes.SubstitutingScope
import org.jetbrains.kotlin.types.typesApproximation.OldCaptureTypeApproximator
interface SubstitutingScopeProvider {
fun createSubstitutingScope(workerScope: MemberScope, givenSubstitutor: TypeSubstitutor): SubstitutingScope
fun provideCapturedTypeCreator(): CapturedTypeCreator
fun provideApproximator(): CapturedTypeApproximator
val isNewInferenceEnabled: Boolean
companion object {
val DEFAULT: SubstitutingScopeProvider = object : SubstitutingScopeProvider {
override fun createSubstitutingScope(workerScope: MemberScope, givenSubstitutor: TypeSubstitutor): SubstitutingScope {
return SubstitutingScope(workerScope, givenSubstitutor, this)
}
override fun provideCapturedTypeCreator(): CapturedTypeCreator {
return OldCapturedTypeCreator
}
override fun provideApproximator(): CapturedTypeApproximator {
return OldCaptureTypeApproximator()
}
override val isNewInferenceEnabled: Boolean get() = false
}
}
}
interface CapturedTypeCreator {
fun createCapturedType(typeProjection: TypeProjection): TypeProjection
}
interface CapturedTypeApproximator {
fun approximateCapturedTypes(typeProjection: TypeProjection?, approximateContravariant: Boolean): TypeProjection?
}
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.resolve.calls.inference.CapturedTypeConstructorKt;
import org.jetbrains.kotlin.types.model.TypeSubstitutorMarker;
import org.jetbrains.kotlin.types.typeUtil.TypeUtilsKt;
import org.jetbrains.kotlin.types.typesApproximation.CapturedTypeApproximationKt;
import org.jetbrains.kotlin.utils.ExceptionUtilsKt;
import java.util.ArrayList;
@@ -46,14 +47,6 @@ public class TypeSubstitutor implements TypeSubstitutorMarker {
}
}
private @NotNull SubstitutingScopeProvider substitutingScopeProvider;
@NotNull
public TypeSubstitutor setSubstitutingScopeProvider(@NotNull SubstitutingScopeProvider substitutingScopeProvider) {
this.substitutingScopeProvider = substitutingScopeProvider;
return this;
}
@NotNull
public static TypeSubstitutor create(@NotNull TypeSubstitution substitution) {
return new TypeSubstitutor(substitution);
@@ -80,7 +73,6 @@ public class TypeSubstitutor implements TypeSubstitutorMarker {
protected TypeSubstitutor(@NotNull TypeSubstitution substitution) {
this.substitution = substitution;
this.substitutingScopeProvider = SubstitutingScopeProvider.Companion.getDEFAULT();
}
public boolean isEmpty() {
@@ -118,12 +110,8 @@ public class TypeSubstitutor implements TypeSubstitutorMarker {
if (!substitution.approximateCapturedTypes() && !substitution.approximateContravariantCapturedTypes()) {
return substitutedTypeProjection;
}
CapturedTypeApproximator approximator = substitutingScopeProvider.provideApproximator();
return approximator.approximateCapturedTypes(
substitutedTypeProjection,
substitution.approximateContravariantCapturedTypes()
);
return CapturedTypeApproximationKt.approximateCapturedTypesIfNecessary(
substitutedTypeProjection, substitution.approximateContravariantCapturedTypes());
}
@Nullable
@@ -55,11 +55,6 @@ public class TypeUtils {
throw new IllegalStateException(name);
}
@Override
public boolean isMarkedNullable() {
return false;
}
@NotNull
@Override
public String toString() {