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:
@@ -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
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -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 {
|
||||
|
||||
+1
-2
@@ -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)
|
||||
|
||||
+5
-10
@@ -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
|
||||
|
||||
+1
-13
@@ -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;
|
||||
|
||||
+2
-21
@@ -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;
|
||||
|
||||
|
||||
+5
-7
@@ -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
|
||||
|
||||
+3
-66
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -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 {
|
||||
|
||||
+5
-20
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user