mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
highlight inaccessible array component type (IDEA-165434)
This commit is contained in:
@@ -116,6 +116,19 @@ public final class PsiUtil extends PsiUtilCore {
|
||||
public static JavaResolveResult getAccessObjectClass(@NotNull PsiExpression expression) {
|
||||
if (expression instanceof PsiSuperExpression) return JavaResolveResult.EMPTY;
|
||||
PsiType type = expression.getType();
|
||||
final JavaResolveResult accessObject = getAccessObjectClass(type, expression.getProject());
|
||||
if (accessObject != null) return accessObject;
|
||||
|
||||
if (type == null && expression instanceof PsiReferenceExpression) {
|
||||
JavaResolveResult resolveResult = ((PsiReferenceExpression)expression).advancedResolve(false);
|
||||
if (resolveResult.getElement() instanceof PsiClass) {
|
||||
return resolveResult;
|
||||
}
|
||||
}
|
||||
return JavaResolveResult.EMPTY;
|
||||
}
|
||||
|
||||
private static JavaResolveResult getAccessObjectClass(PsiType type, Project project) {
|
||||
if (type instanceof PsiClassType) {
|
||||
return ((PsiClassType)type).resolveGenerics();
|
||||
}
|
||||
@@ -132,22 +145,19 @@ public final class PsiUtil extends PsiUtilCore {
|
||||
final PsiClass resolved = ((PsiClassType)upperBound).resolve();
|
||||
final PsiFile containingFile = resolved != null ? resolved.getContainingFile() : null;
|
||||
final String packageName = containingFile instanceof PsiClassOwner ? ((PsiClassOwner)containingFile).getPackageName() : null;
|
||||
String classText = StringUtil.isEmptyOrSpaces(packageName) ? "" : "package " +packageName + ";\n ";
|
||||
String classText = StringUtil.isEmptyOrSpaces(packageName) ? "" : "package " + packageName + ";\n ";
|
||||
classText += "class I<T extends " + upperBound.getCanonicalText() + "> {}";
|
||||
final PsiJavaFile file =
|
||||
(PsiJavaFile)PsiFileFactory.getInstance(expression.getProject()).createFileFromText("inference_dummy.java", JavaLanguage.INSTANCE, classText);
|
||||
(PsiJavaFile)PsiFileFactory.getInstance(project).createFileFromText("inference_dummy.java", JavaLanguage.INSTANCE, classText);
|
||||
final PsiTypeParameter freshParameter = file.getClasses()[0].getTypeParameters()[0];
|
||||
return new ClassCandidateInfo(freshParameter, PsiSubstitutor.EMPTY);
|
||||
}
|
||||
}
|
||||
|
||||
if (type == null && expression instanceof PsiReferenceExpression) {
|
||||
JavaResolveResult resolveResult = ((PsiReferenceExpression)expression).advancedResolve(false);
|
||||
if (resolveResult.getElement() instanceof PsiClass) {
|
||||
return resolveResult;
|
||||
}
|
||||
if (type instanceof PsiArrayType) {
|
||||
return getAccessObjectClass(((PsiArrayType)type).getComponentType(), project);
|
||||
}
|
||||
return JavaResolveResult.EMPTY;
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean isConstantExpression(@Nullable PsiExpression expression) {
|
||||
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
package b;
|
||||
class C {
|
||||
{
|
||||
int u = a.B.getAs().<error descr="Cannot access 'length' in '_Dummy_.__Array__'">length</error>;
|
||||
a.B.getAs().<error descr="Cannot access 'clone()' in '_Dummy_.__Array__'">clone</error>();
|
||||
}
|
||||
}
|
||||
+7
@@ -92,6 +92,13 @@ public class LightAdvHighlightingFixtureTest extends LightCodeInsightFixtureTest
|
||||
myFixture.checkHighlighting();
|
||||
}
|
||||
|
||||
public void testPackageLocalClassUsedinArrayTypeOutsidePackage() throws Exception {
|
||||
myFixture.addClass("package a; class A {}");
|
||||
myFixture.addClass("package a; public class B {public static A[] getAs() {return null;}}");
|
||||
myFixture.configureByFile(getTestName(false) + ".java");
|
||||
myFixture.checkHighlighting();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getBasePath() {
|
||||
return JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/daemonCodeAnalyzer/advFixture";
|
||||
|
||||
Reference in New Issue
Block a user