diff --git a/java/java-analysis-impl/resources/messages/InspectionGadgetsBundle.properties b/java/java-analysis-impl/resources/messages/InspectionGadgetsBundle.properties index 51df2d4b5858..2573ecc571a5 100644 --- a/java/java-analysis-impl/resources/messages/InspectionGadgetsBundle.properties +++ b/java/java-analysis-impl/resources/messages/InspectionGadgetsBundle.properties @@ -788,7 +788,7 @@ junit.test.class.naming.convention.element.description=Test class junit.test.suite.naming.convention.element.description=Test suite method.coupling.display.name=Overly coupled method collections.must.have.initial.capacity.display.name=Collection without initial capacity -anonymous.inner.class.display.name=Anonymous inner class can be replaced with inner class +anonymous.inner.class.display.name=Anonymous class can be replaced with inner class negated.conditional.display.name=Conditional expression with negated condition non.reproducible.math.call.display.name=Non-reproducible call to 'Math' multiple.top.level.classes.in.file.display.name=Multiple top level classes in single file @@ -883,7 +883,7 @@ empty.class.problem.descriptor=Class #ref is empty #loc empty.enum.problem.descriptor=Enum #ref is empty #loc empty.class.file.without.class.problem.descriptor=Java file does not declare any class #loc empty.anonymous.class.problem.descriptor=Anonymous class is empty #loc -anonymous.inner.class.problem.descriptor=Anonymous inner class #ref #loc +anonymous.inner.class.problem.descriptor=Anonymous class #ref #loc limited.scope.inner.class.problem.descriptor=Local class #ref #loc final.method.problem.descriptor=Method declared #ref #loc class.initializer.problem.descriptor=Non-'static' initializer #loc diff --git a/java/java-impl/src/META-INF/InspectionGadgets.xml b/java/java-impl/src/META-INF/InspectionGadgets.xml index fbc1328ba843..3e4376a8fa1c 100644 --- a/java/java-impl/src/META-INF/InspectionGadgets.xml +++ b/java/java-impl/src/META-INF/InspectionGadgets.xml @@ -411,8 +411,8 @@ + groupBundle="messages.InspectionsBundle" groupKey="group.names.class.structure" enabledByDefault="true" + level="INFORMATION" implementationClass="com.siyeh.ig.classlayout.AnonymousInnerClassInspection"/> diff --git a/java/java-impl/src/com/siyeh/ig/classlayout/AnonymousInnerClassInspection.java b/java/java-impl/src/com/siyeh/ig/classlayout/AnonymousInnerClassInspection.java index 106e22b76961..a7ec18bd7fe9 100644 --- a/java/java-impl/src/com/siyeh/ig/classlayout/AnonymousInnerClassInspection.java +++ b/java/java-impl/src/com/siyeh/ig/classlayout/AnonymousInnerClassInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2023 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,7 @@ package com.siyeh.ig.classlayout; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.psi.PsiAnonymousClass; -import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiEnumConstantInitializer; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; @@ -35,8 +35,7 @@ public final class AnonymousInnerClassInspection extends BaseInspection { @Override @NotNull protected String buildErrorString(Object... infos) { - return InspectionGadgetsBundle.message( - "anonymous.inner.class.problem.descriptor"); + return InspectionGadgetsBundle.message("anonymous.inner.class.problem.descriptor"); } @Override @@ -49,13 +48,7 @@ public final class AnonymousInnerClassInspection extends BaseInspection { return new AnonymousInnerClassVisitor(); } - private static class AnonymousInnerClassVisitor - extends BaseInspectionVisitor { - - @Override - public void visitClass(@NotNull PsiClass aClass) { - //no call to super here, to avoid double counting - } + private static class AnonymousInnerClassVisitor extends BaseInspectionVisitor { @Override public void visitAnonymousClass(@NotNull PsiAnonymousClass aClass) { @@ -63,7 +56,16 @@ public final class AnonymousInnerClassInspection extends BaseInspection { if (aClass instanceof PsiEnumConstantInitializer) { return; } - registerClassError(aClass); + if (isVisibleHighlight(aClass)) { + registerClassError(aClass); + } + else { + final PsiElement lBrace = aClass.getLBrace(); + assert lBrace != null; + int length = aClass.getStartOffsetInParent() + lBrace.getStartOffsetInParent(); + PsiElement newExpression = aClass.getParent(); + registerErrorAtOffset(newExpression, 0, length); + } } } } \ No newline at end of file diff --git a/java/java-impl/src/com/siyeh/ig/fixes/MoveAnonymousToInnerClassFix.java b/java/java-impl/src/com/siyeh/ig/fixes/MoveAnonymousToInnerClassFix.java index 9aecfde83f78..9b7ceb5d65a3 100644 --- a/java/java-impl/src/com/siyeh/ig/fixes/MoveAnonymousToInnerClassFix.java +++ b/java/java-impl/src/com/siyeh/ig/fixes/MoveAnonymousToInnerClassFix.java @@ -16,8 +16,10 @@ package com.siyeh.ig.fixes; import com.intellij.codeInspection.util.IntentionFamilyName; +import com.intellij.psi.PsiAnonymousClass; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiNewExpression; import com.intellij.refactoring.JavaRefactoringActionHandlerFactory; import com.intellij.refactoring.RefactoringActionHandler; import com.siyeh.InspectionGadgetsBundle; @@ -49,6 +51,10 @@ public class MoveAnonymousToInnerClassFix extends RefactoringInspectionGadgetsFi @Override public PsiElement getElementToRefactor(PsiElement element) { + if (element instanceof PsiNewExpression newExpression) { + PsiAnonymousClass anonymousClass = newExpression.getAnonymousClass(); + if (anonymousClass != null) return anonymousClass; + } return element instanceof PsiClass ? element : element.getParent(); } }