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:
Anna Kozlova
2020-02-14 23:01:58 +01:00
committed by intellij-monorepo-bot
parent 47ab4db8e2
commit 2fc8df2e0d
7 changed files with 46 additions and 23 deletions

View File

@@ -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;
}

View File

@@ -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));

View File

@@ -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();
}
}

View File

@@ -1,3 +1,8 @@
package p;
public class ChildClass extends BaseClass {}
class ChildClass2 {
public static ChildClass childClass() {
return null;
}
}

View File

@@ -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;
}
}
}

View File

@@ -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();
}

View File

@@ -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();
}
}
'''