mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
+16
-5
@@ -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);
|
||||
|
||||
+10
@@ -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);
|
||||
|
||||
|
||||
+17
@@ -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();
|
||||
}
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
// "Replace with lambda" "true"
|
||||
package mismatch;
|
||||
|
||||
interface CanceledStatus {
|
||||
CanceledStatus NULL = () -> false;
|
||||
|
||||
boolean isCanceled();
|
||||
}
|
||||
+13
@@ -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();
|
||||
}
|
||||
+2
-2
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+4
-4
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -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();
|
||||
}
|
||||
|
||||
+2
-1
@@ -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); }
|
||||
}
|
||||
+1
-2
@@ -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() {}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user