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() {