diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java index 00ca113a49de..0e13f8f96a23 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightClassUtil.java @@ -263,6 +263,17 @@ public class HighlightClassUtil { return errorResult; } + static HighlightInfo checkVarClassConflict(PsiClass psiClass, PsiIdentifier identifier) { + String className = psiClass.getName(); + if (className != null && "var".equals(className)) { + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) + .descriptionAndTooltip("'var' is a restricted local variable type and cannot be used for type declarations") + .range(identifier) + .create(); + } + return null; + } + @Nullable static HighlightInfo checkClassAndPackageConflict(@NotNull PsiClass aClass) { String name = aClass.getQualifiedName(); diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index 340bb8c582ac..6de400a80c7b 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -658,6 +658,9 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh if (!(parent instanceof PsiAnonymousClass) && aClass.getNameIdentifier() == identifier) { myHolder.add(HighlightNamesUtil.highlightClassName(aClass, identifier, colorsScheme)); } + if (!myHolder.hasErrorResults() && myLanguageLevel.isAtLeast(LanguageLevel.JDK_X)) { + myHolder.add(HighlightClassUtil.checkVarClassConflict(aClass, identifier)); + } if (!myHolder.hasErrorResults() && myLanguageLevel.isAtLeast(LanguageLevel.JDK_1_8)) { myHolder.add(GenericsHighlightUtil.checkUnrelatedDefaultMethods(aClass, identifier)); } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/compiler/JavacQuirksInspectionVisitor.java b/java/java-analysis-impl/src/com/intellij/codeInspection/compiler/JavacQuirksInspectionVisitor.java index 3106bfcb6f8d..02ea9fe434ed 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/compiler/JavacQuirksInspectionVisitor.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/compiler/JavacQuirksInspectionVisitor.java @@ -182,6 +182,10 @@ public class JavacQuirksInspectionVisitor extends JavaElementVisitor { final String message = JavaErrorMessages.message("underscore.identifier.warn"); myHolder.registerProblem(identifier, message, ProblemHighlightType.GENERIC_ERROR_OR_WARNING); } + else if (identifier.getParent() instanceof PsiClass && "var".equals(identifier.getText()) && + myLanguageLevel.isLessThan(LanguageLevel.JDK_X)) { + myHolder.registerProblem(identifier, "Usage of 'var' as class name might not be supported in releases after java 9"); + } } @Override diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting8/VarClassesWarning.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting8/VarClassesWarning.java new file mode 100644 index 000000000000..304826271091 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting8/VarClassesWarning.java @@ -0,0 +1 @@ +class var {} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/VarClassNameConflicts.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/VarClassNameConflicts.java new file mode 100644 index 000000000000..900adbdefbd9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/VarClassNameConflicts.java @@ -0,0 +1,5 @@ +class Main { + class var {} + + <var extends String> void foo() {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingJdk8Test.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingJdk8Test.java index 31e97b26ed8f..45cff0915cef 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingJdk8Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingJdk8Test.java @@ -45,6 +45,7 @@ public class LightAdvHighlightingJdk8Test extends LightDaemonAnalyzerTestCase { public void testLambdaExpressions() { doTest(false, true); } public void testUnsupportedFeatures() { doTest(false, false); } public void testModulesNotSupported() { doTest(false, false); } + public void testVarClassesWarning() { doTest(true, false); } public void testTooManyVarargsPolyArguments() { doTest(true, false); diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvLVTIHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvLVTIHighlightingTest.java index f60827331381..f96df72ae926 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvLVTIHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvLVTIHighlightingTest.java @@ -35,9 +35,8 @@ public class LightAdvLVTIHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(BASE_PATH + "/" + getTestName(false) + ".java", false, false); } - public void testSimpleAvailability() { - doTest(); - } + public void testSimpleAvailability() { doTest(); } + public void testVarClassNameConflicts() { doTest(); } @Override protected Sdk getProjectJDK() {