mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-10 13:17:09 +07:00
[java jigsaw] fix compare method to align with the contract IDEA-289714
GitOrigin-RevId: 075e74c9a56c82e427e58ad0a8bf2bfbb05855d8
This commit is contained in:
committed by
intellij-monorepo-bot
parent
a3444d3762
commit
c9371e5185
+30
-9
@@ -10,14 +10,21 @@ import com.intellij.psi.search.DelegatingGlobalSearchScope;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* A scope decorator that allows to prefer a "required" module over a module that is a dependency of the required module.
|
||||
*/
|
||||
public class JavaPlatformModuleSystemScope extends DelegatingGlobalSearchScope {
|
||||
private final @NotNull PsiJavaModule myModule;
|
||||
|
||||
public JavaPlatformModuleSystemScope(@NotNull Project project, @NotNull PsiJavaModule module, @NotNull GlobalSearchScope baseScope) {
|
||||
private JavaPlatformModuleSystemScope(@NotNull Project project, @NotNull PsiJavaModule module, @NotNull GlobalSearchScope baseScope) {
|
||||
super(project, baseScope);
|
||||
myModule = module;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new instance of {@link JavaPlatformModuleSystemScope} if the file is a part of a JPMS
|
||||
* or returns the base scope otherwise.
|
||||
*/
|
||||
public static @NotNull GlobalSearchScope create(@NotNull Project project,
|
||||
@NotNull VirtualFile file,
|
||||
@NotNull GlobalSearchScope baseScope) {
|
||||
@@ -32,15 +39,29 @@ public class JavaPlatformModuleSystemScope extends DelegatingGlobalSearchScope {
|
||||
if (!myModule.isValid()) return getDelegate().compare(file1, file2);
|
||||
PsiJavaModule module1 = JavaPsiModuleUtil.findDescriptorByFile(file1, myModule.getProject());
|
||||
PsiJavaModule module2 = JavaPsiModuleUtil.findDescriptorByFile(file2, myModule.getProject());
|
||||
if (module1 == null || module2 == null || // not a module source root
|
||||
module1 == module2 || module1.getName().equals(module2.getName()) || // same module
|
||||
isModuleFile(module1, file1) || isModuleFile(module2, file2) // the file is a module file
|
||||
) {
|
||||
return getDelegate().compare(file1, file2);
|
||||
}
|
||||
|
||||
// Prefer: files from java modules
|
||||
if (module1 == null && module2 == null) return getDelegate().compare(file1, file2);
|
||||
if (module1 == null) return 1;
|
||||
if (module2 == null) return -1;
|
||||
|
||||
// The scope compares imports of classes/packages, so we don't need to compare module files.
|
||||
if (isModuleFile(module1, file1) && isModuleFile(module2, file2)) return getDelegate().compare(file1, file2);
|
||||
if (isModuleFile(module1, file1)) return 1;
|
||||
if (isModuleFile(module2, file2)) return -1;
|
||||
|
||||
// Files from the same module: use base comparator
|
||||
if (module1 == module2 || module1.getName().equals(module2.getName())) return getDelegate().compare(file1, file2);
|
||||
|
||||
// Prefer: a file from a module that the current module reads
|
||||
int result = Boolean.compare(JavaPsiModuleUtil.reads(myModule, module1), JavaPsiModuleUtil.reads(myModule, module2));
|
||||
return result != 0 ? result : getDelegate().compare(file1, file2);
|
||||
if (result != 0) return result;
|
||||
|
||||
// Prefer: a file from the current module
|
||||
if (module1.equals(myModule)) return -1;
|
||||
if (module2.equals(myModule)) return 1;
|
||||
|
||||
return getDelegate().compare(file1, file2);
|
||||
}
|
||||
|
||||
private static boolean isModuleFile(@NotNull PsiJavaModule module, @NotNull VirtualFile file) {
|
||||
@@ -60,7 +81,7 @@ public class JavaPlatformModuleSystemScope extends DelegatingGlobalSearchScope {
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return myModule.hashCode();
|
||||
return 31 * super.hashCode() + myModule.hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user