From 68a6a503da01e073a083f5da904648401ae6ea8b Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 20 Feb 2017 13:47:09 +0100 Subject: [PATCH] [java] highlighting for deprecated module usages --- .../deprecation/DeprecationInspection.java | 14 ++++++++++++++ .../daemon/impl/analysis/HighlightMessageUtil.java | 3 +++ .../codeInsight/daemon/ModuleHighlightingTest.kt | 7 +++++++ 3 files changed, 24 insertions(+) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/deprecation/DeprecationInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/deprecation/DeprecationInspection.java index 813cc819b320..5c14b72ded54 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/deprecation/DeprecationInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/deprecation/DeprecationInspection.java @@ -25,6 +25,7 @@ import com.intellij.codeInspection.ProblemsHolder; import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; +import com.intellij.psi.impl.PsiImplUtil; import com.intellij.psi.infos.MethodCandidateInfo; import com.intellij.psi.util.MethodSignatureBackedByPsiMethod; import com.intellij.psi.util.PsiTreeUtil; @@ -216,6 +217,19 @@ public class DeprecationInspection extends BaseJavaBatchLocalInspectionTool { } } } + + @Override + public void visitRequiresStatement(PsiRequiresStatement statement) { + PsiJavaModuleReferenceElement refElement = statement.getReferenceElement(); + if (refElement != null) { + PsiPolyVariantReference ref = refElement.getReference(); + PsiElement target = ref != null ? ref.resolve() : null; + if (target instanceof PsiJavaModule && PsiImplUtil.isDeprecatedByAnnotation((PsiJavaModule)target)) { + String message = JavaErrorMessages.message("deprecated.symbol", HighlightMessageUtil.getSymbolName(target)); + myHolder.registerProblem(refElement, message, ProblemHighlightType.LIKE_DEPRECATED); + } + } + } } private static boolean hasDefaultDeprecatedConstructor(PsiClass superClass) { diff --git a/java/java-psi-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMessageUtil.java b/java/java-psi-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMessageUtil.java index 42ee7bc215db..5d2aec204db9 100644 --- a/java/java-psi-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMessageUtil.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMessageUtil.java @@ -69,6 +69,9 @@ public class HighlightMessageUtil { else if (symbol instanceof PsiDirectory) { symbolName = ((PsiDirectory)symbol).getName(); } + else if (symbol instanceof PsiJavaModule) { + symbolName = ((PsiJavaModule)symbol).getName(); + } return symbolName; } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ModuleHighlightingTest.kt b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ModuleHighlightingTest.kt index a49e65b8e69e..e309cf036003 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ModuleHighlightingTest.kt +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ModuleHighlightingTest.kt @@ -16,6 +16,7 @@ package com.intellij.codeInsight.daemon import com.intellij.codeInsight.daemon.impl.JavaHighlightInfoTypes +import com.intellij.codeInspection.deprecation.DeprecationInspection import com.intellij.openapi.util.TextRange import com.intellij.testFramework.fixtures.LightJava9ModulesCodeInsightFixtureTestCase import com.intellij.testFramework.fixtures.MultiModuleJava9ProjectDescriptor.ModuleDescriptor.* @@ -215,6 +216,12 @@ class ModuleHighlightingTest : LightJava9ModulesCodeInsightFixtureTestCase() { highlight("module M { requires M6; }") } + fun testDeprecations() { + myFixture.enableInspections(DeprecationInspection()) + addFile("module-info.java", "@Deprecated module M2 { }", M2) + highlight("""module M { requires M2; }""") + } + // private fun highlight(text: String) = highlight("module-info.java", text)