unresolved qualifiers in ref expressions chain (follow IDEA-CR-24382)

This commit is contained in:
Anna Kozlova
2017-09-11 13:33:49 +03:00
parent 83cc3edc8e
commit 5fa4775cf1
7 changed files with 36 additions and 9 deletions

View File

@@ -2779,7 +2779,7 @@ public class HighlightUtil extends HighlightUtilBase {
if (outerParent instanceof PsiPackageStatement ||
result.isPackagePrefixPackageReference() ||
PsiUtil.isInsideJavadocComment(ref) ||
parent.resolve() instanceof PsiClass ||
parent.resolve() instanceof PsiMember ||
outerParent instanceof PsiPackageAccessibilityStatement) {
return null;
}
@@ -2955,6 +2955,22 @@ public class HighlightUtil extends HighlightUtilBase {
if (qualifier instanceof PsiReferenceExpression) {
PsiElement qualifierResolved = ((PsiReferenceExpression)qualifier).resolve();
if (qualifierResolved instanceof PsiClass || qualifierResolved instanceof PsiPackage) return null;
if (qualifierResolved == null) {
PsiReferenceExpression qExpression = (PsiReferenceExpression)qualifier;
while (true) {
PsiElement qResolve = qExpression.resolve();
if (qResolve == null || qResolve instanceof PsiClass || qResolve instanceof PsiPackage) {
PsiExpression qualifierExpression = qExpression.getQualifierExpression();
if (qualifierExpression == null) return null;
if (qualifierExpression instanceof PsiReferenceExpression) {
qExpression = (PsiReferenceExpression)qualifierExpression;
continue;
}
}
break;
}
}
}
String description = JavaErrorMessages.message("expected.class.or.package");
HighlightInfo info =

View File

@@ -21,6 +21,7 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
@@ -279,6 +280,16 @@ public class PsiReferenceExpressionImpl extends ExpressionPsiElement implements
else if (result.length == 0) {
result = resolveToPackage(containingFile);
}
if (result.length == 0 && variable == null) {
String qualifiedName = getQualifiedName();
PsiClass aClass = qualifiedName != null && !StringUtil.isEmptyOrSpaces(StringUtil.getPackageName(qualifiedName))
? JavaPsiFacade.getInstance(getProject()).findClass(qualifiedName, getResolveScope())
: null;
if (aClass != null) {
result = new JavaResolveResult[] {new CandidateInfo(aClass, PsiSubstitutor.EMPTY, this, false)};
}
}
return result.length == 0 && variable != null ? variable : result;
}

View File

@@ -15,7 +15,7 @@ class E {
class opopo {
public void main(String[] args) {
String java = "bla";
java.<error descr="Cannot resolve symbol 'lang'">lang</error>.String.valueOf("");
<error descr="Expected class or package">java.lang</error>.String.valueOf("");
}
}
}

View File

@@ -11,7 +11,7 @@ class ImmutableSet<T> {
}
public class Test {
private static final Set<String> S = com.google.common.collect.ImmutableSet.of("foo", "bar", "baz");
private static final Set<String> S = ImmutableSet.of("foo", "bar", "baz");
void testOr(String s) {
if(S.contains(s)) {

View File

@@ -2,6 +2,6 @@ import mycompany.File;
class Test {
void foo() throws Exception {
File tempFile = mycompany.File.createTempFile("", "", null);
File tempFile = File.createTempFile("", "", null);
}
}

View File

@@ -19,13 +19,13 @@ public class RenameCollisions {
renameCollisions.StaticInnerClass.snStaticMethod();
StaticInnerClass staticInnerClass = new StaticInnerClass();
int var3 = renameCollisions.RenameCollisions.StaticInnerClass.SN_STATIC_FIELD;
renameCollisions.RenameCollisions.StaticInnerClass.snStaticMethod();
int var3 = RenameCollisions.StaticInnerClass.SN_STATIC_FIELD;
RenameCollisions.StaticInnerClass.snStaticMethod();
}
public static void staticContext() {
StaticInnerClass staticInnerClass = new StaticInnerClass();
int var2 = renameCollisions.RenameCollisions.StaticInnerClass.SN_STATIC_FIELD;
renameCollisions.RenameCollisions.StaticInnerClass.snStaticMethod();
int var2 = RenameCollisions.StaticInnerClass.SN_STATIC_FIELD;
RenameCollisions.StaticInnerClass.snStaticMethod();
}
}

View File

@@ -27,6 +27,6 @@ class Main {
}
}
static public void main() {
test(e.E.A);
test(E.A);
}
}