Navigation: Filter out candidate declarations coming from the wrong library
#KT-13726 In Progress
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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("<built-ins module>"), storageManager, ModuleParameters.Empty.INSTANCE, DefaultBuiltIns.getInstance()
|
||||
KotlinBuiltIns.BUILTINS_MODULE_NAME, storageManager, ModuleParameters.Empty.INSTANCE, DefaultBuiltIns.getInstance()
|
||||
);
|
||||
|
||||
PackageFragmentProvider packageFragmentProvider = createBuiltInPackageFragmentProvider(
|
||||
|
||||
@@ -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("<built-ins module>");
|
||||
|
||||
protected KotlinBuiltIns(@NotNull StorageManager storageManager) {
|
||||
this.storageManager = storageManager;
|
||||
builtInsModule = new ModuleDescriptorImpl(
|
||||
Name.special("<built-ins module>"), storageManager, ModuleParameters.Empty.INSTANCE, this
|
||||
BUILTINS_MODULE_NAME, storageManager, ModuleParameters.Empty.INSTANCE, this
|
||||
);
|
||||
|
||||
PackageFragmentProvider packageFragmentProvider = BuiltInsPackageFragmentProviderKt.createBuiltInPackageFragmentProvider(
|
||||
|
||||
+24
@@ -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<KtNamedDeclaration> filterByOrderEntries(
|
||||
@NotNull KtNamedDeclaration declaration,
|
||||
@NotNull Collection<KtNamedDeclaration> candidates
|
||||
) {
|
||||
final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(declaration.getProject()).getFileIndex();
|
||||
final List<OrderEntry> orderEntries = fileIndex.getOrderEntriesForFile(declaration.getContainingFile().getVirtualFile());
|
||||
|
||||
return CollectionsKt.filter(
|
||||
candidates,
|
||||
new Function1<KtNamedDeclaration, Boolean>() {
|
||||
@Override
|
||||
public Boolean invoke(KtNamedDeclaration candidate) {
|
||||
List<OrderEntry> candidateOrderEntries = fileIndex.getOrderEntriesForFile(candidate.getContainingFile().getVirtualFile());
|
||||
return ContainerUtil.intersects(orderEntries, candidateOrderEntries);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static List<KtNamedDeclaration> filterByReceiverPresenceAndParametersCount(
|
||||
final @NotNull KtNamedDeclaration decompiledDeclaration,
|
||||
|
||||
+15
@@ -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()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user