IDEA-384922 [java-highlighting] Required transitive dependency is not highlighted

GitOrigin-RevId: 3e80edab97d215b7a0d32b23c96cfcdfa6723476
This commit is contained in:
Tagir Valeev
2026-02-06 20:23:12 +00:00
committed by intellij-monorepo-bot
parent 223afcae1e
commit 36bc7c3c64
2 changed files with 58 additions and 0 deletions
@@ -5,6 +5,7 @@ import com.intellij.java.codeserver.highlighting.errors.JavaCompilationError;
import com.intellij.java.codeserver.highlighting.errors.JavaErrorKinds;
import com.intellij.java.codeserver.highlighting.errors.JavaIncompatibleTypeErrorContext;
import com.intellij.lang.jvm.JvmModifier;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.JavaResolveResult;
import com.intellij.psi.LambdaUtil;
import com.intellij.psi.PsiCall;
@@ -14,6 +15,7 @@ import com.intellij.psi.PsiClassType;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiExpression;
import com.intellij.psi.PsiExpressionList;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFunctionalExpression;
import com.intellij.psi.PsiIntersectionType;
import com.intellij.psi.PsiJavaCodeReferenceElement;
@@ -418,6 +420,7 @@ final class FunctionChecker {
PsiUtil.resolveGenericsClassInType(PsiClassImplUtil.correctType(functionalInterfaceType, expression.getResolveScope()));
PsiClass psiClass = resolveResult.getElement();
if (psiClass == null) return;
PsiFile file = psiClass.getContainingFile();
if (!PsiUtil.isAccessible(myVisitor.project(), psiClass, expression, null)) {
myVisitor.myModifierChecker.reportAccessProblem(expression, psiClass, resolveResult);
return;
@@ -448,5 +451,11 @@ final class FunctionChecker {
}
myVisitor.myModuleChecker.checkModuleAccess(psiClass, expression);
if (!myVisitor.hasErrorResults()) {
VirtualFile virtualFile = file.getVirtualFile();
if (virtualFile != null && !expression.getResolveScope().contains(virtualFile)) {
myVisitor.report(JavaErrorKinds.CLASS_NOT_ACCESSIBLE.create(expression, psiClass));
}
}
}
}
@@ -5,13 +5,17 @@ import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInsight.intention.preview.IntentionPreviewInfo;
import com.intellij.openapi.module.JavaModuleType;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ModuleRootModificationUtil;
import com.intellij.openapi.roots.ModuleSourceOrderEntry;
import com.intellij.openapi.roots.OrderEntry;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.testFramework.IdeaTestUtil;
import com.intellij.testFramework.PsiTestUtil;
import com.intellij.testFramework.builders.JavaModuleFixtureBuilder;
import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase;
import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.ContainerUtil;
@@ -52,6 +56,51 @@ public class MultipleModuleHighlightingTest extends JavaCodeInsightFixtureTestCa
myFixture.checkHighlighting();
}
@Override
protected void tuneFixture(JavaModuleFixtureBuilder<?> moduleBuilder) throws Exception {
moduleBuilder.setLanguageLevel(LanguageLevel.JDK_1_8);
moduleBuilder.addJdk(IdeaTestUtil.getMockJdk18Path().getPath());
}
public void testMissedTransitiveDepFunctionalInterface() throws IOException {
Sdk sdk = ModuleRootManager.getInstance(getModule()).getSdk();
Module mod1 =
PsiTestUtil.addModule(getProject(), JavaModuleType.getModuleType(), "mod1", myFixture.getTempDirFixture().findOrCreateDir("mod1"));
Module mod2 =
PsiTestUtil.addModule(getProject(), JavaModuleType.getModuleType(), "mod2", myFixture.getTempDirFixture().findOrCreateDir("mod2"));
Module mod3 =
PsiTestUtil.addModule(getProject(), JavaModuleType.getModuleType(), "mod3", myFixture.getTempDirFixture().findOrCreateDir("mod3"));
ModuleRootModificationUtil.setModuleSdk(mod1, sdk);
ModuleRootModificationUtil.setModuleSdk(mod2, sdk);
ModuleRootModificationUtil.setModuleSdk(mod3, sdk);
ModuleRootModificationUtil.addDependency(mod2, mod1);
ModuleRootModificationUtil.addDependency(mod3, mod2);
myFixture.addFileToProject("mod1/M1.java", "public class M1 {}");
myFixture.addFileToProject("mod2/M2.java", """
import java.util.function.Supplier;
public class M2 {
public static void test(Supplier<M1> supplier) {
System.out.println(supplier.get());
}
public static M1Sub create() {
return new M1Sub();
}
public static class M1Sub extends M1 {}
}
""");
PsiFile file = myFixture.addFileToProject("mod3/M3.java", """
public class M3 {
public static void main(String[] args) {
M2.test(<error descr="Cannot access M1">M2::create</error>);
}
}""");
myFixture.configureFromExistingVirtualFile(PsiUtilCore.getVirtualFile(file));
IdeaTestUtil.withLevel(mod3, LanguageLevel.JDK_1_8, myFixture::checkHighlighting);
}
public void testMissedMethodInHierarchy() throws IOException {
Module mod1 =
PsiTestUtil.addModule(getProject(), JavaModuleType.getModuleType(), "mod1", myFixture.getTempDirFixture().findOrCreateDir("mod1"));