diff --git a/ChangeLog.md b/ChangeLog.md index ef2efc94365..c437bd5472a 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -227,6 +227,7 @@ These artifacts include extensions for the types available in the latter JDKs, s - [`KT-13904`](https://youtrack.jetbrains.com/issue/KT-13904) Move Nested Class to Upper Level: Preserve state of "Search in comments"/"Search for text occurrences" checkboxes - [`KT-13909`](https://youtrack.jetbrains.com/issue/KT-13909) Move Files/Directories: Fix behavior of "Open moved files in editor" checkbox - [`KT-14004`](https://youtrack.jetbrains.com/issue/KT-14004) Introduce Variable: Fix exception on trying to extract variable of functional type +- [`KT-13726`](https://youtrack.jetbrains.com/issue/KT-13726) Move: Fix bogus conflicts due to references resolving to wrong library version ##### New features diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/LoadBuiltinsTest.java b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/LoadBuiltinsTest.java index 969a0885a42..27e99227db0 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/LoadBuiltinsTest.java +++ b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/LoadBuiltinsTest.java @@ -23,6 +23,7 @@ import kotlin.collections.CollectionsKt; import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.builtins.DefaultBuiltIns; +import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.builtins.functions.BuiltInFictitiousFunctionClassFactory; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime; @@ -32,7 +33,6 @@ import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor; import org.jetbrains.kotlin.descriptors.PackageFragmentProvider; import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl; import org.jetbrains.kotlin.name.FqName; -import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.renderer.DescriptorRenderer; import org.jetbrains.kotlin.renderer.DescriptorRendererModifier; @@ -108,7 +108,7 @@ public class LoadBuiltinsTest extends KotlinTestWithEnvironment { private static PackageFragmentProvider createBuiltInsPackageFragmentProvider() { LockBasedStorageManager storageManager = new LockBasedStorageManager(); ModuleDescriptorImpl builtInsModule = new ModuleDescriptorImpl( - Name.special(""), storageManager, ModuleParameters.Empty.INSTANCE, DefaultBuiltIns.getInstance() + KotlinBuiltIns.BUILTINS_MODULE_NAME, storageManager, ModuleParameters.Empty.INSTANCE, DefaultBuiltIns.getInstance() ); PackageFragmentProvider packageFragmentProvider = createBuiltInPackageFragmentProvider( diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java index f3d0091d8de..ceece94ffa6 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java @@ -76,11 +76,12 @@ public abstract class KotlinBuiltIns { private final StorageManager storageManager; public static final FqNames FQ_NAMES = new FqNames(); + public static final Name BUILTINS_MODULE_NAME = Name.special(""); protected KotlinBuiltIns(@NotNull StorageManager storageManager) { this.storageManager = storageManager; builtInsModule = new ModuleDescriptorImpl( - Name.special(""), storageManager, ModuleParameters.Empty.INSTANCE, this + BUILTINS_MODULE_NAME, storageManager, ModuleParameters.Empty.INSTANCE, this ); PackageFragmentProvider packageFragmentProvider = BuiltInsPackageFragmentProviderKt.createBuiltInPackageFragmentProvider( diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/SourceNavigationHelper.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/SourceNavigationHelper.java index 6887d26795a..03d8f440255 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/SourceNavigationHelper.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/navigation/SourceNavigationHelper.java @@ -36,6 +36,8 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.StringStubIndexExtension; import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; +import kotlin.collections.CollectionsKt; +import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; @@ -199,6 +201,8 @@ public class SourceNavigationHelper { return null; } + candidates = filterByOrderEntries(declaration, candidates); + if (!forceResolve) { candidates = filterByReceiverPresenceAndParametersCount(declaration, candidates); @@ -340,6 +344,26 @@ public class SourceNavigationHelper { }); } + @NotNull + private static List filterByOrderEntries( + @NotNull KtNamedDeclaration declaration, + @NotNull Collection candidates + ) { + final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(declaration.getProject()).getFileIndex(); + final List orderEntries = fileIndex.getOrderEntriesForFile(declaration.getContainingFile().getVirtualFile()); + + return CollectionsKt.filter( + candidates, + new Function1() { + @Override + public Boolean invoke(KtNamedDeclaration candidate) { + List candidateOrderEntries = fileIndex.getOrderEntriesForFile(candidate.getContainingFile().getVirtualFile()); + return ContainerUtil.intersects(orderEntries, candidateOrderEntries); + } + } + ); + } + @NotNull private static List filterByReceiverPresenceAndParametersCount( final @NotNull KtNamedDeclaration decompiledDeclaration, 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 6d737421bff..097520b30ad 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 @@ -19,8 +19,10 @@ package org.jetbrains.kotlin.idea.decompiler.navigation import com.intellij.openapi.project.Project import com.intellij.psi.search.EverythingGlobalScope import org.jetbrains.kotlin.builtins.DefaultBuiltIns +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor +import org.jetbrains.kotlin.idea.caches.resolve.* import org.jetbrains.kotlin.idea.decompiler.KtDecompiledFile import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledTextIndexer import org.jetbrains.kotlin.idea.stubindex.* @@ -33,6 +35,7 @@ import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.DescriptorRendererModifier import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe +import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.descriptorUtil.resolveTopLevelClass import org.jetbrains.kotlin.types.ErrorUtils import java.util.* @@ -47,7 +50,19 @@ fun findDecompiledDeclaration( val decompiledFiles = findDecompiledFilesForDescriptor(project, referencedDescriptor) + val referencedModule = referencedDescriptor.module return decompiledFiles.asSequence().mapNotNull { file -> + val moduleInfo = file.getNullableModuleInfo() + val libraryInfo = when (moduleInfo) { + is LibraryInfo -> moduleInfo + is LibrarySourceInfo -> LibraryInfo(project, moduleInfo.library) + else -> null + } + val libraryModule = libraryInfo?.let { file.getResolutionFacade().findModuleDescriptor(it) } + if (libraryModule != null + && referencedModule.name != KotlinBuiltIns.BUILTINS_MODULE_NAME + && referencedModule.name != libraryModule.name) return@mapNotNull null + ByDescriptorIndexer.getDeclarationForDescriptor(referencedDescriptor, file) }.firstOrNull() }