diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt index aecfb969652..7941dd790c2 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt @@ -271,6 +271,8 @@ class LazyJavaTypeResolver( return (descriptor as ClassDescriptor).getMemberScope(getArguments()) } + override fun computeCustomSubstitution(): TypeSubstitution? = null + private val nullable = c.storageManager.createLazyValue l@ { when (attr.flexibility) { FLEXIBLE_LOWER_BOUND -> return@l false diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java index 7d5c79af2c8..a4780e56c3f 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java @@ -22,6 +22,7 @@ import org.jetbrains.annotations.ReadOnly; import org.jetbrains.kotlin.resolve.scopes.JetScope; import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.TypeProjection; +import org.jetbrains.kotlin.types.TypeSubstitution; import org.jetbrains.kotlin.types.TypeSubstitutor; import java.util.Collection; @@ -31,6 +32,9 @@ public interface ClassDescriptor extends ClassifierDescriptor, MemberDescriptor, @NotNull JetScope getMemberScope(@NotNull List typeArguments); + @NotNull + JetScope getMemberScope(@NotNull TypeSubstitution typeSubstitution); + @NotNull JetScope getUnsubstitutedMemberScope(); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractClassDescriptor.java index 5503ff7e0bc..68ff3bf791d 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractClassDescriptor.java @@ -28,7 +28,6 @@ import org.jetbrains.kotlin.storage.StorageManager; import org.jetbrains.kotlin.types.*; import java.util.List; -import java.util.Map; public abstract class AbstractClassDescriptor implements ClassDescriptor { private final Name name; @@ -94,6 +93,15 @@ public abstract class AbstractClassDescriptor implements ClassDescriptor { return new SubstitutingScope(getUnsubstitutedMemberScope(), substitutor); } + @NotNull + @Override + public JetScope getMemberScope(@NotNull TypeSubstitution typeSubstitution) { + if (typeSubstitution.isEmpty()) return getUnsubstitutedMemberScope(); + + TypeSubstitutor substitutor = TypeSubstitutor.create(typeSubstitution); + return new SubstitutingScope(getUnsubstitutedMemberScope(), substitutor); + } + @NotNull @Override public ClassDescriptor substitute(@NotNull TypeSubstitutor substitutor) { diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java index 7ff817722f0..178860982c3 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java @@ -97,6 +97,16 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor { return new SubstitutingScope(memberScope, getSubstitutor()); } + @NotNull + @Override + public JetScope getMemberScope(@NotNull TypeSubstitution typeSubstitution) { + JetScope memberScope = original.getMemberScope(typeSubstitution); + if (originalSubstitutor.isEmpty()) { + return memberScope; + } + return new SubstitutingScope(memberScope, getSubstitutor()); + } + @NotNull @Override public JetScope getUnsubstitutedMemberScope() { diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/AbstractLazyType.kt b/core/descriptors/src/org/jetbrains/kotlin/types/AbstractLazyType.kt index 3182ea05a6b..960ab47a12d 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/AbstractLazyType.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/AbstractLazyType.kt @@ -32,6 +32,10 @@ public abstract class AbstractLazyType(storageManager: StorageManager) : Abstrac protected abstract fun computeArguments(): List + override fun getSubstitution() = computeCustomSubstitution() ?: IndexedParametersSubstitution(constructor, getArguments()) + + protected open fun computeCustomSubstitution(): TypeSubstitution? = null + private val memberScope = storageManager.createLazyValue { computeMemberScope() } override fun getMemberScope() = memberScope() diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/DelegatingType.java b/core/descriptors/src/org/jetbrains/kotlin/types/DelegatingType.java index 6a0bfb27747..7bd852289ea 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/DelegatingType.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/DelegatingType.java @@ -39,6 +39,12 @@ public abstract class DelegatingType implements JetType { return getDelegate().getArguments(); } + @NotNull + @Override + public TypeSubstitution getSubstitution() { + return getDelegate().getSubstitution(); + } + @Override public boolean isMarkedNullable() { return getDelegate().isMarkedNullable(); diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java index caaa8bd4074..fdcef1c94bb 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java @@ -314,6 +314,12 @@ public class ErrorUtils { public JetScope getMemberScope(@NotNull List typeArguments) { return createErrorScope("Error scope for class " + getName() + " with arguments: " + typeArguments); } + + @NotNull + @Override + public JetScope getMemberScope(@NotNull TypeSubstitution typeSubstitution) { + return createErrorScope("Error scope for class " + getName() + " with arguments: " + typeSubstitution); + } } @NotNull @@ -463,6 +469,12 @@ public class ErrorUtils { return arguments; } + @NotNull + @Override + public TypeSubstitution getSubstitution() { + return new IndexedParametersSubstitution(constructor, arguments); + } + @Override public boolean isMarkedNullable() { return false; diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/JetType.java b/core/descriptors/src/org/jetbrains/kotlin/types/JetType.java index 352b74572f0..08b32dd4a1f 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/JetType.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/JetType.java @@ -36,6 +36,9 @@ public interface JetType extends Annotated { @ReadOnly List getArguments(); + @NotNull + TypeSubstitution getSubstitution(); + boolean isMarkedNullable(); @NotNull diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/JetTypeImpl.java b/core/descriptors/src/org/jetbrains/kotlin/types/JetTypeImpl.java index 4197444022a..5a65f2906f9 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/JetTypeImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/JetTypeImpl.java @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.types; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.resolve.scopes.JetScope; @@ -29,12 +30,14 @@ public final class JetTypeImpl extends AbstractJetType { private final boolean nullable; private final JetScope memberScope; private final Annotations annotations; + private final TypeSubstitution substitution; public JetTypeImpl( @NotNull Annotations annotations, @NotNull TypeConstructor constructor, boolean nullable, @NotNull List arguments, + @Nullable TypeSubstitution substitution, @NotNull JetScope memberScope ) { this.annotations = annotations; @@ -47,6 +50,17 @@ public final class JetTypeImpl extends AbstractJetType { this.nullable = nullable; this.arguments = arguments; this.memberScope = memberScope; + this.substitution = substitution; + } + + public JetTypeImpl( + @NotNull Annotations annotations, + @NotNull TypeConstructor constructor, + boolean nullable, + @NotNull List arguments, + @NotNull JetScope memberScope + ) { + this(annotations, constructor, nullable, arguments, null, memberScope); } @NotNull @@ -55,6 +69,15 @@ public final class JetTypeImpl extends AbstractJetType { return annotations; } + @NotNull + @Override + public TypeSubstitution getSubstitution() { + if (substitution == null) { + return new IndexedParametersSubstitution(getConstructor(), getArguments()); + } + return substitution; + } + @NotNull @Override public TypeConstructor getConstructor() { diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.java index 68f8da36eeb..1776b737d0b 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.java @@ -65,6 +65,12 @@ public class TypeUtils { throw new IllegalStateException(name); } + @NotNull + @Override + public TypeSubstitution getSubstitution() { + throw new IllegalStateException(name); + } + @Override public boolean isMarkedNullable() { throw new IllegalStateException(name); @@ -785,6 +791,12 @@ public class TypeUtils { public Annotations getAnnotations() { return delegate.getAnnotations(); } + + @NotNull + @Override + public TypeSubstitution getSubstitution() { + return delegate.getSubstitution(); + } } private static class NullableType extends AbstractTypeWithKnownNullability { diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedType.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedType.kt index bfe68c4b4f5..e0665d3c949 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedType.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedType.kt @@ -52,7 +52,6 @@ class DeserializedType( c.components.annotationAndConstantLoader.loadTypeAnnotations(typeProto, c.nameResolver) } - override fun isMarkedNullable(): Boolean = typeProto.getNullable() private fun getTypeMemberScope(constructor: TypeConstructor, typeArguments: List): JetScope { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/missingDependencies.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/missingDependencies.kt index a7184bf234c..ab01ea50a11 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/missingDependencies.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/missingDependencies.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.resolve.scopes.JetScopeImpl import org.jetbrains.kotlin.resolve.scopes.UsageLocation import org.jetbrains.kotlin.types.ErrorUtils.createErrorType import org.jetbrains.kotlin.types.TypeProjection +import org.jetbrains.kotlin.types.TypeSubstitution import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.error.MissingDependencyErrorClass import org.jetbrains.kotlin.utils.Printer @@ -81,4 +82,5 @@ private class MissingDependencyErrorClassDescriptor( override fun getUnsubstitutedMemberScope() = scope override fun getMemberScope(typeArguments: List) = scope + override fun getMemberScope(typeSubstitution: TypeSubstitution) = scope }