resolve references by qualified class name when qualifiers can't be resolved

javac ignores problems caused by files located in wrong directories, IDEA reports them: try to search class by FQName when failed to resolve normally (IDEA-178376; IDEA-176179)
This commit is contained in:
Anna Kozlova
2017-09-06 19:42:00 +03:00
parent 3711f0567a
commit 955a6160cd
10 changed files with 75 additions and 16 deletions
@@ -2774,10 +2774,12 @@ public class HighlightUtil extends HighlightUtilBase {
if (resolved == null) {
// do not highlight unknown packages (javac does not care), Javadoc, and module references (checked elsewhere)
PsiElement outerParent = getOuterReferenceParent(ref);
PsiJavaCodeReferenceElement parent = getOuterReferenceParent(ref);
PsiElement outerParent = parent.getParent();
if (outerParent instanceof PsiPackageStatement ||
result.isPackagePrefixPackageReference() ||
PsiUtil.isInsideJavadocComment(ref) ||
parent.resolve() instanceof PsiClass ||
outerParent instanceof PsiPackageAccessibilityStatement) {
return null;
}
@@ -2864,15 +2866,24 @@ public class HighlightUtil extends HighlightUtilBase {
return ElementDescriptionUtil.getElementDescription(element, HighlightUsagesDescriptionLocation.INSTANCE);
}
private static PsiElement getOuterReferenceParent(PsiJavaCodeReferenceElement ref) {
PsiElement element = ref;
while (element instanceof PsiJavaCodeReferenceElement) element = element.getParent();
@NotNull
private static PsiJavaCodeReferenceElement getOuterReferenceParent(@NotNull PsiJavaCodeReferenceElement ref) {
PsiJavaCodeReferenceElement element = ref;
while (true) {
PsiElement parent = element.getParent();
if (parent instanceof PsiJavaCodeReferenceElement) {
element = (PsiJavaCodeReferenceElement)parent;
}
else {
break;
}
}
return element;
}
@Nullable
static HighlightInfo checkPackageAndClassConflict(@NotNull PsiJavaCodeReferenceElement ref, @NotNull PsiFile containingFile) {
if (ref.isQualified() && getOuterReferenceParent(ref) instanceof PsiPackageStatement) {
if (ref.isQualified() && getOuterReferenceParent(ref).getParent() instanceof PsiPackageStatement) {
VirtualFile file = containingFile.getVirtualFile();
if (file != null) {
Module module = ProjectFileIndex.SERVICE.getInstance(ref.getProject()).getModuleForFile(file);
@@ -394,6 +394,16 @@ public class PsiJavaCodeReferenceElementImpl extends CompositePsiElement impleme
result = referenceElement.resolve(PACKAGE_NAME_KIND, containingFile);
}
}
if (result.length == 0 && (kind == CLASS_OR_PACKAGE_NAME_KIND || kind == CLASS_NAME_KIND)) {
String qualifiedName = referenceElement.getQualifiedName();
PsiClass aClass = qualifiedName != null && !StringUtil.isEmptyOrSpaces(StringUtil.getPackageName(qualifiedName))
? JavaPsiFacade.getInstance(referenceElement.getProject()).findClass(qualifiedName, referenceElement.getResolveScope())
: null;
if (aClass != null) {
result = new JavaResolveResult[] {new CandidateInfo(aClass, PsiSubstitutor.EMPTY, referenceElement, false)};
}
}
JavaResolveUtil.substituteResults(referenceElement, result);
@@ -0,0 +1,17 @@
package xxxy.yy;
class MyTest {
{
xxxy.yy.MyTest.I o;
I i = new xxxy.yy.MyTest.I() {
@Override
public void foo() {
}
};
}
interface I {
void foo();
}
}
@@ -0,0 +1,8 @@
// "Replace with lambda" "true"
package mismatch;
interface CanceledStatus {
CanceledStatus NULL = () -> false;
boolean isCanceled();
}
@@ -0,0 +1,13 @@
// "Replace with lambda" "true"
package mismatch;
interface CanceledStatus {
CanceledStatus NULL = new Canceled<caret>Status() {
@Override
public boolean isCanceled() {
return false;
}
};
boolean isCanceled();
}
@@ -3,8 +3,8 @@ package javax.annotation;
class A {
@Nonnull private final Object field;
A(@javax.annotation.Nonnull Object field, String... strs) {
this.field = field;<caret>
A(@Nonnull Object field, String... strs) {
this.field = field;
}
}
@@ -18,12 +18,12 @@ public class RenameCollisions {
int var1 = renameCollisions.LocalClass.SN_STATIC_FIELD;
renameCollisions.LocalClass.snStaticMethod();
renameCollisions.RenameCollisions.LocalClass innerClass = new renameCollisions.RenameCollisions.LocalClass();
int var4 = renameCollisions.RenameCollisions.LocalClass.SN_STATIC_FIELD;
LocalClass innerClass = new LocalClass();
int var4 = LocalClass.SN_STATIC_FIELD;
}
public static void staticContext() {
renameCollisions.RenameCollisions.LocalClass innerClass = new RenameCollisions().new LocalClass();
int var3 = renameCollisions.RenameCollisions.LocalClass.SN_STATIC_FIELD;
LocalClass innerClass = new RenameCollisions().new LocalClass();
int var3 = LocalClass.SN_STATIC_FIELD;
}
}
@@ -18,13 +18,13 @@ public class RenameCollisions {
int var1 = renameCollisions.StaticInnerClass.SN_STATIC_FIELD;
renameCollisions.StaticInnerClass.snStaticMethod();
renameCollisions.RenameCollisions.StaticInnerClass staticInnerClass = new renameCollisions.RenameCollisions.StaticInnerClass();
StaticInnerClass staticInnerClass = new StaticInnerClass();
int var3 = renameCollisions.RenameCollisions.StaticInnerClass.SN_STATIC_FIELD;
renameCollisions.RenameCollisions.StaticInnerClass.snStaticMethod();
}
public static void staticContext() {
renameCollisions.RenameCollisions.StaticInnerClass staticInnerClass = new renameCollisions.RenameCollisions.StaticInnerClass();
StaticInnerClass staticInnerClass = new StaticInnerClass();
int var2 = renameCollisions.RenameCollisions.StaticInnerClass.SN_STATIC_FIELD;
renameCollisions.RenameCollisions.StaticInnerClass.snStaticMethod();
}
@@ -19,6 +19,7 @@ import com.intellij.codeInsight.daemon.LightDaemonAnalyzerTestCase;
import com.intellij.codeInspection.LocalInspectionTool;
import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection;
import com.intellij.codeInspection.uncheckedWarnings.UncheckedWarningLocalInspection;
import com.intellij.codeInspection.unusedImport.UnusedImportInspection;
import com.intellij.openapi.projectRoots.JavaSdkVersion;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.LanguageLevelProjectExtension;
@@ -28,7 +29,6 @@ import com.intellij.psi.PsiManager;
import com.intellij.psi.PsiType;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.testFramework.IdeaTestUtil;
import com.intellij.codeInspection.unusedImport.UnusedImportInspection;
import org.jetbrains.annotations.NotNull;
public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase {
@@ -426,6 +426,7 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase {
public void testUncheckedWarningWhenCastingFromCapturedWildcard() { doTest8Incompatibility(true); }
public void testEnclosingRefInTopLevelClassExtendingInnerWhichExtendsItsOuter() { doTest8Incompatibility(true); }
public void testGenericThrowTypes() { doTest5(false); }
public void testClassInWrongPackage() { doTest6(false); }
public void testRecursiveParamBoundsWhenSuperSubstitution() { doTest6(false); }
public void testCaptureForBoundCheck() { doTest6(false); }
}
@@ -21,8 +21,7 @@ public class UnnecessaryJavaDocLink {
}
/**
* @see com.siyeh.igtest.javadoc.unnecessary_javadoc_link.UnnecessaryJavaDocLink
* something
* @see com.siyeh.igtest.javadoc.unnecessary_javadoc_link.UnnecessaryJavaDocLink1 something
*/
void bar() {}
}