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-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-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-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
|
##### New features
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import kotlin.collections.CollectionsKt;
|
|||||||
import kotlin.jvm.functions.Function1;
|
import kotlin.jvm.functions.Function1;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.kotlin.builtins.DefaultBuiltIns;
|
import org.jetbrains.kotlin.builtins.DefaultBuiltIns;
|
||||||
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
||||||
import org.jetbrains.kotlin.builtins.functions.BuiltInFictitiousFunctionClassFactory;
|
import org.jetbrains.kotlin.builtins.functions.BuiltInFictitiousFunctionClassFactory;
|
||||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment;
|
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment;
|
||||||
import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime;
|
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.PackageFragmentProvider;
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl;
|
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl;
|
||||||
import org.jetbrains.kotlin.name.FqName;
|
import org.jetbrains.kotlin.name.FqName;
|
||||||
import org.jetbrains.kotlin.name.Name;
|
|
||||||
import org.jetbrains.kotlin.psi.KtFile;
|
import org.jetbrains.kotlin.psi.KtFile;
|
||||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer;
|
import org.jetbrains.kotlin.renderer.DescriptorRenderer;
|
||||||
import org.jetbrains.kotlin.renderer.DescriptorRendererModifier;
|
import org.jetbrains.kotlin.renderer.DescriptorRendererModifier;
|
||||||
@@ -108,7 +108,7 @@ public class LoadBuiltinsTest extends KotlinTestWithEnvironment {
|
|||||||
private static PackageFragmentProvider createBuiltInsPackageFragmentProvider() {
|
private static PackageFragmentProvider createBuiltInsPackageFragmentProvider() {
|
||||||
LockBasedStorageManager storageManager = new LockBasedStorageManager();
|
LockBasedStorageManager storageManager = new LockBasedStorageManager();
|
||||||
ModuleDescriptorImpl builtInsModule = new ModuleDescriptorImpl(
|
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(
|
PackageFragmentProvider packageFragmentProvider = createBuiltInPackageFragmentProvider(
|
||||||
|
|||||||
@@ -76,11 +76,12 @@ public abstract class KotlinBuiltIns {
|
|||||||
private final StorageManager storageManager;
|
private final StorageManager storageManager;
|
||||||
|
|
||||||
public static final FqNames FQ_NAMES = new FqNames();
|
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) {
|
protected KotlinBuiltIns(@NotNull StorageManager storageManager) {
|
||||||
this.storageManager = storageManager;
|
this.storageManager = storageManager;
|
||||||
builtInsModule = new ModuleDescriptorImpl(
|
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(
|
PackageFragmentProvider packageFragmentProvider = BuiltInsPackageFragmentProviderKt.createBuiltInPackageFragmentProvider(
|
||||||
|
|||||||
+24
@@ -36,6 +36,8 @@ import com.intellij.psi.search.GlobalSearchScope;
|
|||||||
import com.intellij.psi.stubs.StringStubIndexExtension;
|
import com.intellij.psi.stubs.StringStubIndexExtension;
|
||||||
import com.intellij.util.containers.ContainerUtil;
|
import com.intellij.util.containers.ContainerUtil;
|
||||||
import gnu.trove.THashSet;
|
import gnu.trove.THashSet;
|
||||||
|
import kotlin.collections.CollectionsKt;
|
||||||
|
import kotlin.jvm.functions.Function1;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.annotations.TestOnly;
|
import org.jetbrains.annotations.TestOnly;
|
||||||
@@ -199,6 +201,8 @@ public class SourceNavigationHelper {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
candidates = filterByOrderEntries(declaration, candidates);
|
||||||
|
|
||||||
if (!forceResolve) {
|
if (!forceResolve) {
|
||||||
candidates = filterByReceiverPresenceAndParametersCount(declaration, candidates);
|
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
|
@NotNull
|
||||||
private static List<KtNamedDeclaration> filterByReceiverPresenceAndParametersCount(
|
private static List<KtNamedDeclaration> filterByReceiverPresenceAndParametersCount(
|
||||||
final @NotNull KtNamedDeclaration decompiledDeclaration,
|
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.openapi.project.Project
|
||||||
import com.intellij.psi.search.EverythingGlobalScope
|
import com.intellij.psi.search.EverythingGlobalScope
|
||||||
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
||||||
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
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.KtDecompiledFile
|
||||||
import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledTextIndexer
|
import org.jetbrains.kotlin.idea.decompiler.textBuilder.DecompiledTextIndexer
|
||||||
import org.jetbrains.kotlin.idea.stubindex.*
|
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.renderer.DescriptorRendererModifier
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
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.resolve.descriptorUtil.resolveTopLevelClass
|
||||||
import org.jetbrains.kotlin.types.ErrorUtils
|
import org.jetbrains.kotlin.types.ErrorUtils
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -47,7 +50,19 @@ fun findDecompiledDeclaration(
|
|||||||
|
|
||||||
val decompiledFiles = findDecompiledFilesForDescriptor(project, referencedDescriptor)
|
val decompiledFiles = findDecompiledFilesForDescriptor(project, referencedDescriptor)
|
||||||
|
|
||||||
|
val referencedModule = referencedDescriptor.module
|
||||||
return decompiledFiles.asSequence().mapNotNull { file ->
|
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)
|
ByDescriptorIndexer.getDeclarationForDescriptor(referencedDescriptor, file)
|
||||||
}.firstOrNull()
|
}.firstOrNull()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user