mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 06:39:38 +07:00
java: check accessibility of classes: warn on static imports, do not for supers of method signatures types
GitOrigin-RevId: 94d15750d549eca51ad5c0b0767ae5387b7424e7
This commit is contained in:
committed by
intellij-monorepo-bot
parent
47ab4db8e2
commit
2fc8df2e0d
@@ -1436,11 +1436,8 @@ public class GenericsHighlightUtil {
|
||||
return checkClassSupersAccessibility(aClass, aClass.getResolveScope(), HighlightNamesUtil.getClassDeclarationTextRange(aClass), true);
|
||||
}
|
||||
|
||||
static HighlightInfo checkClassSupersAccessibility(@NotNull PsiClass aClass, @NotNull PsiReferenceExpression ref) {
|
||||
if (ref.getParent() instanceof PsiMethodCallExpression) {
|
||||
return checkClassSupersAccessibility(aClass, ref.getResolveScope(), ref.getTextRange(), false);
|
||||
}
|
||||
return null;
|
||||
static HighlightInfo checkClassSupersAccessibility(@NotNull PsiClass aClass, @NotNull PsiElement ref) {
|
||||
return checkClassSupersAccessibility(aClass, ref.getResolveScope(), ref.getTextRange(), false);
|
||||
}
|
||||
|
||||
private static HighlightInfo checkClassSupersAccessibility(@NotNull PsiClass aClass,
|
||||
@@ -1529,21 +1526,22 @@ public class GenericsHighlightUtil {
|
||||
return "Cannot access " + HighlightUtil.formatClass(aClass);
|
||||
}
|
||||
|
||||
if (checkParameters) {
|
||||
if (type instanceof PsiClassType) {
|
||||
for (PsiType parameterType : ((PsiClassType)type).getParameters()) {
|
||||
final String notAccessibleMessage = isTypeAccessible(parameterType, classes, true, resolveScope, factory);
|
||||
if (notAccessibleMessage != null) {
|
||||
return notAccessibleMessage;
|
||||
}
|
||||
if (!checkParameters){
|
||||
return null;
|
||||
}
|
||||
|
||||
if (type instanceof PsiClassType) {
|
||||
for (PsiType parameterType : ((PsiClassType)type).getParameters()) {
|
||||
final String notAccessibleMessage = isTypeAccessible(parameterType, classes, true, resolveScope, factory);
|
||||
if (notAccessibleMessage != null) {
|
||||
return notAccessibleMessage;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
boolean isInLibrary = !index.isInContent(vFile);
|
||||
for (PsiClassType superType : aClass.getSuperTypes()) {
|
||||
final String notAccessibleMessage = isTypeAccessible(superType, classes, checkParameters && !isInLibrary, resolveScope, factory);
|
||||
final String notAccessibleMessage = isTypeAccessible(superType, classes, !isInLibrary, resolveScope, factory);
|
||||
if (notAccessibleMessage != null) {
|
||||
return notAccessibleMessage;
|
||||
}
|
||||
|
||||
@@ -659,6 +659,16 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
|
||||
public void visitImportStaticStatement(PsiImportStaticStatement statement) {
|
||||
myHolder.add(checkFeature(statement, Feature.STATIC_IMPORTS));
|
||||
if (!myHolder.hasErrorResults()) myHolder.add(ImportsHighlightUtil.checkStaticOnDemandImportResolvesToClass(statement));
|
||||
if (!myHolder.hasErrorResults()) {
|
||||
PsiJavaCodeReferenceElement importReference = statement.getImportReference();
|
||||
PsiClass targetClass = statement.resolveTargetClass();
|
||||
if (importReference != null) {
|
||||
PsiElement referenceNameElement = importReference.getReferenceNameElement();
|
||||
if (referenceNameElement != null && targetClass != null) {
|
||||
myHolder.add(GenericsHighlightUtil.checkClassSupersAccessibility(targetClass, referenceNameElement));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1374,10 +1384,12 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
|
||||
if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkClassReferenceAfterQualifier(expression, resolved));
|
||||
final PsiExpression qualifierExpression = expression.getQualifierExpression();
|
||||
myHolder.add(HighlightUtil.checkUnqualifiedSuperInDefaultMethod(myLanguageLevel, expression, qualifierExpression));
|
||||
if (!myHolder.hasErrorResults() && myJavaModule == null) {
|
||||
PsiClass psiClass = RefactoringChangeUtil.getQualifierClass(expression);
|
||||
if (psiClass != null) {
|
||||
myHolder.add(GenericsHighlightUtil.checkClassSupersAccessibility(psiClass, expression));
|
||||
if (!myHolder.hasErrorResults() && myJavaModule == null && qualifierExpression != null) {
|
||||
if (parent instanceof PsiMethodCallExpression) {
|
||||
PsiClass psiClass = RefactoringChangeUtil.getQualifierClass(expression);
|
||||
if (psiClass != null) {
|
||||
myHolder.add(GenericsHighlightUtil.checkClassSupersAccessibility(psiClass, expression));
|
||||
}
|
||||
}
|
||||
if (!myHolder.hasErrorResults()) {
|
||||
myHolder.add(GenericsHighlightUtil.checkMemberSignatureTypesAccessibility(expression));
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
package p;
|
||||
|
||||
import static p.<error descr="Cannot access p.BaseClass">ChildClass</error>.*;
|
||||
|
||||
class Sample {
|
||||
public static void main(String[] args) {
|
||||
ChildClass.<error descr="Cannot resolve method 'foo' in 'ChildClass'">foo</error>();
|
||||
foo();
|
||||
ChildClass cc = ChildClass2.childClass();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
package p;
|
||||
|
||||
public class ChildClass extends BaseClass {}
|
||||
class ChildClass2 {
|
||||
public static ChildClass childClass() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,11 +3,13 @@ package p;
|
||||
import ppp.*;
|
||||
|
||||
class Foo {
|
||||
{
|
||||
final ByteArrayOStream baos = alloc();
|
||||
void foo(Bar bar) {
|
||||
final ByteArrayOStream baos = bar.alloc();
|
||||
}
|
||||
|
||||
ByteArrayOStream alloc() {
|
||||
return null;
|
||||
class Bar {
|
||||
ByteArrayOStream alloc() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -21,6 +21,7 @@ import com.intellij.openapi.application.ex.PathManagerEx;
|
||||
import com.intellij.openapi.editor.markup.RangeHighlighter;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.roots.FileIndexFacade;
|
||||
import com.intellij.openapi.roots.LanguageLevelModuleExtension;
|
||||
import com.intellij.openapi.roots.ModuleRootModificationUtil;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
@@ -174,6 +175,7 @@ public class MultipleJdksHighlightingTest extends UsefulTestCase {
|
||||
|
||||
public void testStaticCallOnChildWithNotAccessibleParent() {
|
||||
addDependencies_37_78();
|
||||
ModuleRootModificationUtil.updateModel(myJava3Module, m -> m.getModuleExtension(LanguageLevelModuleExtension.class).setLanguageLevel(LanguageLevel.JDK_1_5));
|
||||
doTest3Modules();
|
||||
}
|
||||
|
||||
|
||||
@@ -181,7 +181,7 @@ public class Factory {
|
||||
myFixture.addFileToProject "mod2/Usage.java", '''
|
||||
public class Usage {
|
||||
{
|
||||
<error descr="Cannot access Class0">Factory.create</error>();
|
||||
Factory.create();
|
||||
}
|
||||
}
|
||||
'''
|
||||
|
||||
Reference in New Issue
Block a user