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 f571f8b1ee9f..28a2f1f9284f 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 @@ -1176,6 +1176,12 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh if (myLanguageLevel.isAtLeast(LanguageLevel.JDK_1_9)) { if (!myHolder.hasErrorResults()) add(ModuleHighlightUtil.checkPackageStatement(statement, myFile, myJavaModule)); } + if (!myHolder.hasErrorResults()) { + if (HighlightingFeature.UNNAMED_CLASSES.isAvailable(myFile) && JavaUnnamedClassUtil.isFileWithUnnamedClass(myFile)) { + add(HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(statement).descriptionAndTooltip( + JavaErrorBundle.message("text.package.statement.not.allowed.for.unnamed.class"))); + } + } } @Override diff --git a/java/java-psi-impl/src/com/intellij/psi/util/JavaUnnamedClassUtil.java b/java/java-psi-impl/src/com/intellij/psi/util/JavaUnnamedClassUtil.java new file mode 100644 index 000000000000..733226aa2846 --- /dev/null +++ b/java/java-psi-impl/src/com/intellij/psi/util/JavaUnnamedClassUtil.java @@ -0,0 +1,21 @@ +// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.psi.util; + +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiJavaFile; +import com.intellij.psi.PsiUnnamedClass; +import org.jetbrains.annotations.NotNull; + +public final class JavaUnnamedClassUtil { + public static boolean isFileWithUnnamedClass(@NotNull PsiFile file) { + if (file instanceof PsiJavaFile) { + PsiJavaFile javaFile = (PsiJavaFile)file; + PsiClass[] classes = javaFile.getClasses(); + if (classes.length == 1 && classes[0] instanceof PsiUnnamedClass) { + return true; + } + } + return false; + } +} diff --git a/java/java-psi-impl/src/messages/JavaErrorBundle.properties b/java/java-psi-impl/src/messages/JavaErrorBundle.properties index 6b35c268d52e..9f924b31d86e 100644 --- a/java/java-psi-impl/src/messages/JavaErrorBundle.properties +++ b/java/java-psi-impl/src/messages/JavaErrorBundle.properties @@ -575,4 +575,5 @@ too.many.array.dimensions=Too many array dimensions error.cannot.infer.pattern.type=Cannot infer pattern type: {0} error.extra.semicolons.between.import.statements.not.allowed=Extra semicolons between import statements are not allowed error.guard.allowed.after.patterns.only=Guard is allowed after patterns only -error.unnamed.class.contains.no.main.method=Unnamed class contains no 'main' method \ No newline at end of file +error.unnamed.class.contains.no.main.method=Unnamed class contains no 'main' method +text.package.statement.not.allowed.for.unnamed.class=Package statement is not allowed for unnamed class \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/unnamedClass/WithPackageStatement.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/unnamedClass/WithPackageStatement.java new file mode 100644 index 000000000000..c26a1d12caf1 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/unnamedClass/WithPackageStatement.java @@ -0,0 +1,5 @@ +package pack.bar; + +void foo() { + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/UnnamedClassHighlightingTest.kt b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/UnnamedClassHighlightingTest.kt index be82a034ae53..da7b5f5a7397 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/UnnamedClassHighlightingTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/UnnamedClassHighlightingTest.kt @@ -16,7 +16,7 @@ class UnnamedClassHighlightingTest : LightJavaCodeInsightFixtureTestCase() { }) } - fun testNoMainMethod() { + fun testWithPackageStatement() { doTest() }