diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/MissingDeprecatedAnnotationInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/MissingDeprecatedAnnotationInspection.java index f51cc34d2f..b503535b5a 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/MissingDeprecatedAnnotationInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/MissingDeprecatedAnnotationInspection.java @@ -26,117 +26,118 @@ import consulo.annotation.component.ExtensionImpl; import consulo.language.editor.inspection.ProblemDescriptor; import consulo.language.psi.PsiElement; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; @ExtensionImpl public class MissingDeprecatedAnnotationInspection extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.missingDeprecatedAnnotationDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.missingDeprecatedAnnotationProblemDescriptor().get(); - } - - @Override - public boolean runForWholeFile() { - return true; - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new MissingDeprecatedAnnotationFix(); - } - - private static class MissingDeprecatedAnnotationFix extends InspectionGadgetsFix { @Nonnull - public String getName() { - return InspectionGadgetsLocalize.missingDeprecatedAnnotationAddQuickfix().get(); + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.missingDeprecatedAnnotationDisplayName(); } @Override - public void doFix(Project project, ProblemDescriptor descriptor) { - final PsiElement identifier = descriptor.getPsiElement(); - final PsiModifierListOwner parent = (PsiModifierListOwner)identifier.getParent(); - if (parent == null) { - return; - } - final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); - final PsiAnnotation annotation = factory.createAnnotationFromText("@java.lang.Deprecated", parent); - final PsiModifierList modifierList = parent.getModifierList(); - if (modifierList == null) { - return; - } - modifierList.addAfter(annotation, null); + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.missingDeprecatedAnnotationProblemDescriptor().get(); } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new MissingDeprecatedAnnotationVisitor(); - } - - private static class MissingDeprecatedAnnotationVisitor extends BaseInspectionVisitor { @Override - public void visitClass(@Nonnull PsiClass aClass) { - super.visitClass(aClass); - if (!PsiUtil.isLanguageLevel5OrHigher(aClass)) { - return; - } - if (!hasDeprecatedComment(aClass) || hasDeprecatedAnnotation(aClass)) { - return; - } - registerClassError(aClass); + public boolean runForWholeFile() { + return true; } @Override - public void visitMethod(@Nonnull PsiMethod method) { - if (!PsiUtil.isLanguageLevel5OrHigher(method)) { - return; - } - if (method.getNameIdentifier() == null) { - return; - } - if (!hasDeprecatedComment(method) || hasDeprecatedAnnotation(method)) { - return; - } - registerMethodError(method); + protected InspectionGadgetsFix buildFix(Object... infos) { + return new MissingDeprecatedAnnotationFix(); } - @Override - public void visitField(@Nonnull PsiField field) { - if (!PsiUtil.isLanguageLevel5OrHigher(field)) { - return; - } - if (!hasDeprecatedComment(field) || hasDeprecatedAnnotation(field)) { - return; - } - registerFieldError(field); + private static class MissingDeprecatedAnnotationFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.missingDeprecatedAnnotationAddQuickfix(); + } + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) { + final PsiElement identifier = descriptor.getPsiElement(); + final PsiModifierListOwner parent = (PsiModifierListOwner) identifier.getParent(); + if (parent == null) { + return; + } + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); + final PsiAnnotation annotation = factory.createAnnotationFromText("@java.lang.Deprecated", parent); + final PsiModifierList modifierList = parent.getModifierList(); + if (modifierList == null) { + return; + } + modifierList.addAfter(annotation, null); + } } - private static boolean hasDeprecatedAnnotation(PsiModifierListOwner element) { - final PsiModifierList modifierList = element.getModifierList(); - if (modifierList == null) { - return false; - } - final PsiAnnotation annotation = modifierList.findAnnotation(CommonClassNames.JAVA_LANG_DEPRECATED); - return annotation != null; + @Override + public BaseInspectionVisitor buildVisitor() { + return new MissingDeprecatedAnnotationVisitor(); } - private static boolean hasDeprecatedComment(PsiDocCommentOwner element) { - final PsiDocComment comment = element.getDocComment(); - if (comment == null) { - return false; - } - final PsiDocTag deprecatedTag = comment.findTagByName("deprecated"); - return deprecatedTag != null; + private static class MissingDeprecatedAnnotationVisitor extends BaseInspectionVisitor { + + @Override + public void visitClass(@Nonnull PsiClass aClass) { + super.visitClass(aClass); + if (!PsiUtil.isLanguageLevel5OrHigher(aClass)) { + return; + } + if (!hasDeprecatedComment(aClass) || hasDeprecatedAnnotation(aClass)) { + return; + } + registerClassError(aClass); + } + + @Override + public void visitMethod(@Nonnull PsiMethod method) { + if (!PsiUtil.isLanguageLevel5OrHigher(method)) { + return; + } + if (method.getNameIdentifier() == null) { + return; + } + if (!hasDeprecatedComment(method) || hasDeprecatedAnnotation(method)) { + return; + } + registerMethodError(method); + } + + @Override + public void visitField(@Nonnull PsiField field) { + if (!PsiUtil.isLanguageLevel5OrHigher(field)) { + return; + } + if (!hasDeprecatedComment(field) || hasDeprecatedAnnotation(field)) { + return; + } + registerFieldError(field); + } + + private static boolean hasDeprecatedAnnotation(PsiModifierListOwner element) { + final PsiModifierList modifierList = element.getModifierList(); + if (modifierList == null) { + return false; + } + final PsiAnnotation annotation = modifierList.findAnnotation(CommonClassNames.JAVA_LANG_DEPRECATED); + return annotation != null; + } + + private static boolean hasDeprecatedComment(PsiDocCommentOwner element) { + final PsiDocComment comment = element.getDocComment(); + if (comment == null) { + return false; + } + final PsiDocTag deprecatedTag = comment.findTagByName("deprecated"); + return deprecatedTag != null; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/MissingOverrideAnnotationInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/MissingOverrideAnnotationInspection.java index 4b704c9b24..3ced5c0d11 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/MissingOverrideAnnotationInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/MissingOverrideAnnotationInspection.java @@ -29,9 +29,11 @@ import consulo.language.editor.inspection.ProblemDescriptor; import consulo.language.psi.PsiElement; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import consulo.util.collection.SmartList; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; import java.util.ArrayList; @@ -40,201 +42,207 @@ @ExtensionImpl public class MissingOverrideAnnotationInspection extends BaseInspection implements CleanupLocalInspectionTool { + @SuppressWarnings({"PublicField"}) + public boolean ignoreObjectMethods = false; + + @SuppressWarnings({"PublicField"}) + public boolean ignoreAnonymousClassMethods = false; + + @Override + public boolean isEnabledByDefault() { + return true; + } - @SuppressWarnings({"PublicField"}) - public boolean ignoreObjectMethods = false; - - @SuppressWarnings({"PublicField"}) - public boolean ignoreAnonymousClassMethods = false; - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - @Nonnull - public String getID() { - return "override"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.missingOverrideAnnotationDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.missingOverrideAnnotationProblemDescriptor().get(); - } - - @Override - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); - panel.addCheckbox(InspectionGadgetsLocalize.ignoreEqualsHashcodeAndTostring().get(), "ignoreObjectMethods"); - panel.addCheckbox(InspectionGadgetsLocalize.ignoreMethodsInAnonymousClasses().get(), "ignoreAnonymousClassMethods"); - return panel; - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new MissingOverrideAnnotationFix(); - } - - private static class MissingOverrideAnnotationFix extends InspectionGadgetsFix { @Nonnull - public String getName() { - return InspectionGadgetsLocalize.missingOverrideAnnotationAddQuickfix().get(); + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "override"; } + @Nonnull @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement identifier = descriptor.getPsiElement(); - final PsiElement parent = identifier.getParent(); - if (!(parent instanceof PsiModifierListOwner)) { - return; - } - final PsiModifierListOwner modifierListOwner = - (PsiModifierListOwner)parent; - final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); - final PsiElementFactory factory = psiFacade.getElementFactory(); - final PsiAnnotation annotation = - factory.createAnnotationFromText("@java.lang.Override", - modifierListOwner); - final PsiModifierList modifierList = - modifierListOwner.getModifierList(); - if (modifierList == null) { - return; - } - modifierList.addAfter(annotation, null); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.missingOverrideAnnotationDisplayName(); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new MissingOverrideAnnotationVisitor(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.missingOverrideAnnotationProblemDescriptor().get(); + } - private class MissingOverrideAnnotationVisitor - extends BaseInspectionVisitor { + @Override + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); + panel.addCheckbox(InspectionGadgetsLocalize.ignoreEqualsHashcodeAndTostring().get(), "ignoreObjectMethods"); + panel.addCheckbox(InspectionGadgetsLocalize.ignoreMethodsInAnonymousClasses().get(), "ignoreAnonymousClassMethods"); + return panel; + } @Override - public void visitMethod(@Nonnull PsiMethod method) { - if (!PsiUtil.isLanguageLevel5OrHigher(method)) { - return; - } - if (method.getNameIdentifier() == null) { - return; - } - if (method.isConstructor()) { - return; - } - if (method.hasModifierProperty(PsiModifier.PRIVATE) || - method.hasModifierProperty(PsiModifier.STATIC)) { - return; - } - final PsiClass methodClass = method.getContainingClass(); - if (methodClass == null) { - return; - } - if (ignoreAnonymousClassMethods && - methodClass instanceof PsiAnonymousClass) { - return; - } - final boolean useJdk6Rules = - PsiUtil.isLanguageLevel6OrHigher(method); - if (useJdk6Rules) { - if (!isJdk6Override(method, methodClass)) { - return; + protected InspectionGadgetsFix buildFix(Object... infos) { + return new MissingOverrideAnnotationFix(); + } + + private static class MissingOverrideAnnotationFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.missingOverrideAnnotationAddQuickfix(); + } + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement identifier = descriptor.getPsiElement(); + final PsiElement parent = identifier.getParent(); + if (!(parent instanceof PsiModifierListOwner)) { + return; + } + final PsiModifierListOwner modifierListOwner = + (PsiModifierListOwner) parent; + final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); + final PsiElementFactory factory = psiFacade.getElementFactory(); + final PsiAnnotation annotation = + factory.createAnnotationFromText( + "@java.lang.Override", + modifierListOwner + ); + final PsiModifierList modifierList = + modifierListOwner.getModifierList(); + if (modifierList == null) { + return; + } + modifierList.addAfter(annotation, null); } - } - else if (!isJdk5Override(method, methodClass)) { - return; - } - if (ignoreObjectMethods && (MethodUtils.isHashCode(method) || - MethodUtils.isEquals(method) || - MethodUtils.isToString(method))) { - return; - } - if (hasOverrideAnnotation(method)) { - return; - } - registerMethodError(method); } - private boolean hasOverrideAnnotation( - PsiModifierListOwner element) { - final PsiModifierList modifierList = element.getModifierList(); - if (modifierList == null) { - return false; - } - final PsiAnnotation annotation = modifierList.findAnnotation(CommonClassNames.JAVA_LANG_OVERRIDE); - return annotation != null; + @Override + public BaseInspectionVisitor buildVisitor() { + return new MissingOverrideAnnotationVisitor(); } - private boolean isJdk6Override(PsiMethod method, PsiClass methodClass) { - final PsiMethod[] superMethods = - getSuperMethodsInJavaSense(method, methodClass); - if (superMethods.length <= 0) { - return false; - } - // is override except if this is an interface method - // overriding a protected method in java.lang.Object - // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6501053 - if (!methodClass.isInterface()) { - return true; - } - for (PsiMethod superMethod : superMethods) { - if (!superMethod.hasModifierProperty(PsiModifier.PROTECTED)) { - return true; + private class MissingOverrideAnnotationVisitor + extends BaseInspectionVisitor { + + @Override + public void visitMethod(@Nonnull PsiMethod method) { + if (!PsiUtil.isLanguageLevel5OrHigher(method)) { + return; + } + if (method.getNameIdentifier() == null) { + return; + } + if (method.isConstructor()) { + return; + } + if (method.hasModifierProperty(PsiModifier.PRIVATE) || + method.hasModifierProperty(PsiModifier.STATIC)) { + return; + } + final PsiClass methodClass = method.getContainingClass(); + if (methodClass == null) { + return; + } + if (ignoreAnonymousClassMethods && + methodClass instanceof PsiAnonymousClass) { + return; + } + final boolean useJdk6Rules = + PsiUtil.isLanguageLevel6OrHigher(method); + if (useJdk6Rules) { + if (!isJdk6Override(method, methodClass)) { + return; + } + } + else if (!isJdk5Override(method, methodClass)) { + return; + } + if (ignoreObjectMethods && (MethodUtils.isHashCode(method) || + MethodUtils.isEquals(method) || + MethodUtils.isToString(method))) { + return; + } + if (hasOverrideAnnotation(method)) { + return; + } + registerMethodError(method); } - } - return false; - } - private boolean isJdk5Override(PsiMethod method, PsiClass methodClass) { - final PsiMethod[] superMethods = - getSuperMethodsInJavaSense(method, methodClass); - for (PsiMethod superMethod : superMethods) { - final PsiClass superClass = superMethod.getContainingClass(); - if (superClass == null) { - continue; + private boolean hasOverrideAnnotation( + PsiModifierListOwner element + ) { + final PsiModifierList modifierList = element.getModifierList(); + if (modifierList == null) { + return false; + } + final PsiAnnotation annotation = modifierList.findAnnotation(CommonClassNames.JAVA_LANG_OVERRIDE); + return annotation != null; } - if (superClass.isInterface()) { - continue; + + private boolean isJdk6Override(PsiMethod method, PsiClass methodClass) { + final PsiMethod[] superMethods = + getSuperMethodsInJavaSense(method, methodClass); + if (superMethods.length <= 0) { + return false; + } + // is override except if this is an interface method + // overriding a protected method in java.lang.Object + // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6501053 + if (!methodClass.isInterface()) { + return true; + } + for (PsiMethod superMethod : superMethods) { + if (!superMethod.hasModifierProperty(PsiModifier.PROTECTED)) { + return true; + } + } + return false; } - if (methodClass.isInterface() && - superMethod.hasModifierProperty(PsiModifier.PROTECTED)) { - // only true for J2SE java.lang.Object.clone(), but might - // be different on other/newer java platforms - continue; + + private boolean isJdk5Override(PsiMethod method, PsiClass methodClass) { + final PsiMethod[] superMethods = + getSuperMethodsInJavaSense(method, methodClass); + for (PsiMethod superMethod : superMethods) { + final PsiClass superClass = superMethod.getContainingClass(); + if (superClass == null) { + continue; + } + if (superClass.isInterface()) { + continue; + } + if (methodClass.isInterface() && + superMethod.hasModifierProperty(PsiModifier.PROTECTED)) { + // only true for J2SE java.lang.Object.clone(), but might + // be different on other/newer java platforms + continue; + } + return true; + } + return false; } - return true; - } - return false; - } - private PsiMethod[] getSuperMethodsInJavaSense( - @Nonnull PsiMethod method, @Nonnull PsiClass methodClass) { - final PsiMethod[] superMethods = method.findSuperMethods(); - final List toExclude = new SmartList(); - for (PsiMethod superMethod : superMethods) { - final PsiClass superClass = superMethod.getContainingClass(); - if (!InheritanceUtil.isInheritorOrSelf(methodClass, superClass, - true)) { - toExclude.add(superMethod); + private PsiMethod[] getSuperMethodsInJavaSense( + @Nonnull PsiMethod method, @Nonnull PsiClass methodClass + ) { + final PsiMethod[] superMethods = method.findSuperMethods(); + final List toExclude = new SmartList(); + for (PsiMethod superMethod : superMethods) { + final PsiClass superClass = superMethod.getContainingClass(); + if (!InheritanceUtil.isInheritorOrSelf(methodClass, superClass, + true + )) { + toExclude.add(superMethod); + } + } + if (!toExclude.isEmpty()) { + final List result = + new ArrayList(Arrays.asList(superMethods)); + result.removeAll(toExclude); + return result.toArray(new PsiMethod[result.size()]); + } + return superMethods; } - } - if (!toExclude.isEmpty()) { - final List result = - new ArrayList(Arrays.asList(superMethods)); - result.removeAll(toExclude); - return result.toArray(new PsiMethod[result.size()]); - } - return superMethods; } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/MultipleTopLevelClassesInFileInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/MultipleTopLevelClassesInFileInspection.java index b54a7e185b..a64840e765 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/MultipleTopLevelClassesInFileInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/MultipleTopLevelClassesInFileInspection.java @@ -24,57 +24,58 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.PsiElement; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class MultipleTopLevelClassesInFileInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.multipleTopLevelClassesInFileDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.multipleTopLevelClassesInFileDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.multipleTopLevelClassesInFileProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.multipleTopLevelClassesInFileProblemDescriptor().get(); + } - protected InspectionGadgetsFix buildFix(Object... infos) { - return new MoveClassFix(); - } + protected InspectionGadgetsFix buildFix(Object... infos) { + return new MoveClassFix(); + } - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } - public BaseInspectionVisitor buildVisitor() { - return new MultipleTopLevelClassesInFileVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new MultipleTopLevelClassesInFileVisitor(); + } - private static class MultipleTopLevelClassesInFileVisitor - extends BaseInspectionVisitor { + private static class MultipleTopLevelClassesInFileVisitor + extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - // no call to super, so that it doesn't drill down to inner classes - if (!(aClass.getParent() instanceof PsiJavaFile)) { - return; - } - final PsiJavaFile file = (PsiJavaFile)aClass.getParent(); - if (file == null) { - return; - } - int numClasses = 0; - final PsiElement[] children = file.getChildren(); - for (final PsiElement child : children) { - if (child instanceof PsiClass) { - numClasses++; + @Override + public void visitClass(@Nonnull PsiClass aClass) { + // no call to super, so that it doesn't drill down to inner classes + if (!(aClass.getParent() instanceof PsiJavaFile)) { + return; + } + final PsiJavaFile file = (PsiJavaFile) aClass.getParent(); + if (file == null) { + return; + } + int numClasses = 0; + final PsiElement[] children = file.getChildren(); + for (final PsiElement child : children) { + if (child instanceof PsiClass) { + numClasses++; + } + } + if (numClasses <= 1) { + return; + } + registerClassError(aClass); } - } - if (numClasses <= 1) { - return; - } - registerClassError(aClass); } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/NonFinalFieldInEnumInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/NonFinalFieldInEnumInspection.java index a162affb16..458380e9e2 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/NonFinalFieldInEnumInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/NonFinalFieldInEnumInspection.java @@ -25,55 +25,53 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.access.RequiredReadAction; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; -import org.jetbrains.annotations.Nls; /** * @author Bas Leijdekkers */ @ExtensionImpl public class NonFinalFieldInEnumInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nonFinalFieldInEnumDisplayName(); + } - @Nls - @Nonnull - @Override - public String getDisplayName() { - return InspectionGadgetsLocalize.nonFinalFieldInEnumDisplayName().get(); - } - - @Nonnull - @Override - @RequiredReadAction - protected String buildErrorString(Object... infos) { - final PsiClass enumClass = (PsiClass)infos[0]; - return InspectionGadgetsLocalize.nonFinalFieldInEnumProblemDescriptor(enumClass.getName()).get(); - } + @Nonnull + @Override + @RequiredReadAction + protected String buildErrorString(Object... infos) { + final PsiClass enumClass = (PsiClass) infos[0]; + return InspectionGadgetsLocalize.nonFinalFieldInEnumProblemDescriptor(enumClass.getName()).get(); + } - @Nullable - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiField field = (PsiField)infos[1]; - return MakeFieldFinalFix.buildFix(field); - } + @Nullable + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiField field = (PsiField) infos[1]; + return MakeFieldFinalFix.buildFix(field); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new NonFinalFieldInEnumVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new NonFinalFieldInEnumVisitor(); + } - private static class NonFinalFieldInEnumVisitor extends BaseInspectionVisitor { + private static class NonFinalFieldInEnumVisitor extends BaseInspectionVisitor { - @Override - public void visitField(PsiField field) { - super.visitField(field); - final PsiClass containingClass = field.getContainingClass(); - if (containingClass == null || !containingClass.isEnum()) { - return; - } - if (field.hasModifierProperty(PsiModifier.FINAL)) { - return; - } - registerFieldError(field, containingClass, field); + @Override + public void visitField(PsiField field) { + super.visitField(field); + final PsiClass containingClass = field.getContainingClass(); + if (containingClass == null || !containingClass.isEnum()) { + return; + } + if (field.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + registerFieldError(field, containingClass, field); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/NonFinalUtilityClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/NonFinalUtilityClassInspection.java index 7b29f451da..0fa239b48e 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/NonFinalUtilityClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/NonFinalUtilityClassInspection.java @@ -24,53 +24,51 @@ import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; -import org.jetbrains.annotations.Nls; /** * @author Bas Leijdekkers */ @ExtensionImpl public class NonFinalUtilityClassInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nonFinalUtilityClassDisplayName(); + } - @Nls - @Nonnull - @Override - public String getDisplayName() { - return InspectionGadgetsLocalize.nonFinalUtilityClassDisplayName().get(); - } - - @Nonnull - @Override - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.nonFinalUtilityClassProblemDescriptor().get(); - } + @Nonnull + @Override + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.nonFinalUtilityClassProblemDescriptor().get(); + } - @Nullable - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new MakeClassFinalFix((PsiClass)infos[0]); - } + @Nullable + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new MakeClassFinalFix((PsiClass) infos[0]); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new NonFinalUtilityClassVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new NonFinalUtilityClassVisitor(); + } - private static class NonFinalUtilityClassVisitor extends BaseInspectionVisitor { + private static class NonFinalUtilityClassVisitor extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - // no call to super, so that it doesn't drill down to inner classes - if (!UtilityClassUtil.isUtilityClass(aClass)) { - return; - } - if (aClass.hasModifierProperty(PsiModifier.FINAL) || - aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { - return; - } - registerClassError(aClass, aClass); + @Override + public void visitClass(@Nonnull PsiClass aClass) { + // no call to super, so that it doesn't drill down to inner classes + if (!UtilityClassUtil.isUtilityClass(aClass)) { + return; + } + if (aClass.hasModifierProperty(PsiModifier.FINAL) || + aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + return; + } + registerClassError(aClass, aClass); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/NoopMethodInAbstractClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/NoopMethodInAbstractClassInspection.java index 513e0d55f6..7f9720b8a7 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/NoopMethodInAbstractClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/NoopMethodInAbstractClassInspection.java @@ -23,49 +23,50 @@ import com.siyeh.ig.psiutils.MethodUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class NoopMethodInAbstractClassInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.noopMethodInAbstractClassDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.noopMethodInAbstractClassDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.noopMethodInAbstractClassProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.noopMethodInAbstractClassProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new NoopMethodInAbstractClassVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new NoopMethodInAbstractClassVisitor(); + } - private static class NoopMethodInAbstractClassVisitor extends BaseInspectionVisitor { + private static class NoopMethodInAbstractClassVisitor extends BaseInspectionVisitor { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - if (method.isConstructor()) { - return; - } - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null) { - return; - } - if (containingClass.isInterface() || containingClass.isAnnotationType()) { - return; - } - if (!containingClass.hasModifierProperty(PsiModifier.ABSTRACT)) { - return; - } - if (method.hasModifierProperty(PsiModifier.ABSTRACT) || method.hasModifierProperty(PsiModifier.NATIVE)) { - return; - } - if (!MethodUtils.isEmpty(method)) { - return; - } - registerMethodError(method); + @Override + public void visitMethod(@Nonnull PsiMethod method) { + if (method.isConstructor()) { + return; + } + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) { + return; + } + if (containingClass.isInterface() || containingClass.isAnnotationType()) { + return; + } + if (!containingClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + return; + } + if (method.hasModifierProperty(PsiModifier.ABSTRACT) || method.hasModifierProperty(PsiModifier.NATIVE)) { + return; + } + if (!MethodUtils.isEmpty(method)) { + return; + } + registerMethodError(method); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ProtectedMemberInFinalClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ProtectedMemberInFinalClassInspection.java index 9be22a9801..d038dbd53b 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ProtectedMemberInFinalClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ProtectedMemberInFinalClassInspection.java @@ -42,172 +42,173 @@ import consulo.language.psi.search.ReferencesSearch; import consulo.language.psi.util.PsiTreeUtil; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import consulo.util.collection.MultiMap; import jakarta.annotation.Nonnull; @ExtensionImpl public class ProtectedMemberInFinalClassInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.protectedMemberInFinalClassDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.protectedMemberInFinalClassDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.protectedMemberInFinalClassProblemDescriptor().get(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new RemoveModifierFix((String)infos[0]); - } - - @Nonnull - @Override - protected InspectionGadgetsFix[] buildFixes(Object... infos) { - return new InspectionGadgetsFix[] { - new RemoveModifierFix((String)infos[0]), - new MakePrivateFix() - }; - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.protectedMemberInFinalClassProblemDescriptor().get(); + } - private static class MakePrivateFix extends InspectionGadgetsFix { + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + return new RemoveModifierFix((String) infos[0]); + } @Nonnull - public String getName() { - return InspectionGadgetsLocalize.makePrivateQuickfix().get(); + @Override + protected InspectionGadgetsFix[] buildFixes(Object... infos) { + return new InspectionGadgetsFix[]{ + new RemoveModifierFix((String) infos[0]), + new MakePrivateFix() + }; } - @Override - public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiElement parent = element.getParent(); - final PsiElement grandParent = parent.getParent(); - if (!(grandParent instanceof PsiMember)) { - return; - } - final PsiMember member = (PsiMember)grandParent; - final PsiModifierList modifierList = member.getModifierList(); - if (modifierList == null) { - return; - } - final MultiMap conflicts = new MultiMap(); - if (member instanceof PsiMethod) { - final PsiMethod method = (PsiMethod)member; - SuperMethodsSearch.search(method, method.getContainingClass(), true, false).forEach( - new Processor() { - @Override - public boolean process(MethodSignatureBackedByPsiMethod methodSignature) { - final PsiMethod superMethod = methodSignature.getMethod(); - conflicts.putValue( - superMethod, - InspectionGadgetsLocalize.zeroWillHaveIncompatibleAccessPrivilegesWithSuper1( - RefactoringUIUtil.getDescription(method, false), - RefactoringUIUtil.getDescription(superMethod, true) - ).get() - ); - return true; - } - }); - OverridingMethodsSearch.search(method).forEach(new Processor() { - @Override - public boolean process(PsiMethod overridingMethod) { - conflicts.putValue( - overridingMethod, - InspectionGadgetsLocalize.zeroWillNoLongerBeVisibleFromOverriding1( - RefactoringUIUtil.getDescription(method, false), - RefactoringUIUtil.getDescription(overridingMethod, true) - ).get() - ); - return false; + private static class MakePrivateFix extends InspectionGadgetsFix { + @Nonnull + public LocalizeValue getName() { + return InspectionGadgetsLocalize.makePrivateQuickfix(); } - }); - } - final PsiModifierList modifierListCopy = (PsiModifierList)modifierList.copy(); - modifierListCopy.setModifierProperty(PsiModifier.PRIVATE, true); - final Query search = ReferencesSearch.search(member, member.getResolveScope()); - search.forEach(new Processor() { + @Override - public boolean process(PsiReference reference) { - final PsiElement element = reference.getElement(); - if (!JavaResolveUtil.isAccessible(member, member.getContainingClass(), modifierListCopy, element, null, null)) { - final PsiElement context = - PsiTreeUtil.getParentOfType(element, PsiMethod.class, PsiField.class, PsiClass.class, PsiFile.class); - conflicts.putValue( - element, - RefactoringLocalize.zeroWith1VisibilityIsNotAccessibleFrom2(RefactoringUIUtil.getDescription(member, false), - PsiBundle.visibilityPresentation(PsiModifier.PRIVATE), - RefactoringUIUtil.getDescription(context, true) - ).get() - ); - } - return true; - } - }); - final boolean conflictsDialogOK; - if (conflicts.isEmpty()) { - conflictsDialogOK = true; - } else { - if (!isOnTheFly()) { - return; - } - final ConflictsDialog conflictsDialog = new ConflictsDialog(member.getProject(), conflicts, new Runnable() { - @Override - public void run() { - final AccessToken token = WriteAction.start(); - try { - modifierList.setModifierProperty(PsiModifier.PRIVATE, true); + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiElement parent = element.getParent(); + final PsiElement grandParent = parent.getParent(); + if (!(grandParent instanceof PsiMember)) { + return; + } + final PsiMember member = (PsiMember) grandParent; + final PsiModifierList modifierList = member.getModifierList(); + if (modifierList == null) { + return; } - finally { - token.finish(); + final MultiMap conflicts = new MultiMap(); + if (member instanceof PsiMethod) { + final PsiMethod method = (PsiMethod) member; + SuperMethodsSearch.search(method, method.getContainingClass(), true, false).forEach( + new Processor() { + @Override + public boolean process(MethodSignatureBackedByPsiMethod methodSignature) { + final PsiMethod superMethod = methodSignature.getMethod(); + conflicts.putValue( + superMethod, + InspectionGadgetsLocalize.zeroWillHaveIncompatibleAccessPrivilegesWithSuper1( + RefactoringUIUtil.getDescription(method, false), + RefactoringUIUtil.getDescription(superMethod, true) + ).get() + ); + return true; + } + }); + OverridingMethodsSearch.search(method).forEach(new Processor() { + @Override + public boolean process(PsiMethod overridingMethod) { + conflicts.putValue( + overridingMethod, + InspectionGadgetsLocalize.zeroWillNoLongerBeVisibleFromOverriding1( + RefactoringUIUtil.getDescription(method, false), + RefactoringUIUtil.getDescription(overridingMethod, true) + ).get() + ); + return false; + } + }); } - } - }); - conflictsDialog.show(); - conflictsDialogOK = conflictsDialog.isOK(); - } - if (conflictsDialogOK) { - modifierList.setModifierProperty(PsiModifier.PRIVATE, true); - } + final PsiModifierList modifierListCopy = (PsiModifierList) modifierList.copy(); + modifierListCopy.setModifierProperty(PsiModifier.PRIVATE, true); + final Query search = ReferencesSearch.search(member, member.getResolveScope()); + search.forEach(new Processor() { + @Override + public boolean process(PsiReference reference) { + final PsiElement element = reference.getElement(); + if (!JavaResolveUtil.isAccessible(member, member.getContainingClass(), modifierListCopy, element, null, null)) { + final PsiElement context = + PsiTreeUtil.getParentOfType(element, PsiMethod.class, PsiField.class, PsiClass.class, PsiFile.class); + conflicts.putValue( + element, + RefactoringLocalize.zeroWith1VisibilityIsNotAccessibleFrom2( + RefactoringUIUtil.getDescription(member, false), + PsiBundle.visibilityPresentation(PsiModifier.PRIVATE), + RefactoringUIUtil.getDescription(context, true) + ).get() + ); + } + return true; + } + }); + final boolean conflictsDialogOK; + if (conflicts.isEmpty()) { + conflictsDialogOK = true; + } + else { + if (!isOnTheFly()) { + return; + } + final ConflictsDialog conflictsDialog = new ConflictsDialog(member.getProject(), conflicts, new Runnable() { + @Override + public void run() { + final AccessToken token = WriteAction.start(); + try { + modifierList.setModifierProperty(PsiModifier.PRIVATE, true); + } + finally { + token.finish(); + } + } + }); + conflictsDialog.show(); + conflictsDialogOK = conflictsDialog.isOK(); + } + if (conflictsDialogOK) { + modifierList.setModifierProperty(PsiModifier.PRIVATE, true); + } + } } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ProtectedMemberInFinalClassVisitor(); - } - - private static class ProtectedMemberInFinalClassVisitor extends BaseInspectionVisitor { @Override - public void visitMethod(@Nonnull PsiMethod method) { - if (!method.hasModifierProperty(PsiModifier.PROTECTED)) { - return; - } - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null || !containingClass.hasModifierProperty(PsiModifier.FINAL)) { - return; - } - if (MethodUtils.hasSuper(method)) { - return; - } - registerModifierError(PsiModifier.PROTECTED, method, PsiModifier.PROTECTED); + public BaseInspectionVisitor buildVisitor() { + return new ProtectedMemberInFinalClassVisitor(); } - @Override - public void visitField(@Nonnull PsiField field) { - if (!field.hasModifierProperty(PsiModifier.PROTECTED)) { - return; - } - final PsiClass containingClass = field.getContainingClass(); - if (containingClass == null || !containingClass.hasModifierProperty(PsiModifier.FINAL)) { - return; - } - registerModifierError(PsiModifier.PROTECTED, field, PsiModifier.PROTECTED); + private static class ProtectedMemberInFinalClassVisitor extends BaseInspectionVisitor { + + @Override + public void visitMethod(@Nonnull PsiMethod method) { + if (!method.hasModifierProperty(PsiModifier.PROTECTED)) { + return; + } + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null || !containingClass.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + if (MethodUtils.hasSuper(method)) { + return; + } + registerModifierError(PsiModifier.PROTECTED, method, PsiModifier.PROTECTED); + } + + @Override + public void visitField(@Nonnull PsiField field) { + if (!field.hasModifierProperty(PsiModifier.PROTECTED)) { + return; + } + final PsiClass containingClass = field.getContainingClass(); + if (containingClass == null || !containingClass.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + registerModifierError(PsiModifier.PROTECTED, field, PsiModifier.PROTECTED); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/PublicConstructorInNonPublicClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/PublicConstructorInNonPublicClassInspection.java index 6c610ca8e6..0c0ddafda3 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/PublicConstructorInNonPublicClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/PublicConstructorInNonPublicClassInspection.java @@ -26,6 +26,7 @@ import consulo.language.editor.inspection.ProblemDescriptor; import consulo.language.psi.PsiElement; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; @@ -34,81 +35,82 @@ @ExtensionImpl public class PublicConstructorInNonPublicClassInspection extends BaseInspection { - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.publicConstructorInNonPublicClassDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - final PsiMethod method = (PsiMethod)infos[0]; - return InspectionGadgetsLocalize.publicConstructorInNonPublicClassProblemDescriptor(method.getName()).get(); - } - - public BaseInspectionVisitor buildVisitor() { - return new PublicConstructorInNonPublicClassVisitor(); - } - - @Nonnull - public InspectionGadgetsFix[] buildFixes(Object... infos) { - final List fixes = new ArrayList<>(); - final PsiMethod constructor = (PsiMethod)infos[0]; - final PsiClass aClass = constructor.getContainingClass(); - if (aClass != null && aClass.hasModifierProperty(PsiModifier.PRIVATE)) { - fixes.add(new SetConstructorModifierFix(PsiModifier.PRIVATE)); + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.publicConstructorInNonPublicClassDisplayName(); } - fixes.add(new RemoveModifierFix(PsiModifier.PUBLIC)); - return fixes.toArray(new InspectionGadgetsFix[fixes.size()]); - } - - private static class SetConstructorModifierFix extends InspectionGadgetsFix { - @PsiModifier.ModifierConstant private final String modifier; + @Nonnull + public String buildErrorString(Object... infos) { + final PsiMethod method = (PsiMethod) infos[0]; + return InspectionGadgetsLocalize.publicConstructorInNonPublicClassProblemDescriptor(method.getName()).get(); + } - SetConstructorModifierFix(@PsiModifier.ModifierConstant String modifier) { - this.modifier = modifier; + public BaseInspectionVisitor buildVisitor() { + return new PublicConstructorInNonPublicClassVisitor(); } @Nonnull - public String getName() { - return InspectionGadgetsLocalize.publicConstructorInNonPublicClassQuickfix(modifier).get(); + public InspectionGadgetsFix[] buildFixes(Object... infos) { + final List fixes = new ArrayList<>(); + final PsiMethod constructor = (PsiMethod) infos[0]; + final PsiClass aClass = constructor.getContainingClass(); + if (aClass != null && aClass.hasModifierProperty(PsiModifier.PRIVATE)) { + fixes.add(new SetConstructorModifierFix(PsiModifier.PRIVATE)); + } + fixes.add(new RemoveModifierFix(PsiModifier.PUBLIC)); + return fixes.toArray(new InspectionGadgetsFix[fixes.size()]); } - protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiModifierList modifierList = (PsiModifierList)element.getParent(); - modifierList.setModifierProperty(PsiModifier.PUBLIC, false); - modifierList.setModifierProperty(modifier, true); + private static class SetConstructorModifierFix extends InspectionGadgetsFix { + @PsiModifier.ModifierConstant + private final String modifier; + + SetConstructorModifierFix(@PsiModifier.ModifierConstant String modifier) { + this.modifier = modifier; + } + + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.publicConstructorInNonPublicClassQuickfix(modifier); + } + + protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiModifierList modifierList = (PsiModifierList) element.getParent(); + modifierList.setModifierProperty(PsiModifier.PUBLIC, false); + modifierList.setModifierProperty(modifier, true); + } } - } - private static class PublicConstructorInNonPublicClassVisitor extends BaseInspectionVisitor { + private static class PublicConstructorInNonPublicClassVisitor extends BaseInspectionVisitor { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - //no call to super, so we don't drill into anonymous classes - if (!method.isConstructor()) { - return; - } - if (!method.hasModifierProperty(PsiModifier.PUBLIC)) { - return; - } - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null) { - return; - } - if (containingClass.hasModifierProperty(PsiModifier.PUBLIC) || - containingClass.hasModifierProperty(PsiModifier.PROTECTED)) { - return; - } - if (SerializationUtils.isExternalizable(containingClass)) { - final PsiParameterList parameterList = method.getParameterList(); - if (parameterList.getParametersCount() == 0) { - return; + @Override + public void visitMethod(@Nonnull PsiMethod method) { + //no call to super, so we don't drill into anonymous classes + if (!method.isConstructor()) { + return; + } + if (!method.hasModifierProperty(PsiModifier.PUBLIC)) { + return; + } + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) { + return; + } + if (containingClass.hasModifierProperty(PsiModifier.PUBLIC) || + containingClass.hasModifierProperty(PsiModifier.PROTECTED)) { + return; + } + if (SerializationUtils.isExternalizable(containingClass)) { + final PsiParameterList parameterList = method.getParameterList(); + if (parameterList.getParametersCount() == 0) { + return; + } + } + registerModifierError(PsiModifier.PUBLIC, method, method); } - } - registerModifierError(PsiModifier.PUBLIC, method, method); } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/PublicConstructorInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/PublicConstructorInspection.java index 005085c90a..33d5529f83 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/PublicConstructorInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/PublicConstructorInspection.java @@ -13,155 +13,127 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.intellij.java.impl.ig.classlayout; -import com.siyeh.localize.InspectionGadgetsLocalize; -import jakarta.annotation.Nonnull; - -import consulo.annotation.component.ExtensionImpl; -import jakarta.annotation.Nullable; -import org.jetbrains.annotations.Nls; - -import consulo.language.editor.inspection.ProblemDescriptor; -import consulo.dataContext.DataManager; -import consulo.dataContext.DataContext; -import consulo.project.Project; -import consulo.util.concurrent.AsyncResult; +import com.intellij.java.analysis.refactoring.JavaRefactoringActionHandlerFactory; +import com.intellij.java.impl.ig.psiutils.SerializationUtils; import com.intellij.java.language.psi.PsiClass; -import consulo.language.psi.PsiElement; import com.intellij.java.language.psi.PsiMethod; import com.intellij.java.language.psi.PsiModifier; import com.intellij.java.language.psi.PsiParameterList; -import consulo.language.psi.util.PsiTreeUtil; -import com.intellij.java.analysis.refactoring.JavaRefactoringActionHandlerFactory; -import consulo.language.editor.refactoring.action.RefactoringActionHandler; -import consulo.language.util.IncorrectOperationException; -import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; -import com.intellij.java.impl.ig.psiutils.SerializationUtils; +import com.siyeh.localize.InspectionGadgetsLocalize; +import consulo.annotation.component.ExtensionImpl; +import consulo.dataContext.DataContext; +import consulo.dataContext.DataManager; +import consulo.language.editor.inspection.ProblemDescriptor; +import consulo.language.editor.refactoring.action.RefactoringActionHandler; +import consulo.language.psi.PsiElement; +import consulo.language.psi.util.PsiTreeUtil; +import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; +import consulo.project.Project; +import consulo.util.concurrent.AsyncResult; +import jakarta.annotation.Nonnull; +import jakarta.annotation.Nullable; /** * @author Bas Leijdekkers */ @ExtensionImpl -public class PublicConstructorInspection extends BaseInspection -{ - - @Nls - @Nonnull - @Override - public String getDisplayName() - { - return InspectionGadgetsLocalize.publicConstructorDisplayName().get(); - } - - @Nonnull - @Override - protected String buildErrorString(Object... infos) - { - return (Boolean)infos[0] - ? InspectionGadgetsLocalize.publicDefaultConstructorProblemDescriptor().get() - : InspectionGadgetsLocalize.publicConstructorProblemDescriptor().get(); - } - - @Override - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() - { - return true; - } - - @Nullable - @Override - protected InspectionGadgetsFix buildFix(Object... infos) - { - return new ReplaceConstructorWithFactoryMethodFix(); - } - - private class ReplaceConstructorWithFactoryMethodFix extends InspectionGadgetsFix - { - - @Nonnull - @Override - public String getName() - { - return InspectionGadgetsLocalize.publicConstructorQuickfix().get(); - } - - @Override - protected void doFix(final Project project, ProblemDescriptor descriptor) throws IncorrectOperationException - { - final PsiElement element = PsiTreeUtil.getParentOfType(descriptor.getPsiElement(), PsiClass.class, PsiMethod.class); - final AsyncResult context = DataManager.getInstance().getDataContextFromFocus(); - context.doWhenDone(dataContext -> { - final JavaRefactoringActionHandlerFactory factory = JavaRefactoringActionHandlerFactory.getInstance(); - final RefactoringActionHandler handler = factory.createReplaceConstructorWithFactoryHandler(); - handler.invoke(project, new PsiElement[]{element}, dataContext); - }); - } - } - - @Override - public BaseInspectionVisitor buildVisitor() - { - return new PublicConstructorVisitor(); - } - - private static class PublicConstructorVisitor extends BaseInspectionVisitor - { - - @Override - public void visitMethod(PsiMethod method) - { - super.visitMethod(method); - if(!method.isConstructor()) - { - return; - } - if(!method.hasModifierProperty(PsiModifier.PUBLIC)) - { - return; - } - final PsiClass aClass = method.getContainingClass(); - if(aClass == null || aClass.hasModifierProperty(PsiModifier.ABSTRACT)) - { - return; - } - if(SerializationUtils.isExternalizable(aClass)) - { - final PsiParameterList parameterList = method.getParameterList(); - if(parameterList.getParametersCount() == 0) - { - return; - } - } - registerMethodError(method, Boolean.FALSE); - } - - @Override - public void visitClass(PsiClass aClass) - { - super.visitClass(aClass); - if(aClass.isInterface() || aClass.isEnum()) - { - return; - } - if(!aClass.hasModifierProperty(PsiModifier.PUBLIC) || aClass.hasModifierProperty(PsiModifier.ABSTRACT)) - { - return; - } - final PsiMethod[] constructors = aClass.getConstructors(); - if(constructors.length > 0) - { - return; - } - if(SerializationUtils.isExternalizable(aClass)) - { - return; - } - registerClassError(aClass, Boolean.TRUE); - } - } +public class PublicConstructorInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.publicConstructorDisplayName(); + } + + @Nonnull + @Override + protected String buildErrorString(Object... infos) { + return (Boolean) infos[0] + ? InspectionGadgetsLocalize.publicDefaultConstructorProblemDescriptor().get() + : InspectionGadgetsLocalize.publicConstructorProblemDescriptor().get(); + } + + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } + + @Nullable + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new ReplaceConstructorWithFactoryMethodFix(); + } + + private class ReplaceConstructorWithFactoryMethodFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.publicConstructorQuickfix(); + } + + @Override + protected void doFix(final Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement element = PsiTreeUtil.getParentOfType(descriptor.getPsiElement(), PsiClass.class, PsiMethod.class); + final AsyncResult context = DataManager.getInstance().getDataContextFromFocus(); + context.doWhenDone(dataContext -> { + final JavaRefactoringActionHandlerFactory factory = JavaRefactoringActionHandlerFactory.getInstance(); + final RefactoringActionHandler handler = factory.createReplaceConstructorWithFactoryHandler(); + handler.invoke(project, new PsiElement[]{element}, dataContext); + }); + } + } + + @Override + public BaseInspectionVisitor buildVisitor() { + return new PublicConstructorVisitor(); + } + + private static class PublicConstructorVisitor extends BaseInspectionVisitor { + + @Override + public void visitMethod(PsiMethod method) { + super.visitMethod(method); + if (!method.isConstructor()) { + return; + } + if (!method.hasModifierProperty(PsiModifier.PUBLIC)) { + return; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null || aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + return; + } + if (SerializationUtils.isExternalizable(aClass)) { + final PsiParameterList parameterList = method.getParameterList(); + if (parameterList.getParametersCount() == 0) { + return; + } + } + registerMethodError(method, Boolean.FALSE); + } + + @Override + public void visitClass(PsiClass aClass) { + super.visitClass(aClass); + if (aClass.isInterface() || aClass.isEnum()) { + return; + } + if (!aClass.hasModifierProperty(PsiModifier.PUBLIC) || aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + return; + } + final PsiMethod[] constructors = aClass.getConstructors(); + if (constructors.length > 0) { + return; + } + if (SerializationUtils.isExternalizable(aClass)) { + return; + } + registerClassError(aClass, Boolean.TRUE); + } + } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/SingletonInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/SingletonInspection.java index 797e8581a0..e46ac28249 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/SingletonInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/SingletonInspection.java @@ -21,42 +21,42 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class SingletonInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.singletonDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.singletonDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.singletonProblemDescriptor().get(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.singletonProblemDescriptor().get(); + } - @Override - public boolean runForWholeFile() { - return true; - } + @Override + public boolean runForWholeFile() { + return true; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new SingletonVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new SingletonVisitor(); + } - private static class SingletonVisitor extends BaseInspectionVisitor { + private static class SingletonVisitor extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - // no call to super, so that it doesn't drill down to inner classes - if (!SingletonUtil.isSingleton(aClass)) { - return; - } - registerClassError(aClass); + @Override + public void visitClass(@Nonnull PsiClass aClass) { + // no call to super, so that it doesn't drill down to inner classes + if (!SingletonUtil.isSingleton(aClass)) { + return; + } + registerClassError(aClass); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/StaticNonFinalFieldInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/StaticNonFinalFieldInspection.java index ace244f2a4..84a3aba71b 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/StaticNonFinalFieldInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/StaticNonFinalFieldInspection.java @@ -23,42 +23,43 @@ import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @ExtensionImpl public class StaticNonFinalFieldInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.staticNonFinalFieldDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.staticNonFinalFieldDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.staticNonFinalFieldProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.staticNonFinalFieldProblemDescriptor().get(); + } - @Nullable - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiField field = (PsiField)infos[0]; - return MakeFieldFinalFix.buildFix(field); - } + @Nullable + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiField field = (PsiField) infos[0]; + return MakeFieldFinalFix.buildFix(field); + } - public BaseInspectionVisitor buildVisitor() { - return new StaticNonFinalFieldVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new StaticNonFinalFieldVisitor(); + } - private static class StaticNonFinalFieldVisitor - extends BaseInspectionVisitor { + private static class StaticNonFinalFieldVisitor + extends BaseInspectionVisitor { - @Override - public void visitField(@Nonnull PsiField field) { - if (!field.hasModifierProperty(PsiModifier.STATIC) || - field.hasModifierProperty(PsiModifier.FINAL)) { - return; - } - registerFieldError(field, field); + @Override + public void visitField(@Nonnull PsiField field) { + if (!field.hasModifierProperty(PsiModifier.STATIC) || + field.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + registerFieldError(field, field); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/UtilityClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/UtilityClassInspection.java index 583b2aa8c2..e55fb3d9e5 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/UtilityClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/UtilityClassInspection.java @@ -27,59 +27,59 @@ import com.siyeh.ig.ui.ExternalizableStringSet; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import javax.swing.*; @ExtensionImpl public class UtilityClassInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public final ExternalizableStringSet ignorableAnnotations = new ExternalizableStringSet(); - @SuppressWarnings({"PublicField"}) - public final ExternalizableStringSet ignorableAnnotations = new ExternalizableStringSet(); - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.utilityClassDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.utilityClassDisplayName(); + } - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.utilityClassProblemDescriptor().get(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.utilityClassProblemDescriptor().get(); + } - @Nonnull - @Override - protected InspectionGadgetsFix[] buildFixes(Object... infos) { - return AddToIgnoreIfAnnotatedByListQuickFix.build((PsiModifierListOwner) infos[0], ignorableAnnotations); - } + @Nonnull + @Override + protected InspectionGadgetsFix[] buildFixes(Object... infos) { + return AddToIgnoreIfAnnotatedByListQuickFix.build((PsiModifierListOwner) infos[0], ignorableAnnotations); + } - @Override - public JComponent createOptionsPanel() { - return SpecialAnnotationsUtil.createSpecialAnnotationsListControl( - ignorableAnnotations, - InspectionGadgetsLocalize.ignoreIfAnnotatedBy().get() - ); - } + @Override + public JComponent createOptionsPanel() { + return SpecialAnnotationsUtil.createSpecialAnnotationsListControl( + ignorableAnnotations, + InspectionGadgetsLocalize.ignoreIfAnnotatedBy().get() + ); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new UtilityClassVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new UtilityClassVisitor(); + } - private class UtilityClassVisitor extends BaseInspectionVisitor { + private class UtilityClassVisitor extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - // no call to super, so that it doesn't drill down to inner classes - if (!UtilityClassUtil.isUtilityClass(aClass)) { - return; - } - if (AnnotationUtil.isAnnotated(aClass, ignorableAnnotations)) { - return; - } - registerClassError(aClass, aClass); + @Override + public void visitClass(@Nonnull PsiClass aClass) { + // no call to super, so that it doesn't drill down to inner classes + if (!UtilityClassUtil.isUtilityClass(aClass)) { + return; + } + if (AnnotationUtil.isAnnotated(aClass, ignorableAnnotations)) { + return; + } + registerClassError(aClass, aClass); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/UtilityClassWithPublicConstructorInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/UtilityClassWithPublicConstructorInspection.java index 246ea32ab8..d373800c03 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/UtilityClassWithPublicConstructorInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/UtilityClassWithPublicConstructorInspection.java @@ -28,97 +28,96 @@ import consulo.language.editor.inspection.ProblemDescriptor; import consulo.language.psi.PsiElement; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; @ExtensionImpl -public class UtilityClassWithPublicConstructorInspection - extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.utilityClassWithPublicConstructorDisplayName().get(); - } - - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.utilityClassWithPublicConstructorProblemDescriptor().get(); - } +public class UtilityClassWithPublicConstructorInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.utilityClassWithPublicConstructorDisplayName(); + } - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiClass psiClass = (PsiClass)infos[0]; - if (psiClass.getConstructors().length > 1) { - return new UtilityClassWithPublicConstructorFix(true); + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.utilityClassWithPublicConstructorProblemDescriptor().get(); } - else { - return new UtilityClassWithPublicConstructorFix(false); + + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiClass psiClass = (PsiClass) infos[0]; + if (psiClass.getConstructors().length > 1) { + return new UtilityClassWithPublicConstructorFix(true); + } + else { + return new UtilityClassWithPublicConstructorFix(false); + } } - } - private static class UtilityClassWithPublicConstructorFix - extends InspectionGadgetsFix { + private static class UtilityClassWithPublicConstructorFix + extends InspectionGadgetsFix { - private final boolean m_multipleConstructors; + private final boolean m_multipleConstructors; - UtilityClassWithPublicConstructorFix(boolean multipleConstructors) { - super(); - m_multipleConstructors = multipleConstructors; - } + UtilityClassWithPublicConstructorFix(boolean multipleConstructors) { + super(); + m_multipleConstructors = multipleConstructors; + } - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.utilityClassWithPublicConstructorMakeQuickfix(m_multipleConstructors ? 1 : 2).get(); + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.utilityClassWithPublicConstructorMakeQuickfix(m_multipleConstructors ? 1 : 2); + } + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement classNameIdentifier = descriptor.getPsiElement(); + final PsiClass psiClass = (PsiClass) classNameIdentifier.getParent(); + if (psiClass == null) { + return; + } + final PsiMethod[] constructors = psiClass.getConstructors(); + for (PsiMethod constructor : constructors) { + final PsiModifierList modifierList = + constructor.getModifierList(); + modifierList.setModifierProperty(PsiModifier.PRIVATE, true); + } + } } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement classNameIdentifier = descriptor.getPsiElement(); - final PsiClass psiClass = (PsiClass)classNameIdentifier.getParent(); - if (psiClass == null) { - return; - } - final PsiMethod[] constructors = psiClass.getConstructors(); - for (PsiMethod constructor : constructors) { - final PsiModifierList modifierList = - constructor.getModifierList(); - modifierList.setModifierProperty(PsiModifier.PRIVATE, true); - } + public BaseInspectionVisitor buildVisitor() { + return new StaticClassWithPublicConstructorVisitor(); } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new StaticClassWithPublicConstructorVisitor(); - } - private static class StaticClassWithPublicConstructorVisitor - extends BaseInspectionVisitor { + private static class StaticClassWithPublicConstructorVisitor + extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - // no call to super, so that it doesn't drill down to inner classes - if (!UtilityClassUtil.isUtilityClass(aClass)) { - return; - } - if (!hasPublicConstructor(aClass)) { - return; - } - registerClassError(aClass, aClass); - } + @Override + public void visitClass(@Nonnull PsiClass aClass) { + // no call to super, so that it doesn't drill down to inner classes + if (!UtilityClassUtil.isUtilityClass(aClass)) { + return; + } + if (!hasPublicConstructor(aClass)) { + return; + } + registerClassError(aClass, aClass); + } - private static boolean hasPublicConstructor(PsiClass aClass) { - final PsiMethod[] constructors = aClass.getConstructors(); - for (final PsiMethod constructor : constructors) { - if (constructor.hasModifierProperty(PsiModifier.PUBLIC)) { - return true; + private static boolean hasPublicConstructor(PsiClass aClass) { + final PsiMethod[] constructors = aClass.getConstructors(); + for (final PsiMethod constructor : constructors) { + if (constructor.hasModifierProperty(PsiModifier.PUBLIC)) { + return true; + } + } + return false; } - } - return false; } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/UtilityClassWithoutPrivateConstructorInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/UtilityClassWithoutPrivateConstructorInspection.java index 63a9ba7e45..3bc5687065 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/UtilityClassWithoutPrivateConstructorInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/UtilityClassWithoutPrivateConstructorInspection.java @@ -22,7 +22,6 @@ import com.intellij.java.language.codeInsight.AnnotationUtil; import com.intellij.java.language.psi.*; import com.siyeh.HardcodedMethodConstants; -import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; @@ -39,6 +38,7 @@ import consulo.language.psi.scope.GlobalSearchScope; import consulo.language.psi.search.ReferencesSearch; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import consulo.ui.ex.awt.Messages; import jakarta.annotation.Nonnull; @@ -51,231 +51,233 @@ @ExtensionImpl public class UtilityClassWithoutPrivateConstructorInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean ignoreClassesWithOnlyMain = false; - @SuppressWarnings({"PublicField"}) - public boolean ignoreClassesWithOnlyMain = false; + @SuppressWarnings({"PublicField"}) + public final ExternalizableStringSet ignorableAnnotations = new ExternalizableStringSet(); - @SuppressWarnings({"PublicField"}) - public final ExternalizableStringSet ignorableAnnotations = new ExternalizableStringSet(); - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.utilityClassWithoutPrivateConstructorDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.utilityClassWithoutPrivateConstructorProblemDescriptor().get(); - } - - @Override - @Nullable - public JComponent createOptionsPanel() { - final JPanel panel = new JPanel(new BorderLayout()); - final JPanel annotationsPanel = SpecialAnnotationsUtil.createSpecialAnnotationsListControl( - ignorableAnnotations, - InspectionGadgetsLocalize.ignoreIfAnnotatedBy().get() - ); - panel.add(annotationsPanel, BorderLayout.CENTER); - final CheckBox checkBox = new CheckBox( - InspectionGadgetsLocalize.utilityClassWithoutPrivateConstructorOption().get(), - this, - "ignoreClassesWithOnlyMain" - ); - panel.add(checkBox, BorderLayout.SOUTH); - return panel; - } - - @Nonnull - @Override - protected InspectionGadgetsFix[] buildFixes(Object... infos) { - final List fixes = new ArrayList(); - final PsiClass aClass = (PsiClass) infos[0]; - final PsiMethod constructor = getNullArgConstructor(aClass); - if (constructor == null) { - fixes.add(new CreateEmptyPrivateConstructor()); - } else { - final Query query = ReferencesSearch.search(constructor, constructor.getUseScope()); - final PsiReference reference = query.findFirst(); - if (reference == null) { - fixes.add(new MakeConstructorPrivateFix()); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.utilityClassWithoutPrivateConstructorDisplayName(); } - AddToIgnoreIfAnnotatedByListQuickFix.build(aClass, ignorableAnnotations, fixes); - return fixes.toArray(new InspectionGadgetsFix[fixes.size()]); - } - - private static class CreateEmptyPrivateConstructor extends InspectionGadgetsFix { + @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.utilityClassWithoutPrivateConstructorCreateQuickfix().get(); + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.utilityClassWithoutPrivateConstructorProblemDescriptor().get(); + } + + @Override + @Nullable + public JComponent createOptionsPanel() { + final JPanel panel = new JPanel(new BorderLayout()); + final JPanel annotationsPanel = SpecialAnnotationsUtil.createSpecialAnnotationsListControl( + ignorableAnnotations, + InspectionGadgetsLocalize.ignoreIfAnnotatedBy().get() + ); + panel.add(annotationsPanel, BorderLayout.CENTER); + final CheckBox checkBox = new CheckBox( + InspectionGadgetsLocalize.utilityClassWithoutPrivateConstructorOption().get(), + this, + "ignoreClassesWithOnlyMain" + ); + panel.add(checkBox, BorderLayout.SOUTH); + return panel; } + @Nonnull @Override - public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement classNameIdentifier = descriptor.getPsiElement(); - final PsiElement parent = classNameIdentifier.getParent(); - if (!(parent instanceof PsiClass)) { - return; - } - final PsiClass aClass = (PsiClass) parent; - final Query query = ReferencesSearch.search(aClass, aClass.getUseScope()); - for (PsiReference reference : query) { - if (reference == null) { - continue; + protected InspectionGadgetsFix[] buildFixes(Object... infos) { + final List fixes = new ArrayList(); + final PsiClass aClass = (PsiClass) infos[0]; + final PsiMethod constructor = getNullArgConstructor(aClass); + if (constructor == null) { + fixes.add(new CreateEmptyPrivateConstructor()); } - final PsiElement element = reference.getElement(); - final PsiElement context = element.getParent(); - if (context instanceof PsiNewExpression) { - SwingUtilities.invokeLater(new Runnable() { - public void run() { - Messages.showInfoMessage(aClass.getProject(), - "Utility class has instantiations, private constructor will not be created", - "Can't generate constructor"); + else { + final Query query = ReferencesSearch.search(constructor, constructor.getUseScope()); + final PsiReference reference = query.findFirst(); + if (reference == null) { + fixes.add(new MakeConstructorPrivateFix()); } - }); - return; } - } - final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); - final PsiElementFactory factory = psiFacade.getElementFactory(); - final PsiMethod constructor = factory.createConstructor(); - final PsiModifierList modifierList = constructor.getModifierList(); - modifierList.setModifierProperty(PsiModifier.PRIVATE, true); - aClass.add(constructor); - final CodeStyleManager styleManager = CodeStyleManager.getInstance(project); - styleManager.reformat(constructor); + AddToIgnoreIfAnnotatedByListQuickFix.build(aClass, ignorableAnnotations, fixes); + return fixes.toArray(new InspectionGadgetsFix[fixes.size()]); } - } - private static class MakeConstructorPrivateFix extends InspectionGadgetsFix { - - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.utilityClassWithoutPrivateConstructorMakeQuickfix().get(); - } + private static class CreateEmptyPrivateConstructor extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.utilityClassWithoutPrivateConstructorCreateQuickfix(); + } - @Override - public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement classNameIdentifier = descriptor.getPsiElement(); - final PsiElement parent = classNameIdentifier.getParent(); - if (!(parent instanceof PsiClass)) { - return; - } - final PsiClass aClass = (PsiClass) parent; - final PsiMethod[] constructors = aClass.getConstructors(); - for (final PsiMethod constructor : constructors) { - final PsiParameterList parameterList = constructor.getParameterList(); - if (parameterList.getParametersCount() == 0) { - final PsiModifierList modifiers = constructor.getModifierList(); - modifiers.setModifierProperty(PsiModifier.PUBLIC, false); - modifiers.setModifierProperty(PsiModifier.PROTECTED, false); - modifiers.setModifierProperty(PsiModifier.PRIVATE, true); + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement classNameIdentifier = descriptor.getPsiElement(); + final PsiElement parent = classNameIdentifier.getParent(); + if (!(parent instanceof PsiClass)) { + return; + } + final PsiClass aClass = (PsiClass) parent; + final Query query = ReferencesSearch.search(aClass, aClass.getUseScope()); + for (PsiReference reference : query) { + if (reference == null) { + continue; + } + final PsiElement element = reference.getElement(); + final PsiElement context = element.getParent(); + if (context instanceof PsiNewExpression) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + Messages.showInfoMessage( + aClass.getProject(), + "Utility class has instantiations, private constructor will not be created", + "Can't generate constructor" + ); + } + }); + return; + } + } + final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); + final PsiElementFactory factory = psiFacade.getElementFactory(); + final PsiMethod constructor = factory.createConstructor(); + final PsiModifierList modifierList = constructor.getModifierList(); + modifierList.setModifierProperty(PsiModifier.PRIVATE, true); + aClass.add(constructor); + final CodeStyleManager styleManager = CodeStyleManager.getInstance(project); + styleManager.reformat(constructor); } - } } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new UtilityClassWithoutPrivateConstructorVisitor(); - } + private static class MakeConstructorPrivateFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.utilityClassWithoutPrivateConstructorMakeQuickfix(); + } - private class UtilityClassWithoutPrivateConstructorVisitor extends BaseInspectionVisitor { + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement classNameIdentifier = descriptor.getPsiElement(); + final PsiElement parent = classNameIdentifier.getParent(); + if (!(parent instanceof PsiClass)) { + return; + } + final PsiClass aClass = (PsiClass) parent; + final PsiMethod[] constructors = aClass.getConstructors(); + for (final PsiMethod constructor : constructors) { + final PsiParameterList parameterList = constructor.getParameterList(); + if (parameterList.getParametersCount() == 0) { + final PsiModifierList modifiers = constructor.getModifierList(); + modifiers.setModifierProperty(PsiModifier.PUBLIC, false); + modifiers.setModifierProperty(PsiModifier.PROTECTED, false); + modifiers.setModifierProperty(PsiModifier.PRIVATE, true); + } + } + } + } @Override - public void visitClass(@Nonnull PsiClass aClass) { - // no call to super, so that it doesn't drill down to inner classes - if (aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { - return; - } - if (!UtilityClassUtil.isUtilityClass(aClass)) { - return; - } - if (ignoreClassesWithOnlyMain && hasOnlyMain(aClass)) { - return; - } - if (hasPrivateConstructor(aClass)) { - return; - } - if (AnnotationUtil.isAnnotated(aClass, ignorableAnnotations)) { - return; - } - if (aClass.hasModifierProperty(PsiModifier.PRIVATE) && aClass.getConstructors().length == 0) { - return; - } - final SearchScope scope = GlobalSearchScope.projectScope(aClass.getProject()); - final Query query = ClassInheritorsSearch.search(aClass, scope, true, true); - final PsiClass subclass = query.findFirst(); - if (subclass != null) { - return; - } - registerClassError(aClass, aClass); + public BaseInspectionVisitor buildVisitor() { + return new UtilityClassWithoutPrivateConstructorVisitor(); } - private boolean hasOnlyMain(PsiClass aClass) { - final PsiMethod[] methods = aClass.getMethods(); - if (methods.length == 0) { - return false; - } - for (PsiMethod method : methods) { - if (method.isConstructor()) { - continue; - } - if (!method.hasModifierProperty(PsiModifier.STATIC)) { - return false; - } - if (method.hasModifierProperty(PsiModifier.PRIVATE)) { - continue; - } - if (!method.hasModifierProperty(PsiModifier.PUBLIC)) { - return false; - } - final String name = method.getName(); - if (!name.equals(HardcodedMethodConstants.MAIN)) { - return false; - } - final PsiType returnType = method.getReturnType(); - if (!PsiType.VOID.equals(returnType)) { - return false; - } - final PsiParameterList parameterList = method.getParameterList(); - if (parameterList.getParametersCount() != 1) { - return false; + private class UtilityClassWithoutPrivateConstructorVisitor extends BaseInspectionVisitor { + + @Override + public void visitClass(@Nonnull PsiClass aClass) { + // no call to super, so that it doesn't drill down to inner classes + if (aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + return; + } + if (!UtilityClassUtil.isUtilityClass(aClass)) { + return; + } + if (ignoreClassesWithOnlyMain && hasOnlyMain(aClass)) { + return; + } + if (hasPrivateConstructor(aClass)) { + return; + } + if (AnnotationUtil.isAnnotated(aClass, ignorableAnnotations)) { + return; + } + if (aClass.hasModifierProperty(PsiModifier.PRIVATE) && aClass.getConstructors().length == 0) { + return; + } + final SearchScope scope = GlobalSearchScope.projectScope(aClass.getProject()); + final Query query = ClassInheritorsSearch.search(aClass, scope, true, true); + final PsiClass subclass = query.findFirst(); + if (subclass != null) { + return; + } + registerClassError(aClass, aClass); } - final PsiParameter[] parameters = parameterList.getParameters(); - final PsiParameter parameter = parameters[0]; - final PsiType type = parameter.getType(); - if (!type.equalsToText("java.lang.String[]")) { - return false; + + private boolean hasOnlyMain(PsiClass aClass) { + final PsiMethod[] methods = aClass.getMethods(); + if (methods.length == 0) { + return false; + } + for (PsiMethod method : methods) { + if (method.isConstructor()) { + continue; + } + if (!method.hasModifierProperty(PsiModifier.STATIC)) { + return false; + } + if (method.hasModifierProperty(PsiModifier.PRIVATE)) { + continue; + } + if (!method.hasModifierProperty(PsiModifier.PUBLIC)) { + return false; + } + final String name = method.getName(); + if (!name.equals(HardcodedMethodConstants.MAIN)) { + return false; + } + final PsiType returnType = method.getReturnType(); + if (!PsiType.VOID.equals(returnType)) { + return false; + } + final PsiParameterList parameterList = method.getParameterList(); + if (parameterList.getParametersCount() != 1) { + return false; + } + final PsiParameter[] parameters = parameterList.getParameters(); + final PsiParameter parameter = parameters[0]; + final PsiType type = parameter.getType(); + if (!type.equalsToText("java.lang.String[]")) { + return false; + } + } + return true; } - } - return true; - } - boolean hasPrivateConstructor(PsiClass aClass) { - final PsiMethod[] constructors = aClass.getConstructors(); - for (final PsiMethod constructor : constructors) { - if (constructor.hasModifierProperty(PsiModifier.PRIVATE)) { - return true; + boolean hasPrivateConstructor(PsiClass aClass) { + final PsiMethod[] constructors = aClass.getConstructors(); + for (final PsiMethod constructor : constructors) { + if (constructor.hasModifierProperty(PsiModifier.PRIVATE)) { + return true; + } + } + return false; } - } - return false; } - } - @Nullable - static PsiMethod getNullArgConstructor(PsiClass aClass) { - final PsiMethod[] constructors = aClass.getConstructors(); - for (final PsiMethod constructor : constructors) { - final PsiParameterList params = constructor.getParameterList(); - if (params.getParametersCount() == 0) { - return constructor; - } + @Nullable + static PsiMethod getNullArgConstructor(PsiClass aClass) { + final PsiMethod[] constructors = aClass.getConstructors(); + for (final PsiMethod constructor : constructors) { + final PsiParameterList params = constructor.getParameterList(); + if (params.getParametersCount() == 0) { + return constructor; + } + } + return null; } - return null; - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/AnonymousClassComplexityInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/AnonymousClassComplexityInspection.java index f3df798768..f27e87ec9e 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/AnonymousClassComplexityInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/AnonymousClassComplexityInspection.java @@ -21,109 +21,111 @@ import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl -public class AnonymousClassComplexityInspection - extends ClassMetricInspection { - - private static final int DEFAULT_COMPLEXITY_LIMIT = 3; - - @Override - @Nonnull - public String getID() { - return "OverlyComplexAnonymousInnerClass"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.overlyComplexAnonymousInnerClassDisplayName().get(); - } - - @Override - protected int getDefaultLimit() { - return DEFAULT_COMPLEXITY_LIMIT; - } - - @Override - protected String getConfigurationLabel() { - return InspectionGadgetsLocalize.cyclomaticComplexityLimitOption().get(); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new MoveAnonymousToInnerClassFix(); - } - - @Override - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final Integer totalComplexity = (Integer)infos[0]; - return InspectionGadgetsLocalize.overlyComplexAnonymousInnerClassProblemDescriptor(totalComplexity).get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ClassComplexityVisitor(); - } - - private class ClassComplexityVisitor extends BaseInspectionVisitor { +public class AnonymousClassComplexityInspection extends ClassMetricInspection { + private static final int DEFAULT_COMPLEXITY_LIMIT = 3; + @Nonnull @Override - public void visitClass(@Nonnull PsiClass psiClass) { - // no call to super, to prevent double counting + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "OverlyComplexAnonymousInnerClass"; } + @Nonnull @Override - public void visitAnonymousClass( - @Nonnull PsiAnonymousClass aClass) { - if (aClass instanceof PsiEnumConstantInitializer) { - return; - } - final int totalComplexity = calculateTotalComplexity(aClass); - if (totalComplexity <= getLimit()) { - return; - } - registerClassError(aClass, Integer.valueOf(totalComplexity)); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.overlyComplexAnonymousInnerClassDisplayName(); } - private int calculateTotalComplexity(PsiClass aClass) { - if (aClass == null) { - return 0; - } - final PsiMethod[] methods = aClass.getMethods(); - int totalComplexity = calculateComplexityForMethods(methods); - totalComplexity += calculateInitializerComplexity(aClass); - return totalComplexity; + @Override + protected int getDefaultLimit() { + return DEFAULT_COMPLEXITY_LIMIT; + } + + @Override + protected String getConfigurationLabel() { + return InspectionGadgetsLocalize.cyclomaticComplexityLimitOption().get(); + } + + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new MoveAnonymousToInnerClassFix(); } - private int calculateInitializerComplexity(PsiClass aClass) { - final ComplexityVisitor visitor = new ComplexityVisitor(); - int complexity = 0; - final PsiClassInitializer[] initializers = aClass.getInitializers(); - for (final PsiClassInitializer initializer : initializers) { - visitor.reset(); - initializer.accept(visitor); - complexity += visitor.getComplexity(); - } - return complexity; + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } + + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final Integer totalComplexity = (Integer) infos[0]; + return InspectionGadgetsLocalize.overlyComplexAnonymousInnerClassProblemDescriptor(totalComplexity).get(); + } + + @Override + public BaseInspectionVisitor buildVisitor() { + return new ClassComplexityVisitor(); } - private int calculateComplexityForMethods(PsiMethod[] methods) { - final ComplexityVisitor visitor = new ComplexityVisitor(); - int complexity = 0; - for (final PsiMethod method : methods) { - visitor.reset(); - method.accept(visitor); - complexity += visitor.getComplexity(); - } - return complexity; + private class ClassComplexityVisitor extends BaseInspectionVisitor { + + @Override + public void visitClass(@Nonnull PsiClass psiClass) { + // no call to super, to prevent double counting + } + + @Override + public void visitAnonymousClass( + @Nonnull PsiAnonymousClass aClass + ) { + if (aClass instanceof PsiEnumConstantInitializer) { + return; + } + final int totalComplexity = calculateTotalComplexity(aClass); + if (totalComplexity <= getLimit()) { + return; + } + registerClassError(aClass, Integer.valueOf(totalComplexity)); + } + + private int calculateTotalComplexity(PsiClass aClass) { + if (aClass == null) { + return 0; + } + final PsiMethod[] methods = aClass.getMethods(); + int totalComplexity = calculateComplexityForMethods(methods); + totalComplexity += calculateInitializerComplexity(aClass); + return totalComplexity; + } + + private int calculateInitializerComplexity(PsiClass aClass) { + final ComplexityVisitor visitor = new ComplexityVisitor(); + int complexity = 0; + final PsiClassInitializer[] initializers = aClass.getInitializers(); + for (final PsiClassInitializer initializer : initializers) { + visitor.reset(); + initializer.accept(visitor); + complexity += visitor.getComplexity(); + } + return complexity; + } + + private int calculateComplexityForMethods(PsiMethod[] methods) { + final ComplexityVisitor visitor = new ComplexityVisitor(); + int complexity = 0; + for (final PsiMethod method : methods) { + visitor.reset(); + method.accept(visitor); + complexity += visitor.getComplexity(); + } + return complexity; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/AnonymousClassMethodCountInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/AnonymousClassMethodCountInspection.java index 514b535664..8716de1057 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/AnonymousClassMethodCountInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/AnonymousClassMethodCountInspection.java @@ -23,81 +23,83 @@ import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl -public class AnonymousClassMethodCountInspection - extends ClassMetricInspection { +public class AnonymousClassMethodCountInspection extends ClassMetricInspection { + private static final int DEFAULT_METHOD_COUNT_LIMIT = 1; - private static final int DEFAULT_METHOD_COUNT_LIMIT = 1; - - @Override - @Nonnull - public String getID() { - return "AnonymousInnerClassWithTooManyMethods"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.anonymousInnerClassWithTooManyMethodsDisplayName().get(); - } - - @Override - protected int getDefaultLimit() { - return DEFAULT_METHOD_COUNT_LIMIT; - } - - @Override - protected String getConfigurationLabel() { - return InspectionGadgetsLocalize.methodCountLimitOption().get(); - } + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "AnonymousInnerClassWithTooManyMethods"; + } - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new MoveAnonymousToInnerClassFix(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.anonymousInnerClassWithTooManyMethodsDisplayName(); + } - @Override - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } + @Override + protected int getDefaultLimit() { + return DEFAULT_METHOD_COUNT_LIMIT; + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final Integer count = (Integer)infos[0]; - return InspectionGadgetsLocalize.anonymousInnerClassWithTooManyMethodsProblemDescriptor(count).get(); - } + @Override + protected String getConfigurationLabel() { + return InspectionGadgetsLocalize.methodCountLimitOption().get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new AnonymousClassMethodCountVisitor(); - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new MoveAnonymousToInnerClassFix(); + } - private class AnonymousClassMethodCountVisitor - extends BaseInspectionVisitor { + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } @Override - public void visitClass(@Nonnull PsiClass psiClass) { - // no call to super, to prevent double counting + @Nonnull + public String buildErrorString(Object... infos) { + final Integer count = (Integer) infos[0]; + return InspectionGadgetsLocalize.anonymousInnerClassWithTooManyMethodsProblemDescriptor(count).get(); } @Override - public void visitAnonymousClass( - @Nonnull PsiAnonymousClass aClass) { - if (aClass instanceof PsiEnumConstantInitializer) { - return; - } - final int totalMethodCount = calculateTotalMethodCount(aClass); - if (totalMethodCount <= getLimit()) { - return; - } - registerClassError(aClass, Integer.valueOf(totalMethodCount)); + public BaseInspectionVisitor buildVisitor() { + return new AnonymousClassMethodCountVisitor(); } - private int calculateTotalMethodCount(PsiClass aClass) { - return aClass.getMethods().length - aClass.getConstructors().length; + private class AnonymousClassMethodCountVisitor + extends BaseInspectionVisitor { + + @Override + public void visitClass(@Nonnull PsiClass psiClass) { + // no call to super, to prevent double counting + } + + @Override + public void visitAnonymousClass( + @Nonnull PsiAnonymousClass aClass + ) { + if (aClass instanceof PsiEnumConstantInitializer) { + return; + } + final int totalMethodCount = calculateTotalMethodCount(aClass); + if (totalMethodCount <= getLimit()) { + return; + } + registerClassError(aClass, Integer.valueOf(totalMethodCount)); + } + + private int calculateTotalMethodCount(PsiClass aClass) { + return aClass.getMethods().length - aClass.getConstructors().length; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ClassComplexityInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ClassComplexityInspection.java index 2ead6d0757..f9b2172a79 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ClassComplexityInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ClassComplexityInspection.java @@ -21,82 +21,85 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl -public class ClassComplexityInspection - extends ClassMetricInspection { +public class ClassComplexityInspection extends ClassMetricInspection { + private static final int DEFAULT_COMPLEXITY_LIMIT = 80; - private static final int DEFAULT_COMPLEXITY_LIMIT = 80; - - @Nonnull - public String getID() { - return "OverlyComplexClass"; - } + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "OverlyComplexClass"; + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.overlyComplexClassDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.overlyComplexClassDisplayName(); + } - protected int getDefaultLimit() { - return DEFAULT_COMPLEXITY_LIMIT; - } + protected int getDefaultLimit() { + return DEFAULT_COMPLEXITY_LIMIT; + } - protected String getConfigurationLabel() { - return InspectionGadgetsLocalize.cyclomaticComplexityLimitOption().get(); - } + protected String getConfigurationLabel() { + return InspectionGadgetsLocalize.cyclomaticComplexityLimitOption().get(); + } - @Nonnull - public String buildErrorString(Object... infos) { - final Integer totalComplexity = (Integer)infos[0]; - return InspectionGadgetsLocalize.overlyComplexClassProblemDescriptor(totalComplexity).get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + final Integer totalComplexity = (Integer) infos[0]; + return InspectionGadgetsLocalize.overlyComplexClassProblemDescriptor(totalComplexity).get(); + } - public BaseInspectionVisitor buildVisitor() { - return new ClassComplexityVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new ClassComplexityVisitor(); + } - private class ClassComplexityVisitor extends BaseInspectionVisitor { + private class ClassComplexityVisitor extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - // note: no call to super - final int totalComplexity = calculateTotalComplexity(aClass); - if (totalComplexity <= getLimit()) { - return; - } - registerClassError(aClass, Integer.valueOf(totalComplexity)); - } + @Override + public void visitClass(@Nonnull PsiClass aClass) { + // note: no call to super + final int totalComplexity = calculateTotalComplexity(aClass); + if (totalComplexity <= getLimit()) { + return; + } + registerClassError(aClass, Integer.valueOf(totalComplexity)); + } - private int calculateTotalComplexity(PsiClass aClass) { - final PsiMethod[] methods = aClass.getMethods(); - int totalComplexity = calculateComplexityForMethods(methods); - totalComplexity += calculateInitializerComplexity(aClass); - return totalComplexity; - } + private int calculateTotalComplexity(PsiClass aClass) { + final PsiMethod[] methods = aClass.getMethods(); + int totalComplexity = calculateComplexityForMethods(methods); + totalComplexity += calculateInitializerComplexity(aClass); + return totalComplexity; + } - private int calculateInitializerComplexity(PsiClass aClass) { - final ComplexityVisitor visitor = new ComplexityVisitor(); - int complexity = 0; - final PsiClassInitializer[] initializers = aClass.getInitializers(); - for (final PsiClassInitializer initializer : initializers) { - visitor.reset(); - initializer.accept(visitor); - complexity += visitor.getComplexity(); - } - return complexity; - } + private int calculateInitializerComplexity(PsiClass aClass) { + final ComplexityVisitor visitor = new ComplexityVisitor(); + int complexity = 0; + final PsiClassInitializer[] initializers = aClass.getInitializers(); + for (final PsiClassInitializer initializer : initializers) { + visitor.reset(); + initializer.accept(visitor); + complexity += visitor.getComplexity(); + } + return complexity; + } - private int calculateComplexityForMethods(PsiMethod[] methods) { - final ComplexityVisitor visitor = new ComplexityVisitor(); - int complexity = 0; - for (final PsiMethod method : methods) { - visitor.reset(); - method.accept(visitor); - complexity += visitor.getComplexity(); - } - return complexity; + private int calculateComplexityForMethods(PsiMethod[] methods) { + final ComplexityVisitor visitor = new ComplexityVisitor(); + int complexity = 0; + for (final PsiMethod method : methods) { + visitor.reset(); + method.accept(visitor); + complexity += visitor.getComplexity(); + } + return complexity; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ClassCouplingInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ClassCouplingInspection.java index 04f206add9..b7617d490f 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ClassCouplingInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ClassCouplingInspection.java @@ -20,124 +20,126 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.deadCodeNotWorking.impl.CheckBox; +import consulo.localize.LocalizeValue; import consulo.ui.ex.awt.UIUtil; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; import java.awt.*; @ExtensionImpl -public class ClassCouplingInspection - extends ClassMetricInspection { - - private static final int DEFAULT_COUPLING_LIMIT = 15; - /** - * @noinspection PublicField - */ - public boolean m_includeJavaClasses = false; - /** - * @noinspection PublicField - */ - public boolean m_includeLibraryClasses = false; - - @Override - @Nonnull - public String getID() { - return "OverlyCoupledClass"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.overlyCoupledClassDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final Integer totalDependencies = (Integer)infos[0]; - return InspectionGadgetsLocalize.overlyCoupledClassProblemDescriptor(totalDependencies).get(); - } - - @Override - protected int getDefaultLimit() { - return DEFAULT_COUPLING_LIMIT; - } - - @Override - protected String getConfigurationLabel() { - return InspectionGadgetsLocalize.overlyCoupledClassClassCouplingLimitOption().get(); - } - - @Override - public JComponent createOptionsPanel() { - final String configurationLabel = getConfigurationLabel(); - final JLabel label = new JLabel(configurationLabel); - final JFormattedTextField valueField = prepareNumberEditor(() -> m_limit, i -> m_limit = i); - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.weightx = 0.0; - constraints.anchor = GridBagConstraints.WEST; - constraints.fill = GridBagConstraints.NONE; - constraints.insets.right = UIUtil.DEFAULT_HGAP; - final JPanel panel = new JPanel(new GridBagLayout()); - panel.add(label, constraints); - constraints.gridx = 1; - constraints.gridy = 0; - constraints.weightx = 1.0; - constraints.insets.right = 0; - constraints.anchor = GridBagConstraints.NORTHWEST; - constraints.fill = GridBagConstraints.NONE; - panel.add(valueField, constraints); - - final CheckBox arrayCheckBox = new CheckBox( - InspectionGadgetsLocalize.includeJavaSystemClassesOption().get(), - this, - "m_includeJavaClasses" - ); - final CheckBox objectCheckBox = new CheckBox( - InspectionGadgetsLocalize.includeLibraryClassesOption().get(), - this, - "m_includeLibraryClasses" - ); - constraints.gridx = 0; - constraints.gridy = 1; - constraints.gridwidth = 2; - constraints.fill = GridBagConstraints.HORIZONTAL; - panel.add(arrayCheckBox, constraints); - - constraints.gridx = 0; - constraints.gridy = 2; - constraints.weighty = 1; - constraints.gridwidth = 2; - panel.add(objectCheckBox, constraints); - return panel; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ClassCouplingVisitor(); - } - - private class ClassCouplingVisitor extends BaseInspectionVisitor { +public class ClassCouplingInspection extends ClassMetricInspection { + private static final int DEFAULT_COUPLING_LIMIT = 15; + /** + * @noinspection PublicField + */ + public boolean m_includeJavaClasses = false; + /** + * @noinspection PublicField + */ + public boolean m_includeLibraryClasses = false; + + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "OverlyCoupledClass"; + } + + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.overlyCoupledClassDisplayName(); + } + + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final Integer totalDependencies = (Integer) infos[0]; + return InspectionGadgetsLocalize.overlyCoupledClassProblemDescriptor(totalDependencies).get(); + } + + @Override + protected int getDefaultLimit() { + return DEFAULT_COUPLING_LIMIT; + } + + @Override + protected String getConfigurationLabel() { + return InspectionGadgetsLocalize.overlyCoupledClassClassCouplingLimitOption().get(); + } + + @Override + public JComponent createOptionsPanel() { + final String configurationLabel = getConfigurationLabel(); + final JLabel label = new JLabel(configurationLabel); + final JFormattedTextField valueField = prepareNumberEditor(() -> m_limit, i -> m_limit = i); + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.weightx = 0.0; + constraints.anchor = GridBagConstraints.WEST; + constraints.fill = GridBagConstraints.NONE; + constraints.insets.right = UIUtil.DEFAULT_HGAP; + final JPanel panel = new JPanel(new GridBagLayout()); + panel.add(label, constraints); + constraints.gridx = 1; + constraints.gridy = 0; + constraints.weightx = 1.0; + constraints.insets.right = 0; + constraints.anchor = GridBagConstraints.NORTHWEST; + constraints.fill = GridBagConstraints.NONE; + panel.add(valueField, constraints); + + final CheckBox arrayCheckBox = new CheckBox( + InspectionGadgetsLocalize.includeJavaSystemClassesOption().get(), + this, + "m_includeJavaClasses" + ); + final CheckBox objectCheckBox = new CheckBox( + InspectionGadgetsLocalize.includeLibraryClassesOption().get(), + this, + "m_includeLibraryClasses" + ); + constraints.gridx = 0; + constraints.gridy = 1; + constraints.gridwidth = 2; + constraints.fill = GridBagConstraints.HORIZONTAL; + panel.add(arrayCheckBox, constraints); + + constraints.gridx = 0; + constraints.gridy = 2; + constraints.weighty = 1; + constraints.gridwidth = 2; + panel.add(objectCheckBox, constraints); + return panel; + } @Override - public void visitClass(@Nonnull PsiClass aClass) { - // note: no call to super - final int totalDependencies = calculateTotalDependencies(aClass); - if (totalDependencies <= getLimit()) { - return; - } - registerClassError(aClass, Integer.valueOf(totalDependencies)); + public BaseInspectionVisitor buildVisitor() { + return new ClassCouplingVisitor(); } - private int calculateTotalDependencies(PsiClass aClass) { - final CouplingVisitor visitor = new CouplingVisitor(aClass, - m_includeJavaClasses, m_includeLibraryClasses); - aClass.accept(visitor); - return visitor.getNumDependencies(); + private class ClassCouplingVisitor extends BaseInspectionVisitor { + + @Override + public void visitClass(@Nonnull PsiClass aClass) { + // note: no call to super + final int totalDependencies = calculateTotalDependencies(aClass); + if (totalDependencies <= getLimit()) { + return; + } + registerClassError(aClass, Integer.valueOf(totalDependencies)); + } + + private int calculateTotalDependencies(PsiClass aClass) { + final CouplingVisitor visitor = new CouplingVisitor(aClass, + m_includeJavaClasses, m_includeLibraryClasses + ); + aClass.accept(visitor); + return visitor.getNumDependencies(); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ClassInheritanceDepthInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ClassInheritanceDepthInspection.java index ce1de3732b..b0062cdd1e 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ClassInheritanceDepthInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ClassInheritanceDepthInspection.java @@ -21,78 +21,81 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import java.util.HashSet; import java.util.Set; @ExtensionImpl -public class ClassInheritanceDepthInspection - extends ClassMetricInspection { +public class ClassInheritanceDepthInspection extends ClassMetricInspection { + private static final int CLASS_INHERITANCE_LIMIT = 2; - @Nonnull - public String getID() { - return "ClassTooDeepInInheritanceTree"; - } - - private static final int CLASS_INHERITANCE_LIMIT = 2; + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "ClassTooDeepInInheritanceTree"; + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.classTooDeepDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.classTooDeepDisplayName(); + } - protected int getDefaultLimit() { - return CLASS_INHERITANCE_LIMIT; - } + protected int getDefaultLimit() { + return CLASS_INHERITANCE_LIMIT; + } - protected String getConfigurationLabel() { - return InspectionGadgetsLocalize.classTooDeepInheritanceDepthLimitOption().get(); - } + protected String getConfigurationLabel() { + return InspectionGadgetsLocalize.classTooDeepInheritanceDepthLimitOption().get(); + } - @Nonnull - public String buildErrorString(Object... infos) { - final Integer count = (Integer)infos[0]; - return InspectionGadgetsLocalize.classTooDeepProblemDescriptor(count).get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + final Integer count = (Integer) infos[0]; + return InspectionGadgetsLocalize.classTooDeepProblemDescriptor(count).get(); + } - public BaseInspectionVisitor buildVisitor() { - return new ClassNestingLevel(); - } + public BaseInspectionVisitor buildVisitor() { + return new ClassNestingLevel(); + } - private class ClassNestingLevel extends BaseInspectionVisitor { + private class ClassNestingLevel extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - // note: no call to super - if (aClass.isEnum()) { - return; - } - if (aClass instanceof PsiTypeParameter) { - return; - } - final int inheritanceDepth = - getInheritanceDepth(aClass, new HashSet()); - if (inheritanceDepth <= getLimit()) { - return; - } - registerClassError(aClass, Integer.valueOf(inheritanceDepth)); - } + @Override + public void visitClass(@Nonnull PsiClass aClass) { + // note: no call to super + if (aClass.isEnum()) { + return; + } + if (aClass instanceof PsiTypeParameter) { + return; + } + final int inheritanceDepth = + getInheritanceDepth(aClass, new HashSet()); + if (inheritanceDepth <= getLimit()) { + return; + } + registerClassError(aClass, Integer.valueOf(inheritanceDepth)); + } - private int getInheritanceDepth(PsiClass aClass, Set visited) { - if (visited.contains(aClass)) { - return 0; - } - visited.add(aClass); - final PsiClass superClass = aClass.getSuperClass(); - if (superClass == null) { - return 0; - } - if (LibraryUtil.classIsInLibrary(aClass) && - LibraryUtil.classIsInLibrary(superClass)) { - return 0; - } - return getInheritanceDepth(superClass, visited) + 1; + private int getInheritanceDepth(PsiClass aClass, Set visited) { + if (visited.contains(aClass)) { + return 0; + } + visited.add(aClass); + final PsiClass superClass = aClass.getSuperClass(); + if (superClass == null) { + return 0; + } + if (LibraryUtil.classIsInLibrary(aClass) && + LibraryUtil.classIsInLibrary(superClass)) { + return 0; + } + return getInheritanceDepth(superClass, visited) + 1; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ClassNestingDepthInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ClassNestingDepthInspection.java index 03e7344f6e..d8417394e4 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ClassNestingDepthInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ClassNestingDepthInspection.java @@ -21,67 +21,70 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.PsiElement; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl -public class ClassNestingDepthInspection - extends ClassMetricInspection { +public class ClassNestingDepthInspection extends ClassMetricInspection { + private static final int CLASS_NESTING_LIMIT = 1; - private static final int CLASS_NESTING_LIMIT = 1; - - @Nonnull - public String getID() { - return "InnerClassTooDeeplyNested"; - } + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "InnerClassTooDeeplyNested"; + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.innerClassTooDeeplyNestedDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.innerClassTooDeeplyNestedDisplayName(); + } - protected int getDefaultLimit() { - return CLASS_NESTING_LIMIT; - } + protected int getDefaultLimit() { + return CLASS_NESTING_LIMIT; + } - protected String getConfigurationLabel() { - return InspectionGadgetsLocalize.innerClassTooDeeplyNestedNestingLimitOption().get(); - } + protected String getConfigurationLabel() { + return InspectionGadgetsLocalize.innerClassTooDeeplyNestedNestingLimitOption().get(); + } - @Nonnull - public String buildErrorString(Object... infos) { - final Integer nestingLevel = (Integer)infos[0]; - return InspectionGadgetsLocalize.innerClassTooDeeplyNestedProblemDescriptor(nestingLevel).get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + final Integer nestingLevel = (Integer) infos[0]; + return InspectionGadgetsLocalize.innerClassTooDeeplyNestedProblemDescriptor(nestingLevel).get(); + } - public BaseInspectionVisitor buildVisitor() { - return new ClassNestingLevel(); - } + public BaseInspectionVisitor buildVisitor() { + return new ClassNestingLevel(); + } - private class ClassNestingLevel extends BaseInspectionVisitor { + private class ClassNestingLevel extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - // note: no call to super - if (aClass instanceof PsiTypeParameter) { - return; - } - final int nestingLevel = getNestingLevel(aClass); - if (nestingLevel <= getLimit()) { - return; - } - registerClassError(aClass, Integer.valueOf(nestingLevel)); - } + @Override + public void visitClass(@Nonnull PsiClass aClass) { + // note: no call to super + if (aClass instanceof PsiTypeParameter) { + return; + } + final int nestingLevel = getNestingLevel(aClass); + if (nestingLevel <= getLimit()) { + return; + } + registerClassError(aClass, Integer.valueOf(nestingLevel)); + } - private int getNestingLevel(PsiClass aClass) { - PsiElement ancestor = aClass.getParent(); - int nestingLevel = 0; - while (ancestor != null) { - if (ancestor instanceof PsiClass) { - nestingLevel++; + private int getNestingLevel(PsiClass aClass) { + PsiElement ancestor = aClass.getParent(); + int nestingLevel = 0; + while (ancestor != null) { + if (ancestor instanceof PsiClass) { + nestingLevel++; + } + ancestor = ancestor.getParent(); + } + return nestingLevel; } - ancestor = ancestor.getParent(); - } - return nestingLevel; } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ConstructorCountInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ConstructorCountInspection.java index df4c283589..0c108aa4dd 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ConstructorCountInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/ConstructorCountInspection.java @@ -20,90 +20,94 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.deadCodeNotWorking.impl.CheckBox; +import consulo.localize.LocalizeValue; import consulo.ui.ex.awt.GridBag; import consulo.ui.ex.awt.UIUtil; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; import java.awt.*; public abstract class ConstructorCountInspection extends ClassMetricInspection { + private static final int CONSTRUCTOR_COUNT_LIMIT = 5; - private static final int CONSTRUCTOR_COUNT_LIMIT = 5; + public boolean ignoreDeprecatedConstructors = false; - public boolean ignoreDeprecatedConstructors = false; - - @Nonnull - public String getID() { - return "ClassWithTooManyConstructors"; - } - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.tooManyConstructorsDisplayName().get(); - } + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "ClassWithTooManyConstructors"; + } - protected int getDefaultLimit() { - return CONSTRUCTOR_COUNT_LIMIT; - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.tooManyConstructorsDisplayName(); + } - protected String getConfigurationLabel() { - return InspectionGadgetsLocalize.tooManyConstructorsCountLimitOption().get(); - } + protected int getDefaultLimit() { + return CONSTRUCTOR_COUNT_LIMIT; + } - @Override - public JComponent createOptionsPanel() { - final JLabel label = new JLabel(getConfigurationLabel()); - final JFormattedTextField valueField = prepareNumberEditor(() -> m_limit, i -> m_limit = i); - final CheckBox includeCheckBox = new CheckBox( - InspectionGadgetsLocalize.tooManyConstructorsIgnoreDeprecatedOption().get(), - this, - "ignoreDeprecatedConstructors" - ); + protected String getConfigurationLabel() { + return InspectionGadgetsLocalize.tooManyConstructorsCountLimitOption().get(); + } - final GridBag bag = new GridBag(); - bag.setDefaultInsets(0, 0, 0, UIUtil.DEFAULT_HGAP); - bag.setDefaultAnchor(GridBagConstraints.WEST); - final JPanel panel = new JPanel(new GridBagLayout()); - panel.add(label, bag.nextLine().next()); - panel.add(valueField, bag.next().weightx(1.0)); - panel.add(includeCheckBox, bag.nextLine().next().coverLine().weighty(1.0).anchor(GridBagConstraints.NORTHWEST)); - return panel; - } + @Override + public JComponent createOptionsPanel() { + final JLabel label = new JLabel(getConfigurationLabel()); + final JFormattedTextField valueField = prepareNumberEditor(() -> m_limit, i -> m_limit = i); + final CheckBox includeCheckBox = new CheckBox( + InspectionGadgetsLocalize.tooManyConstructorsIgnoreDeprecatedOption().get(), + this, + "ignoreDeprecatedConstructors" + ); + + final GridBag bag = new GridBag(); + bag.setDefaultInsets(0, 0, 0, UIUtil.DEFAULT_HGAP); + bag.setDefaultAnchor(GridBagConstraints.WEST); + final JPanel panel = new JPanel(new GridBagLayout()); + panel.add(label, bag.nextLine().next()); + panel.add(valueField, bag.next().weightx(1.0)); + panel.add(includeCheckBox, bag.nextLine().next().coverLine().weighty(1.0).anchor(GridBagConstraints.NORTHWEST)); + return panel; + } - @Nonnull - public String buildErrorString(Object... infos) { - final Integer count = (Integer)infos[0]; - return InspectionGadgetsLocalize.tooManyConstructorsProblemDescriptor(count).get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + final Integer count = (Integer) infos[0]; + return InspectionGadgetsLocalize.tooManyConstructorsProblemDescriptor(count).get(); + } - public BaseInspectionVisitor buildVisitor() { - return new ConstructorCountVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new ConstructorCountVisitor(); + } - private class ConstructorCountVisitor extends BaseInspectionVisitor { + private class ConstructorCountVisitor extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - final int constructorCount = calculateTotalConstructorCount(aClass); - if (constructorCount <= getLimit()) { - return; - } - registerClassError(aClass, Integer.valueOf(constructorCount)); - } + @Override + public void visitClass(@Nonnull PsiClass aClass) { + final int constructorCount = calculateTotalConstructorCount(aClass); + if (constructorCount <= getLimit()) { + return; + } + registerClassError(aClass, Integer.valueOf(constructorCount)); + } - private int calculateTotalConstructorCount(PsiClass aClass) { - final PsiMethod[] constructors = aClass.getConstructors(); - if (!ignoreDeprecatedConstructors) { - return constructors.length; - } - int count = 0; - for (PsiMethod constructor : constructors) { - if (!constructor.isDeprecated()) { - count++; + private int calculateTotalConstructorCount(PsiClass aClass) { + final PsiMethod[] constructors = aClass.getConstructors(); + if (!ignoreDeprecatedConstructors) { + return constructors.length; + } + int count = 0; + for (PsiMethod constructor : constructors) { + if (!constructor.isDeprecated()) { + count++; + } + } + return count; } - } - return count; } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/FieldCountInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/FieldCountInspection.java index ab2bbf6c55..c59e6d72f0 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/FieldCountInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/FieldCountInspection.java @@ -24,147 +24,149 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.deadCodeNotWorking.impl.CheckBox; +import consulo.localize.LocalizeValue; import consulo.ui.ex.awt.UIUtil; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; import java.awt.*; @ExtensionImpl public class FieldCountInspection extends ClassMetricInspection { + private static final int FIELD_COUNT_LIMIT = 10; + /** + * @noinspection PublicField + */ + public boolean m_countConstantFields = false; + + /** + * @noinspection PublicField + */ + public boolean m_considerStaticFinalFieldsConstant = false; + + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "ClassWithTooManyFields"; + } + + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.tooManyFieldsDisplayName(); + } + + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.tooManyFieldsProblemDescriptor(infos[0]).get(); + } + + @Override + protected int getDefaultLimit() { + return FIELD_COUNT_LIMIT; + } - private static final int FIELD_COUNT_LIMIT = 10; - /** - * @noinspection PublicField - */ - public boolean m_countConstantFields = false; - - /** - * @noinspection PublicField - */ - public boolean m_considerStaticFinalFieldsConstant = false; - - @Override - @Nonnull - public String getID() { - return "ClassWithTooManyFields"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.tooManyFieldsDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.tooManyFieldsProblemDescriptor(infos[0]).get(); - } - - @Override - protected int getDefaultLimit() { - return FIELD_COUNT_LIMIT; - } - - @Override - protected String getConfigurationLabel() { - return InspectionGadgetsLocalize.tooManyFieldsCountLimitOption().get(); - } - - @Override - public JComponent createOptionsPanel() { - final String configurationLabel = getConfigurationLabel(); - final JLabel label = new JLabel(configurationLabel); - final JFormattedTextField valueField = prepareNumberEditor(() -> m_limit, i -> m_limit = i); - - final CheckBox includeCheckBox = new CheckBox( - InspectionGadgetsLocalize.fieldCountInspectionIncludeConstantFieldsInCountCheckbox().get(), - this, - "m_countConstantFields" - ); - final CheckBox considerCheckBox = new CheckBox( - InspectionGadgetsLocalize.fieldCountInspectionStaticFinalFieldsCountAsConstantCheckbox().get(), - this, - "m_considerStaticFinalFieldsConstant" - ); - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.weightx = 0.0; - constraints.weighty = 0.0; - constraints.insets.right = UIUtil.DEFAULT_HGAP; - constraints.anchor = GridBagConstraints.WEST; - constraints.fill = GridBagConstraints.NONE; - final JPanel panel = new JPanel(new GridBagLayout()); - panel.add(label, constraints); - constraints.gridx = 1; - constraints.gridy = 0; - constraints.gridwidth = 1; - constraints.weightx = 1.0; - constraints.insets.right = 0; - constraints.anchor = GridBagConstraints.NORTHWEST; - constraints.fill = GridBagConstraints.NONE; - panel.add(valueField, constraints); - constraints.gridx = 0; - constraints.gridy = 1; - constraints.gridwidth = 2; - constraints.weightx = 1.0; - constraints.anchor = GridBagConstraints.NORTHWEST; - constraints.fill = GridBagConstraints.NONE; - panel.add(includeCheckBox, constraints); - constraints.gridy = 2; - constraints.weighty = 1; - panel.add(considerCheckBox, constraints); - return panel; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new FieldCountVisitor(); - } - - private class FieldCountVisitor extends BaseInspectionVisitor { + @Override + protected String getConfigurationLabel() { + return InspectionGadgetsLocalize.tooManyFieldsCountLimitOption().get(); + } + + @Override + public JComponent createOptionsPanel() { + final String configurationLabel = getConfigurationLabel(); + final JLabel label = new JLabel(configurationLabel); + final JFormattedTextField valueField = prepareNumberEditor(() -> m_limit, i -> m_limit = i); + + final CheckBox includeCheckBox = new CheckBox( + InspectionGadgetsLocalize.fieldCountInspectionIncludeConstantFieldsInCountCheckbox().get(), + this, + "m_countConstantFields" + ); + final CheckBox considerCheckBox = new CheckBox( + InspectionGadgetsLocalize.fieldCountInspectionStaticFinalFieldsCountAsConstantCheckbox().get(), + this, + "m_considerStaticFinalFieldsConstant" + ); + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.weightx = 0.0; + constraints.weighty = 0.0; + constraints.insets.right = UIUtil.DEFAULT_HGAP; + constraints.anchor = GridBagConstraints.WEST; + constraints.fill = GridBagConstraints.NONE; + final JPanel panel = new JPanel(new GridBagLayout()); + panel.add(label, constraints); + constraints.gridx = 1; + constraints.gridy = 0; + constraints.gridwidth = 1; + constraints.weightx = 1.0; + constraints.insets.right = 0; + constraints.anchor = GridBagConstraints.NORTHWEST; + constraints.fill = GridBagConstraints.NONE; + panel.add(valueField, constraints); + constraints.gridx = 0; + constraints.gridy = 1; + constraints.gridwidth = 2; + constraints.weightx = 1.0; + constraints.anchor = GridBagConstraints.NORTHWEST; + constraints.fill = GridBagConstraints.NONE; + panel.add(includeCheckBox, constraints); + constraints.gridy = 2; + constraints.weighty = 1; + panel.add(considerCheckBox, constraints); + return panel; + } @Override - public void visitClass(@Nonnull PsiClass aClass) { - // note: no call to super - final int totalFields = countFields(aClass); - if (totalFields <= getLimit()) { - return; - } - registerClassError(aClass, Integer.valueOf(totalFields)); + public BaseInspectionVisitor buildVisitor() { + return new FieldCountVisitor(); } - private int countFields(PsiClass aClass) { - int totalFields = 0; - final PsiField[] fields = aClass.getFields(); - for (final PsiField field : fields) { - if (m_countConstantFields) { - totalFields++; + private class FieldCountVisitor extends BaseInspectionVisitor { + + @Override + public void visitClass(@Nonnull PsiClass aClass) { + // note: no call to super + final int totalFields = countFields(aClass); + if (totalFields <= getLimit()) { + return; + } + registerClassError(aClass, Integer.valueOf(totalFields)); } - else { - if (!fieldIsConstant(field)) { - totalFields++; - } + + private int countFields(PsiClass aClass) { + int totalFields = 0; + final PsiField[] fields = aClass.getFields(); + for (final PsiField field : fields) { + if (m_countConstantFields) { + totalFields++; + } + else { + if (!fieldIsConstant(field)) { + totalFields++; + } + } + } + return totalFields; } - } - return totalFields; - } - private boolean fieldIsConstant(PsiField field) { - if (!field.hasModifierProperty(PsiModifier.STATIC)) { - return false; - } - if (!field.hasModifierProperty(PsiModifier.FINAL)) { - return false; - } - if (m_considerStaticFinalFieldsConstant) { - return true; - } - final PsiType type = field.getType(); - return ClassUtils.isImmutable(type); + private boolean fieldIsConstant(PsiField field) { + if (!field.hasModifierProperty(PsiModifier.STATIC)) { + return false; + } + if (!field.hasModifierProperty(PsiModifier.FINAL)) { + return false; + } + if (m_considerStaticFinalFieldsConstant) { + return true; + } + final PsiType type = field.getType(); + return ClassUtils.isImmutable(type); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/MethodCountInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/MethodCountInspection.java index a1d076f710..5f43bbf090 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/MethodCountInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classmetrics/MethodCountInspection.java @@ -23,109 +23,111 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.deadCodeNotWorking.impl.CheckBox; +import consulo.localize.LocalizeValue; import consulo.ui.ex.awt.UIUtil; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; import java.awt.*; @ExtensionImpl public class MethodCountInspection extends BaseInspection { + private static final int DEFAULT_METHOD_COUNT_LIMIT = 20; - private static final int DEFAULT_METHOD_COUNT_LIMIT = 20; - - @SuppressWarnings({"PublicField"}) - public int m_limit = DEFAULT_METHOD_COUNT_LIMIT; - - @SuppressWarnings({"PublicField"}) - public boolean ignoreGettersAndSetters = false; - - @Override - @Nonnull - public String getID() { - return "ClassWithTooManyMethods"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.tooManyMethodsDisplayName().get(); - } - - @Override - public JComponent createOptionsPanel() { - final JComponent panel = new JPanel(new GridBagLayout()); - final Component label = new JLabel(InspectionGadgetsLocalize.methodCountLimitOption().get()); - final JFormattedTextField valueField = prepareNumberEditor(() -> m_limit, i -> m_limit = i); - - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.insets.right = UIUtil.DEFAULT_HGAP; - constraints.anchor = GridBagConstraints.WEST; - panel.add(label, constraints); - constraints.gridx = 1; - constraints.weightx = 1.0; - constraints.insets.right = 0; - panel.add(valueField, constraints); - - final CheckBox gettersSettersCheckBox = new CheckBox( - InspectionGadgetsLocalize.methodCountIgnoreGettersSettersOption().get(), - this, - "ignoreGettersAndSetters" - ); - - constraints.gridx = 0; - constraints.gridy = 1; - constraints.weighty = 1.0; - constraints.gridwidth = 2; - constraints.anchor = GridBagConstraints.NORTHWEST; - panel.add(gettersSettersCheckBox, constraints); - - return panel; - } - - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final Integer count = (Integer)infos[0]; - return InspectionGadgetsLocalize.tooManyMethodsProblemDescriptor(count).get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new MethodCountVisitor(); - } - - private class MethodCountVisitor extends BaseInspectionVisitor { + @SuppressWarnings({"PublicField"}) + public int m_limit = DEFAULT_METHOD_COUNT_LIMIT; + + @SuppressWarnings({"PublicField"}) + public boolean ignoreGettersAndSetters = false; + + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "ClassWithTooManyMethods"; + } + + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.tooManyMethodsDisplayName(); + } + + @Override + public JComponent createOptionsPanel() { + final JComponent panel = new JPanel(new GridBagLayout()); + final Component label = new JLabel(InspectionGadgetsLocalize.methodCountLimitOption().get()); + final JFormattedTextField valueField = prepareNumberEditor(() -> m_limit, i -> m_limit = i); + + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.insets.right = UIUtil.DEFAULT_HGAP; + constraints.anchor = GridBagConstraints.WEST; + panel.add(label, constraints); + constraints.gridx = 1; + constraints.weightx = 1.0; + constraints.insets.right = 0; + panel.add(valueField, constraints); + + final CheckBox gettersSettersCheckBox = new CheckBox( + InspectionGadgetsLocalize.methodCountIgnoreGettersSettersOption().get(), + this, + "ignoreGettersAndSetters" + ); + + constraints.gridx = 0; + constraints.gridy = 1; + constraints.weighty = 1.0; + constraints.gridwidth = 2; + constraints.anchor = GridBagConstraints.NORTHWEST; + panel.add(gettersSettersCheckBox, constraints); + + return panel; + } + + + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final Integer count = (Integer) infos[0]; + return InspectionGadgetsLocalize.tooManyMethodsProblemDescriptor(count).get(); + } @Override - public void visitClass(@Nonnull PsiClass aClass) { - // note: no call to super - final int methodCount = calculateTotalMethodCount(aClass); - if (methodCount <= m_limit) { - return; - } - registerClassError(aClass, Integer.valueOf(methodCount)); + public BaseInspectionVisitor buildVisitor() { + return new MethodCountVisitor(); } - private int calculateTotalMethodCount(PsiClass aClass) { - final PsiMethod[] methods = aClass.getMethods(); - int totalCount = 0; - for (final PsiMethod method : methods) { - if (method.isConstructor()) { - continue; + private class MethodCountVisitor extends BaseInspectionVisitor { + + @Override + public void visitClass(@Nonnull PsiClass aClass) { + // note: no call to super + final int methodCount = calculateTotalMethodCount(aClass); + if (methodCount <= m_limit) { + return; + } + registerClassError(aClass, Integer.valueOf(methodCount)); } - if (ignoreGettersAndSetters) { - if (PropertyUtil.isSimpleGetter(method) || - PropertyUtil.isSimpleSetter(method)) { - continue; - } + + private int calculateTotalMethodCount(PsiClass aClass) { + final PsiMethod[] methods = aClass.getMethods(); + int totalCount = 0; + for (final PsiMethod method : methods) { + if (method.isConstructor()) { + continue; + } + if (ignoreGettersAndSetters) { + if (PropertyUtil.isSimpleGetter(method) || + PropertyUtil.isSimpleSetter(method)) { + continue; + } + } + totalCount++; + } + return totalCount; } - totalCount++; - } - return totalCount; } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneCallsConstructorsInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneCallsConstructorsInspection.java index e207b82d11..281f00b48e 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneCallsConstructorsInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneCallsConstructorsInspection.java @@ -22,61 +22,65 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class CloneCallsConstructorsInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.cloneInstantiatesObjectsWithConstructorDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.cloneInstantiatesObjectsWithConstructorDisplayName().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.cloneInstantiatesObjectsWithConstructorProblemDescriptor().get(); + } - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.cloneInstantiatesObjectsWithConstructorProblemDescriptor().get(); - } + public BaseInspectionVisitor buildVisitor() { + return new CloneCallsConstructorVisitor(); + } - public BaseInspectionVisitor buildVisitor() { - return new CloneCallsConstructorVisitor(); - } + private static class CloneCallsConstructorVisitor + extends BaseInspectionVisitor { - private static class CloneCallsConstructorVisitor - extends BaseInspectionVisitor { + @Override + public void visitMethod(@Nonnull PsiMethod method) { + final String methodName = method.getName(); + final PsiParameterList parameterList = method.getParameterList(); + final boolean isClone = + HardcodedMethodConstants.CLONE.equals(methodName) && + parameterList.getParametersCount() == 0; + if (isClone) { + method.accept(new JavaRecursiveElementVisitor() { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - final String methodName = method.getName(); - final PsiParameterList parameterList = method.getParameterList(); - final boolean isClone = - HardcodedMethodConstants.CLONE.equals(methodName) && - parameterList.getParametersCount() == 0; - if (isClone) { - method.accept(new JavaRecursiveElementVisitor() { - - @Override - public void visitNewExpression( - @Nonnull PsiNewExpression newExpression) { - super.visitNewExpression(newExpression); - final PsiExpression[] arrayDimensions = - newExpression.getArrayDimensions(); - if (arrayDimensions.length != 0) { - return; - } - if (newExpression.getArrayInitializer() != null) { - return; - } - if (newExpression.getAnonymousClass() != null) { - return; - } - if (PsiTreeUtil.getParentOfType(newExpression, - PsiThrowStatement.class) != null) { - return; + @Override + public void visitNewExpression( + @Nonnull PsiNewExpression newExpression + ) { + super.visitNewExpression(newExpression); + final PsiExpression[] arrayDimensions = + newExpression.getArrayDimensions(); + if (arrayDimensions.length != 0) { + return; + } + if (newExpression.getArrayInitializer() != null) { + return; + } + if (newExpression.getAnonymousClass() != null) { + return; + } + if (PsiTreeUtil.getParentOfType( + newExpression, + PsiThrowStatement.class + ) != null) { + return; + } + registerError(newExpression); + } + }); } - registerError(newExpression); - } - }); - } + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneCallsSuperCloneInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneCallsSuperCloneInspection.java index 32b20054d8..1a088395a5 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneCallsSuperCloneInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneCallsSuperCloneInspection.java @@ -18,26 +18,28 @@ import com.intellij.java.language.psi.PsiClass; import com.intellij.java.language.psi.PsiMethod; import com.intellij.java.language.psi.PsiModifier; -import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.psiutils.CloneUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl public class CloneCallsSuperCloneInspection extends BaseInspection { @Nonnull @Override + @Pattern(VALID_ID_PATTERN) public String getID() { return "CloneDoesntCallSuperClone"; } @Nonnull @Override - public String getDisplayName() { - return InspectionGadgetsLocalize.cloneDoesntCallSuperCloneDisplayName().get(); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.cloneDoesntCallSuperCloneDisplayName(); } @Nonnull diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneDeclaresCloneNotSupportedInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneDeclaresCloneNotSupportedInspection.java index 225ea4fad0..9a114b5656 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneDeclaresCloneNotSupportedInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneDeclaresCloneNotSupportedInspection.java @@ -31,90 +31,91 @@ import consulo.language.editor.inspection.ProblemDescriptor; import consulo.language.psi.PsiElement; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl public class CloneDeclaresCloneNotSupportedInspection extends BaseInspection { + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "CloneDoesntDeclareCloneNotSupportedException"; + } - @Override - @Nonnull - public String getID() { - return "CloneDoesntDeclareCloneNotSupportedException"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.cloneDoesntDeclareClonenotsupportedexceptionDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.cloneDoesntDeclareClonenotsupportedexceptionProblemDescriptor().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new CloneDeclaresCloneNotSupportedInspectionFix(); - } - - private static class CloneDeclaresCloneNotSupportedInspectionFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.cloneDoesntDeclareClonenotsupportedexceptionDisplayName(); + } @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.cloneDoesntDeclareClonenotsupportedexceptionDeclareQuickfix().get(); + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.cloneDoesntDeclareClonenotsupportedexceptionProblemDescriptor().get(); } @Override - public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement methodNameIdentifier = descriptor.getPsiElement(); - final PsiMethod method = (PsiMethod)methodNameIdentifier.getParent(); - PsiUtil.addException(method, "java.lang.CloneNotSupportedException"); + public boolean isEnabledByDefault() { + return true; } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new CloneDeclaresCloneNotSupportedExceptionVisitor(); - } + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + return new CloneDeclaresCloneNotSupportedInspectionFix(); + } - private static class CloneDeclaresCloneNotSupportedExceptionVisitor extends BaseInspectionVisitor { + private static class CloneDeclaresCloneNotSupportedInspectionFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.cloneDoesntDeclareClonenotsupportedexceptionDeclareQuickfix(); + } + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement methodNameIdentifier = descriptor.getPsiElement(); + final PsiMethod method = (PsiMethod) methodNameIdentifier.getParent(); + PsiUtil.addException(method, "java.lang.CloneNotSupportedException"); + } + } @Override - public void visitMethod(@Nonnull PsiMethod method) { - if (!CloneUtils.isClone(method)) { - return; - } - if (method.hasModifierProperty(PsiModifier.FINAL)) { - return; - } - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null) { - return; - } - if (containingClass.hasModifierProperty(PsiModifier.FINAL)) { - return; - } - if (MethodUtils.hasInThrows(method, "java.lang.CloneNotSupportedException")) { - return; - } - final MethodSignatureBackedByPsiMethod signature = SuperMethodsSearch.search(method, null, true, false).findFirst(); - if (signature == null) { - return; - } - final PsiMethod superMethod = signature.getMethod(); - if (!MethodUtils.hasInThrows(superMethod, "java.lang.CloneNotSupportedException")) { - return; - } - registerMethodError(method); + public BaseInspectionVisitor buildVisitor() { + return new CloneDeclaresCloneNotSupportedExceptionVisitor(); + } + + private static class CloneDeclaresCloneNotSupportedExceptionVisitor extends BaseInspectionVisitor { + + @Override + public void visitMethod(@Nonnull PsiMethod method) { + if (!CloneUtils.isClone(method)) { + return; + } + if (method.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) { + return; + } + if (containingClass.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + if (MethodUtils.hasInThrows(method, "java.lang.CloneNotSupportedException")) { + return; + } + final MethodSignatureBackedByPsiMethod signature = SuperMethodsSearch.search(method, null, true, false).findFirst(); + if (signature == null) { + return; + } + final PsiMethod superMethod = signature.getMethod(); + if (!MethodUtils.hasInThrows(superMethod, "java.lang.CloneNotSupportedException")) { + return; + } + registerMethodError(method); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneInNonCloneableClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneInNonCloneableClassInspection.java index 63b0febac7..d358d16f9c 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneInNonCloneableClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneInNonCloneableClassInspection.java @@ -24,52 +24,52 @@ import com.siyeh.ig.psiutils.CloneUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class CloneInNonCloneableClassInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.cloneMethodInNonCloneableClassDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.cloneMethodInNonCloneableClassDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final PsiClass aClass = (PsiClass)infos[0]; - final String className = aClass.getName(); - return aClass.isInterface() - ? InspectionGadgetsLocalize.cloneMethodInNonCloneableInterfaceProblemDescriptor(className).get() - : InspectionGadgetsLocalize.cloneMethodInNonCloneableClassProblemDescriptor(className).get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final PsiClass aClass = (PsiClass) infos[0]; + final String className = aClass.getName(); + return aClass.isInterface() + ? InspectionGadgetsLocalize.cloneMethodInNonCloneableInterfaceProblemDescriptor(className).get() + : InspectionGadgetsLocalize.cloneMethodInNonCloneableClassProblemDescriptor(className).get(); + } - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiClass aClass = (PsiClass)infos[0]; - return new MakeCloneableFix(aClass.isInterface()); - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiClass aClass = (PsiClass) infos[0]; + return new MakeCloneableFix(aClass.isInterface()); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new CloneInNonCloneableClassVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new CloneInNonCloneableClassVisitor(); + } - private static class CloneInNonCloneableClassVisitor - extends BaseInspectionVisitor { + private static class CloneInNonCloneableClassVisitor + extends BaseInspectionVisitor { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - if (!CloneUtils.isClone(method)) { - return; - } - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null || - CloneUtils.isCloneable(containingClass)) { - return; - } - registerMethodError(method, containingClass); + @Override + public void visitMethod(@Nonnull PsiMethod method) { + if (!CloneUtils.isClone(method)) { + return; + } + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null || + CloneUtils.isCloneable(containingClass)) { + return; + } + registerMethodError(method, containingClass); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneableImplementsCloneInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneableImplementsCloneInspection.java index 4a97497359..fd2602f581 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneableImplementsCloneInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/cloneable/CloneableImplementsCloneInspection.java @@ -29,102 +29,103 @@ import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; @ExtensionImpl public class CloneableImplementsCloneInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean m_ignoreCloneableDueToInheritance = false; - /** - * @noinspection PublicField - */ - public boolean m_ignoreCloneableDueToInheritance = false; - - @Override - @Nonnull - public String getID() { - return "CloneableClassWithoutClone"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.cloneableClassWithoutCloneDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.cloneableClassWithoutCloneProblemDescriptor().get(); - } - - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.cloneableClassWithoutCloneIgnoreOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "m_ignoreCloneableDueToInheritance"); - } + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "CloneableClassWithoutClone"; + } - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new CreateCloneMethodFix(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.cloneableClassWithoutCloneDisplayName(); + } - private static class CreateCloneMethodFix extends InspectionGadgetsFix { + @Override @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.cloneableClassWithoutCloneProblemDescriptor().get(); + } + @Override - public String getName() { - return InspectionGadgetsLocalize.cloneableClassWithoutCloneQuickfix().get(); + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.cloneableClassWithoutCloneIgnoreOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "m_ignoreCloneableDueToInheritance"); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiElement parent = element.getParent(); - if (!(parent instanceof PsiClass)) { - return; - } - final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); - final StringBuilder cloneMethod = new StringBuilder("public "); - cloneMethod.append(element.getText()); - cloneMethod.append(" clone() throws java.lang.CloneNotSupportedException {\nreturn ("); - cloneMethod.append(element.getText()); - cloneMethod.append(") super.clone();\n}"); - final PsiMethod method = factory.createMethodFromText(cloneMethod.toString(), element); - parent.add(method); + protected InspectionGadgetsFix buildFix(Object... infos) { + return new CreateCloneMethodFix(); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new CloneableImplementsCloneVisitor(); - } + private static class CreateCloneMethodFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.cloneableClassWithoutCloneQuickfix(); + } - private class CloneableImplementsCloneVisitor extends BaseInspectionVisitor { + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiElement parent = element.getParent(); + if (!(parent instanceof PsiClass)) { + return; + } + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); + final StringBuilder cloneMethod = new StringBuilder("public "); + cloneMethod.append(element.getText()); + cloneMethod.append(" clone() throws java.lang.CloneNotSupportedException {\nreturn ("); + cloneMethod.append(element.getText()); + cloneMethod.append(") super.clone();\n}"); + final PsiMethod method = factory.createMethodFromText(cloneMethod.toString(), element); + parent.add(method); + } + } @Override - public void visitClass(@Nonnull PsiClass aClass) { - // no call to super, so it doesn't drill down - if (aClass.isInterface() || aClass.isAnnotationType() || aClass.isEnum()) { - return; - } - if (aClass instanceof PsiTypeParameter) { - return; - } - if (m_ignoreCloneableDueToInheritance) { - if (!CloneUtils.isDirectlyCloneable(aClass)) { - return; - } - } - else if (!CloneUtils.isCloneable(aClass)) { - return; - } - final PsiMethod[] methods = aClass.getMethods(); - for (final PsiMethod method : methods) { - if (CloneUtils.isClone(method)) { - return; + public BaseInspectionVisitor buildVisitor() { + return new CloneableImplementsCloneVisitor(); + } + + private class CloneableImplementsCloneVisitor extends BaseInspectionVisitor { + + @Override + public void visitClass(@Nonnull PsiClass aClass) { + // no call to super, so it doesn't drill down + if (aClass.isInterface() || aClass.isAnnotationType() || aClass.isEnum()) { + return; + } + if (aClass instanceof PsiTypeParameter) { + return; + } + if (m_ignoreCloneableDueToInheritance) { + if (!CloneUtils.isDirectlyCloneable(aClass)) { + return; + } + } + else if (!CloneUtils.isCloneable(aClass)) { + return; + } + final PsiMethod[] methods = aClass.getMethods(); + for (final PsiMethod method : methods) { + if (CloneUtils.isClone(method)) { + return; + } + } + registerClassError(aClass); } - } - registerClassError(aClass); } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/BreakStatementInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/BreakStatementInspection.java index 53f1e25113..ab0fd662ea 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/BreakStatementInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/BreakStatementInspection.java @@ -19,66 +19,69 @@ import com.intellij.java.language.psi.PsiBreakStatement; import com.intellij.java.language.psi.PsiCodeBlock; import com.intellij.java.language.psi.PsiSwitchStatement; +import com.siyeh.ig.BaseInspection; +import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; -import consulo.language.psi.*; +import consulo.language.psi.PsiElement; import consulo.language.psi.util.PsiTreeUtil; -import com.siyeh.InspectionGadgetsBundle; -import com.siyeh.ig.BaseInspection; -import com.siyeh.ig.BaseInspectionVisitor; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class BreakStatementInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.breakStatementDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.breakStatementDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.statementProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.statementProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new BreakStatementVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new BreakStatementVisitor(); + } - private static class BreakStatementVisitor - extends BaseInspectionVisitor { + private static class BreakStatementVisitor + extends BaseInspectionVisitor { - @Override - public void visitBreakStatement(@Nonnull PsiBreakStatement statement) { - super.visitBreakStatement(statement); - final PsiSwitchStatement switchStatement = - PsiTreeUtil.getParentOfType(statement, - PsiSwitchStatement.class); - if (switchStatement != null && isTopLevelBreakInSwitch(statement)) { - return; - } - registerStatementError(statement); - } + @Override + public void visitBreakStatement(@Nonnull PsiBreakStatement statement) { + super.visitBreakStatement(statement); + final PsiSwitchStatement switchStatement = + PsiTreeUtil.getParentOfType( + statement, + PsiSwitchStatement.class + ); + if (switchStatement != null && isTopLevelBreakInSwitch(statement)) { + return; + } + registerStatementError(statement); + } - private static boolean isTopLevelBreakInSwitch( - PsiBreakStatement statement) { - final PsiElement parent = statement.getParent(); - if (!(parent instanceof PsiCodeBlock)) { - return false; - } - final PsiElement parentsParent = parent.getParent(); - if (parentsParent instanceof PsiSwitchStatement) { - return true; - } - if (!(parentsParent instanceof PsiBlockStatement)) { - return false; - } - final PsiElement blocksParent = parentsParent.getParent(); - if (!(blocksParent instanceof PsiCodeBlock)) { - return false; - } - final PsiElement blocksParentsParent = blocksParent.getParent(); - return blocksParentsParent instanceof PsiSwitchStatement; + private static boolean isTopLevelBreakInSwitch( + PsiBreakStatement statement + ) { + final PsiElement parent = statement.getParent(); + if (!(parent instanceof PsiCodeBlock)) { + return false; + } + final PsiElement parentsParent = parent.getParent(); + if (parentsParent instanceof PsiSwitchStatement) { + return true; + } + if (!(parentsParent instanceof PsiBlockStatement)) { + return false; + } + final PsiElement blocksParent = parentsParent.getParent(); + if (!(blocksParent instanceof PsiCodeBlock)) { + return false; + } + final PsiElement blocksParentsParent = blocksParent.getParent(); + return blocksParentsParent instanceof PsiSwitchStatement; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/BreakStatementWithLabelInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/BreakStatementWithLabelInspection.java index a4763cbf84..bd245a1eec 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/BreakStatementWithLabelInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/BreakStatementWithLabelInspection.java @@ -21,45 +21,46 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class BreakStatementWithLabelInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.breakStatementWithLabelDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.breakStatementWithLabelDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.breakStatementWithLabelProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.breakStatementWithLabelProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new BreakStatementWithLabelVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new BreakStatementWithLabelVisitor(); + } - private static class BreakStatementWithLabelVisitor - extends BaseInspectionVisitor { + private static class BreakStatementWithLabelVisitor + extends BaseInspectionVisitor { - @Override - public void visitBreakStatement(@Nonnull PsiBreakStatement statement) { - super.visitBreakStatement(statement); - final PsiIdentifier labelIdentifier = - statement.getLabelIdentifier(); - if (labelIdentifier == null) { - return; - } + @Override + public void visitBreakStatement(@Nonnull PsiBreakStatement statement) { + super.visitBreakStatement(statement); + final PsiIdentifier labelIdentifier = + statement.getLabelIdentifier(); + if (labelIdentifier == null) { + return; + } - final String labelText = labelIdentifier.getText(); - if (labelText == null) { - return; - } - if (labelText.length() == 0) { - return; - } - registerStatementError(statement); + final String labelText = labelIdentifier.getText(); + if (labelText == null) { + return; + } + if (labelText.length() == 0) { + return; + } + registerStatementError(statement); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ConditionalExpressionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ConditionalExpressionInspection.java index 0024d79c6a..72eed3cb48 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ConditionalExpressionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ConditionalExpressionInspection.java @@ -29,52 +29,52 @@ @ExtensionImpl public class ConditionalExpressionInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean ignoreSimpleAssignmentsAndReturns = false; - @SuppressWarnings({"PublicField"}) - public boolean ignoreSimpleAssignmentsAndReturns = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.conditionalExpressionDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.conditionalExpressionDisplayName(); + } - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.conditionalExpressionProblemDescriptor().get(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.conditionalExpressionProblemDescriptor().get(); + } - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.conditionalExpressionOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreSimpleAssignmentsAndReturns"); - } + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.conditionalExpressionOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreSimpleAssignmentsAndReturns"); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new ConditionalExpressionVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new ConditionalExpressionVisitor(); + } - private class ConditionalExpressionVisitor - extends BaseInspectionVisitor { + private class ConditionalExpressionVisitor + extends BaseInspectionVisitor { - @Override - public void visitConditionalExpression( - PsiConditionalExpression expression) { - super.visitConditionalExpression(expression); - if (ignoreSimpleAssignmentsAndReturns) { - PsiElement parent = expression.getParent(); - while (parent instanceof PsiParenthesizedExpression) { - parent = parent.getParent(); - } - if (parent instanceof PsiAssignmentExpression || - parent instanceof PsiReturnStatement || - parent instanceof PsiLocalVariable) { - return; + @Override + public void visitConditionalExpression( + PsiConditionalExpression expression + ) { + super.visitConditionalExpression(expression); + if (ignoreSimpleAssignmentsAndReturns) { + PsiElement parent = expression.getParent(); + while (parent instanceof PsiParenthesizedExpression) { + parent = parent.getParent(); + } + if (parent instanceof PsiAssignmentExpression || + parent instanceof PsiReturnStatement || + parent instanceof PsiLocalVariable) { + return; + } + } + registerError(expression); } - } - registerError(expression); } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ConstantConditionalExpressionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ConstantConditionalExpressionInspection.java index d5072e1cd1..91316dbb52 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ConstantConditionalExpressionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ConstantConditionalExpressionInspection.java @@ -25,88 +25,88 @@ import consulo.annotation.component.ExtensionImpl; import consulo.language.editor.inspection.ProblemDescriptor; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; @ExtensionImpl -public class ConstantConditionalExpressionInspection - extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.constantConditionalExpressionDisplayName().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } +public class ConstantConditionalExpressionInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.constantConditionalExpressionDisplayName(); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final PsiConditionalExpression expression = (PsiConditionalExpression)infos[0]; - return InspectionGadgetsLocalize.constantConditionalExpressionProblemDescriptor(calculateReplacementExpression(expression)).get(); - } + @Override + public boolean isEnabledByDefault() { + return true; + } - static String calculateReplacementExpression( - PsiConditionalExpression exp) { - final PsiExpression thenExpression = exp.getThenExpression(); - final PsiExpression elseExpression = exp.getElseExpression(); - final PsiExpression condition = exp.getCondition(); - assert thenExpression != null; - assert elseExpression != null; - if (BoolUtils.isTrue(condition)) { - return thenExpression.getText(); + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final PsiConditionalExpression expression = (PsiConditionalExpression) infos[0]; + return InspectionGadgetsLocalize.constantConditionalExpressionProblemDescriptor(calculateReplacementExpression(expression)).get(); } - else { - return elseExpression.getText(); + + static String calculateReplacementExpression( + PsiConditionalExpression exp + ) { + final PsiExpression thenExpression = exp.getThenExpression(); + final PsiExpression elseExpression = exp.getElseExpression(); + final PsiExpression condition = exp.getCondition(); + assert thenExpression != null; + assert elseExpression != null; + if (BoolUtils.isTrue(condition)) { + return thenExpression.getText(); + } + else { + return elseExpression.getText(); + } } - } - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new ConstantConditionalFix(); - } + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + return new ConstantConditionalFix(); + } - private static class ConstantConditionalFix extends InspectionGadgetsFix { + private static class ConstantConditionalFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix(); + } - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix().get(); + @Override + public void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiConditionalExpression expression = (PsiConditionalExpression) descriptor.getPsiElement(); + final String newExpression = calculateReplacementExpression(expression); + replaceExpression(expression, newExpression); + } } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiConditionalExpression expression = (PsiConditionalExpression)descriptor.getPsiElement(); - final String newExpression = calculateReplacementExpression(expression); - replaceExpression(expression, newExpression); + public BaseInspectionVisitor buildVisitor() { + return new ConstantConditionalExpressionVisitor(); } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ConstantConditionalExpressionVisitor(); - } - private static class ConstantConditionalExpressionVisitor extends BaseInspectionVisitor { - @Override - public void visitConditionalExpression(PsiConditionalExpression expression) { - super.visitConditionalExpression(expression); - final PsiExpression condition = expression.getCondition(); - final PsiExpression thenExpression = expression.getThenExpression(); - if (thenExpression == null) { - return; - } - final PsiExpression elseExpression = expression.getElseExpression(); - if (elseExpression == null) { - return; - } - if (BoolUtils.isFalse(condition) || BoolUtils.isTrue(condition)) { - registerError(expression, expression); - } + private static class ConstantConditionalExpressionVisitor extends BaseInspectionVisitor { + @Override + public void visitConditionalExpression(PsiConditionalExpression expression) { + super.visitConditionalExpression(expression); + final PsiExpression condition = expression.getCondition(); + final PsiExpression thenExpression = expression.getThenExpression(); + if (thenExpression == null) { + return; + } + final PsiExpression elseExpression = expression.getElseExpression(); + if (elseExpression == null) { + return; + } + if (BoolUtils.isFalse(condition) || BoolUtils.isTrue(condition)) { + registerError(expression, expression); + } + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ConstantIfStatementInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ConstantIfStatementInspection.java index 5dfcccf840..962d0089f4 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ConstantIfStatementInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ConstantIfStatementInspection.java @@ -28,131 +28,134 @@ import consulo.language.psi.PsiElement; import consulo.language.psi.util.PsiTreeUtil; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; @ExtensionImpl public class ConstantIfStatementInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.constantIfStatementDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.constantIfStatementDisplayName().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.constantIfStatementProblemDescriptor().get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ConstantIfStatementVisitor(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - //if (PsiUtil.isInJspFile(location)) { - // return null; - //} - return new ConstantIfStatementFix(); - } - - private static class ConstantIfStatementFix extends InspectionGadgetsFix { + @Override + public boolean isEnabledByDefault() { + return true; + } + @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix().get(); + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.constantIfStatementProblemDescriptor().get(); } - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement ifKeyword = descriptor.getPsiElement(); - final PsiIfStatement statement = (PsiIfStatement)ifKeyword.getParent(); - assert statement != null; - final PsiStatement thenBranch = statement.getThenBranch(); - final PsiStatement elseBranch = statement.getElseBranch(); - final PsiExpression condition = statement.getCondition(); - if (BoolUtils.isFalse(condition)) { - if (elseBranch != null) { - replaceStatementWithUnwrapping(elseBranch, statement); - } - else { - deleteElement(statement); - } - } - else { - replaceStatementWithUnwrapping(thenBranch, statement); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new ConstantIfStatementVisitor(); + } + + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + //if (PsiUtil.isInJspFile(location)) { + // return null; + //} + return new ConstantIfStatementFix(); } - private static void replaceStatementWithUnwrapping(PsiStatement branch, PsiIfStatement statement) throws IncorrectOperationException { - if (branch instanceof PsiBlockStatement && !(statement.getParent() instanceof PsiIfStatement)) { - final PsiCodeBlock parentBlock = PsiTreeUtil.getParentOfType(branch, PsiCodeBlock.class); - if (parentBlock == null) { - final String elseText = branch.getText(); - replaceStatement(statement, elseText); - return; + private static class ConstantIfStatementFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix(); } - final PsiCodeBlock block = ((PsiBlockStatement)branch).getCodeBlock(); - final boolean hasConflicts = VariableSearchUtils.containsConflictingDeclarations(block, parentBlock); - if (hasConflicts) { - final String elseText = branch.getText(); - replaceStatement(statement, elseText); + + public void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement ifKeyword = descriptor.getPsiElement(); + final PsiIfStatement statement = (PsiIfStatement) ifKeyword.getParent(); + assert statement != null; + final PsiStatement thenBranch = statement.getThenBranch(); + final PsiStatement elseBranch = statement.getElseBranch(); + final PsiExpression condition = statement.getCondition(); + if (BoolUtils.isFalse(condition)) { + if (elseBranch != null) { + replaceStatementWithUnwrapping(elseBranch, statement); + } + else { + deleteElement(statement); + } + } + else { + replaceStatementWithUnwrapping(thenBranch, statement); + } } - else { - final PsiElement containingElement = statement.getParent(); - final PsiStatement[] statements = block.getStatements(); - if (statements.length > 0) { - assert containingElement != null; - final PsiJavaToken lBrace = block.getLBrace(); - final PsiJavaToken rBrace = block.getRBrace(); - PsiElement added = null; - if (lBrace != null && rBrace != null) { - final PsiElement firstNonBrace = lBrace.getNextSibling(); - final PsiElement lastNonBrace = rBrace.getPrevSibling(); - if (firstNonBrace != null && lastNonBrace != null) { - added = containingElement.addRangeBefore(firstNonBrace, lastNonBrace, statement); - } + + private static void replaceStatementWithUnwrapping( + PsiStatement branch, + PsiIfStatement statement + ) throws IncorrectOperationException { + if (branch instanceof PsiBlockStatement && !(statement.getParent() instanceof PsiIfStatement)) { + final PsiCodeBlock parentBlock = PsiTreeUtil.getParentOfType(branch, PsiCodeBlock.class); + if (parentBlock == null) { + final String elseText = branch.getText(); + replaceStatement(statement, elseText); + return; + } + final PsiCodeBlock block = ((PsiBlockStatement) branch).getCodeBlock(); + final boolean hasConflicts = VariableSearchUtils.containsConflictingDeclarations(block, parentBlock); + if (hasConflicts) { + final String elseText = branch.getText(); + replaceStatement(statement, elseText); + } + else { + final PsiElement containingElement = statement.getParent(); + final PsiStatement[] statements = block.getStatements(); + if (statements.length > 0) { + assert containingElement != null; + final PsiJavaToken lBrace = block.getLBrace(); + final PsiJavaToken rBrace = block.getRBrace(); + PsiElement added = null; + if (lBrace != null && rBrace != null) { + final PsiElement firstNonBrace = lBrace.getNextSibling(); + final PsiElement lastNonBrace = rBrace.getPrevSibling(); + if (firstNonBrace != null && lastNonBrace != null) { + added = containingElement.addRangeBefore(firstNonBrace, lastNonBrace, statement); + } + } + if (added == null) { + added = containingElement.addRangeBefore(statements[0], statements[statements.length - 1], statement); + } + final Project project = statement.getProject(); + final CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(project); + codeStyleManager.reformat(added); + } + statement.delete(); + } } - if (added == null) { - added = containingElement.addRangeBefore(statements[0], statements[statements.length - 1], statement); + else { + final String elseText = branch.getText(); + replaceStatement(statement, elseText); } - final Project project = statement.getProject(); - final CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(project); - codeStyleManager.reformat(added); - } - statement.delete(); } - } - else { - final String elseText = branch.getText(); - replaceStatement(statement, elseText); - } } - } - private static class ConstantIfStatementVisitor extends BaseInspectionVisitor { - @Override - public void visitIfStatement(PsiIfStatement statement) { - super.visitIfStatement(statement); - final PsiExpression condition = statement.getCondition(); - if (condition == null) { - return; - } - final PsiStatement thenBranch = statement.getThenBranch(); - if (thenBranch == null) { - return; - } - if (BoolUtils.isTrue(condition) || BoolUtils.isFalse(condition)) { - registerStatementError(statement); - } + private static class ConstantIfStatementVisitor extends BaseInspectionVisitor { + @Override + public void visitIfStatement(PsiIfStatement statement) { + super.visitIfStatement(statement); + final PsiExpression condition = statement.getCondition(); + if (condition == null) { + return; + } + final PsiStatement thenBranch = statement.getThenBranch(); + if (thenBranch == null) { + return; + } + if (BoolUtils.isTrue(condition) || BoolUtils.isFalse(condition)) { + registerStatementError(statement); + } + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ContinueStatementInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ContinueStatementInspection.java index de35d6f43e..50851b41dd 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ContinueStatementInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ContinueStatementInspection.java @@ -20,30 +20,31 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class ContinueStatementInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.continueStatementDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.continueStatementDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.statementProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.statementProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new ContinueStatementVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new ContinueStatementVisitor(); + } - private static class ContinueStatementVisitor extends BaseInspectionVisitor { - @Override - public void visitContinueStatement(@Nonnull PsiContinueStatement statement) { - super.visitContinueStatement(statement); - registerStatementError(statement); + private static class ContinueStatementVisitor extends BaseInspectionVisitor { + @Override + public void visitContinueStatement(@Nonnull PsiContinueStatement statement) { + super.visitContinueStatement(statement); + registerStatementError(statement); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ContinueStatementWithLabelInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ContinueStatementWithLabelInspection.java index 0b97e8b445..4d5b4fe6ba 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ContinueStatementWithLabelInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ContinueStatementWithLabelInspection.java @@ -21,41 +21,42 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class ContinueStatementWithLabelInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.continueStatementWithLabelDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.continueStatementWithLabelDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.continueStatementWithLabelProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.continueStatementWithLabelProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new ContinueStatementWithLabelVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new ContinueStatementWithLabelVisitor(); + } - private static class ContinueStatementWithLabelVisitor extends BaseInspectionVisitor { - @Override - public void visitContinueStatement(@Nonnull PsiContinueStatement statement) { - super.visitContinueStatement(statement); - final PsiIdentifier label = statement.getLabelIdentifier(); - if (label == null) { - return; - } - final String labelText = label.getText(); - if (labelText == null) { - return; - } - if (labelText.length() == 0) { - return; - } - registerStatementError(statement); + private static class ContinueStatementWithLabelVisitor extends BaseInspectionVisitor { + @Override + public void visitContinueStatement(@Nonnull PsiContinueStatement statement) { + super.visitContinueStatement(statement); + final PsiIdentifier label = statement.getLabelIdentifier(); + if (label == null) { + return; + } + final String labelText = label.getText(); + if (labelText == null) { + return; + } + if (labelText.length() == 0) { + return; + } + registerStatementError(statement); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/DefaultNotLastCaseInSwitchInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/DefaultNotLastCaseInSwitchInspection.java index 14d63f1601..7ec22f28a7 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/DefaultNotLastCaseInSwitchInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/DefaultNotLastCaseInSwitchInspection.java @@ -23,54 +23,56 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class DefaultNotLastCaseInSwitchInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.defaultNotLastCaseInSwitchDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.defaultNotLastCaseInSwitchDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.defaultNotLastCaseInSwitchProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.defaultNotLastCaseInSwitchProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new DefaultNotLastCaseInSwitchVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new DefaultNotLastCaseInSwitchVisitor(); + } - private static class DefaultNotLastCaseInSwitchVisitor - extends BaseInspectionVisitor { + private static class DefaultNotLastCaseInSwitchVisitor + extends BaseInspectionVisitor { - @Override - public void visitSwitchStatement( - @Nonnull PsiSwitchStatement statement) { - super.visitSwitchStatement(statement); - final PsiCodeBlock body = statement.getBody(); - if (body == null) { - return; - } - final PsiStatement[] statements = body.getStatements(); - boolean labelSeen = false; - for (int i = statements.length - 1; i >= 0; i--) { - final PsiStatement child = statements[i]; - if (child instanceof PsiSwitchLabelStatement) { - final PsiSwitchLabelStatement label = - (PsiSwitchLabelStatement)child; - if (label.isDefaultCase()) { - if (labelSeen) { - registerStatementError(label); + @Override + public void visitSwitchStatement( + @Nonnull PsiSwitchStatement statement + ) { + super.visitSwitchStatement(statement); + final PsiCodeBlock body = statement.getBody(); + if (body == null) { + return; + } + final PsiStatement[] statements = body.getStatements(); + boolean labelSeen = false; + for (int i = statements.length - 1; i >= 0; i--) { + final PsiStatement child = statements[i]; + if (child instanceof PsiSwitchLabelStatement) { + final PsiSwitchLabelStatement label = + (PsiSwitchLabelStatement) child; + if (label.isDefaultCase()) { + if (labelSeen) { + registerStatementError(label); + } + return; + } + else { + labelSeen = true; + } + } } - return; - } - else { - labelSeen = true; - } } - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/DoubleNegationInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/DoubleNegationInspection.java index 064d01d91c..6935241345 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/DoubleNegationInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/DoubleNegationInspection.java @@ -29,132 +29,144 @@ import consulo.language.editor.inspection.ProblemDescriptor; import consulo.language.psi.PsiElement; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @ExtensionImpl public class DoubleNegationInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.doubleNegationDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.doubleNegationDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.doubleNegationProblemDescriptor().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Nullable - protected InspectionGadgetsFix buildFix(Object... infos) { - return new DoubleNegationFix(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.doubleNegationProblemDescriptor().get(); + } - private static class DoubleNegationFix extends InspectionGadgetsFix { + @Override + public boolean isEnabledByDefault() { + return true; + } - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.doubleNegationQuickfix().get(); + @Nullable + protected InspectionGadgetsFix buildFix(Object... infos) { + return new DoubleNegationFix(); } - protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement expression = descriptor.getPsiElement(); - if (expression instanceof PsiPrefixExpression) { - final PsiPrefixExpression prefixExpression = (PsiPrefixExpression)expression; - final PsiExpression operand = ParenthesesUtils.stripParentheses(prefixExpression.getOperand()); - replaceExpression(prefixExpression, BoolUtils.getNegatedExpressionText(operand)); - } else if (expression instanceof PsiPolyadicExpression) { - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)expression; - final PsiExpression[] operands = polyadicExpression.getOperands(); - final int length = operands.length; - if (length == 2) { - final PsiExpression firstOperand = operands[0]; - final PsiExpression secondOperand = operands[1]; - if (isNegation(firstOperand)) { - replaceExpression(polyadicExpression, BoolUtils.getNegatedExpressionText(firstOperand) + "==" + secondOperand.getText()); - } - else { - replaceExpression(polyadicExpression, firstOperand.getText() + "==" + BoolUtils.getNegatedExpressionText(secondOperand)); - } + private static class DoubleNegationFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.doubleNegationQuickfix(); } - else { - final StringBuilder newExpressionText = new StringBuilder(); - for (int i = 0; i < length; i++) { - if (i > 0) { - if (length % 2 != 1 && i == length - 1) { - newExpressionText.append("!="); - } - else { - newExpressionText.append("=="); - } + + protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement expression = descriptor.getPsiElement(); + if (expression instanceof PsiPrefixExpression) { + final PsiPrefixExpression prefixExpression = (PsiPrefixExpression) expression; + final PsiExpression operand = ParenthesesUtils.stripParentheses(prefixExpression.getOperand()); + replaceExpression(prefixExpression, BoolUtils.getNegatedExpressionText(operand)); + } + else if (expression instanceof PsiPolyadicExpression) { + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) expression; + final PsiExpression[] operands = polyadicExpression.getOperands(); + final int length = operands.length; + if (length == 2) { + final PsiExpression firstOperand = operands[0]; + final PsiExpression secondOperand = operands[1]; + if (isNegation(firstOperand)) { + replaceExpression( + polyadicExpression, + BoolUtils.getNegatedExpressionText(firstOperand) + "==" + secondOperand.getText() + ); + } + else { + replaceExpression( + polyadicExpression, + firstOperand.getText() + "==" + BoolUtils.getNegatedExpressionText(secondOperand) + ); + } + } + else { + final StringBuilder newExpressionText = new StringBuilder(); + for (int i = 0; i < length; i++) { + if (i > 0) { + if (length % 2 != 1 && i == length - 1) { + newExpressionText.append("!="); + } + else { + newExpressionText.append("=="); + } + } + newExpressionText.append(operands[i].getText()); + } + replaceExpression(polyadicExpression, newExpressionText.toString()); + } } - newExpressionText.append(operands[i].getText()); - } - replaceExpression(polyadicExpression, newExpressionText.toString()); } - } } - } - public BaseInspectionVisitor buildVisitor() { - return new DoubleNegationVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new DoubleNegationVisitor(); + } - private static class DoubleNegationVisitor extends BaseInspectionVisitor { + private static class DoubleNegationVisitor extends BaseInspectionVisitor { - @Override - public void visitPrefixExpression(PsiPrefixExpression expression) { - super.visitPrefixExpression(expression); - if (!isNegation(expression)) { - return; - } - final PsiExpression operand = expression.getOperand(); - if (!isNegation(operand)) { - return; - } - registerError(expression); + @Override + public void visitPrefixExpression(PsiPrefixExpression expression) { + super.visitPrefixExpression(expression); + if (!isNegation(expression)) { + return; + } + final PsiExpression operand = expression.getOperand(); + if (!isNegation(operand)) { + return; + } + registerError(expression); + } + + @Override + public void visitPolyadicExpression(PsiPolyadicExpression expression) { + super.visitPolyadicExpression(expression); + if (!isNegation(expression)) { + return; + } + final PsiExpression[] operands = expression.getOperands(); + if (operands.length == 2) { + int notNegatedCount = 0; + for (PsiExpression operand : operands) { + if (!isNegation(operand)) { + notNegatedCount++; + } + } + if (notNegatedCount > 1) { + return; + } + } + registerError(expression); + } } - @Override - public void visitPolyadicExpression(PsiPolyadicExpression expression) { - super.visitPolyadicExpression(expression); - if (!isNegation(expression)) { - return; - } - final PsiExpression[] operands = expression.getOperands(); - if (operands.length == 2) { - int notNegatedCount = 0; - for (PsiExpression operand : operands) { - if (!isNegation(operand)) { - notNegatedCount++; - } + static boolean isNegation(@Nullable PsiExpression expression) { + expression = ParenthesesUtils.stripParentheses(expression); + if (expression instanceof PsiPrefixExpression) { + return isNegation((PsiPrefixExpression) expression); } - if (notNegatedCount > 1) { - return; + if (expression instanceof PsiPolyadicExpression) { + return isNegation((PsiPolyadicExpression) expression); } - } - registerError(expression); + return false; } - } - static boolean isNegation(@Nullable PsiExpression expression) { - expression = ParenthesesUtils.stripParentheses(expression); - if (expression instanceof PsiPrefixExpression) return isNegation((PsiPrefixExpression)expression); - if (expression instanceof PsiPolyadicExpression) return isNegation((PsiPolyadicExpression)expression); - return false; - } - - static boolean isNegation(PsiPrefixExpression expression) { - return JavaTokenType.EXCL.equals(expression.getOperationTokenType()); - } + static boolean isNegation(PsiPrefixExpression expression) { + return JavaTokenType.EXCL.equals(expression.getOperationTokenType()); + } - static boolean isNegation(PsiPolyadicExpression expression) { - return JavaTokenType.NE.equals(expression.getOperationTokenType()); - } + static boolean isNegation(PsiPolyadicExpression expression) { + return JavaTokenType.NE.equals(expression.getOperationTokenType()); + } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/DuplicateBooleanBranchInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/DuplicateBooleanBranchInspection.java index bc439d384e..8b6b6f5348 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/DuplicateBooleanBranchInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/DuplicateBooleanBranchInspection.java @@ -23,6 +23,7 @@ import consulo.annotation.component.ExtensionImpl; import consulo.language.ast.IElementType; import consulo.language.psi.PsiElement; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import java.util.Arrays; @@ -31,94 +32,95 @@ @ExtensionImpl public class DuplicateBooleanBranchInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.duplicateBooleanBranchDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.duplicateBooleanBranchDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.duplicateBooleanBranchProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.duplicateBooleanBranchProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new DuplicateBooleanBranchVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new DuplicateBooleanBranchVisitor(); + } - private static class DuplicateBooleanBranchVisitor extends BaseInspectionVisitor { + private static class DuplicateBooleanBranchVisitor extends BaseInspectionVisitor { - @Override - public void visitPolyadicExpression(PsiPolyadicExpression expression) { - super.visitPolyadicExpression(expression); - final IElementType tokenType = expression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.ANDAND) && !tokenType.equals(JavaTokenType.OROR)) { - return; - } - PsiElement parent = expression.getParent(); - while (parent instanceof PsiParenthesizedExpression) { - parent = parent.getParent(); - } - if (parent instanceof PsiBinaryExpression) { - final PsiBinaryExpression parentExpression = (PsiBinaryExpression)parent; - if (tokenType.equals(parentExpression.getOperationTokenType())) { - return; - } - } - final Set conditions = new HashSet(); - collectConditions(expression, conditions, tokenType); - final int numConditions = conditions.size(); - if (numConditions < 2) { - return; - } - final PsiExpression[] conditionArray = conditions.toArray(new PsiExpression[numConditions]); - final boolean[] matched = new boolean[conditionArray.length]; - Arrays.fill(matched, false); - for (int i = 0; i < conditionArray.length; i++) { - if (matched[i]) { - continue; - } - final PsiExpression condition = conditionArray[i]; - for (int j = i + 1; j < conditionArray.length; j++) { - if (matched[j]) { - continue; - } - final PsiExpression testCondition = conditionArray[j]; - final boolean areEquivalent = EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(condition, testCondition); - if (areEquivalent) { - registerError(testCondition); - if (!matched[i]) { - registerError(condition); + @Override + public void visitPolyadicExpression(PsiPolyadicExpression expression) { + super.visitPolyadicExpression(expression); + final IElementType tokenType = expression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.ANDAND) && !tokenType.equals(JavaTokenType.OROR)) { + return; + } + PsiElement parent = expression.getParent(); + while (parent instanceof PsiParenthesizedExpression) { + parent = parent.getParent(); + } + if (parent instanceof PsiBinaryExpression) { + final PsiBinaryExpression parentExpression = (PsiBinaryExpression) parent; + if (tokenType.equals(parentExpression.getOperationTokenType())) { + return; + } + } + final Set conditions = new HashSet(); + collectConditions(expression, conditions, tokenType); + final int numConditions = conditions.size(); + if (numConditions < 2) { + return; + } + final PsiExpression[] conditionArray = conditions.toArray(new PsiExpression[numConditions]); + final boolean[] matched = new boolean[conditionArray.length]; + Arrays.fill(matched, false); + for (int i = 0; i < conditionArray.length; i++) { + if (matched[i]) { + continue; + } + final PsiExpression condition = conditionArray[i]; + for (int j = i + 1; j < conditionArray.length; j++) { + if (matched[j]) { + continue; + } + final PsiExpression testCondition = conditionArray[j]; + final boolean areEquivalent = + EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(condition, testCondition); + if (areEquivalent) { + registerError(testCondition); + if (!matched[i]) { + registerError(condition); + } + matched[i] = true; + matched[j] = true; + } + } } - matched[i] = true; - matched[j] = true; - } } - } - } - private static void collectConditions(PsiExpression condition, Set conditions, IElementType tokenType) { - if (condition == null) { - return; - } - if (condition instanceof PsiParenthesizedExpression) { - final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)condition; - final PsiExpression contents = parenthesizedExpression.getExpression(); - collectConditions(contents, conditions, tokenType); - return; - } - if (condition instanceof PsiPolyadicExpression) { - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)condition; - final IElementType testTokeType = polyadicExpression.getOperationTokenType(); - if (testTokeType.equals(tokenType)) { - final PsiExpression[] operands = polyadicExpression.getOperands(); - for (PsiExpression operand : operands) { - collectConditions(operand, conditions, tokenType); - } - return; + private static void collectConditions(PsiExpression condition, Set conditions, IElementType tokenType) { + if (condition == null) { + return; + } + if (condition instanceof PsiParenthesizedExpression) { + final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression) condition; + final PsiExpression contents = parenthesizedExpression.getExpression(); + collectConditions(contents, conditions, tokenType); + return; + } + if (condition instanceof PsiPolyadicExpression) { + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) condition; + final IElementType testTokeType = polyadicExpression.getOperationTokenType(); + if (testTokeType.equals(tokenType)) { + final PsiExpression[] operands = polyadicExpression.getOperands(); + for (PsiExpression operand : operands) { + collectConditions(operand, conditions, tokenType); + } + return; + } + } + conditions.add(condition); } - } - conditions.add(condition); } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/DuplicateConditionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/DuplicateConditionInspection.java index b3bddd90bd..5b520da234 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/DuplicateConditionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/DuplicateConditionInspection.java @@ -35,129 +35,131 @@ @ExtensionImpl public class DuplicateConditionInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean ignoreMethodCalls = false; - /** - * @noinspection PublicField - */ - public boolean ignoreMethodCalls = false; + // This is a dirty fix of 'squared' algorithm performance issue. + private static final int LIMIT_DEPTH = 20; - // This is a dirty fix of 'squared' algorithm performance issue. - private static final int LIMIT_DEPTH = 20; - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.duplicateConditionDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.duplicateConditionDisplayName(); + } - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.duplicateConditionProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.duplicateConditionProblemDescriptor().get(); + } - @Nullable - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.duplicateConditionIgnoreMethodCallsOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreMethodCalls"); - } + @Nullable + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.duplicateConditionIgnoreMethodCallsOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreMethodCalls"); + } - public BaseInspectionVisitor buildVisitor() { - return new DuplicateConditionVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new DuplicateConditionVisitor(); + } - private class DuplicateConditionVisitor extends BaseInspectionVisitor { + private class DuplicateConditionVisitor extends BaseInspectionVisitor { - @Override - public void visitIfStatement(@Nonnull PsiIfStatement statement) { - super.visitIfStatement(statement); - final PsiElement parent = statement.getParent(); - if (parent instanceof PsiIfStatement) { - final PsiIfStatement parentStatement = (PsiIfStatement)parent; - final PsiStatement elseBranch = parentStatement.getElseBranch(); - if (statement.equals(elseBranch)) { - return; - } - } - final Set conditions = new HashSet(); - collectConditionsForIfStatement(statement, conditions, 0); - final int numConditions = conditions.size(); - if (numConditions < 2) { - return; - } - final PsiExpression[] conditionArray = conditions.toArray(new PsiExpression[numConditions]); - final boolean[] matched = new boolean[conditionArray.length]; - Arrays.fill(matched, false); - for (int i = 0; i < conditionArray.length; i++) { - if (matched[i]) { - continue; - } - final PsiExpression condition = conditionArray[i]; - for (int j = i + 1; j < conditionArray.length; j++) { - if (matched[j]) { - continue; - } - final PsiExpression testCondition = conditionArray[j]; - final boolean areEquivalent = EquivalenceChecker.getCanonicalPsiEquivalence().getCanonicalPsiEquivalence().expressionsAreEquivalent(condition, testCondition); - if (areEquivalent) { - if (!ignoreMethodCalls || !containsMethodCallExpression(testCondition)) { - registerError(testCondition); - if (!matched[i]) { - registerError(condition); - } + @Override + public void visitIfStatement(@Nonnull PsiIfStatement statement) { + super.visitIfStatement(statement); + final PsiElement parent = statement.getParent(); + if (parent instanceof PsiIfStatement) { + final PsiIfStatement parentStatement = (PsiIfStatement) parent; + final PsiStatement elseBranch = parentStatement.getElseBranch(); + if (statement.equals(elseBranch)) { + return; + } + } + final Set conditions = new HashSet(); + collectConditionsForIfStatement(statement, conditions, 0); + final int numConditions = conditions.size(); + if (numConditions < 2) { + return; + } + final PsiExpression[] conditionArray = conditions.toArray(new PsiExpression[numConditions]); + final boolean[] matched = new boolean[conditionArray.length]; + Arrays.fill(matched, false); + for (int i = 0; i < conditionArray.length; i++) { + if (matched[i]) { + continue; + } + final PsiExpression condition = conditionArray[i]; + for (int j = i + 1; j < conditionArray.length; j++) { + if (matched[j]) { + continue; + } + final PsiExpression testCondition = conditionArray[j]; + final boolean areEquivalent = EquivalenceChecker.getCanonicalPsiEquivalence() + .getCanonicalPsiEquivalence() + .expressionsAreEquivalent(condition, testCondition); + if (areEquivalent) { + if (!ignoreMethodCalls || !containsMethodCallExpression(testCondition)) { + registerError(testCondition); + if (!matched[i]) { + registerError(condition); + } + } + matched[i] = true; + matched[j] = true; + } + } } - matched[i] = true; - matched[j] = true; - } } - } - } - private void collectConditionsForIfStatement(PsiIfStatement statement, Set conditions, int depth) { - if (depth > LIMIT_DEPTH) { - return; - } - final PsiExpression condition = statement.getCondition(); - collectConditionsForExpression(condition, conditions); - final PsiStatement branch = statement.getElseBranch(); - if (branch instanceof PsiIfStatement) { - collectConditionsForIfStatement((PsiIfStatement)branch, conditions, depth + 1); - } - } + private void collectConditionsForIfStatement(PsiIfStatement statement, Set conditions, int depth) { + if (depth > LIMIT_DEPTH) { + return; + } + final PsiExpression condition = statement.getCondition(); + collectConditionsForExpression(condition, conditions); + final PsiStatement branch = statement.getElseBranch(); + if (branch instanceof PsiIfStatement) { + collectConditionsForIfStatement((PsiIfStatement) branch, conditions, depth + 1); + } + } - private void collectConditionsForExpression(PsiExpression condition, Set conditions) { - if (condition == null) { - return; - } - if (condition instanceof PsiParenthesizedExpression) { - final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)condition; - final PsiExpression contents = parenthesizedExpression.getExpression(); - collectConditionsForExpression(contents, conditions); - return; - } - if (condition instanceof PsiPolyadicExpression) { - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)condition; - final IElementType tokenType = polyadicExpression.getOperationTokenType(); - if (JavaTokenType.OROR.equals(tokenType)) { - final PsiExpression[] operands = polyadicExpression.getOperands(); - for (PsiExpression operand : operands) { - collectConditionsForExpression(operand, conditions); - } - return; + private void collectConditionsForExpression(PsiExpression condition, Set conditions) { + if (condition == null) { + return; + } + if (condition instanceof PsiParenthesizedExpression) { + final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression) condition; + final PsiExpression contents = parenthesizedExpression.getExpression(); + collectConditionsForExpression(contents, conditions); + return; + } + if (condition instanceof PsiPolyadicExpression) { + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) condition; + final IElementType tokenType = polyadicExpression.getOperationTokenType(); + if (JavaTokenType.OROR.equals(tokenType)) { + final PsiExpression[] operands = polyadicExpression.getOperands(); + for (PsiExpression operand : operands) { + collectConditionsForExpression(operand, conditions); + } + return; + } + } + conditions.add(condition); } - } - conditions.add(condition); - } - private boolean containsMethodCallExpression(PsiElement element) { - if (element instanceof PsiMethodCallExpression) { - return true; - } - final PsiElement[] children = element.getChildren(); - for (PsiElement child : children) { - if (containsMethodCallExpression(child)) { - return true; + private boolean containsMethodCallExpression(PsiElement element) { + if (element instanceof PsiMethodCallExpression) { + return true; + } + final PsiElement[] children = element.getChildren(); + for (PsiElement child : children) { + if (containsMethodCallExpression(child)) { + return true; + } + } + return false; } - } - return false; } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/EnumSwitchStatementWhichMissesCasesInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/EnumSwitchStatementWhichMissesCasesInspection.java index 37f70cca8a..33faf45751 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/EnumSwitchStatementWhichMissesCasesInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/EnumSwitchStatementWhichMissesCasesInspection.java @@ -28,104 +28,104 @@ import javax.swing.*; @ExtensionImpl -public class EnumSwitchStatementWhichMissesCasesInspection - extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.enumSwitchStatementWhichMissesCasesDisplayName().get(); - } - - /** - * @noinspection PublicField - */ - public boolean ignoreSwitchStatementsWithDefault = false; - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final PsiSwitchStatement switchStatement = - (PsiSwitchStatement)infos[0]; - assert switchStatement != null; - final PsiExpression switchStatementExpression = - switchStatement.getExpression(); - assert switchStatementExpression != null; - final PsiType switchStatementType = - switchStatementExpression.getType(); - assert switchStatementType != null; - final String switchStatementTypeText = - switchStatementType.getPresentableText(); - return InspectionGadgetsLocalize.enumSwitchStatementWhichMissesCasesProblemDescriptor(switchStatementTypeText).get(); - } +public class EnumSwitchStatementWhichMissesCasesInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.enumSwitchStatementWhichMissesCasesDisplayName(); + } - @Override - @Nullable - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.enumSwitchStatementWhichMissesCasesOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreSwitchStatementsWithDefault"); - } + /** + * @noinspection PublicField + */ + public boolean ignoreSwitchStatementsWithDefault = false; - @Override - public BaseInspectionVisitor buildVisitor() { - return new EnumSwitchStatementWhichMissesCasesVisitor(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final PsiSwitchStatement switchStatement = + (PsiSwitchStatement) infos[0]; + assert switchStatement != null; + final PsiExpression switchStatementExpression = + switchStatement.getExpression(); + assert switchStatementExpression != null; + final PsiType switchStatementType = + switchStatementExpression.getType(); + assert switchStatementType != null; + final String switchStatementTypeText = + switchStatementType.getPresentableText(); + return InspectionGadgetsLocalize.enumSwitchStatementWhichMissesCasesProblemDescriptor(switchStatementTypeText).get(); + } - private class EnumSwitchStatementWhichMissesCasesVisitor - extends BaseInspectionVisitor { + @Override + @Nullable + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.enumSwitchStatementWhichMissesCasesOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreSwitchStatementsWithDefault"); + } @Override - public void visitSwitchStatement( - @Nonnull PsiSwitchStatement statement) { - super.visitSwitchStatement(statement); - if (!switchStatementMissingCases(statement)) { - return; - } - registerStatementError(statement, statement); + public BaseInspectionVisitor buildVisitor() { + return new EnumSwitchStatementWhichMissesCasesVisitor(); } - private boolean switchStatementMissingCases( - PsiSwitchStatement statement) { - final PsiExpression expression = statement.getExpression(); - if (expression == null) { - return false; - } - final PsiType type = expression.getType(); - if (!(type instanceof PsiClassType)) { - return false; - } - final PsiClassType classType = (PsiClassType)type; - final PsiClass aClass = classType.resolve(); - if (aClass == null || !aClass.isEnum()) { - return false; - } - final PsiCodeBlock body = statement.getBody(); - if (body == null) { - return false; - } - final PsiStatement[] statements = body.getStatements(); - int numCases = 0; - for (final PsiStatement child : statements) { - if (child instanceof PsiSwitchLabelStatement) { - final PsiSwitchLabelStatement switchLabelStatement = - (PsiSwitchLabelStatement)child; - if (!switchLabelStatement.isDefaultCase()) { - numCases++; - } - else if (ignoreSwitchStatementsWithDefault) { - return false; - } + private class EnumSwitchStatementWhichMissesCasesVisitor + extends BaseInspectionVisitor { + + @Override + public void visitSwitchStatement( + @Nonnull PsiSwitchStatement statement + ) { + super.visitSwitchStatement(statement); + if (!switchStatementMissingCases(statement)) { + return; + } + registerStatementError(statement, statement); } - } - final PsiField[] fields = aClass.getFields(); - int numEnums = 0; - for (final PsiField field : fields) { - if (!(field instanceof PsiEnumConstant)) { - continue; + + private boolean switchStatementMissingCases( + PsiSwitchStatement statement + ) { + final PsiExpression expression = statement.getExpression(); + if (expression == null) { + return false; + } + final PsiType type = expression.getType(); + if (!(type instanceof PsiClassType)) { + return false; + } + final PsiClassType classType = (PsiClassType) type; + final PsiClass aClass = classType.resolve(); + if (aClass == null || !aClass.isEnum()) { + return false; + } + final PsiCodeBlock body = statement.getBody(); + if (body == null) { + return false; + } + final PsiStatement[] statements = body.getStatements(); + int numCases = 0; + for (final PsiStatement child : statements) { + if (child instanceof PsiSwitchLabelStatement) { + final PsiSwitchLabelStatement switchLabelStatement = + (PsiSwitchLabelStatement) child; + if (!switchLabelStatement.isDefaultCase()) { + numCases++; + } + else if (ignoreSwitchStatementsWithDefault) { + return false; + } + } + } + final PsiField[] fields = aClass.getFields(); + int numEnums = 0; + for (final PsiField field : fields) { + if (!(field instanceof PsiEnumConstant)) { + continue; + } + numEnums++; + } + return numEnums != numCases; } - numEnums++; - } - return numEnums != numCases; } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/FallthruInSwitchStatementInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/FallthruInSwitchStatementInspection.java index 515c71fbe7..765b387c3d 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/FallthruInSwitchStatementInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/FallthruInSwitchStatementInspection.java @@ -27,6 +27,7 @@ import consulo.language.psi.PsiElement; import consulo.language.psi.PsiWhiteSpace; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @@ -35,82 +36,82 @@ @ExtensionImpl public class FallthruInSwitchStatementInspection extends BaseInspection { - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.fallthruInSwitchStatementDisplayName().get(); - } - - @Nonnull - public String getID() { - return "fallthrough"; - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.fallthruInSwitchStatementProblemDescriptor().get(); - } - - @Nullable - protected InspectionGadgetsFix buildFix(Object... infos) { - return new FallthruInSwitchStatementFix(); - } - - public BaseInspectionVisitor buildVisitor() { - return new FallthroughInSwitchStatementVisitor(); - } - - private static class FallthruInSwitchStatementFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.fallthruInSwitchStatementDisplayName(); + } @Nonnull - public String getName() { - return InspectionGadgetsLocalize.fallthruInSwitchStatementQuickfix().get(); + public String getID() { + return "fallthrough"; } - protected void doFix(Project project, ProblemDescriptor descriptor) { - final PsiSwitchLabelStatement labelStatement = (PsiSwitchLabelStatement)descriptor.getPsiElement(); - final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); - final PsiElementFactory factory = psiFacade.getElementFactory(); - final PsiStatement breakStatement = factory.createStatementFromText("break;", labelStatement); - final PsiElement parent = labelStatement.getParent(); - parent.addBefore(breakStatement, labelStatement); + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.fallthruInSwitchStatementProblemDescriptor().get(); } - } - private static class FallthroughInSwitchStatementVisitor extends BaseInspectionVisitor { + @Nullable + protected InspectionGadgetsFix buildFix(Object... infos) { + return new FallthruInSwitchStatementFix(); + } - private static final Pattern commentPattern = Pattern.compile("(?i)falls?\\s*thro?u"); + public BaseInspectionVisitor buildVisitor() { + return new FallthroughInSwitchStatementVisitor(); + } - @Override - public void visitSwitchStatement(@Nonnull PsiSwitchStatement switchStatement) { - super.visitSwitchStatement(switchStatement); - final PsiCodeBlock body = switchStatement.getBody(); - if (body == null) { - return; - } - final PsiStatement[] statements = body.getStatements(); - for (int i = 1; i < statements.length; i++) { - final PsiStatement statement = statements[i]; - if (!(statement instanceof PsiSwitchLabelStatement)) { - continue; + private static class FallthruInSwitchStatementFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.fallthruInSwitchStatementQuickfix(); } - final PsiElement previousSibling = PsiTreeUtil.skipSiblingsBackward(statement, PsiWhiteSpace.class); - if (previousSibling instanceof PsiComment) { - final PsiComment comment = (PsiComment)previousSibling; - final String commentText = comment.getText(); - if (commentPattern.matcher(commentText).find()) { - continue; - } - } - final PsiStatement previousStatement = PsiTreeUtil.getPrevSiblingOfType(statement, PsiStatement.class); - if (previousStatement instanceof PsiSwitchLabelStatement) { - // don't warn if there are no regular statements after the switch label - continue; + + protected void doFix(Project project, ProblemDescriptor descriptor) { + final PsiSwitchLabelStatement labelStatement = (PsiSwitchLabelStatement) descriptor.getPsiElement(); + final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); + final PsiElementFactory factory = psiFacade.getElementFactory(); + final PsiStatement breakStatement = factory.createStatementFromText("break;", labelStatement); + final PsiElement parent = labelStatement.getParent(); + parent.addBefore(breakStatement, labelStatement); } - if (ControlFlowUtils.statementMayCompleteNormally(previousStatement)) { - registerError(statement); + } + + private static class FallthroughInSwitchStatementVisitor extends BaseInspectionVisitor { + + private static final Pattern commentPattern = Pattern.compile("(?i)falls?\\s*thro?u"); + + @Override + public void visitSwitchStatement(@Nonnull PsiSwitchStatement switchStatement) { + super.visitSwitchStatement(switchStatement); + final PsiCodeBlock body = switchStatement.getBody(); + if (body == null) { + return; + } + final PsiStatement[] statements = body.getStatements(); + for (int i = 1; i < statements.length; i++) { + final PsiStatement statement = statements[i]; + if (!(statement instanceof PsiSwitchLabelStatement)) { + continue; + } + final PsiElement previousSibling = PsiTreeUtil.skipSiblingsBackward(statement, PsiWhiteSpace.class); + if (previousSibling instanceof PsiComment) { + final PsiComment comment = (PsiComment) previousSibling; + final String commentText = comment.getText(); + if (commentPattern.matcher(commentText).find()) { + continue; + } + } + final PsiStatement previousStatement = PsiTreeUtil.getPrevSiblingOfType(statement, PsiStatement.class); + if (previousStatement instanceof PsiSwitchLabelStatement) { + // don't warn if there are no regular statements after the switch label + continue; + } + if (ControlFlowUtils.statementMayCompleteNormally(previousStatement)) { + registerError(statement); + } + } } - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ForLoopReplaceableByWhileInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ForLoopReplaceableByWhileInspection.java index 2c83f8fb10..40378479d7 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ForLoopReplaceableByWhileInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ForLoopReplaceableByWhileInspection.java @@ -34,107 +34,107 @@ @ExtensionImpl public class ForLoopReplaceableByWhileInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean m_ignoreLoopsWithoutConditions = false; - /** - * @noinspection PublicField - */ - public boolean m_ignoreLoopsWithoutConditions = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.forLoopReplaceableByWhileDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.forLoopReplaceableByWhileDisplayName(); + } - @Override - @Nonnull - public String getID() { - return "ForLoopReplaceableByWhile"; - } + @Override + @Nonnull + public String getID() { + return "ForLoopReplaceableByWhile"; + } - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.forLoopReplaceableByWhileProblemDescriptor().get(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.forLoopReplaceableByWhileProblemDescriptor().get(); + } - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.forLoopReplaceableByWhileIgnoreOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "m_ignoreLoopsWithoutConditions"); - } + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.forLoopReplaceableByWhileIgnoreOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "m_ignoreLoopsWithoutConditions"); + } - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new ReplaceForByWhileFix(); - } + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + return new ReplaceForByWhileFix(); + } - private static class ReplaceForByWhileFix extends InspectionGadgetsFix { + private static class ReplaceForByWhileFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.forLoopReplaceableByWhileReplaceQuickfix(); + } - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.forLoopReplaceableByWhileReplaceQuickfix().get(); + @Override + public void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement forKeywordElement = descriptor.getPsiElement(); + final PsiForStatement forStatement = (PsiForStatement) forKeywordElement.getParent(); + assert forStatement != null; + final PsiExpression condition = forStatement.getCondition(); + final PsiStatement body = forStatement.getBody(); + final String bodyText; + if (body == null) { + bodyText = ""; + } + else { + bodyText = body.getText(); + } + @NonNls final String whileStatement; + if (condition == null) { + whileStatement = "while(true)" + bodyText; + } + else { + whileStatement = "while(" + condition.getText() + ')' + + bodyText; + } + replaceStatement(forStatement, whileStatement); + } } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement forKeywordElement = descriptor.getPsiElement(); - final PsiForStatement forStatement = (PsiForStatement)forKeywordElement.getParent(); - assert forStatement != null; - final PsiExpression condition = forStatement.getCondition(); - final PsiStatement body = forStatement.getBody(); - final String bodyText; - if (body == null) { - bodyText = ""; - } - else { - bodyText = body.getText(); - } - @NonNls final String whileStatement; - if (condition == null) { - whileStatement = "while(true)" + bodyText; - } - else { - whileStatement = "while(" + condition.getText() + ')' + - bodyText; - } - replaceStatement(forStatement, whileStatement); + public BaseInspectionVisitor buildVisitor() { + return new ForLoopReplaceableByWhileVisitor(); } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ForLoopReplaceableByWhileVisitor(); - } - private class ForLoopReplaceableByWhileVisitor - extends BaseInspectionVisitor { + private class ForLoopReplaceableByWhileVisitor + extends BaseInspectionVisitor { - @Override - public void visitForStatement( - @Nonnull PsiForStatement statement) { - super.visitForStatement(statement); - final PsiStatement initialization = statement.getInitialization(); - if (initialization != null && - !(initialization instanceof PsiEmptyStatement)) { - return; - } - final PsiStatement update = statement.getUpdate(); - if (update != null && !(update instanceof PsiEmptyStatement)) { - return; - } - if (m_ignoreLoopsWithoutConditions) { - final PsiExpression condition = statement.getCondition(); - if (condition == null) { - return; - } - final String conditionText = condition.getText(); - if (PsiKeyword.TRUE.equals(conditionText)) { - return; + @Override + public void visitForStatement( + @Nonnull PsiForStatement statement + ) { + super.visitForStatement(statement); + final PsiStatement initialization = statement.getInitialization(); + if (initialization != null && + !(initialization instanceof PsiEmptyStatement)) { + return; + } + final PsiStatement update = statement.getUpdate(); + if (update != null && !(update instanceof PsiEmptyStatement)) { + return; + } + if (m_ignoreLoopsWithoutConditions) { + final PsiExpression condition = statement.getCondition(); + if (condition == null) { + return; + } + final String conditionText = condition.getText(); + if (PsiKeyword.TRUE.equals(conditionText)) { + return; + } + } + registerStatementError(statement); } - } - registerStatementError(statement); } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ForLoopWithMissingComponentInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ForLoopWithMissingComponentInspection.java index 284b0d8539..0d896cf8bf 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ForLoopWithMissingComponentInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/ForLoopWithMissingComponentInspection.java @@ -32,166 +32,165 @@ @ExtensionImpl public class ForLoopWithMissingComponentInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean ignoreCollectionLoops = false; - /** - * @noinspection PublicField - */ - public boolean ignoreCollectionLoops = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.forLoopWithMissingComponentDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final boolean hasInitializer = (Boolean)infos[0]; - final boolean hasCondition = (Boolean)infos[1]; - final boolean hasUpdate = (Boolean)infos[2]; - if (hasInitializer) { - if (hasCondition) { - return InspectionGadgetsLocalize.forLoopWithMissingComponentProblemDescriptor3().get(); - } - else if (hasUpdate) { - return InspectionGadgetsLocalize.forLoopWithMissingComponentProblemDescriptor2().get(); - } - else { - return InspectionGadgetsLocalize.forLoopWithMissingComponentProblemDescriptor6().get(); - } - } - else if (hasCondition) { - if (hasUpdate) { - return InspectionGadgetsLocalize.forLoopWithMissingComponentProblemDescriptor1().get(); - } - else { - return InspectionGadgetsLocalize.forLoopWithMissingComponentProblemDescriptor5().get(); - } - } - else if (hasUpdate) { - return InspectionGadgetsLocalize.forLoopWithMissingComponentProblemDescriptor4().get(); - } - else { - return InspectionGadgetsLocalize.forLoopWithMissingComponentProblemDescriptor7().get(); - } - } - - @Override - @Nullable - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.forLoopWithMissingComponentCollectionLoopOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreCollectionLoops"); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ForLoopWithMissingComponentVisitor(); - } - - private class ForLoopWithMissingComponentVisitor extends BaseInspectionVisitor { + @Nonnull @Override - public void visitForStatement(@Nonnull PsiForStatement statement) { - super.visitForStatement(statement); - final boolean hasCondition = hasCondition(statement); - final boolean hasInitializer = hasInitializer(statement); - final boolean hasUpdate = hasUpdate(statement); - if (hasCondition && hasInitializer && hasUpdate) { - return; - } - if (ignoreCollectionLoops && isCollectionLoopStatement(statement)) { - return; - } - registerStatementError(statement, hasInitializer, hasCondition, hasUpdate); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.forLoopWithMissingComponentDisplayName(); } - private boolean hasCondition(PsiForStatement statement) { - return statement.getCondition() != null; + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final boolean hasInitializer = (Boolean) infos[0]; + final boolean hasCondition = (Boolean) infos[1]; + final boolean hasUpdate = (Boolean) infos[2]; + if (hasInitializer) { + if (hasCondition) { + return InspectionGadgetsLocalize.forLoopWithMissingComponentProblemDescriptor3().get(); + } + else if (hasUpdate) { + return InspectionGadgetsLocalize.forLoopWithMissingComponentProblemDescriptor2().get(); + } + else { + return InspectionGadgetsLocalize.forLoopWithMissingComponentProblemDescriptor6().get(); + } + } + else if (hasCondition) { + if (hasUpdate) { + return InspectionGadgetsLocalize.forLoopWithMissingComponentProblemDescriptor1().get(); + } + else { + return InspectionGadgetsLocalize.forLoopWithMissingComponentProblemDescriptor5().get(); + } + } + else if (hasUpdate) { + return InspectionGadgetsLocalize.forLoopWithMissingComponentProblemDescriptor4().get(); + } + else { + return InspectionGadgetsLocalize.forLoopWithMissingComponentProblemDescriptor7().get(); + } } - private boolean hasInitializer(PsiForStatement statement) { - final PsiStatement initialization = statement.getInitialization(); - return initialization != null && !(initialization instanceof PsiEmptyStatement); + @Override + @Nullable + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.forLoopWithMissingComponentCollectionLoopOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreCollectionLoops"); } - private boolean hasUpdate(PsiForStatement statement) { - final PsiStatement update = statement.getUpdate(); - return update != null && !(update instanceof PsiEmptyStatement); + @Override + public BaseInspectionVisitor buildVisitor() { + return new ForLoopWithMissingComponentVisitor(); } - private boolean isCollectionLoopStatement(PsiForStatement forStatement) { - final PsiStatement initialization = forStatement.getInitialization(); - if (!(initialization instanceof PsiDeclarationStatement)) { - return false; - } - final PsiDeclarationStatement declaration = (PsiDeclarationStatement)initialization; - final PsiElement[] declaredElements = declaration.getDeclaredElements(); - for (PsiElement declaredElement : declaredElements) { - if (!(declaredElement instanceof PsiVariable)) { - continue; - } - final PsiVariable variable = (PsiVariable)declaredElement; - final PsiType variableType = variable.getType(); - if (!(variableType instanceof PsiClassType)) { - continue; - } - final PsiClassType classType = (PsiClassType)variableType; - final PsiClass declaredClass = classType.resolve(); - if (declaredClass == null) { - continue; - } - if (!InheritanceUtil.isInheritor(declaredClass, CommonClassNames.JAVA_UTIL_ITERATOR)) { - continue; + private class ForLoopWithMissingComponentVisitor extends BaseInspectionVisitor { + @Override + public void visitForStatement(@Nonnull PsiForStatement statement) { + super.visitForStatement(statement); + final boolean hasCondition = hasCondition(statement); + final boolean hasInitializer = hasInitializer(statement); + final boolean hasUpdate = hasUpdate(statement); + if (hasCondition && hasInitializer && hasUpdate) { + return; + } + if (ignoreCollectionLoops && isCollectionLoopStatement(statement)) { + return; + } + registerStatementError(statement, hasInitializer, hasCondition, hasUpdate); } - final PsiExpression initialValue = variable.getInitializer(); - if (initialValue == null) { - continue; + + private boolean hasCondition(PsiForStatement statement) { + return statement.getCondition() != null; } - if (!(initialValue instanceof PsiMethodCallExpression)) { - continue; + + private boolean hasInitializer(PsiForStatement statement) { + final PsiStatement initialization = statement.getInitialization(); + return initialization != null && !(initialization instanceof PsiEmptyStatement); } - final PsiMethodCallExpression initialCall = (PsiMethodCallExpression)initialValue; - final PsiReferenceExpression initialMethodExpression = initialCall.getMethodExpression(); - final String initialCallName = initialMethodExpression.getReferenceName(); - if (!HardcodedMethodConstants.ITERATOR.equals(initialCallName)) { - continue; + + private boolean hasUpdate(PsiForStatement statement) { + final PsiStatement update = statement.getUpdate(); + return update != null && !(update instanceof PsiEmptyStatement); } - final PsiExpression condition = forStatement.getCondition(); - if (isHasNext(condition, variable)) { - return true; + + private boolean isCollectionLoopStatement(PsiForStatement forStatement) { + final PsiStatement initialization = forStatement.getInitialization(); + if (!(initialization instanceof PsiDeclarationStatement)) { + return false; + } + final PsiDeclarationStatement declaration = (PsiDeclarationStatement) initialization; + final PsiElement[] declaredElements = declaration.getDeclaredElements(); + for (PsiElement declaredElement : declaredElements) { + if (!(declaredElement instanceof PsiVariable)) { + continue; + } + final PsiVariable variable = (PsiVariable) declaredElement; + final PsiType variableType = variable.getType(); + if (!(variableType instanceof PsiClassType)) { + continue; + } + final PsiClassType classType = (PsiClassType) variableType; + final PsiClass declaredClass = classType.resolve(); + if (declaredClass == null) { + continue; + } + if (!InheritanceUtil.isInheritor(declaredClass, CommonClassNames.JAVA_UTIL_ITERATOR)) { + continue; + } + final PsiExpression initialValue = variable.getInitializer(); + if (initialValue == null) { + continue; + } + if (!(initialValue instanceof PsiMethodCallExpression)) { + continue; + } + final PsiMethodCallExpression initialCall = (PsiMethodCallExpression) initialValue; + final PsiReferenceExpression initialMethodExpression = initialCall.getMethodExpression(); + final String initialCallName = initialMethodExpression.getReferenceName(); + if (!HardcodedMethodConstants.ITERATOR.equals(initialCallName)) { + continue; + } + final PsiExpression condition = forStatement.getCondition(); + if (isHasNext(condition, variable)) { + return true; + } + } + return false; } - } - return false; - } - private boolean isHasNext(PsiExpression condition, PsiVariable iterator) { - if (condition instanceof PsiBinaryExpression) { - final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)condition; - final PsiExpression lhs = binaryExpression.getLOperand(); - final PsiExpression rhs = binaryExpression.getROperand(); - return isHasNext(lhs, iterator) || isHasNext(rhs, iterator); - } - if (!(condition instanceof PsiMethodCallExpression)) { - return false; - } - final PsiMethodCallExpression call = (PsiMethodCallExpression)condition; - final PsiExpressionList argumentList = call.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 0) { - return false; - } - final PsiReferenceExpression methodExpression = call.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - if (!HardcodedMethodConstants.HAS_NEXT.equals(methodName)) { - return false; - } - final PsiExpression qualifier = methodExpression.getQualifierExpression(); - if (!(qualifier instanceof PsiReferenceExpression)) { - return true; - } - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)qualifier; - final PsiElement target = referenceExpression.resolve(); - return iterator.equals(target); + private boolean isHasNext(PsiExpression condition, PsiVariable iterator) { + if (condition instanceof PsiBinaryExpression) { + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression) condition; + final PsiExpression lhs = binaryExpression.getLOperand(); + final PsiExpression rhs = binaryExpression.getROperand(); + return isHasNext(lhs, iterator) || isHasNext(rhs, iterator); + } + if (!(condition instanceof PsiMethodCallExpression)) { + return false; + } + final PsiMethodCallExpression call = (PsiMethodCallExpression) condition; + final PsiExpressionList argumentList = call.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 0) { + return false; + } + final PsiReferenceExpression methodExpression = call.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!HardcodedMethodConstants.HAS_NEXT.equals(methodName)) { + return false; + } + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (!(qualifier instanceof PsiReferenceExpression)) { + return true; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) qualifier; + final PsiElement target = referenceExpression.resolve(); + return iterator.equals(target); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/IfMayBeConditionalInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/IfMayBeConditionalInspection.java index cc3f3d8446..792ebbc437 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/IfMayBeConditionalInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/IfMayBeConditionalInspection.java @@ -32,246 +32,244 @@ import consulo.project.Project; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; -import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; import javax.swing.*; @ExtensionImpl public class IfMayBeConditionalInspection extends BaseInspection { + @SuppressWarnings("PublicField") + public boolean reportMethodCalls = false; - @SuppressWarnings("PublicField") - public boolean reportMethodCalls = false; - - @Override - @Nls - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.ifMayBeConditionalDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.ifMayBeConditionalProblemDescriptor().get(); - } - - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.ifMayBeConditionalReportMethodCallsOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "reportMethodCalls"); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new IfMayBeConditionalFix(); - } - - private static class IfMayBeConditionalFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.ifMayBeConditionalDisplayName(); + } + @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.ifMayBeConditionalQuickfix().get(); + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.ifMayBeConditionalProblemDescriptor().get(); + } + + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.ifMayBeConditionalReportMethodCallsOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "reportMethodCalls"); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiIfStatement ifStatement = (PsiIfStatement)element.getParent(); - final PsiStatement thenBranch = ifStatement.getThenBranch(); - final PsiStatement thenStatement = ControlFlowUtils.stripBraces(thenBranch); - final PsiStatement elseBranch = ifStatement.getElseBranch(); - final PsiStatement elseStatement = ControlFlowUtils.stripBraces(elseBranch); - final PsiExpression condition = ifStatement.getCondition(); - @NonNls final StringBuilder replacementText = new StringBuilder(); - if (thenStatement instanceof PsiReturnStatement) { - final PsiReturnStatement elseReturn = (PsiReturnStatement)elseStatement; - final PsiReturnStatement thenReturn = (PsiReturnStatement)thenStatement; - replacementText.append("return "); - appendExpressionText(condition, replacementText); - replacementText.append('?'); - final PsiExpression thenReturnValue = thenReturn.getReturnValue(); - appendExpressionText(thenReturnValue, replacementText); - replacementText.append(':'); - if (elseReturn != null) { - final PsiExpression elseReturnValue = elseReturn.getReturnValue(); - appendExpressionText(elseReturnValue, replacementText); + protected InspectionGadgetsFix buildFix(Object... infos) { + return new IfMayBeConditionalFix(); + } + + private static class IfMayBeConditionalFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.ifMayBeConditionalQuickfix(); } - replacementText.append(';'); - } - else if (thenStatement instanceof PsiExpressionStatement && elseStatement instanceof PsiExpressionStatement) { - final PsiExpressionStatement thenExpressionStatement = (PsiExpressionStatement)thenStatement; - final PsiExpressionStatement elseExpressionStatement = (PsiExpressionStatement)elseStatement; - final PsiExpression thenExpression = thenExpressionStatement.getExpression(); - final PsiExpression elseExpression = elseExpressionStatement.getExpression(); - if (thenExpression instanceof PsiAssignmentExpression && elseExpression instanceof PsiAssignmentExpression) { - final PsiAssignmentExpression thenAssignmentExpression = (PsiAssignmentExpression)thenExpression; - final PsiExpression lhs = thenAssignmentExpression.getLExpression(); - replacementText.append(lhs.getText()); - final PsiJavaToken token = thenAssignmentExpression.getOperationSign(); - replacementText.append(token.getText()); - appendExpressionText(condition, replacementText); - replacementText.append('?'); - final PsiExpression thenRhs = thenAssignmentExpression.getRExpression(); - appendExpressionText(thenRhs, replacementText); - replacementText.append(':'); - final PsiAssignmentExpression elseAssignmentExpression = (PsiAssignmentExpression)elseExpression; - final PsiExpression elseRhs = elseAssignmentExpression.getRExpression(); - appendExpressionText(elseRhs, replacementText); - replacementText.append(';'); + + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiIfStatement ifStatement = (PsiIfStatement) element.getParent(); + final PsiStatement thenBranch = ifStatement.getThenBranch(); + final PsiStatement thenStatement = ControlFlowUtils.stripBraces(thenBranch); + final PsiStatement elseBranch = ifStatement.getElseBranch(); + final PsiStatement elseStatement = ControlFlowUtils.stripBraces(elseBranch); + final PsiExpression condition = ifStatement.getCondition(); + @NonNls final StringBuilder replacementText = new StringBuilder(); + if (thenStatement instanceof PsiReturnStatement) { + final PsiReturnStatement elseReturn = (PsiReturnStatement) elseStatement; + final PsiReturnStatement thenReturn = (PsiReturnStatement) thenStatement; + replacementText.append("return "); + appendExpressionText(condition, replacementText); + replacementText.append('?'); + final PsiExpression thenReturnValue = thenReturn.getReturnValue(); + appendExpressionText(thenReturnValue, replacementText); + replacementText.append(':'); + if (elseReturn != null) { + final PsiExpression elseReturnValue = elseReturn.getReturnValue(); + appendExpressionText(elseReturnValue, replacementText); + } + replacementText.append(';'); + } + else if (thenStatement instanceof PsiExpressionStatement && elseStatement instanceof PsiExpressionStatement) { + final PsiExpressionStatement thenExpressionStatement = (PsiExpressionStatement) thenStatement; + final PsiExpressionStatement elseExpressionStatement = (PsiExpressionStatement) elseStatement; + final PsiExpression thenExpression = thenExpressionStatement.getExpression(); + final PsiExpression elseExpression = elseExpressionStatement.getExpression(); + if (thenExpression instanceof PsiAssignmentExpression && elseExpression instanceof PsiAssignmentExpression) { + final PsiAssignmentExpression thenAssignmentExpression = (PsiAssignmentExpression) thenExpression; + final PsiExpression lhs = thenAssignmentExpression.getLExpression(); + replacementText.append(lhs.getText()); + final PsiJavaToken token = thenAssignmentExpression.getOperationSign(); + replacementText.append(token.getText()); + appendExpressionText(condition, replacementText); + replacementText.append('?'); + final PsiExpression thenRhs = thenAssignmentExpression.getRExpression(); + appendExpressionText(thenRhs, replacementText); + replacementText.append(':'); + final PsiAssignmentExpression elseAssignmentExpression = (PsiAssignmentExpression) elseExpression; + final PsiExpression elseRhs = elseAssignmentExpression.getRExpression(); + appendExpressionText(elseRhs, replacementText); + replacementText.append(';'); + } + else if (thenExpression instanceof PsiMethodCallExpression && elseExpression instanceof PsiMethodCallExpression) { + final PsiMethodCallExpression thenMethodCallExpression = (PsiMethodCallExpression) thenExpression; + final PsiMethodCallExpression elseMethodCallExpression = (PsiMethodCallExpression) elseExpression; + final PsiReferenceExpression thenMethodExpression = thenMethodCallExpression.getMethodExpression(); + replacementText.append(thenMethodExpression.getText()); + replacementText.append('('); + final PsiExpressionList thenArgumentList = thenMethodCallExpression.getArgumentList(); + final PsiExpression[] thenArguments = thenArgumentList.getExpressions(); + final PsiExpressionList elseArgumentList = elseMethodCallExpression.getArgumentList(); + final PsiExpression[] elseArguments = elseArgumentList.getExpressions(); + for (int i = 0, length = thenArguments.length; i < length; i++) { + if (i > 0) { + replacementText.append(','); + } + final PsiExpression thenArgument = thenArguments[i]; + final PsiExpression elseArgument = elseArguments[i]; + if (EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(thenArgument, elseArgument)) { + replacementText.append(thenArgument.getText()); + } + else { + appendExpressionText(condition, replacementText); + replacementText.append('?'); + appendExpressionText(thenArgument, replacementText); + replacementText.append(':'); + appendExpressionText(elseArgument, replacementText); + } + } + replacementText.append(");"); + } + else { + return; + } + } + replaceStatement(ifStatement, replacementText.toString()); } - else if (thenExpression instanceof PsiMethodCallExpression && elseExpression instanceof PsiMethodCallExpression) { - final PsiMethodCallExpression thenMethodCallExpression = (PsiMethodCallExpression)thenExpression; - final PsiMethodCallExpression elseMethodCallExpression = (PsiMethodCallExpression)elseExpression; - final PsiReferenceExpression thenMethodExpression = thenMethodCallExpression.getMethodExpression(); - replacementText.append(thenMethodExpression.getText()); - replacementText.append('('); - final PsiExpressionList thenArgumentList = thenMethodCallExpression.getArgumentList(); - final PsiExpression[] thenArguments = thenArgumentList.getExpressions(); - final PsiExpressionList elseArgumentList = elseMethodCallExpression.getArgumentList(); - final PsiExpression[] elseArguments = elseArgumentList.getExpressions(); - for (int i = 0, length = thenArguments.length; i < length; i++) { - if (i > 0) { - replacementText.append(','); + + private static void appendExpressionText(@Nullable PsiExpression expression, StringBuilder out) { + expression = ParenthesesUtils.stripParentheses(expression); + if (expression == null) { + return; } - final PsiExpression thenArgument = thenArguments[i]; - final PsiExpression elseArgument = elseArguments[i]; - if (EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(thenArgument, elseArgument)) { - replacementText.append(thenArgument.getText()); + final String expressionText = expression.getText(); + if (ParenthesesUtils.getPrecedence(expression) > ParenthesesUtils.CONDITIONAL_PRECEDENCE) { + out.append('('); + out.append(expressionText); + out.append(')'); } else { - appendExpressionText(condition, replacementText); - replacementText.append('?'); - appendExpressionText(thenArgument, replacementText); - replacementText.append(':'); - appendExpressionText(elseArgument, replacementText); + out.append(expressionText); } - } - replacementText.append(");"); - } - else { - return; } - } - replaceStatement(ifStatement, replacementText.toString()); } - private static void appendExpressionText(@Nullable PsiExpression expression, StringBuilder out) { - expression = ParenthesesUtils.stripParentheses(expression); - if (expression == null) { - return; - } - final String expressionText = expression.getText(); - if (ParenthesesUtils.getPrecedence(expression) > ParenthesesUtils.CONDITIONAL_PRECEDENCE) { - out.append('('); - out.append(expressionText); - out.append(')'); - } - else { - out.append(expressionText); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new IfMayBeConditionalVisitor(); } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new IfMayBeConditionalVisitor(); - } - private class IfMayBeConditionalVisitor extends BaseInspectionVisitor { + private class IfMayBeConditionalVisitor extends BaseInspectionVisitor { - @Override - public void visitIfStatement(PsiIfStatement statement) { - super.visitIfStatement(statement); - final PsiStatement thenBranch = statement.getThenBranch(); - final PsiStatement elseBranch = statement.getElseBranch(); - final PsiStatement thenStatement = ControlFlowUtils.stripBraces(thenBranch); - if (thenStatement == null) { - return; - } - final PsiStatement elseStatement = ControlFlowUtils.stripBraces(elseBranch); - if (elseStatement == null) { - return; - } - if (thenStatement instanceof PsiReturnStatement) { - if (!(elseStatement instanceof PsiReturnStatement)) { - return; - } - final PsiReturnStatement thenReturnStatement = (PsiReturnStatement)thenStatement; - final PsiExpression thenReturnValue = ParenthesesUtils.stripParentheses(thenReturnStatement.getReturnValue()); - if (thenReturnValue instanceof PsiConditionalExpression) { - return; - } - final PsiReturnStatement elseReturnStatement = (PsiReturnStatement)elseStatement; - final PsiExpression elseReturnValue = ParenthesesUtils.stripParentheses(elseReturnStatement.getReturnValue()); - if (elseReturnValue instanceof PsiConditionalExpression) { - return; - } - registerStatementError(statement); - } - else if (thenStatement instanceof PsiExpressionStatement) { - if (!(elseStatement instanceof PsiExpressionStatement)) { - return; - } - final PsiExpressionStatement thenExpressionStatement = (PsiExpressionStatement)thenStatement; - final PsiExpression thenExpression = thenExpressionStatement.getExpression(); - final PsiExpressionStatement elseExpressionStatement = (PsiExpressionStatement)elseStatement; - final PsiExpression elseExpression = elseExpressionStatement.getExpression(); - if (thenExpression instanceof PsiAssignmentExpression) { - if (!(elseExpression instanceof PsiAssignmentExpression)) { - return; - } - final PsiAssignmentExpression thenAssignmentExpression = (PsiAssignmentExpression)thenExpression; - final PsiAssignmentExpression elseAssignmentExpression = (PsiAssignmentExpression)elseExpression; - if (!thenAssignmentExpression.getOperationTokenType().equals(elseAssignmentExpression.getOperationTokenType())) { - return; - } - final PsiExpression thenLhs = thenAssignmentExpression.getLExpression(); - final PsiExpression elseLhs = elseAssignmentExpression.getLExpression(); - if (!EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(thenLhs, elseLhs)) { - return; - } - final PsiExpression thenRhs = ParenthesesUtils.stripParentheses(thenAssignmentExpression.getRExpression()); - if (thenRhs instanceof PsiConditionalExpression) { - return; - } - final PsiExpression elseRhs = ParenthesesUtils.stripParentheses(elseAssignmentExpression.getRExpression()); - if (elseRhs instanceof PsiConditionalExpression) { - return; - } - registerStatementError(statement); - } - else if (reportMethodCalls && thenExpression instanceof PsiMethodCallExpression) { - if (!(elseExpression instanceof PsiMethodCallExpression)) { - return; - } - final PsiMethodCallExpression thenMethodCallExpression = (PsiMethodCallExpression)thenExpression; - final PsiMethodCallExpression elseMethodCallExpression = (PsiMethodCallExpression)elseExpression; - final PsiReferenceExpression thenMethodExpression = thenMethodCallExpression.getMethodExpression(); - final PsiReferenceExpression elseMethodExpression = elseMethodCallExpression.getMethodExpression(); - if (!EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(thenMethodExpression, elseMethodExpression)) { - return; - } - final PsiExpressionList thenArgumentList = thenMethodCallExpression.getArgumentList(); - final PsiExpression[] thenArguments = thenArgumentList.getExpressions(); - final PsiExpressionList elseArgumentList = elseMethodCallExpression.getArgumentList(); - final PsiExpression[] elseArguments = elseArgumentList.getExpressions(); - if (thenArguments.length != elseArguments.length) { - return; - } - int differences = 0; - for (int i = 0, length = thenArguments.length; i < length; i++) { - final PsiExpression thenArgument = thenArguments[i]; - final PsiExpression elseArgument = elseArguments[i]; - if (!EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(thenArgument, elseArgument)) { - differences++; + @Override + public void visitIfStatement(PsiIfStatement statement) { + super.visitIfStatement(statement); + final PsiStatement thenBranch = statement.getThenBranch(); + final PsiStatement elseBranch = statement.getElseBranch(); + final PsiStatement thenStatement = ControlFlowUtils.stripBraces(thenBranch); + if (thenStatement == null) { + return; + } + final PsiStatement elseStatement = ControlFlowUtils.stripBraces(elseBranch); + if (elseStatement == null) { + return; + } + if (thenStatement instanceof PsiReturnStatement) { + if (!(elseStatement instanceof PsiReturnStatement)) { + return; + } + final PsiReturnStatement thenReturnStatement = (PsiReturnStatement) thenStatement; + final PsiExpression thenReturnValue = ParenthesesUtils.stripParentheses(thenReturnStatement.getReturnValue()); + if (thenReturnValue instanceof PsiConditionalExpression) { + return; + } + final PsiReturnStatement elseReturnStatement = (PsiReturnStatement) elseStatement; + final PsiExpression elseReturnValue = ParenthesesUtils.stripParentheses(elseReturnStatement.getReturnValue()); + if (elseReturnValue instanceof PsiConditionalExpression) { + return; + } + registerStatementError(statement); + } + else if (thenStatement instanceof PsiExpressionStatement) { + if (!(elseStatement instanceof PsiExpressionStatement)) { + return; + } + final PsiExpressionStatement thenExpressionStatement = (PsiExpressionStatement) thenStatement; + final PsiExpression thenExpression = thenExpressionStatement.getExpression(); + final PsiExpressionStatement elseExpressionStatement = (PsiExpressionStatement) elseStatement; + final PsiExpression elseExpression = elseExpressionStatement.getExpression(); + if (thenExpression instanceof PsiAssignmentExpression) { + if (!(elseExpression instanceof PsiAssignmentExpression)) { + return; + } + final PsiAssignmentExpression thenAssignmentExpression = (PsiAssignmentExpression) thenExpression; + final PsiAssignmentExpression elseAssignmentExpression = (PsiAssignmentExpression) elseExpression; + if (!thenAssignmentExpression.getOperationTokenType().equals(elseAssignmentExpression.getOperationTokenType())) { + return; + } + final PsiExpression thenLhs = thenAssignmentExpression.getLExpression(); + final PsiExpression elseLhs = elseAssignmentExpression.getLExpression(); + if (!EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(thenLhs, elseLhs)) { + return; + } + final PsiExpression thenRhs = ParenthesesUtils.stripParentheses(thenAssignmentExpression.getRExpression()); + if (thenRhs instanceof PsiConditionalExpression) { + return; + } + final PsiExpression elseRhs = ParenthesesUtils.stripParentheses(elseAssignmentExpression.getRExpression()); + if (elseRhs instanceof PsiConditionalExpression) { + return; + } + registerStatementError(statement); + } + else if (reportMethodCalls && thenExpression instanceof PsiMethodCallExpression) { + if (!(elseExpression instanceof PsiMethodCallExpression)) { + return; + } + final PsiMethodCallExpression thenMethodCallExpression = (PsiMethodCallExpression) thenExpression; + final PsiMethodCallExpression elseMethodCallExpression = (PsiMethodCallExpression) elseExpression; + final PsiReferenceExpression thenMethodExpression = thenMethodCallExpression.getMethodExpression(); + final PsiReferenceExpression elseMethodExpression = elseMethodCallExpression.getMethodExpression(); + if (!EquivalenceChecker.getCanonicalPsiEquivalence() + .expressionsAreEquivalent(thenMethodExpression, elseMethodExpression)) { + return; + } + final PsiExpressionList thenArgumentList = thenMethodCallExpression.getArgumentList(); + final PsiExpression[] thenArguments = thenArgumentList.getExpressions(); + final PsiExpressionList elseArgumentList = elseMethodCallExpression.getArgumentList(); + final PsiExpression[] elseArguments = elseArgumentList.getExpressions(); + if (thenArguments.length != elseArguments.length) { + return; + } + int differences = 0; + for (int i = 0, length = thenArguments.length; i < length; i++) { + final PsiExpression thenArgument = thenArguments[i]; + final PsiExpression elseArgument = elseArguments[i]; + if (!EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(thenArgument, elseArgument)) { + differences++; + } + } + if (differences == 1) { + registerStatementError(statement); + } + } } - } - if (differences == 1) { - registerStatementError(statement); - } } - } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/IfStatementWithIdenticalBranchesInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/IfStatementWithIdenticalBranchesInspection.java index 93ed2c40b5..9d4b6066ff 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/IfStatementWithIdenticalBranchesInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/IfStatementWithIdenticalBranchesInspection.java @@ -18,6 +18,7 @@ import java.util.Collections; import com.siyeh.localize.InspectionGadgetsLocalize; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import consulo.annotation.component.ExtensionImpl; @@ -47,228 +48,239 @@ import jakarta.annotation.Nullable; @ExtensionImpl -public class IfStatementWithIdenticalBranchesInspection - extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.ifStatementWithIdenticalBranchesDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.ifStatementWithIdenticalBranchesProblemDescriptor().get(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new CollapseIfFix(); - } - - private static class CollapseIfFix extends InspectionGadgetsFix { - - public CollapseIfFix() { +public class IfStatementWithIdenticalBranchesInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.ifStatementWithIdenticalBranchesDisplayName(); } + @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.ifStatementWithIdenticalBranchesCollapseQuickfix().get(); + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.ifStatementWithIdenticalBranchesProblemDescriptor().get(); } @Override - public void doFix(@Nonnull Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement identifier = descriptor.getPsiElement(); - final PsiIfStatement statement = (PsiIfStatement)identifier.getParent(); - assert statement != null; - final PsiStatement thenBranch = statement.getThenBranch(); - if (thenBranch == null) { - return; - } - final PsiStatement elseBranch = statement.getElseBranch(); - if (elseBranch == null) { - // implicit else branch after the if - statement.delete(); - return; - } - if (elseBranch instanceof PsiIfStatement) { - final PsiIfStatement elseIfStatement = (PsiIfStatement)elseBranch; - final PsiExpression condition1 = statement.getCondition(); - final PsiExpression condition2 = elseIfStatement.getCondition(); - if (condition1 == null) { - return; - } - replaceExpression(condition1, buildOrExpressionText(condition1, condition2)); - final PsiStatement elseElseBranch = elseIfStatement.getElseBranch(); - if (elseElseBranch == null) { - elseIfStatement.delete(); + public InspectionGadgetsFix buildFix(Object... infos) { + return new CollapseIfFix(); + } + + private static class CollapseIfFix extends InspectionGadgetsFix { + + public CollapseIfFix() { } - else { - elseIfStatement.replace(elseElseBranch); + + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.ifStatementWithIdenticalBranchesCollapseQuickfix(); } - } - else { - final PsiElement parent = statement.getParent(); - if (thenBranch instanceof PsiBlockStatement) { - final PsiBlockStatement blockStatement = (PsiBlockStatement)thenBranch; - if (parent instanceof PsiCodeBlock) { - final PsiCodeBlock codeBlock = blockStatement.getCodeBlock(); - final PsiStatement[] statements = - codeBlock.getStatements(); - if (statements.length > 0) { - parent.addRangeBefore(statements[0], statements[statements.length - 1], statement); + + @Override + public void doFix(@Nonnull Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement identifier = descriptor.getPsiElement(); + final PsiIfStatement statement = (PsiIfStatement) identifier.getParent(); + assert statement != null; + final PsiStatement thenBranch = statement.getThenBranch(); + if (thenBranch == null) { + return; + } + final PsiStatement elseBranch = statement.getElseBranch(); + if (elseBranch == null) { + // implicit else branch after the if + statement.delete(); + return; + } + if (elseBranch instanceof PsiIfStatement) { + final PsiIfStatement elseIfStatement = (PsiIfStatement) elseBranch; + final PsiExpression condition1 = statement.getCondition(); + final PsiExpression condition2 = elseIfStatement.getCondition(); + if (condition1 == null) { + return; + } + replaceExpression(condition1, buildOrExpressionText(condition1, condition2)); + final PsiStatement elseElseBranch = elseIfStatement.getElseBranch(); + if (elseElseBranch == null) { + elseIfStatement.delete(); + } + else { + elseIfStatement.replace(elseElseBranch); + } + } + else { + final PsiElement parent = statement.getParent(); + if (thenBranch instanceof PsiBlockStatement) { + final PsiBlockStatement blockStatement = (PsiBlockStatement) thenBranch; + if (parent instanceof PsiCodeBlock) { + final PsiCodeBlock codeBlock = blockStatement.getCodeBlock(); + final PsiStatement[] statements = + codeBlock.getStatements(); + if (statements.length > 0) { + parent.addRangeBefore(statements[0], statements[statements.length - 1], statement); + } + statement.delete(); + } + else { + statement.replace(blockStatement); + } + } + else { + statement.replace(thenBranch); + } } - statement.delete(); - } - else { - statement.replace(blockStatement); - } } - else { - statement.replace(thenBranch); + + private static String buildOrExpressionText( + PsiExpression expression1, + PsiExpression expression2 + ) { + final StringBuilder result = new StringBuilder(); + if (expression1 != null) { + result.append(expression1.getText()); + } + result.append("||"); + if (expression2 != null) { + result.append(expression2.getText()); + } + return result.toString(); } - } } - private static String buildOrExpressionText(PsiExpression expression1, - PsiExpression expression2) { - final StringBuilder result = new StringBuilder(); - if (expression1 != null) { - result.append(expression1.getText()); - } - result.append("||"); - if (expression2 != null) { - result.append(expression2.getText()); - } - return result.toString(); + @Override + public BaseInspectionVisitor buildVisitor() { + return new IfStatementWithIdenticalBranchesVisitor(); } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new IfStatementWithIdenticalBranchesVisitor(); - } - private static class IfStatementWithIdenticalBranchesVisitor - extends BaseInspectionVisitor { + private static class IfStatementWithIdenticalBranchesVisitor + extends BaseInspectionVisitor { - @Override - public void visitIfStatement( - @Nonnull PsiIfStatement ifStatement) { - super.visitIfStatement(ifStatement); - final PsiStatement elseBranch = ifStatement.getElseBranch(); - final PsiStatement thenBranch = ifStatement.getThenBranch(); - if (thenBranch == null) { - return; - } - final Project project = ifStatement.getProject(); - final InputVariables inputVariables = - new InputVariables(Collections.emptyList(), - project, new LocalSearchScope(thenBranch), false); - final DuplicatesFinder finder = - new DuplicatesFinder(new PsiElement[]{thenBranch}, - inputVariables, null, - Collections.emptyList()); - if (elseBranch instanceof PsiIfStatement) { - final PsiIfStatement statement = - (PsiIfStatement)elseBranch; - final PsiStatement branch = statement.getThenBranch(); - if (branch == null) { - return; - } - final Match match = finder.isDuplicate(branch, true); - if (match != null && match.getReturnValue() == null) { - registerStatementError(ifStatement, statement); - return; - } - } - if (elseBranch == null) { - checkIfStatementWithoutElseBranch(ifStatement); - } - else { - final Match match = finder.isDuplicate(elseBranch, true); - if (match != null) { - registerStatementError(ifStatement); + @Override + public void visitIfStatement( + @Nonnull PsiIfStatement ifStatement + ) { + super.visitIfStatement(ifStatement); + final PsiStatement elseBranch = ifStatement.getElseBranch(); + final PsiStatement thenBranch = ifStatement.getThenBranch(); + if (thenBranch == null) { + return; + } + final Project project = ifStatement.getProject(); + final InputVariables inputVariables = + new InputVariables(Collections.emptyList(), + project, new LocalSearchScope(thenBranch), false + ); + final DuplicatesFinder finder = + new DuplicatesFinder(new PsiElement[]{thenBranch}, + inputVariables, null, + Collections.emptyList() + ); + if (elseBranch instanceof PsiIfStatement) { + final PsiIfStatement statement = + (PsiIfStatement) elseBranch; + final PsiStatement branch = statement.getThenBranch(); + if (branch == null) { + return; + } + final Match match = finder.isDuplicate(branch, true); + if (match != null && match.getReturnValue() == null) { + registerStatementError(ifStatement, statement); + return; + } + } + if (elseBranch == null) { + checkIfStatementWithoutElseBranch(ifStatement); + } + else { + final Match match = finder.isDuplicate(elseBranch, true); + if (match != null) { + registerStatementError(ifStatement); + } + } } - } - } - private void checkIfStatementWithoutElseBranch( - PsiIfStatement ifStatement) { - final PsiStatement thenBranch = ifStatement.getThenBranch(); - if (ControlFlowUtils.statementMayCompleteNormally(thenBranch)) { - return; - } - PsiStatement nextStatement = getNextStatement(ifStatement); - if (thenBranch instanceof PsiBlockStatement) { - final PsiBlockStatement blockStatement = - (PsiBlockStatement)thenBranch; - final PsiCodeBlock codeBlock = blockStatement.getCodeBlock(); - final PsiStatement[] statements = codeBlock.getStatements(); - final PsiStatement lastStatement = - statements[statements.length - 1]; - for (PsiStatement statement : statements) { - if (nextStatement == null) { - if (statement == lastStatement && - statement instanceof PsiReturnStatement) { - final PsiReturnStatement returnStatement = - (PsiReturnStatement)statement; - if (returnStatement.getReturnValue() == null) { - registerStatementError(ifStatement); - } + private void checkIfStatementWithoutElseBranch( + PsiIfStatement ifStatement + ) { + final PsiStatement thenBranch = ifStatement.getThenBranch(); + if (ControlFlowUtils.statementMayCompleteNormally(thenBranch)) { + return; + } + PsiStatement nextStatement = getNextStatement(ifStatement); + if (thenBranch instanceof PsiBlockStatement) { + final PsiBlockStatement blockStatement = + (PsiBlockStatement) thenBranch; + final PsiCodeBlock codeBlock = blockStatement.getCodeBlock(); + final PsiStatement[] statements = codeBlock.getStatements(); + final PsiStatement lastStatement = + statements[statements.length - 1]; + for (PsiStatement statement : statements) { + if (nextStatement == null) { + if (statement == lastStatement && + statement instanceof PsiReturnStatement) { + final PsiReturnStatement returnStatement = + (PsiReturnStatement) statement; + if (returnStatement.getReturnValue() == null) { + registerStatementError(ifStatement); + } + } + return; + } + else if (!EquivalenceChecker.getCanonicalPsiEquivalence().statementsAreEquivalent( + statement, nextStatement)) { + return; + } + nextStatement = getNextStatement(nextStatement); + } + } + else if (!EquivalenceChecker.getCanonicalPsiEquivalence().statementsAreEquivalent( + thenBranch, nextStatement)) { + return; } - return; - } - else if (!EquivalenceChecker.getCanonicalPsiEquivalence().statementsAreEquivalent( - statement, nextStatement)) { - return; - } - nextStatement = getNextStatement(nextStatement); + registerStatementError(ifStatement); } - } - else if (!EquivalenceChecker.getCanonicalPsiEquivalence().statementsAreEquivalent( - thenBranch, nextStatement)) { - return; - } - registerStatementError(ifStatement); - } - @Nullable - private static PsiStatement getNextStatement(PsiStatement statement) { - PsiStatement nextStatement = - PsiTreeUtil.getNextSiblingOfType(statement, - PsiStatement.class); - while (nextStatement == null) { - //noinspection AssignmentToMethodParameter - statement = PsiTreeUtil.getParentOfType(statement, - PsiStatement.class); - if (statement == null) { - return null; - } - if (statement instanceof PsiLoopStatement) { - // return in a loop statement is not the same as continuing - // looping. - return statement; - } - nextStatement = PsiTreeUtil.getNextSiblingOfType(statement, - PsiStatement.class); - if (nextStatement == null) { - continue; - } - final PsiElement statementParent = statement.getParent(); - if (!(statementParent instanceof PsiIfStatement)) { - continue; - } - // nextStatement should not be the else part of an if statement - final PsiElement nextStatementParent = - nextStatement.getParent(); - if (statementParent.equals(nextStatementParent)) { - nextStatement = null; + @Nullable + private static PsiStatement getNextStatement(PsiStatement statement) { + PsiStatement nextStatement = + PsiTreeUtil.getNextSiblingOfType( + statement, + PsiStatement.class + ); + while (nextStatement == null) { + //noinspection AssignmentToMethodParameter + statement = PsiTreeUtil.getParentOfType( + statement, + PsiStatement.class + ); + if (statement == null) { + return null; + } + if (statement instanceof PsiLoopStatement) { + // return in a loop statement is not the same as continuing + // looping. + return statement; + } + nextStatement = PsiTreeUtil.getNextSiblingOfType( + statement, + PsiStatement.class + ); + if (nextStatement == null) { + continue; + } + final PsiElement statementParent = statement.getParent(); + if (!(statementParent instanceof PsiIfStatement)) { + continue; + } + // nextStatement should not be the else part of an if statement + final PsiElement nextStatementParent = + nextStatement.getParent(); + if (statementParent.equals(nextStatementParent)) { + nextStatement = null; + } + } + return nextStatement; } - } - return nextStatement; } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/IfStatementWithTooManyBranchesInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/IfStatementWithTooManyBranchesInspection.java index 481dbce84f..ea8de752bc 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/IfStatementWithTooManyBranchesInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/IfStatementWithTooManyBranchesInspection.java @@ -27,66 +27,65 @@ import javax.swing.*; -public abstract class IfStatementWithTooManyBranchesInspection - extends BaseInspection { +public abstract class IfStatementWithTooManyBranchesInspection extends BaseInspection { + private static final int DEFAULT_BRANCH_LIMIT = 3; - private static final int DEFAULT_BRANCH_LIMIT = 3; + /** + * this is public for the DefaultJDOMExternalizer thingy + * + * @noinspection PublicField + */ + public int m_limit = DEFAULT_BRANCH_LIMIT; - /** - * this is public for the DefaultJDOMExternalizer thingy - * - * @noinspection PublicField - */ - public int m_limit = DEFAULT_BRANCH_LIMIT; - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.ifStatementWithTooManyBranchesDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.ifStatementWithTooManyBranchesDisplayName(); + } - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.ifStatementWithTooManyBranchesMaxOption(); - return new SingleIntegerFieldOptionsPanel(message.get(), this, "m_limit"); - } + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.ifStatementWithTooManyBranchesMaxOption(); + return new SingleIntegerFieldOptionsPanel(message.get(), this, "m_limit"); + } - @Nonnull - protected String buildErrorString(Object... infos) { - final Integer branchCount = (Integer)infos[0]; - return InspectionGadgetsLocalize.ifStatementWithTooManyBranchesProblemDescriptor(branchCount).get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + final Integer branchCount = (Integer) infos[0]; + return InspectionGadgetsLocalize.ifStatementWithTooManyBranchesProblemDescriptor(branchCount).get(); + } - public BaseInspectionVisitor buildVisitor() { - return new IfStatementWithTooManyBranchesVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new IfStatementWithTooManyBranchesVisitor(); + } - private class IfStatementWithTooManyBranchesVisitor extends BaseInspectionVisitor { - @Override - public void visitIfStatement(@Nonnull PsiIfStatement statement) { - super.visitIfStatement(statement); - final PsiElement parent = statement.getParent(); - if (parent instanceof PsiIfStatement) { - final PsiIfStatement parentStatement = (PsiIfStatement)parent; - final PsiStatement elseBranch = parentStatement.getElseBranch(); - if (statement.equals(elseBranch)) { - return; + private class IfStatementWithTooManyBranchesVisitor extends BaseInspectionVisitor { + @Override + public void visitIfStatement(@Nonnull PsiIfStatement statement) { + super.visitIfStatement(statement); + final PsiElement parent = statement.getParent(); + if (parent instanceof PsiIfStatement) { + final PsiIfStatement parentStatement = (PsiIfStatement) parent; + final PsiStatement elseBranch = parentStatement.getElseBranch(); + if (statement.equals(elseBranch)) { + return; + } + } + final int branchCount = calculateBranchCount(statement); + if (branchCount <= m_limit) { + return; + } + registerStatementError(statement, branchCount); } - } - final int branchCount = calculateBranchCount(statement); - if (branchCount <= m_limit) { - return; - } - registerStatementError(statement, branchCount); - } - private int calculateBranchCount(PsiIfStatement statement) { - final PsiStatement branch = statement.getElseBranch(); - if (branch == null) { - return 1; - } - if (!(branch instanceof PsiIfStatement)) { - return 2; - } - return 1 + calculateBranchCount((PsiIfStatement)branch); + private int calculateBranchCount(PsiIfStatement statement) { + final PsiStatement branch = statement.getElseBranch(); + if (branch == null) { + return 1; + } + if (!(branch instanceof PsiIfStatement)) { + return 2; + } + return 1 + calculateBranchCount((PsiIfStatement) branch); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/InfiniteLoopStatementInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/InfiniteLoopStatementInspection.java index 889d56abb1..4cf13df7e0 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/InfiniteLoopStatementInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/InfiniteLoopStatementInspection.java @@ -24,77 +24,64 @@ import com.siyeh.ig.psiutils.ControlFlowUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl -public class InfiniteLoopStatementInspection extends BaseInspection -{ +public class InfiniteLoopStatementInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.infiniteLoopStatementDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() - { - return InspectionGadgetsLocalize.infiniteLoopStatementDisplayName().get(); - } + @Override + public boolean isEnabledByDefault() { + return true; + } - @Override - public boolean isEnabledByDefault() - { - return true; - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.infiniteLoopStatementProblemDescriptor().get(); + } - @Override - @Nonnull - protected String buildErrorString(Object... infos) - { - return InspectionGadgetsLocalize.infiniteLoopStatementProblemDescriptor().get(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new InfiniteLoopStatementsVisitor(); + } - @Override - public BaseInspectionVisitor buildVisitor() - { - return new InfiniteLoopStatementsVisitor(); - } + private static class InfiniteLoopStatementsVisitor extends BaseInspectionVisitor { - private static class InfiniteLoopStatementsVisitor extends BaseInspectionVisitor - { + @Override + public void visitForStatement(@Nonnull PsiForStatement statement) { + super.visitForStatement(statement); + checkStatement(statement); + } - @Override - public void visitForStatement(@Nonnull PsiForStatement statement) - { - super.visitForStatement(statement); - checkStatement(statement); - } + @Override + public void visitWhileStatement(@Nonnull PsiWhileStatement statement) { + super.visitWhileStatement(statement); + checkStatement(statement); + } - @Override - public void visitWhileStatement(@Nonnull PsiWhileStatement statement) - { - super.visitWhileStatement(statement); - checkStatement(statement); - } + @Override + public void visitDoWhileStatement(@Nonnull PsiDoWhileStatement statement) { + super.visitDoWhileStatement(statement); + checkStatement(statement); + } - @Override - public void visitDoWhileStatement(@Nonnull PsiDoWhileStatement statement) - { - super.visitDoWhileStatement(statement); - checkStatement(statement); - } - - private void checkStatement(PsiStatement statement) - { - if(ControlFlowUtils.statementMayCompleteNormally(statement)) - { - return; - } - if(ControlFlowUtils.containsReturn(statement)) - { - return; - } - if(ControlFlowUtils.containsSystemExit(statement)) - { - return; - } - registerStatementError(statement); - } - } + private void checkStatement(PsiStatement statement) { + if (ControlFlowUtils.statementMayCompleteNormally(statement)) { + return; + } + if (ControlFlowUtils.containsReturn(statement)) { + return; + } + if (ControlFlowUtils.containsSystemExit(statement)) { + return; + } + registerStatementError(statement); + } + } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/LabeledStatementInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/LabeledStatementInspection.java index 36161a29b5..d8fb5c95c1 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/LabeledStatementInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/LabeledStatementInspection.java @@ -21,34 +21,35 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class LabeledStatementInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.labeledStatementDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.labeledStatementDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.labeledStatementProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.labeledStatementProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new LabeledStatementVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new LabeledStatementVisitor(); + } - private static class LabeledStatementVisitor - extends BaseInspectionVisitor { + private static class LabeledStatementVisitor + extends BaseInspectionVisitor { - @Override - public void visitLabeledStatement(PsiLabeledStatement statement) { - super.visitLabeledStatement(statement); - final PsiIdentifier labelIdentifier = - statement.getLabelIdentifier(); - registerError(labelIdentifier); + @Override + public void visitLabeledStatement(PsiLabeledStatement statement) { + super.visitLabeledStatement(statement); + final PsiIdentifier labelIdentifier = + statement.getLabelIdentifier(); + registerError(labelIdentifier); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/LoopConditionNotUpdatedInsideLoopInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/LoopConditionNotUpdatedInsideLoopInspection.java index e14a4756e4..b7547819b6 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/LoopConditionNotUpdatedInsideLoopInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/LoopConditionNotUpdatedInsideLoopInspection.java @@ -36,234 +36,242 @@ import java.util.List; @ExtensionImpl -public class LoopConditionNotUpdatedInsideLoopInspection - extends BaseInspection { - - @SuppressWarnings({"PublicField"}) - public boolean ignoreIterators = false; - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.loopConditionNotUpdatedInsideLoopDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.loopConditionNotUpdatedInsideLoopProblemDescriptor().get(); - } - - @Nullable - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.ignoreIteratorLoopVariables(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreIterators"); - } - - public BaseInspectionVisitor buildVisitor() { - return new LoopConditionNotUpdatedInsideLoopVisitor(); - } - - private class LoopConditionNotUpdatedInsideLoopVisitor - extends BaseInspectionVisitor { +public class LoopConditionNotUpdatedInsideLoopInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean ignoreIterators = false; + @Nonnull @Override - public void visitWhileStatement(PsiWhileStatement statement) { - super.visitWhileStatement(statement); - final PsiExpression condition = statement.getCondition(); - check(condition, statement); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.loopConditionNotUpdatedInsideLoopDisplayName(); } - @Override - public void visitDoWhileStatement(PsiDoWhileStatement statement) { - super.visitDoWhileStatement(statement); - final PsiExpression condition = statement.getCondition(); - check(condition, statement); + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.loopConditionNotUpdatedInsideLoopProblemDescriptor().get(); } - @Override - public void visitForStatement(PsiForStatement statement) { - super.visitForStatement(statement); - final PsiExpression condition = statement.getCondition(); - check(condition, statement); + @Nullable + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.ignoreIteratorLoopVariables(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreIterators"); } - private void check(PsiExpression condition, PsiStatement statement) { - final List notUpdated = - new SmartList(); - if (checkCondition(condition, statement, notUpdated)) { - if (notUpdated.isEmpty()) { - // condition involves only final variables and/or constants, - // flag the whole condition - // Maybe this should show a different error message, like - // "loop condition cannot change", - // "loop condition is never updated" or so - if (!BoolUtils.isTrue(condition)) { - registerError(condition); - } + public BaseInspectionVisitor buildVisitor() { + return new LoopConditionNotUpdatedInsideLoopVisitor(); + } + + private class LoopConditionNotUpdatedInsideLoopVisitor + extends BaseInspectionVisitor { + + @Override + public void visitWhileStatement(PsiWhileStatement statement) { + super.visitWhileStatement(statement); + final PsiExpression condition = statement.getCondition(); + check(condition, statement); } - else { - for (PsiExpression expression : notUpdated) { - registerError(expression); - } + + @Override + public void visitDoWhileStatement(PsiDoWhileStatement statement) { + super.visitDoWhileStatement(statement); + final PsiExpression condition = statement.getCondition(); + check(condition, statement); } - } - } - private boolean checkCondition(@Nullable PsiExpression condition, - @Nonnull PsiStatement context, - List notUpdated) { - if (condition == null) { - return false; - } - if (PsiUtil.isConstantExpression(condition) || - PsiKeyword.NULL.equals(condition.getText())) { - return true; - } - if (condition instanceof PsiInstanceOfExpression) { - final PsiInstanceOfExpression instanceOfExpression = - (PsiInstanceOfExpression)condition; - final PsiExpression operand = instanceOfExpression.getOperand(); - return checkCondition(operand, context, notUpdated); - } - else if (condition instanceof PsiParenthesizedExpression) { - // catch stuff like "while ((x)) { ... }" - final PsiExpression expression = - ((PsiParenthesizedExpression)condition).getExpression(); - return checkCondition(expression, context, notUpdated); - } - else if (condition instanceof PsiBinaryExpression) { - // while (value != x) { ... } - // while (value != (x + y)) { ... } - // while (b1 && b2) { ... } - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)condition; - final PsiExpression lhs = binaryExpression.getLOperand(); - final PsiExpression rhs = binaryExpression.getROperand(); - if (rhs == null) { - return false; + @Override + public void visitForStatement(PsiForStatement statement) { + super.visitForStatement(statement); + final PsiExpression condition = statement.getCondition(); + check(condition, statement); } - if (checkCondition(lhs, context, notUpdated)) { - return checkCondition(rhs, context, notUpdated); + + private void check(PsiExpression condition, PsiStatement statement) { + final List notUpdated = + new SmartList(); + if (checkCondition(condition, statement, notUpdated)) { + if (notUpdated.isEmpty()) { + // condition involves only final variables and/or constants, + // flag the whole condition + // Maybe this should show a different error message, like + // "loop condition cannot change", + // "loop condition is never updated" or so + if (!BoolUtils.isTrue(condition)) { + registerError(condition); + } + } + else { + for (PsiExpression expression : notUpdated) { + registerError(expression); + } + } + } } - } - else if (condition instanceof PsiReferenceExpression) { - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)condition; - final PsiElement element = referenceExpression.resolve(); - if (element instanceof PsiField) { - final PsiField field = (PsiField)element; - final PsiType type = field.getType(); - if (field.hasModifierProperty(PsiModifier.FINAL) && - type.getArrayDimensions() == 0) { - if (field.hasModifierProperty(PsiModifier.STATIC)) { - return true; + + private boolean checkCondition( + @Nullable PsiExpression condition, + @Nonnull PsiStatement context, + List notUpdated + ) { + if (condition == null) { + return false; } - final PsiExpression qualifier = - referenceExpression.getQualifierExpression(); - if (qualifier == null) { - return true; + if (PsiUtil.isConstantExpression(condition) || + PsiKeyword.NULL.equals(condition.getText())) { + return true; } - else if (checkCondition(qualifier, context, - notUpdated)) { - return true; + if (condition instanceof PsiInstanceOfExpression) { + final PsiInstanceOfExpression instanceOfExpression = + (PsiInstanceOfExpression) condition; + final PsiExpression operand = instanceOfExpression.getOperand(); + return checkCondition(operand, context, notUpdated); } - } - } - else if (element instanceof PsiVariable) { - final PsiVariable variable = (PsiVariable)element; - if (variable.hasModifierProperty(PsiModifier.FINAL)) { - // final variables cannot be updated, don't bother to - // flag them - return true; - } - else if (element instanceof PsiLocalVariable || - element instanceof PsiParameter) { - if (!VariableAccessUtils.variableIsAssigned(variable, - context)) { - notUpdated.add(referenceExpression); - return true; + else if (condition instanceof PsiParenthesizedExpression) { + // catch stuff like "while ((x)) { ... }" + final PsiExpression expression = + ((PsiParenthesizedExpression) condition).getExpression(); + return checkCondition(expression, context, notUpdated); + } + else if (condition instanceof PsiBinaryExpression) { + // while (value != x) { ... } + // while (value != (x + y)) { ... } + // while (b1 && b2) { ... } + final PsiBinaryExpression binaryExpression = + (PsiBinaryExpression) condition; + final PsiExpression lhs = binaryExpression.getLOperand(); + final PsiExpression rhs = binaryExpression.getROperand(); + if (rhs == null) { + return false; + } + if (checkCondition(lhs, context, notUpdated)) { + return checkCondition(rhs, context, notUpdated); + } + } + else if (condition instanceof PsiReferenceExpression) { + final PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) condition; + final PsiElement element = referenceExpression.resolve(); + if (element instanceof PsiField) { + final PsiField field = (PsiField) element; + final PsiType type = field.getType(); + if (field.hasModifierProperty(PsiModifier.FINAL) && + type.getArrayDimensions() == 0) { + if (field.hasModifierProperty(PsiModifier.STATIC)) { + return true; + } + final PsiExpression qualifier = + referenceExpression.getQualifierExpression(); + if (qualifier == null) { + return true; + } + else if (checkCondition(qualifier, context, + notUpdated + )) { + return true; + } + } + } + else if (element instanceof PsiVariable) { + final PsiVariable variable = (PsiVariable) element; + if (variable.hasModifierProperty(PsiModifier.FINAL)) { + // final variables cannot be updated, don't bother to + // flag them + return true; + } + else if (element instanceof PsiLocalVariable || + element instanceof PsiParameter) { + if (!VariableAccessUtils.variableIsAssigned( + variable, + context + )) { + notUpdated.add(referenceExpression); + return true; + } + } + } + } + else if (condition instanceof PsiPrefixExpression) { + final PsiPrefixExpression prefixExpression = + (PsiPrefixExpression) condition; + final IElementType tokenType = prefixExpression.getOperationTokenType(); + if (JavaTokenType.EXCL.equals(tokenType) || + JavaTokenType.PLUS.equals(tokenType) || + JavaTokenType.MINUS.equals(tokenType)) { + final PsiExpression operand = prefixExpression.getOperand(); + return checkCondition(operand, context, notUpdated); + } + } + else if (condition instanceof PsiArrayAccessExpression) { + // Actually the contents of the array could change nevertheless + // if it is accessed through a different reference like this: + // int[] local_ints = new int[]{1, 2}; + // int[] other_ints = local_ints; + // while (local_ints[0] > 0) { other_ints[0]--; } + // + // Keep this check? + final PsiArrayAccessExpression accessExpression = + (PsiArrayAccessExpression) condition; + final PsiExpression indexExpression = + accessExpression.getIndexExpression(); + return checkCondition(indexExpression, context, notUpdated) + && checkCondition(accessExpression.getArrayExpression(), + context, notUpdated + ); + } + else if (condition instanceof PsiConditionalExpression) { + final PsiConditionalExpression conditionalExpression = + (PsiConditionalExpression) condition; + final PsiExpression thenExpression = + conditionalExpression.getThenExpression(); + final PsiExpression elseExpression = + conditionalExpression.getElseExpression(); + if (thenExpression == null || elseExpression == null) { + return false; + } + return checkCondition(conditionalExpression.getCondition(), + context, notUpdated + ) + && checkCondition(thenExpression, context, notUpdated) + && checkCondition(elseExpression, context, notUpdated); + } + else if (condition instanceof PsiThisExpression) { + return true; + } + else if (condition instanceof PsiMethodCallExpression && + !ignoreIterators) { + final PsiMethodCallExpression methodCallExpression = + (PsiMethodCallExpression) condition; + if (!IteratorUtils.isCallToHasNext(methodCallExpression)) { + return false; + } + final PsiReferenceExpression methodExpression = + methodCallExpression.getMethodExpression(); + final PsiExpression qualifierExpression = + methodExpression.getQualifierExpression(); + if (qualifierExpression instanceof PsiReferenceExpression) { + final PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) qualifierExpression; + final PsiElement element = referenceExpression.resolve(); + if (!(element instanceof PsiVariable)) { + return false; + } + final PsiVariable variable = (PsiVariable) element; + if (!IteratorUtils.containsCallToScannerNext(context, + variable, true + )) { + notUpdated.add(qualifierExpression); + return true; + } + } + else { + if (!IteratorUtils.containsCallToScannerNext(context, + null, true + )) { + notUpdated.add(methodCallExpression); + return true; + } + } } - } - } - } - else if (condition instanceof PsiPrefixExpression) { - final PsiPrefixExpression prefixExpression = - (PsiPrefixExpression)condition; - final IElementType tokenType = prefixExpression.getOperationTokenType(); - if (JavaTokenType.EXCL.equals(tokenType) || - JavaTokenType.PLUS.equals(tokenType) || - JavaTokenType.MINUS.equals(tokenType)) { - final PsiExpression operand = prefixExpression.getOperand(); - return checkCondition(operand, context, notUpdated); - } - } - else if (condition instanceof PsiArrayAccessExpression) { - // Actually the contents of the array could change nevertheless - // if it is accessed through a different reference like this: - // int[] local_ints = new int[]{1, 2}; - // int[] other_ints = local_ints; - // while (local_ints[0] > 0) { other_ints[0]--; } - // - // Keep this check? - final PsiArrayAccessExpression accessExpression = - (PsiArrayAccessExpression)condition; - final PsiExpression indexExpression = - accessExpression.getIndexExpression(); - return checkCondition(indexExpression, context, notUpdated) - && checkCondition(accessExpression.getArrayExpression(), - context, notUpdated); - } - else if (condition instanceof PsiConditionalExpression) { - final PsiConditionalExpression conditionalExpression = - (PsiConditionalExpression)condition; - final PsiExpression thenExpression = - conditionalExpression.getThenExpression(); - final PsiExpression elseExpression = - conditionalExpression.getElseExpression(); - if (thenExpression == null || elseExpression == null) { - return false; - } - return checkCondition(conditionalExpression.getCondition(), - context, notUpdated) - && checkCondition(thenExpression, context, notUpdated) - && checkCondition(elseExpression, context, notUpdated); - } - else if (condition instanceof PsiThisExpression) { - return true; - } - else if (condition instanceof PsiMethodCallExpression && - !ignoreIterators) { - final PsiMethodCallExpression methodCallExpression = - (PsiMethodCallExpression)condition; - if (!IteratorUtils.isCallToHasNext(methodCallExpression)) { - return false; - } - final PsiReferenceExpression methodExpression = - methodCallExpression.getMethodExpression(); - final PsiExpression qualifierExpression = - methodExpression.getQualifierExpression(); - if (qualifierExpression instanceof PsiReferenceExpression) { - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)qualifierExpression; - final PsiElement element = referenceExpression.resolve(); - if (!(element instanceof PsiVariable)) { return false; - } - final PsiVariable variable = (PsiVariable)element; - if (!IteratorUtils.containsCallToScannerNext(context, - variable, true)) { - notUpdated.add(qualifierExpression); - return true; - } - } - else { - if (!IteratorUtils.containsCallToScannerNext(context, - null, true)) { - notUpdated.add(methodCallExpression); - return true; - } } - } - return false; } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/LoopStatementsThatDontLoopInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/LoopStatementsThatDontLoopInspection.java index b77cd53566..bb7bcb79bb 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/LoopStatementsThatDontLoopInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/LoopStatementsThatDontLoopInspection.java @@ -21,99 +21,105 @@ import com.siyeh.ig.psiutils.ControlFlowUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl public class LoopStatementsThatDontLoopInspection extends BaseInspection { - - @Nonnull - public String getID() { - return "LoopStatementThatDoesntLoop"; - } - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.loopStatementsThatDontLoopDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.loopStatementsThatDontLoopProblemDescriptor().get(); - } - - public boolean isEnabledByDefault() { - return true; - } - - public BaseInspectionVisitor buildVisitor() { - return new LoopStatementsThatDontLoopVisitor(); - } - - private static class LoopStatementsThatDontLoopVisitor extends BaseInspectionVisitor { + @Nonnull @Override - public void visitForStatement(@Nonnull PsiForStatement statement) { - super.visitForStatement(statement); - final PsiStatement body = statement.getBody(); - if (body == null) { - return; - } - if (ControlFlowUtils.statementMayCompleteNormally(body)) { - return; - } - if (ControlFlowUtils.statementIsContinueTarget(statement)) { - return; - } - registerStatementError(statement); + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "LoopStatementThatDoesntLoop"; } + @Nonnull @Override - public void visitForeachStatement( - @Nonnull PsiForeachStatement statement) { - super.visitForeachStatement(statement); - final PsiStatement body = statement.getBody(); - if (body == null) { - return; - } - if (ControlFlowUtils.statementMayCompleteNormally(body)) { - return; - } - if (ControlFlowUtils.statementIsContinueTarget(statement)) { - return; - } - registerStatementError(statement); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.loopStatementsThatDontLoopDisplayName(); } - @Override - public void visitWhileStatement(@Nonnull PsiWhileStatement statement) { - super.visitWhileStatement(statement); - final PsiStatement body = statement.getBody(); - if (body == null) { - return; - } - if (ControlFlowUtils.statementMayCompleteNormally(body)) { - return; - } - if (ControlFlowUtils.statementIsContinueTarget(statement)) { - return; - } - registerStatementError(statement); + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.loopStatementsThatDontLoopProblemDescriptor().get(); } - @Override - public void visitDoWhileStatement( - @Nonnull PsiDoWhileStatement statement) { - super.visitDoWhileStatement(statement); - final PsiStatement body = statement.getBody(); - if (body == null) { - return; - } - if (ControlFlowUtils.statementMayCompleteNormally(body)) { - return; - } - if (ControlFlowUtils.statementIsContinueTarget(statement)) { - return; - } - registerStatementError(statement); + public boolean isEnabledByDefault() { + return true; + } + + public BaseInspectionVisitor buildVisitor() { + return new LoopStatementsThatDontLoopVisitor(); + } + + private static class LoopStatementsThatDontLoopVisitor extends BaseInspectionVisitor { + @Override + public void visitForStatement(@Nonnull PsiForStatement statement) { + super.visitForStatement(statement); + final PsiStatement body = statement.getBody(); + if (body == null) { + return; + } + if (ControlFlowUtils.statementMayCompleteNormally(body)) { + return; + } + if (ControlFlowUtils.statementIsContinueTarget(statement)) { + return; + } + registerStatementError(statement); + } + + @Override + public void visitForeachStatement( + @Nonnull PsiForeachStatement statement + ) { + super.visitForeachStatement(statement); + final PsiStatement body = statement.getBody(); + if (body == null) { + return; + } + if (ControlFlowUtils.statementMayCompleteNormally(body)) { + return; + } + if (ControlFlowUtils.statementIsContinueTarget(statement)) { + return; + } + registerStatementError(statement); + } + + @Override + public void visitWhileStatement(@Nonnull PsiWhileStatement statement) { + super.visitWhileStatement(statement); + final PsiStatement body = statement.getBody(); + if (body == null) { + return; + } + if (ControlFlowUtils.statementMayCompleteNormally(body)) { + return; + } + if (ControlFlowUtils.statementIsContinueTarget(statement)) { + return; + } + registerStatementError(statement); + } + + @Override + public void visitDoWhileStatement( + @Nonnull PsiDoWhileStatement statement + ) { + super.visitDoWhileStatement(statement); + final PsiStatement body = statement.getBody(); + if (body == null) { + return; + } + if (ControlFlowUtils.statementMayCompleteNormally(body)) { + return; + } + if (ControlFlowUtils.statementIsContinueTarget(statement)) { + return; + } + registerStatementError(statement); + } } - } } \ No newline at end of file