From c28f1d89cc08377050743f8728f78af4fc5527e9 Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Tue, 21 Jan 2025 19:27:21 +0100 Subject: [PATCH] [java-highlighting] IDEA-365996 Constructor in an implicitly declared class is not highlighted as error GitOrigin-RevId: 2de45c452608cea2ab314511060ac733259a8c18 --- .../impl/analysis/HighlightMethodUtil.java | 16 ++++++++++++++++ .../impl/analysis/HighlightVisitorImpl.java | 1 + .../messages/JavaErrorBundle.properties | 3 ++- .../ImplicitClassConstructorNoParam.java | 7 +++++++ .../ImplicitClassConstructorParam.java | 7 +++++++ .../daemon/ImplicitClassHighlightingTest.kt | 8 ++++++++ 6 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/implicitClass/ImplicitClassConstructorNoParam.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/implicitClass/ImplicitClassConstructorParam.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java index ce17f7b3a82e..3fd204a4fba1 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java @@ -1734,6 +1734,22 @@ public final class HighlightMethodUtil { return false; } + static HighlightInfo.@Nullable Builder checkConstructorInImplicitClass(@NotNull PsiMethod method) { + if (!method.isConstructor()) { + return null; + } + if (!(method.getContainingClass() instanceof PsiImplicitClass)) { + return null; + } + String description = JavaErrorBundle.message("implicit.class.with.explicit.constructor"); + TextRange textRange = HighlightNamesUtil.getMethodDeclarationTextRange(method); + HighlightInfo.Builder builder = + HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(textRange).descriptionAndTooltip(description); + IntentionAction action = QuickFixFactory.getInstance().createDeleteFix(method); + builder.registerFix(action, null, null, null, null); + return builder; + } + private static final class ReturnModel { final PsiReturnStatement myStatement; final PsiType myType; 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 2b68d606536b..6da3aab19f30 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 @@ -776,6 +776,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh @Override public void visitMethod(@NotNull PsiMethod method) { super.visitMethod(method); + if (!hasErrorResults()) add(HighlightMethodUtil.checkConstructorInImplicitClass(method)); if (!hasErrorResults()) add(HighlightControlFlowUtil.checkUnreachableStatement(method.getBody())); if (!hasErrorResults()) add(HighlightMethodUtil.checkConstructorHandleSuperClassExceptions(method)); if (!hasErrorResults()) add(HighlightMethodUtil.checkRecordAccessorDeclaration(method)); diff --git a/java/java-psi-impl/resources/messages/JavaErrorBundle.properties b/java/java-psi-impl/resources/messages/JavaErrorBundle.properties index e6b675faa7bb..ed11e07f618d 100644 --- a/java/java-psi-impl/resources/messages/JavaErrorBundle.properties +++ b/java/java-psi-impl/resources/messages/JavaErrorBundle.properties @@ -451,4 +451,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 remove.unused.imports.quickfix.text=Remove unused imports -incomplete.project.state.pending.reference=Not resolved until the project is fully loaded \ No newline at end of file +incomplete.project.state.pending.reference=Not resolved until the project is fully loaded +implicit.class.with.explicit.constructor=Explicit constructor in implicitly declared class is not allowed \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/implicitClass/ImplicitClassConstructorNoParam.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/implicitClass/ImplicitClassConstructorNoParam.java new file mode 100644 index 000000000000..05897f719a62 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/implicitClass/ImplicitClassConstructorNoParam.java @@ -0,0 +1,7 @@ +void main(String[] args) { + System.out.println("AAAAA"); +} + +public ImplicitClassConstructorNoParam() { + System.out.println("BBBBB"); +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/implicitClass/ImplicitClassConstructorParam.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/implicitClass/ImplicitClassConstructorParam.java new file mode 100644 index 000000000000..40dd435ed550 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/implicitClass/ImplicitClassConstructorParam.java @@ -0,0 +1,7 @@ +void main(String[] args) { + System.out.println("AAAAA"); +} + +public ImplicitClassConstructorParam(String a) { + System.out.println("BBBBB"); +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ImplicitClassHighlightingTest.kt b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ImplicitClassHighlightingTest.kt index 00057ae46f71..49bba34d7f8e 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ImplicitClassHighlightingTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/ImplicitClassHighlightingTest.kt @@ -164,6 +164,14 @@ class ImplicitClassHighlightingTest : LightJavaCodeInsightFixtureTestCase() { }) } + fun testImplicitClassConstructorNoParam() { + doTest() + } + + fun testImplicitClassConstructorParam() { + doTest() + } + private fun doTest() { myFixture.configureByFile(getTestName(false) + ".java") myFixture.checkHighlighting()