mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
[java-highlighting] move module-related warnings to JavaModuleDefinitionInspection
Part of IDEA-365344 Create a new Java error highlighter with minimal dependencies (PSI only) GitOrigin-RevId: 66179a41da5e02b759f07f9d6638b87711181348
This commit is contained in:
committed by
intellij-monorepo-bot
parent
b58f63db9e
commit
a0f777069b
@@ -4,6 +4,7 @@ package com.intellij.java.codeserver.core;
|
||||
import com.intellij.ide.highlighter.ArchiveFileType;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.ModuleManager;
|
||||
import com.intellij.openapi.module.ModuleUtilCore;
|
||||
import com.intellij.openapi.project.DumbService;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.ModuleRootManager;
|
||||
@@ -20,10 +21,8 @@ import com.intellij.psi.search.FilenameIndex;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.search.ProjectScope;
|
||||
import com.intellij.psi.search.searches.JavaModuleSearch;
|
||||
import com.intellij.psi.util.CachedValueProvider;
|
||||
import com.intellij.psi.util.CachedValuesManager;
|
||||
import com.intellij.psi.util.JavaMultiReleaseUtil;
|
||||
import com.intellij.psi.util.PsiUtilCore;
|
||||
import com.intellij.psi.util.*;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.MultiMap;
|
||||
import com.intellij.util.graph.DFSTBuilder;
|
||||
@@ -522,6 +521,67 @@ public final class JavaPsiModuleUtil {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* State of package reference in module-info file
|
||||
*/
|
||||
public enum PackageReferenceState {
|
||||
/**
|
||||
* Valid reference to a non-empty package
|
||||
*/
|
||||
VALID,
|
||||
/**
|
||||
* No package is found
|
||||
*/
|
||||
PACKAGE_NOT_FOUND,
|
||||
/**
|
||||
* Package exists but contains no classes (for exports) or no files (for opens)
|
||||
*/
|
||||
PACKAGE_EMPTY
|
||||
}
|
||||
|
||||
/**
|
||||
* @param statement statement to check ('opens' or 'exports' statement)
|
||||
* @return state of the reference
|
||||
*/
|
||||
public static @NotNull PackageReferenceState checkPackageReference(@NotNull PsiPackageAccessibilityStatement statement) {
|
||||
PsiJavaCodeReferenceElement refElement = statement.getPackageReference();
|
||||
if (refElement != null) {
|
||||
PsiFile file = statement.getContainingFile();
|
||||
Module module = ModuleUtilCore.findModuleForFile(file);
|
||||
if (module != null) {
|
||||
PsiElement target = refElement.resolve();
|
||||
PsiDirectory[] directories = PsiDirectory.EMPTY_ARRAY;
|
||||
if (target instanceof PsiPackage psiPackage) {
|
||||
boolean inTests = ModuleRootManager.getInstance(module).getFileIndex().isInTestSourceContent(file.getVirtualFile());
|
||||
directories = psiPackage.getDirectories(module.getModuleScope(inTests));
|
||||
Module mainMultiReleaseModule = JavaMultiReleaseUtil.getMainMultiReleaseModule(module);
|
||||
if (mainMultiReleaseModule != null) {
|
||||
directories = ArrayUtil.mergeArrays(directories, psiPackage.getDirectories(mainMultiReleaseModule.getModuleScope(inTests)));
|
||||
}
|
||||
}
|
||||
String packageName = statement.getPackageName();
|
||||
if (directories.length == 0) {
|
||||
return PackageReferenceState.PACKAGE_NOT_FOUND;
|
||||
}
|
||||
boolean opens = statement.getRole() == PsiPackageAccessibilityStatement.Role.OPENS;
|
||||
if (packageName != null && isPackageEmpty(directories, packageName, opens)) {
|
||||
return PackageReferenceState.PACKAGE_EMPTY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return PackageReferenceState.VALID;
|
||||
}
|
||||
|
||||
private static boolean isPackageEmpty(PsiDirectory @NotNull [] directories, @NotNull String packageName, boolean anyFile) {
|
||||
if (anyFile) {
|
||||
return !ContainerUtil.exists(directories, dir -> dir.getFiles().length > 0);
|
||||
}
|
||||
else {
|
||||
return PsiUtil.isPackageEmpty(directories, packageName);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper service to support resolve in java-psi-impl
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user