diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/RootContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/RootContext.java index 7a34ed2807c..bfe772a167e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/RootContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/RootContext.java @@ -23,7 +23,6 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.descriptors.DeclarationDescriptorVisitor; import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.name.Name; -import org.jetbrains.kotlin.types.TypeSubstitutor; public class RootContext extends CodegenContext { private final GenerationState state; @@ -56,11 +55,6 @@ public class RootContext extends CodegenContext { throw new IllegalStateException(); } - @Override - public DeclarationDescriptor substitute(@NotNull TypeSubstitutor substitutor) { - throw new IllegalStateException(); - } - @Override public R accept(DeclarationDescriptorVisitor visitor, D data) { throw new IllegalStateException(); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.kt index 4f9361343d8..1b583a01387 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.kt @@ -91,7 +91,7 @@ class OverloadResolver( collectModulePackageMembersWithSameName( packageMembersByName, - c.functions.values + c.declaredClasses.values + c.typeAliases.values, + (c.functions.values as Collection) + c.declaredClasses.values + c.typeAliases.values, overloadFilter ) { scope, name -> diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/UnderscoreUsageChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/UnderscoreUsageChecker.kt index e29f282c0ec..b9cd8249217 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/UnderscoreUsageChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/UnderscoreUsageChecker.kt @@ -31,7 +31,7 @@ object UnderscoreUsageChecker : CallChecker { override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { if (resolvedCall is VariableAsFunctionResolvedCall) return val descriptor = resolvedCall.resultingDescriptor - val namedDescriptor = if (descriptor is ConstructorDescriptor) descriptor.containingDeclaration else descriptor + val namedDescriptor: DeclarationDescriptor = (descriptor as? ConstructorDescriptor)?.containingDeclaration ?: descriptor if (!namedDescriptor.name.asString().isUnderscoreOnlyName()) return checkCallElement(resolvedCall.call.callElement, context) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt index 067dff4defb..84798617409 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/FileScopeFactory.kt @@ -38,7 +38,6 @@ import org.jetbrains.kotlin.resolve.source.KotlinSourceElement import org.jetbrains.kotlin.script.getScriptExternalDependencies import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.getValue -import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.utils.Printer data class FileScopes(val lexicalScope: LexicalScope, val importingScope: ImportingScope, val importResolver: ImportResolver) @@ -236,7 +235,6 @@ class FileScopeFactory( override fun getOriginal() = this override val annotations: Annotations get() = Annotations.EMPTY - override fun substitute(substitutor: TypeSubstitutor) = this override fun accept(visitor: DeclarationDescriptorVisitor?, data: D): R { throw UnsupportedOperationException() diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyAnnotations.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyAnnotations.kt index 6e855ee2bc1..0b72348f240 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyAnnotations.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyAnnotations.kt @@ -30,7 +30,6 @@ import org.jetbrains.kotlin.resolve.lazy.LazyEntity import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.source.toSourceElement import org.jetbrains.kotlin.storage.StorageManager -import org.jetbrains.kotlin.types.TypeSubstitutor abstract class LazyAnnotationsContext( val annotationResolver: AnnotationResolver, @@ -172,7 +171,6 @@ class LazyAnnotationDescriptor( override fun getName() = Name.special("< file descriptor for annotation resolution >") private fun error(): Nothing = error("This method should not be called") - override fun substitute(substitutor: TypeSubstitutor): DeclarationDescriptor? = error() override fun accept(visitor: DeclarationDescriptorVisitor?, data: D): R = error() override fun acceptVoid(visitor: DeclarationDescriptorVisitor?) = error() diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBuiltinsPackageFragmentDescriptor.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBuiltinsPackageFragmentDescriptor.kt index 9783569648a..adb55a2701c 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBuiltinsPackageFragmentDescriptor.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBuiltinsPackageFragmentDescriptor.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.MemberScope -import org.jetbrains.kotlin.types.TypeSubstitutor interface IrBuiltinsPackageFragmentDescriptor : PackageFragmentDescriptor @@ -40,7 +39,6 @@ class IrBuiltinsPackageFragmentDescriptorImpl( override fun getOriginal(): DeclarationDescriptorWithSource = this override fun getSource(): SourceElement = SourceElement.NO_SOURCE override val annotations: Annotations = Annotations.EMPTY - override fun substitute(substitutor: TypeSubstitutor): DeclarationDescriptor = throw UnsupportedOperationException() override fun accept(visitor: DeclarationDescriptorVisitor, data: D): R { return visitor.visitPackageFragmentDescriptor(this, data) @@ -50,5 +48,3 @@ class IrBuiltinsPackageFragmentDescriptorImpl( visitor.visitPackageFragmentDescriptor(this, null) } } - - diff --git a/compiler/tests-common/org/jetbrains/kotlin/jvm/runtime/AbstractJvmRuntimeDescriptorLoaderTest.kt b/compiler/tests-common/org/jetbrains/kotlin/jvm/runtime/AbstractJvmRuntimeDescriptorLoaderTest.kt index 8364637bebe..50bdb9f9133 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/jvm/runtime/AbstractJvmRuntimeDescriptorLoaderTest.kt +++ b/compiler/tests-common/org/jetbrains/kotlin/jvm/runtime/AbstractJvmRuntimeDescriptorLoaderTest.kt @@ -45,7 +45,6 @@ import org.jetbrains.kotlin.test.KotlinTestUtils.TestFileFactoryNoModules import org.jetbrains.kotlin.test.util.DescriptorValidator.ValidationVisitor.errorTypesForbidden import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparator import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparator.Configuration -import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.utils.Printer import org.jetbrains.kotlin.utils.sure import java.io.File @@ -221,7 +220,6 @@ abstract class AbstractJvmRuntimeDescriptorLoaderTest : TestCaseWithTmpdir() { override fun getContainingDeclaration() = null override fun getOriginal() = throw UnsupportedOperationException() - override fun substitute(substitutor: TypeSubstitutor) = throw UnsupportedOperationException() override fun acceptVoid(visitor: DeclarationDescriptorVisitor?) = throw UnsupportedOperationException() override fun getName() = throw UnsupportedOperationException() override val annotations: Annotations diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/CallableDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/CallableDescriptor.java index 2c37a77d427..196690dc641 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/CallableDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/CallableDescriptor.java @@ -20,12 +20,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.ReadOnly; import org.jetbrains.kotlin.types.KotlinType; -import org.jetbrains.kotlin.types.TypeSubstitutor; import java.util.Collection; import java.util.List; -public interface CallableDescriptor extends DeclarationDescriptorWithVisibility, DeclarationDescriptorNonRoot { +public interface CallableDescriptor extends DeclarationDescriptorWithVisibility, DeclarationDescriptorNonRoot, + Substitutable { @Nullable ReceiverParameterDescriptor getExtensionReceiverParameter(); @@ -46,9 +46,6 @@ public interface CallableDescriptor extends DeclarationDescriptorWithVisibility, @Override CallableDescriptor getOriginal(); - @Override - CallableDescriptor substitute(@NotNull TypeSubstitutor substitutor); - @NotNull List getValueParameters(); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java index 984b9c51777..fc74bb0a76c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassDescriptor.java @@ -23,7 +23,6 @@ import org.jetbrains.kotlin.resolve.scopes.MemberScope; import org.jetbrains.kotlin.types.SimpleType; import org.jetbrains.kotlin.types.TypeProjection; import org.jetbrains.kotlin.types.TypeSubstitution; -import org.jetbrains.kotlin.types.TypeSubstitutor; import java.util.Collection; import java.util.List; @@ -59,10 +58,6 @@ public interface ClassDescriptor extends ClassifierDescriptorWithTypeParameters, @Override SimpleType getDefaultType(); - @NotNull - @Override - ClassDescriptor substitute(@NotNull TypeSubstitutor substitutor); - /** * @return nested object declared as 'companion' if one is present. */ diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassifierDescriptorWithTypeParameters.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassifierDescriptorWithTypeParameters.java index e9fa045e3a1..3a039ac76ee 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassifierDescriptorWithTypeParameters.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ClassifierDescriptorWithTypeParameters.java @@ -22,7 +22,8 @@ import org.jetbrains.annotations.ReadOnly; import java.util.List; public interface ClassifierDescriptorWithTypeParameters - extends ClassifierDescriptor, DeclarationDescriptorWithVisibility, MemberDescriptor { + extends ClassifierDescriptor, DeclarationDescriptorWithVisibility, MemberDescriptor, + Substitutable { /** * @return true if this class contains a reference to its outer class (as opposed to static nested class) */ diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/DeclarationDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/DeclarationDescriptor.java index 15b3467c78c..232e9823868 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/DeclarationDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/DeclarationDescriptor.java @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.descriptors; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.annotations.Annotated; -import org.jetbrains.kotlin.types.TypeSubstitutor; public interface DeclarationDescriptor extends Annotated, Named { /** @@ -34,9 +33,6 @@ public interface DeclarationDescriptor extends Annotated, Named { @Nullable DeclarationDescriptor getContainingDeclaration(); - @Nullable - DeclarationDescriptor substitute(@NotNull TypeSubstitutor substitutor); - R accept(DeclarationDescriptorVisitor visitor, D data); void acceptVoid(DeclarationDescriptorVisitor visitor); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt index 7b71ab6b0a2..88e301b4863 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.descriptors import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.types.TypeSubstitutor interface ModuleDescriptor : DeclarationDescriptor { override fun getContainingDeclaration(): DeclarationDescriptor? = null @@ -28,10 +27,6 @@ interface ModuleDescriptor : DeclarationDescriptor { fun shouldSeeInternalsOf(targetModule: ModuleDescriptor): Boolean - override fun substitute(substitutor: TypeSubstitutor): ModuleDescriptor { - return this - } - override fun accept(visitor: DeclarationDescriptorVisitor, data: D): R { return visitor.visitModuleDeclaration(this, data) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/Substitutable.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/Substitutable.kt new file mode 100644 index 00000000000..6c1ef1cbd59 --- /dev/null +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/Substitutable.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.descriptors + +import org.jetbrains.kotlin.types.TypeSubstitutor + +interface Substitutable { + fun substitute(substitutor: TypeSubstitutor): T +} diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/TypeAliasDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/TypeAliasDescriptor.kt index 713f822b2fa..a8a4f4649e8 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/TypeAliasDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/TypeAliasDescriptor.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.descriptors import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor import org.jetbrains.kotlin.types.SimpleType -import org.jetbrains.kotlin.types.TypeSubstitutor interface TypeAliasDescriptor : ClassifierDescriptorWithTypeParameters { /// Right-hand side of the type alias definition. @@ -33,7 +32,5 @@ interface TypeAliasDescriptor : ClassifierDescriptorWithTypeParameters { override fun getOriginal(): TypeAliasDescriptor - override fun substitute(substitutor: TypeSubstitutor): TypeAliasDescriptor - val constructors: Collection } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/TypeParameterDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/TypeParameterDescriptor.java index ea8382a6e7a..a1395ed7cb4 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/TypeParameterDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/TypeParameterDescriptor.java @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.descriptors; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.TypeConstructor; -import org.jetbrains.kotlin.types.TypeSubstitutor; import org.jetbrains.kotlin.types.Variance; import java.util.List; @@ -37,11 +36,6 @@ public interface TypeParameterDescriptor extends ClassifierDescriptor { @Override TypeConstructor getTypeConstructor(); - @NotNull - @Override - @Deprecated // Use the static method DescriptorSubstitutor.substituteTypeParameters() - TypeParameterDescriptor substitute(@NotNull TypeSubstitutor substitutor); - @NotNull @Override TypeParameterDescriptor getOriginal(); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeParameterDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeParameterDescriptor.java index 56ee977e837..564006d3de9 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeParameterDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/AbstractTypeParameterDescriptor.java @@ -134,13 +134,6 @@ public abstract class AbstractTypeParameterDescriptor extends DeclarationDescrip return (TypeParameterDescriptor) super.getOriginal(); } - @NotNull - @Override - @Deprecated - public TypeParameterDescriptor substitute(@NotNull TypeSubstitutor substitutor) { - throw new UnsupportedOperationException("Don't call substitute() on type parameters"); - } - @Override public R accept(DeclarationDescriptorVisitor visitor, D data) { return visitor.visitTypeParameterDescriptor(this, data); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazyPackageViewDescriptorImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazyPackageViewDescriptorImpl.kt index a2e5684d6e0..cc6018450c5 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazyPackageViewDescriptorImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazyPackageViewDescriptorImpl.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.descriptors.impl -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptorVisitor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageViewDescriptor @@ -27,7 +26,6 @@ import org.jetbrains.kotlin.resolve.scopes.LazyScopeAdapter import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.getValue -import org.jetbrains.kotlin.types.TypeSubstitutor class LazyPackageViewDescriptorImpl( override val module: ModuleDescriptorImpl, @@ -65,7 +63,5 @@ class LazyPackageViewDescriptorImpl( return result } - override fun substitute(substitutor: TypeSubstitutor): DeclarationDescriptor? = this - override fun accept(visitor: DeclarationDescriptorVisitor, data: D): R = visitor.visitPackageViewDescriptor(this, data) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PackageFragmentDescriptorImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PackageFragmentDescriptorImpl.kt index 5e4a8f2198d..8c4c19a6a44 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PackageFragmentDescriptorImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PackageFragmentDescriptorImpl.kt @@ -16,18 +16,18 @@ package org.jetbrains.kotlin.descriptors.impl -import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.DeclarationDescriptorVisitor +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor +import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.types.TypeSubstitutor abstract class PackageFragmentDescriptorImpl( module: ModuleDescriptor, final override val fqName: FqName ) : DeclarationDescriptorNonRootImpl(module, Annotations.EMPTY, fqName.shortNameOrSpecial(), SourceElement.NO_SOURCE), PackageFragmentDescriptor { - override fun substitute(substitutor: TypeSubstitutor): DeclarationDescriptor? = this - override fun accept(visitor: DeclarationDescriptorVisitor, data: D): R = visitor.visitPackageFragmentDescriptor(this, data) diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt index a101697f1dc..83de7362900 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/SubstitutingScope.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.resolve.scopes import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.Substitutable import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.calls.inference.wrapWithCapturingSubstitution @@ -41,12 +42,15 @@ class SubstitutingScope(private val workerScope: MemberScope, givenSubstitutor: substitutedDescriptors = HashMap() } - val substituted = substitutedDescriptors!!.getOrPut(descriptor, { - descriptor.substitute(substitutor).sure { - "We expect that no conflict should happen while substitution is guaranteed to generate invariant projection, " + - "but $descriptor substitution fails" + val substituted = substitutedDescriptors!!.getOrPut(descriptor) { + when (descriptor) { + 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" + } + else -> error("Unknown descriptor in scope: $descriptor") } - }) + } @Suppress("UNCHECKED_CAST") return substituted as D diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java index 68204588938..80b0ac4b6b9 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java @@ -99,13 +99,6 @@ public class ErrorUtils { @Override public void acceptVoid(DeclarationDescriptorVisitor visitor) { - - } - - @NotNull - @Override - public ModuleDescriptor substitute(@NotNull TypeSubstitutor substitutor) { - return this; } @Override diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/findDecompiledDeclaration.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/findDecompiledDeclaration.kt index fd24b5b3461..9bf34b4a753 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/findDecompiledDeclaration.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/findDecompiledDeclaration.kt @@ -104,11 +104,12 @@ private fun findCandidateDeclarationsInIndex( return KotlinFullClassNameIndex.getInstance().get(containingClass.fqNameSafe.asString(), project, scope) } - val topLevelDeclaration = DescriptorUtils.getParentOfType(referencedDescriptor, PropertyDescriptor::class.java, false) - ?: DescriptorUtils.getParentOfType(referencedDescriptor, TypeAliasConstructorDescriptor::class.java, false)?.typeAliasDescriptor - ?: DescriptorUtils.getParentOfType(referencedDescriptor, FunctionDescriptor::class.java, false) - ?: DescriptorUtils.getParentOfType(referencedDescriptor, TypeAliasDescriptor::class.java, false) - ?: return emptyList() + val topLevelDeclaration = + DescriptorUtils.getParentOfType(referencedDescriptor, PropertyDescriptor::class.java, false) as DeclarationDescriptor? + ?: DescriptorUtils.getParentOfType(referencedDescriptor, TypeAliasConstructorDescriptor::class.java, false)?.typeAliasDescriptor + ?: DescriptorUtils.getParentOfType(referencedDescriptor, FunctionDescriptor::class.java, false) + ?: DescriptorUtils.getParentOfType(referencedDescriptor, TypeAliasDescriptor::class.java, false) + ?: return emptyList() // filter out synthetic descriptors if (!DescriptorUtils.isTopLevelDeclaration(topLevelDeclaration)) return emptyList() diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/Utils.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/Utils.kt index d6ce625bd60..1a1c8e3f492 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/Utils.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/Utils.kt @@ -208,11 +208,12 @@ fun MutableCollection.addLoo } } +@Suppress("UNCHECKED_CAST") private fun T.substituteFixed(substitutor: TypeSubstitutor): T { - if (this is LocalVariableDescriptor || this is ValueParameterDescriptor || this is TypeParameterDescriptor) { // TODO: it's not implemented for them + if (this is LocalVariableDescriptor || this is ValueParameterDescriptor || this !is Substitutable<*>) { return this } - return this?.substitute(substitutor) as T + return this.substitute(substitutor) as T } private fun MutableCollection.addLookupElementsForNullable(factory: () -> Collection, matchedInfos: Collection) { diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/DeclaredHeaderMarker.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/DeclaredHeaderMarker.kt index 3192fdd7083..1eb9fe3e213 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/DeclaredHeaderMarker.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/DeclaredHeaderMarker.kt @@ -47,7 +47,7 @@ private enum class SourceKind { NONE, PRODUCTION, TEST } fun ModuleDescriptor.hasDeclarationOf(descriptor: MemberDescriptor) = declarationOf(descriptor) != null -private fun ModuleDescriptor.declarationOf(descriptor: MemberDescriptor) = +private fun ModuleDescriptor.declarationOf(descriptor: MemberDescriptor): DeclarationDescriptor? = with (HeaderImplDeclarationChecker(this)) { when (descriptor) { is CallableMemberDescriptor -> diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/ImplementedHeaderMarker.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/ImplementedHeaderMarker.kt index 316202abf1c..337b00c6ca3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/ImplementedHeaderMarker.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/ImplementedHeaderMarker.kt @@ -32,7 +32,7 @@ import java.awt.event.MouseEvent fun ModuleDescriptor.hasImplementationsOf(descriptor: MemberDescriptor) = implementationsOf(descriptor).isNotEmpty() -private fun ModuleDescriptor.implementationsOf(descriptor: MemberDescriptor) = +private fun ModuleDescriptor.implementationsOf(descriptor: MemberDescriptor): List = with (HeaderImplDeclarationChecker(this)) { when (descriptor) { is CallableMemberDescriptor -> descriptor.findNamesakesFromTheSameModule().filter { it.isImpl }