diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index bdbcc7d05a25..a2b91b615890 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -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); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java index 26052718cb0f..a9370480a6ec 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java @@ -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); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/ClassInWrongPackage.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/ClassInWrongPackage.java new file mode 100644 index 000000000000..f464bdd6be8a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/ClassInWrongPackage.java @@ -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(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterWrongPackageStatement.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterWrongPackageStatement.java new file mode 100644 index 000000000000..a96f5cef9299 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterWrongPackageStatement.java @@ -0,0 +1,8 @@ +// "Replace with lambda" "true" +package mismatch; + +interface CanceledStatus { + CanceledStatus NULL = () -> false; + + boolean isCanceled(); +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeWrongPackageStatement.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeWrongPackageStatement.java new file mode 100644 index 000000000000..a38aa378fa41 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeWrongPackageStatement.java @@ -0,0 +1,13 @@ +// "Replace with lambda" "true" +package mismatch; + +interface CanceledStatus { + CanceledStatus NULL = new CanceledStatus() { + @Override + public boolean isCanceled() { + return false; + } + }; + + boolean isCanceled(); +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterNonnullAnnotated.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterNonnullAnnotated.java index d451d40195b6..232bd14755e4 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterNonnullAnnotated.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterNonnullAnnotated.java @@ -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; + A(@Nonnull Object field, String... strs) { + this.field = field; } } diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameClassInnerToLocal.java.after b/java/java-tests/testData/refactoring/renameCollisions/RenameClassInnerToLocal.java.after index 54a65a8a22b1..fd203a62fb2e 100644 --- a/java/java-tests/testData/refactoring/renameCollisions/RenameClassInnerToLocal.java.after +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameClassInnerToLocal.java.after @@ -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; } } diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameClassLocalToInner.java.after b/java/java-tests/testData/refactoring/renameCollisions/RenameClassLocalToInner.java.after index 18e3bdf728d2..8cc2c53ff315 100644 --- a/java/java-tests/testData/refactoring/renameCollisions/RenameClassLocalToInner.java.after +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameClassLocalToInner.java.after @@ -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(); } diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/GenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/GenericsHighlightingTest.java index bb8eea6532a8..8047d70ad8b5 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/GenericsHighlightingTest.java @@ -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); } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/javadoc/unnecessary_javadoc_link/UnnecessaryJavaDocLink.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/javadoc/unnecessary_javadoc_link/UnnecessaryJavaDocLink.java index cf67f8ec04c3..b361885c404b 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/javadoc/unnecessary_javadoc_link/UnnecessaryJavaDocLink.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/javadoc/unnecessary_javadoc_link/UnnecessaryJavaDocLink.java @@ -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() {} }