From 76a86fcbf20ad39db4704b361e4548fde5de1ad6 Mon Sep 17 00:00:00 2001 From: UNV Date: Sat, 11 Oct 2025 00:10:59 +0300 Subject: [PATCH] Localizing inspections (part 1). --- .../abstraction/InstanceofThisInspection.java | 56 +- ...ocalVariableOfConcreteClassInspection.java | 78 ++- .../ig/abstraction/MagicNumberInspection.java | 219 +++---- ...ethodOnlyUsedFromInnerClassInspection.java | 304 ++++----- ...MethodReturnOfConcreteClassInspection.java | 79 +-- .../OverlyStrongTypeCastInspection.java | 295 +++++---- .../ParameterOfConcreteClassInspection.java | 95 +-- ...MethodNotExposedInInterfaceInspection.java | 248 ++++---- ...aticVariableOfConcreteClassInspection.java | 80 ++- .../TypeMayBeWeakenedInspection.java | 512 +++++++-------- ...gnmentToCatchBlockParameterInspection.java | 91 +-- ...ollectionFieldFromParameterInspection.java | 163 ++--- ...entToDateFieldFromParameterInspection.java | 147 ++--- ...ssignmentToForLoopParameterInspection.java | 277 ++++---- ...AssignmentToMethodParameterInspection.java | 247 ++++---- .../AssignmentToNullInspection.java | 157 ++--- ...aticFieldFromInstanceMethodInspection.java | 160 ++--- ...AssignmentToSuperclassFieldInspection.java | 138 ++-- .../AssignmentUsedAsConditionInspection.java | 185 +++--- ...ntDecrementUsedAsExpressionInspection.java | 590 +++++++++--------- .../NestedAssignmentInspection.java | 57 +- ...nmentWithOperatorAssignmentInspection.java | 357 +++++------ .../bitwise/IncompatibleMaskInspection.java | 264 ++++---- .../PointlessBitwiseExpressionInspection.java | 425 ++++++------- .../ig/bitwise/ShiftOutOfRangeInspection.java | 220 ++++--- .../impl/ig/bugs/ArrayEqualityInspection.java | 204 +++--- .../impl/ig/bugs/ArrayEqualsInspection.java | 202 +++--- .../impl/ig/bugs/ArrayHashCodeInspection.java | 192 +++--- .../bugs/AssertWithSideEffectsInspection.java | 303 ++++----- ...CastToIncompatibleInterfaceInspection.java | 112 ++-- .../ig/bugs/ClassNewInstanceInspection.java | 265 ++++---- ...entedButEqualsNotOverriddenInspection.java | 111 ++-- ...mpareToUsesNonFinalVariableInspection.java | 93 +-- .../ConstantAssertConditionInspection.java | 72 ++- .../ig/bugs/CovariantEqualsInspection.java | 113 ++-- .../ig/bugs/EmptyInitializerInspection.java | 101 +-- .../ig/bugs/EmptyStatementBodyInspection.java | 212 +++---- ...lsBetweenInconvertibleTypesInspection.java | 123 ++-- .../EqualsUsesNonFinalVariableInspection.java | 99 +-- ...chDoesntCheckParameterClassInspection.java | 222 +++---- ...opThatDoesntUseLoopVariableInspection.java | 287 ++++----- ...ashCodeUsesNonFinalVariableInspection.java | 104 +-- .../ig/bugs/IgnoreResultOfCallInspection.java | 315 +++++----- .../bugs/ImplicitArrayToStringInspection.java | 510 +++++++-------- .../ig/bugs/InfiniteRecursionInspection.java | 70 +-- ...anceofIncompatibleInterfaceInspection.java | 10 +- ...InstantiationOfUtilityClassInspection.java | 57 +- ...torHasNextCallsIteratorNextInspection.java | 56 +- ...ThrowNoSuchElementExceptionInspection.java | 150 ++--- ...uteAlignmentInUserInterfaceInspection.java | 246 ++++---- 50 files changed, 4891 insertions(+), 4782 deletions(-) diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/InstanceofThisInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/InstanceofThisInspection.java index 54a9c9179d..e651990748 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/InstanceofThisInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/InstanceofThisInspection.java @@ -22,40 +22,42 @@ import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.PsiElement; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class InstanceofThisInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.instanceofCheckForThisDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.instanceofCheckForThisDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.instanceofCheckForThisProblemDescriptor().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.instanceofCheckForThisProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new InstanceofThisVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new InstanceofThisVisitor(); + } - private static class InstanceofThisVisitor extends BaseInspectionVisitor { + private static class InstanceofThisVisitor extends BaseInspectionVisitor { - @Override - public void visitThisExpression(@Nonnull PsiThisExpression thisValue) { - super.visitThisExpression(thisValue); - if (thisValue.getQualifier() != null) { - return; - } - final PsiElement parent = - PsiTreeUtil.skipParentsOfType(thisValue, PsiParenthesizedExpression.class, - PsiConditionalExpression.class, PsiTypeCastExpression.class); - if (!(parent instanceof PsiInstanceOfExpression)) { - return; - } - registerError(thisValue); + @Override + public void visitThisExpression(@Nonnull PsiThisExpression thisValue) { + super.visitThisExpression(thisValue); + if (thisValue.getQualifier() != null) { + return; + } + final PsiElement parent = + PsiTreeUtil.skipParentsOfType(thisValue, PsiParenthesizedExpression.class, + PsiConditionalExpression.class, PsiTypeCastExpression.class + ); + if (!(parent instanceof PsiInstanceOfExpression)) { + return; + } + registerError(thisValue); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/LocalVariableOfConcreteClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/LocalVariableOfConcreteClassInspection.java index 4c12b87071..74a830493f 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/LocalVariableOfConcreteClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/LocalVariableOfConcreteClassInspection.java @@ -30,51 +30,49 @@ import javax.swing.*; @ExtensionImpl -public class LocalVariableOfConcreteClassInspection - extends BaseInspection { +public class LocalVariableOfConcreteClassInspection extends BaseInspection { + @SuppressWarnings("PublicField") + public boolean ignoreAbstractClasses = false; - @SuppressWarnings("PublicField") - public boolean ignoreAbstractClasses = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.localVariableOfConcreteClassDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.localVariableOfConcreteClassDisplayName(); + } - @Override - @Nonnull - @RequiredReadAction - public String buildErrorString(Object... arg) { - final PsiNamedElement variable = (PsiNamedElement)arg[0]; - final String name = variable.getName(); - return InspectionGadgetsLocalize.localVariableOfConcreteClassProblemDescriptor(name).get(); - } + @Override + @Nonnull + @RequiredReadAction + public String buildErrorString(Object... arg) { + final PsiNamedElement variable = (PsiNamedElement) arg[0]; + final String name = variable.getName(); + return InspectionGadgetsLocalize.localVariableOfConcreteClassProblemDescriptor(name).get(); + } - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.localVariableOfConcreteClassOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreAbstractClasses"); - } + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.localVariableOfConcreteClassOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreAbstractClasses"); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new LocalVariableOfConcreteClassVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new LocalVariableOfConcreteClassVisitor(); + } - private class LocalVariableOfConcreteClassVisitor - extends BaseInspectionVisitor { + private class LocalVariableOfConcreteClassVisitor + extends BaseInspectionVisitor { - @Override - public void visitLocalVariable( - @Nonnull PsiLocalVariable variable) { - super.visitLocalVariable(variable); - final PsiTypeElement typeElement = variable.getTypeElement(); - if (!ConcreteClassUtil.typeIsConcreteClass(typeElement, - ignoreAbstractClasses)) { - return; - } - registerError(typeElement, variable); + @Override + public void visitLocalVariable( + @Nonnull PsiLocalVariable variable + ) { + super.visitLocalVariable(variable); + final PsiTypeElement typeElement = variable.getTypeElement(); + if (!ConcreteClassUtil.typeIsConcreteClass(typeElement, ignoreAbstractClasses)) { + return; + } + registerError(typeElement, variable); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/MagicNumberInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/MagicNumberInspection.java index ba81bb46d6..c1ffcad797 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/MagicNumberInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/MagicNumberInspection.java @@ -28,134 +28,135 @@ import consulo.deadCodeNotWorking.impl.MultipleCheckboxOptionsPanel; import consulo.language.psi.PsiElement; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import javax.swing.*; @ExtensionImpl public class MagicNumberInspection extends BaseInspection { + @SuppressWarnings("PublicField") + public boolean ignoreInHashCode = true; - @SuppressWarnings("PublicField") - public boolean ignoreInHashCode = true; + @SuppressWarnings("PublicField") + public boolean ignoreInTestCode = false; - @SuppressWarnings("PublicField") - public boolean ignoreInTestCode = false; + @SuppressWarnings("PublicField") + public boolean ignoreInAnnotations = true; - @SuppressWarnings("PublicField") - public boolean ignoreInAnnotations = true; + @SuppressWarnings("PublicField") + public boolean ignoreInitialCapacity = false; - @SuppressWarnings("PublicField") - public boolean ignoreInitialCapacity = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.magicNumberDisplayName().get(); - } + @Override + @Nonnull + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.magicNumberDisplayName(); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.magicNumberProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.magicNumberProblemDescriptor().get(); + } - @Override - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); - panel.addCheckbox(InspectionGadgetsBundle.message("magic.number.ignore.option"), "ignoreInHashCode"); - panel.addCheckbox(InspectionGadgetsBundle.message("ignore.in.test.code"), "ignoreInTestCode"); - panel.addCheckbox(InspectionGadgetsBundle.message("ignore.in.annotations"),"ignoreInAnnotations"); - panel.addCheckbox(InspectionGadgetsBundle.message("ignore.as.initial.capacity"), "ignoreInitialCapacity"); - return panel; - } + @Override + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); + panel.addCheckbox(InspectionGadgetsBundle.message("magic.number.ignore.option"), "ignoreInHashCode"); + panel.addCheckbox(InspectionGadgetsBundle.message("ignore.in.test.code"), "ignoreInTestCode"); + panel.addCheckbox(InspectionGadgetsBundle.message("ignore.in.annotations"), "ignoreInAnnotations"); + panel.addCheckbox(InspectionGadgetsBundle.message("ignore.as.initial.capacity"), "ignoreInitialCapacity"); + return panel; + } - @Override - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new IntroduceConstantFix(); - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new IntroduceConstantFix(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new MagicNumberVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new MagicNumberVisitor(); + } - private class MagicNumberVisitor extends BaseInspectionVisitor { + private class MagicNumberVisitor extends BaseInspectionVisitor { - @Override - public void visitLiteralExpression(@Nonnull PsiLiteralExpression expression) { - super.visitLiteralExpression(expression); - final PsiType type = expression.getType(); - if (!ClassUtils.isPrimitiveNumericType(type) || PsiType.CHAR.equals(type)) { - return; - } - if (isSpecialCaseLiteral(expression) || ExpressionUtils.isDeclaredConstant(expression)) { - return; - } - if (ignoreInHashCode) { - final PsiMethod containingMethod = PsiTreeUtil.getParentOfType(expression, PsiMethod.class); - if (MethodUtils.isHashCode(containingMethod)) { - return; - } - } - if (ignoreInTestCode && TestUtils.isInTestCode(expression)) { - return; - } - if (ignoreInAnnotations) { - final boolean insideAnnotation = AnnotationUtil.isInsideAnnotation(expression); - if (insideAnnotation) { - return; - } - } - if (ignoreInitialCapacity) { - final PsiExpressionList expressionList = PsiTreeUtil.getParentOfType(expression, PsiExpressionList.class, true, PsiMember.class); - if (expressionList != null) { - final PsiElement parent = expressionList.getParent(); - if (parent instanceof PsiNewExpression) { - final PsiNewExpression newExpression = (PsiNewExpression)parent; - if (TypeUtils.expressionHasTypeOrSubtype( - newExpression, - CommonClassNames.JAVA_LANG_ABSTRACT_STRING_BUILDER, - CommonClassNames.JAVA_UTIL_MAP, - CommonClassNames.JAVA_UTIL_COLLECTION - ) != null) { - return; + @Override + public void visitLiteralExpression(@Nonnull PsiLiteralExpression expression) { + super.visitLiteralExpression(expression); + final PsiType type = expression.getType(); + if (!ClassUtils.isPrimitiveNumericType(type) || PsiType.CHAR.equals(type)) { + return; + } + if (isSpecialCaseLiteral(expression) || ExpressionUtils.isDeclaredConstant(expression)) { + return; + } + if (ignoreInHashCode) { + final PsiMethod containingMethod = PsiTreeUtil.getParentOfType(expression, PsiMethod.class); + if (MethodUtils.isHashCode(containingMethod)) { + return; + } + } + if (ignoreInTestCode && TestUtils.isInTestCode(expression)) { + return; + } + if (ignoreInAnnotations) { + final boolean insideAnnotation = AnnotationUtil.isInsideAnnotation(expression); + if (insideAnnotation) { + return; + } + } + if (ignoreInitialCapacity) { + final PsiExpressionList expressionList = + PsiTreeUtil.getParentOfType(expression, PsiExpressionList.class, true, PsiMember.class); + if (expressionList != null) { + final PsiElement parent = expressionList.getParent(); + if (parent instanceof PsiNewExpression) { + final PsiNewExpression newExpression = (PsiNewExpression) parent; + if (TypeUtils.expressionHasTypeOrSubtype( + newExpression, + CommonClassNames.JAVA_LANG_ABSTRACT_STRING_BUILDER, + CommonClassNames.JAVA_UTIL_MAP, + CommonClassNames.JAVA_UTIL_COLLECTION + ) != null) { + return; + } + } + } + } + final PsiElement parent = expression.getParent(); + if (parent instanceof PsiPrefixExpression) { + registerError(parent); + } + else { + registerError(expression); } - } } - } - final PsiElement parent = expression.getParent(); - if (parent instanceof PsiPrefixExpression) { - registerError(parent); - } - else { - registerError(expression); - } - } - private boolean isSpecialCaseLiteral(PsiLiteralExpression expression) { - final Object object = ExpressionUtils.computeConstantExpression(expression); - if (object instanceof Integer) { - final int i = ((Integer)object).intValue(); - return i >= 0 && i <= 10 || i == 100 || i == 1000; - } - else if (object instanceof Long) { - final long l = ((Long)object).longValue(); - return l >= 0L && l <= 2L; - } - else if (object instanceof Double) { - final double d = ((Double)object).doubleValue(); - return d == 1.0 || d == 0.0; - } - else if (object instanceof Float) { - final float f = ((Float)object).floatValue(); - return f == 1.0f || f == 0.0f; - } - return false; + private boolean isSpecialCaseLiteral(PsiLiteralExpression expression) { + final Object object = ExpressionUtils.computeConstantExpression(expression); + if (object instanceof Integer) { + final int i = ((Integer) object).intValue(); + return i >= 0 && i <= 10 || i == 100 || i == 1000; + } + else if (object instanceof Long) { + final long l = ((Long) object).longValue(); + return l >= 0L && l <= 2L; + } + else if (object instanceof Double) { + final double d = ((Double) object).doubleValue(); + return d == 1.0 || d == 0.0; + } + else if (object instanceof Float) { + final float f = ((Float) object).floatValue(); + return f == 1.0f || f == 0.0f; + } + return false; + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/MethodOnlyUsedFromInnerClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/MethodOnlyUsedFromInnerClassInspection.java index df7c53afed..f3f326e9a6 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/MethodOnlyUsedFromInnerClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/MethodOnlyUsedFromInnerClassInspection.java @@ -32,6 +32,7 @@ import consulo.language.psi.search.PsiSearchHelper; import consulo.language.psi.search.ReferencesSearch; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @@ -39,171 +40,170 @@ @ExtensionImpl public class MethodOnlyUsedFromInnerClassInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean ignoreMethodsAccessedFromAnonymousClass = false; - @SuppressWarnings({"PublicField"}) - public boolean ignoreMethodsAccessedFromAnonymousClass = false; - - @SuppressWarnings({"PublicField"}) - public boolean ignoreStaticMethodsFromNonStaticInnerClass = false; - - @SuppressWarnings({"PublicField"}) - public boolean onlyReportStaticMethods = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.methodOnlyUsedFromInnerClassDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - final PsiNamedElement element = (PsiNamedElement)infos[0]; - final String name = element.getName(); - if (infos.length > 1) { - if (Boolean.TRUE.equals(infos[1])) { - return InspectionGadgetsLocalize.methodOnlyUsedFromInnerClassProblemDescriptorAnonymousExtending(name).get(); - } - return InspectionGadgetsLocalize.methodOnlyUsedFromInnerClassProblemDescriptorAnonymousImplementing(name).get(); + @SuppressWarnings({"PublicField"}) + public boolean ignoreStaticMethodsFromNonStaticInnerClass = false; + + @SuppressWarnings({"PublicField"}) + public boolean onlyReportStaticMethods = false; + + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.methodOnlyUsedFromInnerClassDisplayName(); } - return InspectionGadgetsLocalize.methodOnlyUsedFromInnerClassProblemDescriptor(name).get(); - } - - @Override - @Nullable - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); - panel.addCheckbox( - InspectionGadgetsLocalize.methodOnlyUsedFromInnerClassIgnoreOption().get(), - "ignoreMethodsAccessedFromAnonymousClass" - ); - panel.addCheckbox( - InspectionGadgetsLocalize.ignoreStaticMethodsAccessedFromANonStaticInnerClass().get(), - "ignoreStaticMethodsFromNonStaticInnerClass" - ); - panel.addCheckbox(InspectionGadgetsLocalize.onlyReportStaticMethods().get(), "onlyReportStaticMethods"); - return panel; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new MethodOnlyUsedFromInnerClassVisitor(); - } - - private class MethodOnlyUsedFromInnerClassVisitor extends BaseInspectionVisitor { + @Override - public void visitMethod(PsiMethod method) { - super.visitMethod(method); - if (!method.hasModifierProperty(PsiModifier.PRIVATE) || method.isConstructor()) { - return; - } - if (onlyReportStaticMethods && !method.hasModifierProperty(PsiModifier.STATIC)) { - return; - } - if (method.getNameIdentifier() == null) { - return; - } - final MethodReferenceFinder processor = new MethodReferenceFinder(method); - if (!processor.isOnlyAccessedFromInnerClass()) { - return; - } - final PsiClass containingClass = processor.getContainingClass(); - if (ignoreStaticMethodsFromNonStaticInnerClass && method.hasModifierProperty(PsiModifier.STATIC)) { - final PsiElement parent = containingClass.getParent(); - if (parent instanceof PsiClass && !containingClass.hasModifierProperty(PsiModifier.STATIC)) { - return; - } - } - if (containingClass instanceof PsiAnonymousClass) { - final PsiClass[] interfaces = containingClass.getInterfaces(); - final PsiClass superClass; - if (interfaces.length == 1) { - superClass = interfaces[0]; - registerMethodError(method, superClass, Boolean.valueOf(false)); - } - else { - superClass = containingClass.getSuperClass(); - if (superClass == null) { - return; - } - registerMethodError(method, superClass, Boolean.valueOf(true)); + @Nonnull + protected String buildErrorString(Object... infos) { + final PsiNamedElement element = (PsiNamedElement) infos[0]; + final String name = element.getName(); + if (infos.length > 1) { + if (Boolean.TRUE.equals(infos[1])) { + return InspectionGadgetsLocalize.methodOnlyUsedFromInnerClassProblemDescriptorAnonymousExtending(name).get(); + } + return InspectionGadgetsLocalize.methodOnlyUsedFromInnerClassProblemDescriptorAnonymousImplementing(name).get(); } - } - else { - registerMethodError(method, containingClass); - } + return InspectionGadgetsLocalize.methodOnlyUsedFromInnerClassProblemDescriptor(name).get(); } - } - private class MethodReferenceFinder implements Processor { - - private final PsiClass methodClass; - private final PsiMethod method; - private boolean onlyAccessedFromInnerClass = false; - - private PsiClass cache = null; - - MethodReferenceFinder(@Nonnull PsiMethod method) { - this.method = method; - methodClass = method.getContainingClass(); + @Override + @Nullable + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); + panel.addCheckbox( + InspectionGadgetsLocalize.methodOnlyUsedFromInnerClassIgnoreOption().get(), + "ignoreMethodsAccessedFromAnonymousClass" + ); + panel.addCheckbox( + InspectionGadgetsLocalize.ignoreStaticMethodsAccessedFromANonStaticInnerClass().get(), + "ignoreStaticMethodsFromNonStaticInnerClass" + ); + panel.addCheckbox(InspectionGadgetsLocalize.onlyReportStaticMethods().get(), "onlyReportStaticMethods"); + return panel; } @Override - public boolean process(PsiReference reference) { - final PsiElement element = reference.getElement(); - final PsiMethod containingMethod = PsiTreeUtil.getParentOfType(element, PsiMethod.class); - if (method.equals(containingMethod)) { - return true; - } - final PsiClass containingClass = ClassUtils.getContainingClass(element); - if (containingClass == null) { - onlyAccessedFromInnerClass = false; - return false; - } - if (containingClass instanceof PsiAnonymousClass) { - final PsiAnonymousClass anonymousClass = (PsiAnonymousClass)containingClass; - final PsiExpressionList argumentList = anonymousClass.getArgumentList(); - if (PsiTreeUtil.isAncestor(argumentList, element, true)) { - onlyAccessedFromInnerClass = false; - return false; + public BaseInspectionVisitor buildVisitor() { + return new MethodOnlyUsedFromInnerClassVisitor(); + } + + private class MethodOnlyUsedFromInnerClassVisitor extends BaseInspectionVisitor { + @Override + public void visitMethod(PsiMethod method) { + super.visitMethod(method); + if (!method.hasModifierProperty(PsiModifier.PRIVATE) || method.isConstructor()) { + return; + } + if (onlyReportStaticMethods && !method.hasModifierProperty(PsiModifier.STATIC)) { + return; + } + if (method.getNameIdentifier() == null) { + return; + } + final MethodReferenceFinder processor = new MethodReferenceFinder(method); + if (!processor.isOnlyAccessedFromInnerClass()) { + return; + } + final PsiClass containingClass = processor.getContainingClass(); + if (ignoreStaticMethodsFromNonStaticInnerClass && method.hasModifierProperty(PsiModifier.STATIC)) { + final PsiElement parent = containingClass.getParent(); + if (parent instanceof PsiClass && !containingClass.hasModifierProperty(PsiModifier.STATIC)) { + return; + } + } + if (containingClass instanceof PsiAnonymousClass) { + final PsiClass[] interfaces = containingClass.getInterfaces(); + final PsiClass superClass; + if (interfaces.length == 1) { + superClass = interfaces[0]; + registerMethodError(method, superClass, Boolean.valueOf(false)); + } + else { + superClass = containingClass.getSuperClass(); + if (superClass == null) { + return; + } + registerMethodError(method, superClass, Boolean.valueOf(true)); + } + } + else { + registerMethodError(method, containingClass); + } } - if (ignoreMethodsAccessedFromAnonymousClass) { - onlyAccessedFromInnerClass = false; - return false; + } + + private class MethodReferenceFinder implements Processor { + + private final PsiClass methodClass; + private final PsiMethod method; + private boolean onlyAccessedFromInnerClass = false; + + private PsiClass cache = null; + + MethodReferenceFinder(@Nonnull PsiMethod method) { + this.method = method; + methodClass = method.getContainingClass(); } - } - if (cache != null) { - if (!cache.equals(containingClass)) { - onlyAccessedFromInnerClass = false; - return false; + + @Override + public boolean process(PsiReference reference) { + final PsiElement element = reference.getElement(); + final PsiMethod containingMethod = PsiTreeUtil.getParentOfType(element, PsiMethod.class); + if (method.equals(containingMethod)) { + return true; + } + final PsiClass containingClass = ClassUtils.getContainingClass(element); + if (containingClass == null) { + onlyAccessedFromInnerClass = false; + return false; + } + if (containingClass instanceof PsiAnonymousClass) { + final PsiAnonymousClass anonymousClass = (PsiAnonymousClass) containingClass; + final PsiExpressionList argumentList = anonymousClass.getArgumentList(); + if (PsiTreeUtil.isAncestor(argumentList, element, true)) { + onlyAccessedFromInnerClass = false; + return false; + } + if (ignoreMethodsAccessedFromAnonymousClass) { + onlyAccessedFromInnerClass = false; + return false; + } + } + if (cache != null) { + if (!cache.equals(containingClass)) { + onlyAccessedFromInnerClass = false; + return false; + } + } + else if (!PsiTreeUtil.isAncestor(methodClass, containingClass, true)) { + onlyAccessedFromInnerClass = false; + return false; + } + onlyAccessedFromInnerClass = true; + cache = containingClass; + return true; } - } - else if (!PsiTreeUtil.isAncestor(methodClass, containingClass, true)) { - onlyAccessedFromInnerClass = false; - return false; - } - onlyAccessedFromInnerClass = true; - cache = containingClass; - return true; - } - public boolean isOnlyAccessedFromInnerClass() { - final PsiSearchHelper searchHelper = PsiSearchHelper.SERVICE.getInstance(method.getProject()); - final ProgressManager progressManager = ProgressManager.getInstance(); - final ProgressIndicator progressIndicator = progressManager.getProgressIndicator(); - final PsiSearchHelper.SearchCostResult searchCost = - searchHelper.isCheapEnoughToSearch(method.getName(), method.getResolveScope(), null, progressIndicator); - if (searchCost == PsiSearchHelper.SearchCostResult.TOO_MANY_OCCURRENCES || - searchCost == PsiSearchHelper.SearchCostResult.ZERO_OCCURRENCES) { - return onlyAccessedFromInnerClass; - } - final Query query = ReferencesSearch.search(method); - query.forEach(this); - return onlyAccessedFromInnerClass; - } + public boolean isOnlyAccessedFromInnerClass() { + final PsiSearchHelper searchHelper = PsiSearchHelper.SERVICE.getInstance(method.getProject()); + final ProgressManager progressManager = ProgressManager.getInstance(); + final ProgressIndicator progressIndicator = progressManager.getProgressIndicator(); + final PsiSearchHelper.SearchCostResult searchCost = + searchHelper.isCheapEnoughToSearch(method.getName(), method.getResolveScope(), null, progressIndicator); + if (searchCost == PsiSearchHelper.SearchCostResult.TOO_MANY_OCCURRENCES || + searchCost == PsiSearchHelper.SearchCostResult.ZERO_OCCURRENCES) { + return onlyAccessedFromInnerClass; + } + final Query query = ReferencesSearch.search(method); + query.forEach(this); + return onlyAccessedFromInnerClass; + } - public PsiClass getContainingClass() { - return cache; + public PsiClass getContainingClass() { + return cache; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/MethodReturnOfConcreteClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/MethodReturnOfConcreteClassInspection.java index 59b340e8e7..af0db3957c 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/MethodReturnOfConcreteClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/MethodReturnOfConcreteClassInspection.java @@ -29,49 +29,50 @@ @ExtensionImpl public class MethodReturnOfConcreteClassInspection extends BaseInspection { + @SuppressWarnings("PublicField") + public boolean ignoreAbstractClasses = false; - @SuppressWarnings("PublicField") - public boolean ignoreAbstractClasses = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.methodReturnConcreteClassDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.methodReturnConcreteClassProblemDescriptor().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.methodReturnConcreteClassDisplayName(); + } - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.methodReturnOfConcreteClassOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreAbstractClasses"); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.methodReturnConcreteClassProblemDescriptor().get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new MethodReturnOfConcreteClassVisitor(); - } + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.methodReturnOfConcreteClassOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreAbstractClasses"); + } - private class MethodReturnOfConcreteClassVisitor extends BaseInspectionVisitor { @Override - public void visitMethod(@Nonnull PsiMethod method) { - super.visitMethod(method); - if (method.isConstructor()) { - return; - } - final PsiTypeElement typeElement = method.getReturnTypeElement(); - if (typeElement == null) { - return; - } - if (!ConcreteClassUtil.typeIsConcreteClass(typeElement, - ignoreAbstractClasses)) { - return; - } - registerError(typeElement); + public BaseInspectionVisitor buildVisitor() { + return new MethodReturnOfConcreteClassVisitor(); + } + + private class MethodReturnOfConcreteClassVisitor extends BaseInspectionVisitor { + @Override + public void visitMethod(@Nonnull PsiMethod method) { + super.visitMethod(method); + if (method.isConstructor()) { + return; + } + final PsiTypeElement typeElement = method.getReturnTypeElement(); + if (typeElement == null) { + return; + } + if (!ConcreteClassUtil.typeIsConcreteClass( + typeElement, + ignoreAbstractClasses + )) { + return; + } + registerError(typeElement); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/OverlyStrongTypeCastInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/OverlyStrongTypeCastInspection.java index c837583e24..22d65c6fee 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/OverlyStrongTypeCastInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/OverlyStrongTypeCastInspection.java @@ -38,167 +38,166 @@ @ExtensionImpl public class OverlyStrongTypeCastInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean ignoreInMatchingInstanceof = false; - @SuppressWarnings({"PublicField"}) - public boolean ignoreInMatchingInstanceof = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.overlyStrongTypeCastDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.overlyStrongTypeCastDisplayName(); + } - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - final PsiType expectedType = (PsiType)infos[0]; - final String typeText = expectedType.getPresentableText(); - return InspectionGadgetsLocalize.overlyStrongTypeCastProblemDescriptor(typeText).get(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + final PsiType expectedType = (PsiType) infos[0]; + final String typeText = expectedType.getPresentableText(); + return InspectionGadgetsLocalize.overlyStrongTypeCastProblemDescriptor(typeText).get(); + } - @Override - @Nullable - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.overlyStrongTypeCastIgnoreInMatchingInstanceofOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreInMatchingInstanceof"); - } + @Override + @Nullable + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.overlyStrongTypeCastIgnoreInMatchingInstanceofOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreInMatchingInstanceof"); + } - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new OverlyStrongCastFix(); - } + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + return new OverlyStrongCastFix(); + } - private static class OverlyStrongCastFix extends InspectionGadgetsFix { + private static class OverlyStrongCastFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.overlyStrongTypeCastWeakenQuickfix(); + } - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.overlyStrongTypeCastWeakenQuickfix().get(); + @Override + public void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement castTypeElement = descriptor.getPsiElement(); + final PsiTypeCastExpression expression = + (PsiTypeCastExpression) castTypeElement.getParent(); + if (expression == null) { + return; + } + final PsiType expectedType = + ExpectedTypeUtils.findExpectedType(expression, true); + if (expectedType == null) { + return; + } + final PsiExpression operand = expression.getOperand(); + if (operand == null) { + return; + } + @NonNls final String newExpression = + '(' + expectedType.getCanonicalText() + ')' + + operand.getText(); + replaceExpressionAndShorten(expression, newExpression); + } } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement castTypeElement = descriptor.getPsiElement(); - final PsiTypeCastExpression expression = - (PsiTypeCastExpression)castTypeElement.getParent(); - if (expression == null) { - return; - } - final PsiType expectedType = - ExpectedTypeUtils.findExpectedType(expression, true); - if (expectedType == null) { - return; - } - final PsiExpression operand = expression.getOperand(); - if (operand == null) { - return; - } - @NonNls - final String newExpression = - '(' + expectedType.getCanonicalText() + ')' + - operand.getText(); - replaceExpressionAndShorten(expression, newExpression); + public BaseInspectionVisitor buildVisitor() { + return new OverlyStrongTypeCastVisitor(); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new OverlyStrongTypeCastVisitor(); - } + private class OverlyStrongTypeCastVisitor + extends BaseInspectionVisitor { - private class OverlyStrongTypeCastVisitor - extends BaseInspectionVisitor { - - @Override - public void visitTypeCastExpression( - @Nonnull PsiTypeCastExpression expression) { - super.visitTypeCastExpression(expression); - final PsiExpression operand = expression.getOperand(); - if (operand == null) { - return; - } - final PsiType operandType = operand.getType(); - if (operandType == null) { - return; - } - final PsiType type = expression.getType(); - if (type == null) { - return; - } - final PsiType expectedType = - ExpectedTypeUtils.findExpectedType(expression, true); - if (expectedType == null) { - return; - } - if (expectedType.equals(type)) { - return; - } - final PsiClass resolved = PsiUtil.resolveClassInType(expectedType); - if (resolved != null && !resolved.isPhysical()) { - return; - } - if (expectedType.isAssignableFrom(operandType)) { - //then it's redundant, and caught by the built-in exception - return; - } - if (isTypeParameter(expectedType)) { - return; - } - if (expectedType instanceof PsiArrayType) { - final PsiArrayType arrayType = (PsiArrayType)expectedType; - final PsiType componentType = arrayType.getDeepComponentType(); - if (isTypeParameter(componentType)) { - return; + @Override + public void visitTypeCastExpression( + @Nonnull PsiTypeCastExpression expression + ) { + super.visitTypeCastExpression(expression); + final PsiExpression operand = expression.getOperand(); + if (operand == null) { + return; + } + final PsiType operandType = operand.getType(); + if (operandType == null) { + return; + } + final PsiType type = expression.getType(); + if (type == null) { + return; + } + final PsiType expectedType = + ExpectedTypeUtils.findExpectedType(expression, true); + if (expectedType == null) { + return; + } + if (expectedType.equals(type)) { + return; + } + final PsiClass resolved = PsiUtil.resolveClassInType(expectedType); + if (resolved != null && !resolved.isPhysical()) { + return; + } + if (expectedType.isAssignableFrom(operandType)) { + //then it's redundant, and caught by the built-in exception + return; + } + if (isTypeParameter(expectedType)) { + return; + } + if (expectedType instanceof PsiArrayType) { + final PsiArrayType arrayType = (PsiArrayType) expectedType; + final PsiType componentType = arrayType.getDeepComponentType(); + if (isTypeParameter(componentType)) { + return; + } + } + if (type instanceof PsiPrimitiveType || + expectedType instanceof PsiPrimitiveType) { + return; + } + if (PsiPrimitiveType.getUnboxedType(type) != null || + PsiPrimitiveType.getUnboxedType(expectedType) != null) { + return; + } + if (expectedType instanceof PsiClassType) { + final PsiClassType expectedClassType = + (PsiClassType) expectedType; + final PsiClassType expectedRawType = + expectedClassType.rawType(); + if (type.equals(expectedRawType)) { + return; + } + if (type instanceof PsiClassType) { + final PsiClassType classType = (PsiClassType) type; + final PsiClassType rawType = classType.rawType(); + if (rawType.equals(expectedRawType)) { + return; + } + } + if (type instanceof PsiArrayType) { + return; + } + } + if (ignoreInMatchingInstanceof && + InstanceOfUtils.hasAgreeingInstanceof(expression)) { + return; + } + final PsiTypeElement castTypeElement = expression.getCastType(); + if (castTypeElement == null) { + return; + } + registerError(castTypeElement, expectedType); } - } - if (type instanceof PsiPrimitiveType || - expectedType instanceof PsiPrimitiveType) { - return; - } - if (PsiPrimitiveType.getUnboxedType(type) != null || - PsiPrimitiveType.getUnboxedType(expectedType) != null) { - return; - } - if (expectedType instanceof PsiClassType) { - final PsiClassType expectedClassType = - (PsiClassType)expectedType; - final PsiClassType expectedRawType = - expectedClassType.rawType(); - if (type.equals(expectedRawType)) { - return; - } - if (type instanceof PsiClassType) { - final PsiClassType classType = (PsiClassType)type; - final PsiClassType rawType = classType.rawType(); - if (rawType.equals(expectedRawType)) { - return; - } - } - if (type instanceof PsiArrayType) { - return; - } - } - if (ignoreInMatchingInstanceof && - InstanceOfUtils.hasAgreeingInstanceof(expression)) { - return; - } - final PsiTypeElement castTypeElement = expression.getCastType(); - if (castTypeElement == null) { - return; - } - registerError(castTypeElement, expectedType); - } - private boolean isTypeParameter(PsiType type) { - if (!(type instanceof PsiClassType)) { - return false; - } - final PsiClassType classType = (PsiClassType)type; - final PsiClass aClass = classType.resolve(); - if (aClass == null) { - return false; - } - return aClass instanceof PsiTypeParameter; + private boolean isTypeParameter(PsiType type) { + if (!(type instanceof PsiClassType)) { + return false; + } + final PsiClassType classType = (PsiClassType) type; + final PsiClass aClass = classType.resolve(); + if (aClass == null) { + return false; + } + return aClass instanceof PsiTypeParameter; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/ParameterOfConcreteClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/ParameterOfConcreteClassInspection.java index 7ef5a3d4cb..7a2e9fbe25 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/ParameterOfConcreteClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/ParameterOfConcreteClassInspection.java @@ -25,64 +25,67 @@ import consulo.deadCodeNotWorking.impl.SingleCheckboxOptionsPanel; import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; @ExtensionImpl public class ParameterOfConcreteClassInspection extends BaseInspection { + @SuppressWarnings("PublicField") + public boolean ignoreAbstractClasses = false; - @SuppressWarnings("PublicField") - public boolean ignoreAbstractClasses = false; - - @Override - @Nonnull - public String getID() { - return "MethodParameterOfConcreteClass"; - } + @Nonnull + @Override + @Pattern("[a-zA-Z_0-9.]+") + public String getID() { + return "MethodParameterOfConcreteClass"; + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.concreteClassMethodParameterDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.concreteClassMethodParameterDisplayName(); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.concreteClassMethodParameterProblemDescriptor(infos).get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.concreteClassMethodParameterProblemDescriptor(infos).get(); + } - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.parameterOfConcreteClassOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreAbstractClasses"); - } + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.parameterOfConcreteClassOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreAbstractClasses"); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new ParameterOfConcreteClassVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new ParameterOfConcreteClassVisitor(); + } - private class ParameterOfConcreteClassVisitor - extends BaseInspectionVisitor { + private class ParameterOfConcreteClassVisitor + extends BaseInspectionVisitor { - @Override - public void visitParameter(@Nonnull PsiParameter parameter) { - super.visitParameter(parameter); + @Override + public void visitParameter(@Nonnull PsiParameter parameter) { + super.visitParameter(parameter); - if (parameter.getDeclarationScope() instanceof PsiCatchSection) { - return; - } - final PsiTypeElement typeElement = parameter.getTypeElement(); - if (typeElement == null) { - return; - } - if (!ConcreteClassUtil.typeIsConcreteClass(typeElement, - ignoreAbstractClasses)) { - return; - } - final String variableName = parameter.getName(); - registerError(typeElement, variableName); + if (parameter.getDeclarationScope() instanceof PsiCatchSection) { + return; + } + final PsiTypeElement typeElement = parameter.getTypeElement(); + if (typeElement == null) { + return; + } + if (!ConcreteClassUtil.typeIsConcreteClass( + typeElement, + ignoreAbstractClasses + )) { + return; + } + final String variableName = parameter.getName(); + registerError(typeElement, variableName); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/PublicMethodNotExposedInInterfaceInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/PublicMethodNotExposedInInterfaceInspection.java index 3cda4e5176..139a3daf1b 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/PublicMethodNotExposedInInterfaceInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/PublicMethodNotExposedInInterfaceInspection.java @@ -28,147 +28,145 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.deadCodeNotWorking.impl.CheckBox; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import javax.swing.*; import java.awt.*; @ExtensionImpl -public class PublicMethodNotExposedInInterfaceInspection - extends BaseInspection { +public class PublicMethodNotExposedInInterfaceInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean onlyWarnIfContainingClassImplementsAnInterface = false; - @SuppressWarnings({"PublicField"}) - public boolean onlyWarnIfContainingClassImplementsAnInterface = false; + @SuppressWarnings({"PublicField"}) + public final ExternalizableStringSet ignorableAnnotations = new ExternalizableStringSet(); - @SuppressWarnings({"PublicField"}) - public final ExternalizableStringSet ignorableAnnotations = - new ExternalizableStringSet(); - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.publicMethodNotInInterfaceDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.publicMethodNotInInterfaceProblemDescriptor().get(); - } - - @Nonnull - @Override - protected InspectionGadgetsFix[] buildFixes(Object... infos) { - return AddToIgnoreIfAnnotatedByListQuickFix.build((PsiModifierListOwner)infos[0], ignorableAnnotations); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.publicMethodNotInInterfaceDisplayName(); + } - @Override - public JComponent createOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final JPanel annotationsListControl = SpecialAnnotationsUtil.createSpecialAnnotationsListControl( - ignorableAnnotations, - InspectionGadgetsLocalize.ignoreIfAnnotatedBy().get() - ); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.weighty = 1.0; - constraints.weightx = 1.0; - constraints.anchor = GridBagConstraints.CENTER; - constraints.fill = GridBagConstraints.BOTH; - panel.add(annotationsListControl, constraints); - final CheckBox checkBox = new CheckBox( - InspectionGadgetsLocalize.publicMethodNotInInterfaceOption().get(), - this, - "onlyWarnIfContainingClassImplementsAnInterface" - ); - constraints.gridy = 1; - constraints.weighty = 0.0; - constraints.anchor = GridBagConstraints.WEST; - constraints.fill = GridBagConstraints.HORIZONTAL; - panel.add(checkBox, constraints); - return panel; - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.publicMethodNotInInterfaceProblemDescriptor().get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new PublicMethodNotExposedInInterfaceVisitor(); - } + @Nonnull + @Override + protected InspectionGadgetsFix[] buildFixes(Object... infos) { + return AddToIgnoreIfAnnotatedByListQuickFix.build((PsiModifierListOwner) infos[0], ignorableAnnotations); + } - private class PublicMethodNotExposedInInterfaceVisitor - extends BaseInspectionVisitor { + @Override + public JComponent createOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final JPanel annotationsListControl = SpecialAnnotationsUtil.createSpecialAnnotationsListControl( + ignorableAnnotations, + InspectionGadgetsLocalize.ignoreIfAnnotatedBy().get() + ); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.weighty = 1.0; + constraints.weightx = 1.0; + constraints.anchor = GridBagConstraints.CENTER; + constraints.fill = GridBagConstraints.BOTH; + panel.add(annotationsListControl, constraints); + final CheckBox checkBox = new CheckBox( + InspectionGadgetsLocalize.publicMethodNotInInterfaceOption().get(), + this, + "onlyWarnIfContainingClassImplementsAnInterface" + ); + constraints.gridy = 1; + constraints.weighty = 0.0; + constraints.anchor = GridBagConstraints.WEST; + constraints.fill = GridBagConstraints.HORIZONTAL; + panel.add(checkBox, constraints); + return panel; + } @Override - public void visitMethod(@Nonnull PsiMethod method) { - super.visitMethod(method); - if (method.isConstructor()) { - return; - } - if (method.getNameIdentifier() == null) { - return; - } - if (!method.hasModifierProperty(PsiModifier.PUBLIC)) { - return; - } - if (method.hasModifierProperty(PsiModifier.STATIC)) { - return; - } - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null) { - return; - } - if (containingClass.isInterface() || - containingClass.isAnnotationType()) { - return; - } - if (!containingClass.hasModifierProperty(PsiModifier.PUBLIC)) { - return; - } - if (AnnotationUtil.isAnnotated(method, ignorableAnnotations)) { - return; - } - if (onlyWarnIfContainingClassImplementsAnInterface) { - final PsiClass[] superClasses = containingClass.getSupers(); - boolean implementsInterface = false; - for (PsiClass superClass : superClasses) { - if (superClass.isInterface() && - !LibraryUtil.classIsInLibrary(superClass)) { - implementsInterface = true; - break; - } - } - if (!implementsInterface) { - return; - } - } - if (exposedInInterface(method)) { - return; - } - if (TestUtils.isJUnitTestMethod(method)) { - return; - } - registerMethodError(method, method); + public BaseInspectionVisitor buildVisitor() { + return new PublicMethodNotExposedInInterfaceVisitor(); } - private boolean exposedInInterface(PsiMethod method) { - final PsiMethod[] superMethods = method.findSuperMethods(); - for (final PsiMethod superMethod : superMethods) { - final PsiClass superClass = superMethod.getContainingClass(); - if (superClass == null) { - continue; - } - if (superClass.isInterface()) { - return true; - } - final String superclassName = superClass.getQualifiedName(); - if (CommonClassNames.JAVA_LANG_OBJECT.equals(superclassName)) { - return true; + private class PublicMethodNotExposedInInterfaceVisitor + extends BaseInspectionVisitor { + + @Override + public void visitMethod(@Nonnull PsiMethod method) { + super.visitMethod(method); + if (method.isConstructor()) { + return; + } + if (method.getNameIdentifier() == null) { + return; + } + if (!method.hasModifierProperty(PsiModifier.PUBLIC)) { + return; + } + if (method.hasModifierProperty(PsiModifier.STATIC)) { + return; + } + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) { + return; + } + if (containingClass.isInterface() || + containingClass.isAnnotationType()) { + return; + } + if (!containingClass.hasModifierProperty(PsiModifier.PUBLIC)) { + return; + } + if (AnnotationUtil.isAnnotated(method, ignorableAnnotations)) { + return; + } + if (onlyWarnIfContainingClassImplementsAnInterface) { + final PsiClass[] superClasses = containingClass.getSupers(); + boolean implementsInterface = false; + for (PsiClass superClass : superClasses) { + if (superClass.isInterface() && + !LibraryUtil.classIsInLibrary(superClass)) { + implementsInterface = true; + break; + } + } + if (!implementsInterface) { + return; + } + } + if (exposedInInterface(method)) { + return; + } + if (TestUtils.isJUnitTestMethod(method)) { + return; + } + registerMethodError(method, method); } - if (exposedInInterface(superMethod)) { - return true; + + private boolean exposedInInterface(PsiMethod method) { + final PsiMethod[] superMethods = method.findSuperMethods(); + for (final PsiMethod superMethod : superMethods) { + final PsiClass superClass = superMethod.getContainingClass(); + if (superClass == null) { + continue; + } + if (superClass.isInterface()) { + return true; + } + final String superclassName = superClass.getQualifiedName(); + if (CommonClassNames.JAVA_LANG_OBJECT.equals(superclassName)) { + return true; + } + if (exposedInInterface(superMethod)) { + return true; + } + } + return false; } - } - return false; } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/StaticVariableOfConcreteClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/StaticVariableOfConcreteClassInspection.java index 56c06c9f36..bfc08235d9 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/StaticVariableOfConcreteClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/StaticVariableOfConcreteClassInspection.java @@ -30,52 +30,50 @@ @ExtensionImpl public class StaticVariableOfConcreteClassInspection extends BaseInspection { + @SuppressWarnings("PublicField") + public boolean ignoreAbstractClasses = false; - @SuppressWarnings("PublicField") - public boolean ignoreAbstractClasses = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.staticVariableOfConcreteClassDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.staticVariableOfConcreteClassDisplayName(); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.staticVariableOfConcreteClassProblemDescriptor(infos[0]).get(); - } + @Nonnull + @Override + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.staticVariableOfConcreteClassProblemDescriptor(infos[0]).get(); + } - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.staticVariableOfConcreteClassOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreAbstractClasses"); - } + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.staticVariableOfConcreteClassOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreAbstractClasses"); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new StaticVariableOfConcreteClassVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new StaticVariableOfConcreteClassVisitor(); + } - private class StaticVariableOfConcreteClassVisitor - extends BaseInspectionVisitor { + private class StaticVariableOfConcreteClassVisitor + extends BaseInspectionVisitor { - @Override - public void visitField(@Nonnull PsiField field) { - super.visitField(field); - if (!field.hasModifierProperty(PsiModifier.STATIC)) { - return; - } - final PsiTypeElement typeElement = field.getTypeElement(); - if (typeElement == null) { - return; - } - if (!ConcreteClassUtil.typeIsConcreteClass(typeElement, - ignoreAbstractClasses)) { - return; - } - final String variableName = field.getName(); - registerError(typeElement, variableName); + @Override + public void visitField(@Nonnull PsiField field) { + super.visitField(field); + if (!field.hasModifierProperty(PsiModifier.STATIC)) { + return; + } + final PsiTypeElement typeElement = field.getTypeElement(); + if (typeElement == null) { + return; + } + if (!ConcreteClassUtil.typeIsConcreteClass(typeElement, ignoreAbstractClasses)) { + return; + } + final String variableName = field.getName(); + registerError(typeElement, variableName); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/TypeMayBeWeakenedInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/TypeMayBeWeakenedInspection.java index c06f4d44a7..b195af91ce 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/TypeMayBeWeakenedInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/abstraction/TypeMayBeWeakenedInspection.java @@ -29,6 +29,7 @@ import consulo.language.editor.inspection.ProblemDescriptor; import consulo.language.psi.PsiElement; import consulo.language.psi.scope.GlobalSearchScope; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @@ -39,282 +40,285 @@ @ExtensionImpl public class TypeMayBeWeakenedInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean useRighthandTypeAsWeakestTypeInAssignments = true; - @SuppressWarnings({"PublicField"}) - public boolean useRighthandTypeAsWeakestTypeInAssignments = true; + @SuppressWarnings({"PublicField"}) + public boolean useParameterizedTypeForCollectionMethods = true; - @SuppressWarnings({"PublicField"}) - public boolean useParameterizedTypeForCollectionMethods = true; + @SuppressWarnings({"PublicField"}) + public boolean doNotWeakenToJavaLangObject = true; - @SuppressWarnings({"PublicField"}) - public boolean doNotWeakenToJavaLangObject = true; + @SuppressWarnings({"PublicField"}) + public boolean onlyWeakentoInterface = true; - @SuppressWarnings({"PublicField"}) - public boolean onlyWeakentoInterface = true; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.typeMayBeWeakenedDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - final Iterable weakerClasses = (Iterable)infos[1]; - @NonNls final StringBuilder builder = new StringBuilder(); - final Iterator iterator = weakerClasses.iterator(); - if (iterator.hasNext()) { - builder.append('\'').append(iterator.next().getQualifiedName()).append('\''); - while (iterator.hasNext()) { - builder.append(", '").append(iterator.next().getQualifiedName()).append('\''); - } - } - final Object info = infos[0]; - if (info instanceof PsiField) { - return InspectionGadgetsLocalize.typeMayBeWeakenedFieldProblemDescriptor(builder.toString()).get(); - } - else if (info instanceof PsiParameter) { - return InspectionGadgetsLocalize.typeMayBeWeakenedParameterProblemDescriptor(builder.toString()).get(); - } - else if (info instanceof PsiMethod) { - return InspectionGadgetsLocalize.typeMayBeWeakenedMethodProblemDescriptor(builder.toString()).get(); - } - return InspectionGadgetsLocalize.typeMayBeWeakenedProblemDescriptor(builder.toString()).get(); - } - - @Override - @Nullable - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this); - optionsPanel.addCheckbox( - InspectionGadgetsLocalize.typeMayBeWeakenedIgnoreOption().get(), - "useRighthandTypeAsWeakestTypeInAssignments" - ); - optionsPanel.addCheckbox( - InspectionGadgetsLocalize.typeMayBeWeakenedCollectionMethodOption().get(), - "useParameterizedTypeForCollectionMethods" - ); - optionsPanel.addCheckbox( - InspectionGadgetsLocalize.typeMayBeWeakenedDoNotWeakenToObjectOption().get(), - "doNotWeakenToJavaLangObject" - ); - optionsPanel.addCheckbox( - InspectionGadgetsLocalize.onlyWeakenToAnInterface().get(), - "onlyWeakentoInterface" - ); - return optionsPanel; - } - - @Override - @Nonnull - protected InspectionGadgetsFix[] buildFixes(Object... infos) { - final Iterable weakerClasses = (Iterable)infos[1]; - final Collection fixes = new ArrayList(); - for (PsiClass weakestClass : weakerClasses) { - final String qualifiedName = weakestClass.getQualifiedName(); - if (qualifiedName == null) { - continue; - } - fixes.add(new TypeMayBeWeakenedFix(qualifiedName)); + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.typeMayBeWeakenedDisplayName(); } - return fixes.toArray(new InspectionGadgetsFix[fixes.size()]); - } - - private static class TypeMayBeWeakenedFix extends InspectionGadgetsFix { - private final String fqClassName; - - TypeMayBeWeakenedFix(@Nonnull String fqClassName) { - this.fqClassName = fqClassName; + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + final Iterable weakerClasses = (Iterable) infos[1]; + @NonNls final StringBuilder builder = new StringBuilder(); + final Iterator iterator = weakerClasses.iterator(); + if (iterator.hasNext()) { + builder.append('\'').append(iterator.next().getQualifiedName()).append('\''); + while (iterator.hasNext()) { + builder.append(", '").append(iterator.next().getQualifiedName()).append('\''); + } + } + final Object info = infos[0]; + if (info instanceof PsiField) { + return InspectionGadgetsLocalize.typeMayBeWeakenedFieldProblemDescriptor(builder.toString()).get(); + } + else if (info instanceof PsiParameter) { + return InspectionGadgetsLocalize.typeMayBeWeakenedParameterProblemDescriptor(builder.toString()).get(); + } + else if (info instanceof PsiMethod) { + return InspectionGadgetsLocalize.typeMayBeWeakenedMethodProblemDescriptor(builder.toString()).get(); + } + return InspectionGadgetsLocalize.typeMayBeWeakenedProblemDescriptor(builder.toString()).get(); } - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.typeMayBeWeakenedQuickfix(fqClassName).get(); + @Override + @Nullable + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this); + optionsPanel.addCheckbox( + InspectionGadgetsLocalize.typeMayBeWeakenedIgnoreOption().get(), + "useRighthandTypeAsWeakestTypeInAssignments" + ); + optionsPanel.addCheckbox( + InspectionGadgetsLocalize.typeMayBeWeakenedCollectionMethodOption().get(), + "useParameterizedTypeForCollectionMethods" + ); + optionsPanel.addCheckbox( + InspectionGadgetsLocalize.typeMayBeWeakenedDoNotWeakenToObjectOption().get(), + "doNotWeakenToJavaLangObject" + ); + optionsPanel.addCheckbox( + InspectionGadgetsLocalize.onlyWeakenToAnInterface().get(), + "onlyWeakentoInterface" + ); + return optionsPanel; } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) { - final PsiElement element = descriptor.getPsiElement(); - final PsiElement parent = element.getParent(); - final PsiTypeElement typeElement; - if (parent instanceof PsiVariable) { - final PsiVariable variable = (PsiVariable)parent; - typeElement = variable.getTypeElement(); - } - else if (parent instanceof PsiMethod) { - final PsiMethod method = (PsiMethod)parent; - typeElement = method.getReturnTypeElement(); - } - else { - return; - } - if (typeElement == null) { - return; - } - final PsiJavaCodeReferenceElement componentReferenceElement = typeElement.getInnermostComponentReferenceElement(); - if (componentReferenceElement == null) { - return; - } - final PsiType oldType = typeElement.getType(); - if (!(oldType instanceof PsiClassType)) { - return; - } - final PsiClassType classType = (PsiClassType)oldType; - final PsiType[] parameterTypes = classType.getParameters(); - final GlobalSearchScope scope = element.getResolveScope(); - final JavaPsiFacade facade = JavaPsiFacade.getInstance(project); - final PsiClass aClass = facade.findClass(fqClassName, scope); - if (aClass == null) { - return; - } - final PsiTypeParameter[] typeParameters = aClass.getTypeParameters(); - final PsiElementFactory factory = facade.getElementFactory(); - final PsiClassType type; - if (typeParameters.length != 0 && typeParameters.length == parameterTypes.length) { - final Map typeParameterMap = new HashMap(); - for (int i = 0; i < typeParameters.length; i++) { - final PsiTypeParameter typeParameter = typeParameters[i]; - final PsiType parameterType = parameterTypes[i]; - typeParameterMap.put(typeParameter, parameterType); + @Nonnull + protected InspectionGadgetsFix[] buildFixes(Object... infos) { + final Iterable weakerClasses = (Iterable) infos[1]; + final Collection fixes = new ArrayList(); + for (PsiClass weakestClass : weakerClasses) { + final String qualifiedName = weakestClass.getQualifiedName(); + if (qualifiedName == null) { + continue; + } + fixes.add(new TypeMayBeWeakenedFix(qualifiedName)); } - final PsiSubstitutor substitutor = factory.createSubstitutor(typeParameterMap); - type = factory.createType(aClass, substitutor); - } - else { - type = factory.createTypeByFQClassName(fqClassName, scope); - } - final PsiJavaCodeReferenceElement referenceElement = factory.createReferenceElementByType(type); - componentReferenceElement.replace(referenceElement); + return fixes.toArray(new InspectionGadgetsFix[fixes.size()]); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new TypeMayBeWeakenedVisitor(); - } + private static class TypeMayBeWeakenedFix extends InspectionGadgetsFix { + private final String fqClassName; - private class TypeMayBeWeakenedVisitor extends BaseInspectionVisitor { - - @Override - public void visitVariable(PsiVariable variable) { - super.visitVariable(variable); - if (variable instanceof PsiParameter) { - final PsiParameter parameter = (PsiParameter)variable; - final PsiElement declarationScope = parameter.getDeclarationScope(); - if (declarationScope instanceof PsiCatchSection) { - // do not weaken catch block parameters - return; + TypeMayBeWeakenedFix(@Nonnull String fqClassName) { + this.fqClassName = fqClassName; } - else if (declarationScope instanceof PsiMethod) { - final PsiMethod method = (PsiMethod)declarationScope; - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null || - containingClass.isInterface()) { - return; - } - if (MethodUtils.hasSuper(method)) { - // do not try to weaken parameters of methods with - // super methods - return; - } - final Query overridingSearch = OverridingMethodsSearch.search(method); - if (overridingSearch.findFirst() != null) { - // do not try to weaken parameters of methods with - // overriding methods. - return; - } - } - } - if (isOnTheFly() && variable instanceof PsiField) { - // checking variables with greater visibiltiy is too expensive - // for error checking in the editor - if (!variable.hasModifierProperty(PsiModifier.PRIVATE)) { - return; + + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.typeMayBeWeakenedQuickfix(fqClassName); } - } - if (useRighthandTypeAsWeakestTypeInAssignments) { - if (variable instanceof PsiParameter) { - final PsiElement parent = variable.getParent(); - if (parent instanceof PsiForeachStatement) { - final PsiForeachStatement foreachStatement = (PsiForeachStatement)parent; - final PsiExpression iteratedValue = foreachStatement.getIteratedValue(); - if (!(iteratedValue instanceof PsiNewExpression) && !(iteratedValue instanceof PsiTypeCastExpression)) { - return; + + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) { + final PsiElement element = descriptor.getPsiElement(); + final PsiElement parent = element.getParent(); + final PsiTypeElement typeElement; + if (parent instanceof PsiVariable) { + final PsiVariable variable = (PsiVariable) parent; + typeElement = variable.getTypeElement(); } - } - } - else { - final PsiExpression initializer = variable.getInitializer(); - if (!(initializer instanceof PsiNewExpression) && !(initializer instanceof PsiTypeCastExpression)) { - return; - } - } - } - final Collection weakestClasses = - WeakestTypeFinder.calculateWeakestClassesNecessary(variable, - useRighthandTypeAsWeakestTypeInAssignments, - useParameterizedTypeForCollectionMethods); - if (doNotWeakenToJavaLangObject) { - final Project project = variable.getProject(); - final JavaPsiFacade facade = JavaPsiFacade.getInstance(project); - final PsiClass javaLangObjectClass = facade.findClass(CommonClassNames.JAVA_LANG_OBJECT, variable.getResolveScope()); - weakestClasses.remove(javaLangObjectClass); - } - if (onlyWeakentoInterface) { - for (Iterator iterator = weakestClasses.iterator(); iterator.hasNext(); ) { - final PsiClass weakestClass = iterator.next(); - if (!weakestClass.isInterface()) { - iterator.remove(); - } + else if (parent instanceof PsiMethod) { + final PsiMethod method = (PsiMethod) parent; + typeElement = method.getReturnTypeElement(); + } + else { + return; + } + if (typeElement == null) { + return; + } + final PsiJavaCodeReferenceElement componentReferenceElement = typeElement.getInnermostComponentReferenceElement(); + if (componentReferenceElement == null) { + return; + } + final PsiType oldType = typeElement.getType(); + if (!(oldType instanceof PsiClassType)) { + return; + } + final PsiClassType classType = (PsiClassType) oldType; + final PsiType[] parameterTypes = classType.getParameters(); + final GlobalSearchScope scope = element.getResolveScope(); + final JavaPsiFacade facade = JavaPsiFacade.getInstance(project); + final PsiClass aClass = facade.findClass(fqClassName, scope); + if (aClass == null) { + return; + } + final PsiTypeParameter[] typeParameters = aClass.getTypeParameters(); + final PsiElementFactory factory = facade.getElementFactory(); + final PsiClassType type; + if (typeParameters.length != 0 && typeParameters.length == parameterTypes.length) { + final Map typeParameterMap = new HashMap(); + for (int i = 0; i < typeParameters.length; i++) { + final PsiTypeParameter typeParameter = typeParameters[i]; + final PsiType parameterType = parameterTypes[i]; + typeParameterMap.put(typeParameter, parameterType); + } + final PsiSubstitutor substitutor = factory.createSubstitutor(typeParameterMap); + type = factory.createType(aClass, substitutor); + } + else { + type = factory.createTypeByFQClassName(fqClassName, scope); + } + final PsiJavaCodeReferenceElement referenceElement = factory.createReferenceElementByType(type); + componentReferenceElement.replace(referenceElement); } - } - if (weakestClasses.isEmpty()) { - return; - } - registerVariableError(variable, variable, weakestClasses); } @Override - public void visitMethod(PsiMethod method) { - super.visitMethod(method); - if (isOnTheFly() && !method.hasModifierProperty(PsiModifier.PRIVATE)) { - // checking methods with greater visibility is too expensive. - // for error checking in the editor - return; - } - if (MethodUtils.hasSuper(method)) { - // do not try to weaken methods with super methods - return; - } - final Query overridingSearch = OverridingMethodsSearch.search(method); - if (overridingSearch.findFirst() != null) { - // do not try to weaken methods with overriding methods. - return; - } - final Collection weakestClasses = - WeakestTypeFinder.calculateWeakestClassesNecessary(method, - useRighthandTypeAsWeakestTypeInAssignments, - useParameterizedTypeForCollectionMethods); - if (doNotWeakenToJavaLangObject) { - final Project project = method.getProject(); - final JavaPsiFacade facade = JavaPsiFacade.getInstance(project); - final PsiClass javaLangObjectClass = facade.findClass(CommonClassNames.JAVA_LANG_OBJECT, method.getResolveScope()); - weakestClasses.remove(javaLangObjectClass); - } - if (onlyWeakentoInterface) { - for (Iterator iterator = weakestClasses.iterator(); iterator.hasNext(); ) { - final PsiClass weakestClass = iterator.next(); - if (!weakestClass.isInterface()) { - iterator.remove(); - } + public BaseInspectionVisitor buildVisitor() { + return new TypeMayBeWeakenedVisitor(); + } + + private class TypeMayBeWeakenedVisitor extends BaseInspectionVisitor { + + @Override + public void visitVariable(PsiVariable variable) { + super.visitVariable(variable); + if (variable instanceof PsiParameter) { + final PsiParameter parameter = (PsiParameter) variable; + final PsiElement declarationScope = parameter.getDeclarationScope(); + if (declarationScope instanceof PsiCatchSection) { + // do not weaken catch block parameters + return; + } + else if (declarationScope instanceof PsiMethod) { + final PsiMethod method = (PsiMethod) declarationScope; + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null || + containingClass.isInterface()) { + return; + } + if (MethodUtils.hasSuper(method)) { + // do not try to weaken parameters of methods with + // super methods + return; + } + final Query overridingSearch = OverridingMethodsSearch.search(method); + if (overridingSearch.findFirst() != null) { + // do not try to weaken parameters of methods with + // overriding methods. + return; + } + } + } + if (isOnTheFly() && variable instanceof PsiField) { + // checking variables with greater visibiltiy is too expensive + // for error checking in the editor + if (!variable.hasModifierProperty(PsiModifier.PRIVATE)) { + return; + } + } + if (useRighthandTypeAsWeakestTypeInAssignments) { + if (variable instanceof PsiParameter) { + final PsiElement parent = variable.getParent(); + if (parent instanceof PsiForeachStatement) { + final PsiForeachStatement foreachStatement = (PsiForeachStatement) parent; + final PsiExpression iteratedValue = foreachStatement.getIteratedValue(); + if (!(iteratedValue instanceof PsiNewExpression) && !(iteratedValue instanceof PsiTypeCastExpression)) { + return; + } + } + } + else { + final PsiExpression initializer = variable.getInitializer(); + if (!(initializer instanceof PsiNewExpression) && !(initializer instanceof PsiTypeCastExpression)) { + return; + } + } + } + final Collection weakestClasses = + WeakestTypeFinder.calculateWeakestClassesNecessary( + variable, + useRighthandTypeAsWeakestTypeInAssignments, + useParameterizedTypeForCollectionMethods + ); + if (doNotWeakenToJavaLangObject) { + final Project project = variable.getProject(); + final JavaPsiFacade facade = JavaPsiFacade.getInstance(project); + final PsiClass javaLangObjectClass = facade.findClass(CommonClassNames.JAVA_LANG_OBJECT, variable.getResolveScope()); + weakestClasses.remove(javaLangObjectClass); + } + if (onlyWeakentoInterface) { + for (Iterator iterator = weakestClasses.iterator(); iterator.hasNext(); ) { + final PsiClass weakestClass = iterator.next(); + if (!weakestClass.isInterface()) { + iterator.remove(); + } + } + } + if (weakestClasses.isEmpty()) { + return; + } + registerVariableError(variable, variable, weakestClasses); + } + + @Override + public void visitMethod(PsiMethod method) { + super.visitMethod(method); + if (isOnTheFly() && !method.hasModifierProperty(PsiModifier.PRIVATE)) { + // checking methods with greater visibility is too expensive. + // for error checking in the editor + return; + } + if (MethodUtils.hasSuper(method)) { + // do not try to weaken methods with super methods + return; + } + final Query overridingSearch = OverridingMethodsSearch.search(method); + if (overridingSearch.findFirst() != null) { + // do not try to weaken methods with overriding methods. + return; + } + final Collection weakestClasses = + WeakestTypeFinder.calculateWeakestClassesNecessary( + method, + useRighthandTypeAsWeakestTypeInAssignments, + useParameterizedTypeForCollectionMethods + ); + if (doNotWeakenToJavaLangObject) { + final Project project = method.getProject(); + final JavaPsiFacade facade = JavaPsiFacade.getInstance(project); + final PsiClass javaLangObjectClass = facade.findClass(CommonClassNames.JAVA_LANG_OBJECT, method.getResolveScope()); + weakestClasses.remove(javaLangObjectClass); + } + if (onlyWeakentoInterface) { + for (Iterator iterator = weakestClasses.iterator(); iterator.hasNext(); ) { + final PsiClass weakestClass = iterator.next(); + if (!weakestClass.isInterface()) { + iterator.remove(); + } + } + } + if (weakestClasses.isEmpty()) { + return; + } + registerMethodError(method, method, weakestClasses); } - } - if (weakestClasses.isEmpty()) { - return; - } - registerMethodError(method, method, weakestClasses); } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToCatchBlockParameterInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToCatchBlockParameterInspection.java index 6860496b88..b8832c95f2 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToCatchBlockParameterInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToCatchBlockParameterInspection.java @@ -24,59 +24,60 @@ 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 AssignmentToCatchBlockParameterInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.assignmentToCatchBlockParameterDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.assignmentToCatchBlockParameterDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.assignmentToCatchBlockParameterProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.assignmentToCatchBlockParameterProblemDescriptor().get(); + } - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new ExtractParameterAsLocalVariableFix(); - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new ExtractParameterAsLocalVariableFix(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new AssignmentToCatchBlockParameterVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new AssignmentToCatchBlockParameterVisitor(); + } - private static class AssignmentToCatchBlockParameterVisitor - extends BaseInspectionVisitor { + private static class AssignmentToCatchBlockParameterVisitor + extends BaseInspectionVisitor { - @Override - public void visitAssignmentExpression( - @Nonnull PsiAssignmentExpression expression) { - super.visitAssignmentExpression(expression); - if (!WellFormednessUtils.isWellFormed(expression)) { - return; - } - final PsiExpression lhs = expression.getLExpression(); - if (!(lhs instanceof PsiReferenceExpression)) { - return; - } - final PsiReferenceExpression reference = - (PsiReferenceExpression) lhs; - final PsiElement variable = reference.resolve(); - if (!(variable instanceof PsiParameter)) { - return; - } - final PsiParameter parameter = (PsiParameter) variable; - final PsiElement declarationScope = parameter.getDeclarationScope(); - if (!(declarationScope instanceof PsiCatchSection)) { - return; - } - registerError(lhs); + @Override + public void visitAssignmentExpression( + @Nonnull PsiAssignmentExpression expression + ) { + super.visitAssignmentExpression(expression); + if (!WellFormednessUtils.isWellFormed(expression)) { + return; + } + final PsiExpression lhs = expression.getLExpression(); + if (!(lhs instanceof PsiReferenceExpression)) { + return; + } + final PsiReferenceExpression reference = + (PsiReferenceExpression) lhs; + final PsiElement variable = reference.resolve(); + if (!(variable instanceof PsiParameter)) { + return; + } + final PsiParameter parameter = (PsiParameter) variable; + final PsiElement declarationScope = parameter.getDeclarationScope(); + if (!(declarationScope instanceof PsiCatchSection)) { + return; + } + registerError(lhs); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToCollectionFieldFromParameterInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToCollectionFieldFromParameterInspection.java index de61edad1e..5d3733301b 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToCollectionFieldFromParameterInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToCollectionFieldFromParameterInspection.java @@ -30,96 +30,101 @@ import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; @ExtensionImpl -public class AssignmentToCollectionFieldFromParameterInspection - extends BaseInspection { +public class AssignmentToCollectionFieldFromParameterInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean ignorePrivateMethods = true; - /** - * @noinspection PublicField - */ - public boolean ignorePrivateMethods = true; - - @Nonnull - public String getID() { - return "AssignmentToCollectionOrArrayFieldFromParameter"; - } + @Nonnull + @Override + @Pattern("[a-zA-Z_0-9.]+") + public String getID() { + return "AssignmentToCollectionOrArrayFieldFromParameter"; + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.assignmentCollectionArrayFieldFromParameterDisplayName().get(); - } + @Nonnull + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.assignmentCollectionArrayFieldFromParameterDisplayName(); + } - @Nonnull - @RequiredReadAction - public String buildErrorString(Object... infos) { - final PsiExpression rhs = (PsiExpression)infos[0]; - final PsiField field = (PsiField)infos[1]; - final PsiType type = field.getType(); - return type instanceof PsiArrayType - ? InspectionGadgetsLocalize.assignmentCollectionArrayFieldFromParameterProblemDescriptorArray(rhs.getText()).get() - : InspectionGadgetsLocalize.assignmentCollectionArrayFieldFromParameterProblemDescriptorCollection(rhs.getText()).get(); - } + @Nonnull + @RequiredReadAction + public String buildErrorString(Object... infos) { + final PsiExpression rhs = (PsiExpression) infos[0]; + final PsiField field = (PsiField) infos[1]; + final PsiType type = field.getType(); + return type instanceof PsiArrayType + ? InspectionGadgetsLocalize.assignmentCollectionArrayFieldFromParameterProblemDescriptorArray(rhs.getText()).get() + : InspectionGadgetsLocalize.assignmentCollectionArrayFieldFromParameterProblemDescriptorCollection(rhs.getText()).get(); + } - @Nullable - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.assignmentCollectionArrayFieldOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignorePrivateMethods"); - } + @Nullable + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.assignmentCollectionArrayFieldOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignorePrivateMethods"); + } - public BaseInspectionVisitor buildVisitor() { - return new AssignmentToCollectionFieldFromParameterVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new AssignmentToCollectionFieldFromParameterVisitor(); + } - private class AssignmentToCollectionFieldFromParameterVisitor - extends BaseInspectionVisitor { + private class AssignmentToCollectionFieldFromParameterVisitor + extends BaseInspectionVisitor { - @Override - public void visitAssignmentExpression(@Nonnull - PsiAssignmentExpression expression) { - super.visitAssignmentExpression(expression); - final PsiExpression rhs = expression.getRExpression(); - if (!(rhs instanceof PsiReferenceExpression)) { - return; - } - final IElementType tokenType = expression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.EQ)) { - return; - } - final PsiExpression lhs = expression.getLExpression(); - if (!(lhs instanceof PsiReferenceExpression)) { - return; - } - if (ignorePrivateMethods) { - final PsiMethod containingMethod = - PsiTreeUtil.getParentOfType(expression, - PsiMethod.class); - if (containingMethod == null || - containingMethod.hasModifierProperty( - PsiModifier.PRIVATE)) { - return; + @Override + public void visitAssignmentExpression( + @Nonnull + PsiAssignmentExpression expression + ) { + super.visitAssignmentExpression(expression); + final PsiExpression rhs = expression.getRExpression(); + if (!(rhs instanceof PsiReferenceExpression)) { + return; + } + final IElementType tokenType = expression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.EQ)) { + return; + } + final PsiExpression lhs = expression.getLExpression(); + if (!(lhs instanceof PsiReferenceExpression)) { + return; + } + if (ignorePrivateMethods) { + final PsiMethod containingMethod = + PsiTreeUtil.getParentOfType( + expression, + PsiMethod.class + ); + if (containingMethod == null || + containingMethod.hasModifierProperty( + PsiModifier.PRIVATE)) { + return; + } + } + final PsiElement element = ((PsiReference) rhs).resolve(); + if (!(element instanceof PsiParameter)) { + return; + } + if (!(element.getParent() instanceof PsiParameterList)) { + return; + } + final PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) lhs; + final PsiElement referent = referenceExpression.resolve(); + if (!(referent instanceof PsiField)) { + return; + } + final PsiField field = (PsiField) referent; + if (!CollectionUtils.isArrayOrCollectionField(field)) { + return; + } + registerError(lhs, rhs, field); } - } - final PsiElement element = ((PsiReference)rhs).resolve(); - if (!(element instanceof PsiParameter)) { - return; - } - if (!(element.getParent() instanceof PsiParameterList)) { - return; - } - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)lhs; - final PsiElement referent = referenceExpression.resolve(); - if (!(referent instanceof PsiField)) { - return; - } - final PsiField field = (PsiField)referent; - if (!CollectionUtils.isArrayOrCollectionField(field)) { - return; - } - registerError(lhs, rhs, field); } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToDateFieldFromParameterInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToDateFieldFromParameterInspection.java index 7894fb3d99..c4b33de806 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToDateFieldFromParameterInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToDateFieldFromParameterInspection.java @@ -35,84 +35,87 @@ @ExtensionImpl public class AssignmentToDateFieldFromParameterInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean ignorePrivateMethods = true; - /** - * @noinspection PublicField - */ - public boolean ignorePrivateMethods = true; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.assignmentToDateCalendarFieldFromParameterDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.assignmentToDateCalendarFieldFromParameterDisplayName(); + } - @Override - @Nonnull - @RequiredReadAction - public String buildErrorString(Object... infos) { - final String type = (String)infos[0]; - final PsiExpression rhs = (PsiExpression)infos[1]; - return InspectionGadgetsLocalize.assignmentToDateCalendarFieldFromParameterProblemDescriptor(type, rhs.getText()).get(); - } + @Nonnull + @Override + @RequiredReadAction + public String buildErrorString(Object... infos) { + final String type = (String) infos[0]; + final PsiExpression rhs = (PsiExpression) infos[1]; + return InspectionGadgetsLocalize.assignmentToDateCalendarFieldFromParameterProblemDescriptor(type, rhs.getText()).get(); + } - @Override - @Nullable - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.assignmentCollectionArrayFieldOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignorePrivateMethods"); - } + @Override + @Nullable + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.assignmentCollectionArrayFieldOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignorePrivateMethods"); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new AssignmentToDateFieldFromParameterVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new AssignmentToDateFieldFromParameterVisitor(); + } - private class AssignmentToDateFieldFromParameterVisitor - extends BaseInspectionVisitor { + private class AssignmentToDateFieldFromParameterVisitor + extends BaseInspectionVisitor { - @Override - public void visitAssignmentExpression( - @Nonnull PsiAssignmentExpression expression) { - super.visitAssignmentExpression(expression); - final IElementType tokenType = expression.getOperationTokenType(); - if (!JavaTokenType.EQ.equals(tokenType)) { - return; - } - final PsiExpression lhs = expression.getLExpression(); - if (!(lhs instanceof PsiReferenceExpression)) { - return; - } - final String type = TypeUtils.expressionHasTypeOrSubtype(lhs, CommonClassNames.JAVA_UTIL_DATE, CommonClassNames.JAVA_UTIL_CALENDAR); - if (type == null) { - return; - } - final PsiExpression rhs = expression.getRExpression(); - if (!(rhs instanceof PsiReferenceExpression)) { - return; - } - final PsiElement lhsReferent = ((PsiReference)lhs).resolve(); - if (!(lhsReferent instanceof PsiField)) { - return; - } - final PsiElement rhsReferent = ((PsiReference)rhs).resolve(); - if (!(rhsReferent instanceof PsiParameter)) { - return; - } - if (!(rhsReferent.getParent() instanceof PsiParameterList)) { - return; - } - if (ignorePrivateMethods) { - final PsiMethod containingMethod = - PsiTreeUtil.getParentOfType(expression, - PsiMethod.class); - if (containingMethod == null || - containingMethod.hasModifierProperty( - PsiModifier.PRIVATE)) { - return; + @Override + public void visitAssignmentExpression( + @Nonnull PsiAssignmentExpression expression + ) { + super.visitAssignmentExpression(expression); + final IElementType tokenType = expression.getOperationTokenType(); + if (!JavaTokenType.EQ.equals(tokenType)) { + return; + } + final PsiExpression lhs = expression.getLExpression(); + if (!(lhs instanceof PsiReferenceExpression)) { + return; + } + final String type = + TypeUtils.expressionHasTypeOrSubtype(lhs, CommonClassNames.JAVA_UTIL_DATE, CommonClassNames.JAVA_UTIL_CALENDAR); + if (type == null) { + return; + } + final PsiExpression rhs = expression.getRExpression(); + if (!(rhs instanceof PsiReferenceExpression)) { + return; + } + final PsiElement lhsReferent = ((PsiReference) lhs).resolve(); + if (!(lhsReferent instanceof PsiField)) { + return; + } + final PsiElement rhsReferent = ((PsiReference) rhs).resolve(); + if (!(rhsReferent instanceof PsiParameter)) { + return; + } + if (!(rhsReferent.getParent() instanceof PsiParameterList)) { + return; + } + if (ignorePrivateMethods) { + final PsiMethod containingMethod = + PsiTreeUtil.getParentOfType( + expression, + PsiMethod.class + ); + if (containingMethod == null || + containingMethod.hasModifierProperty( + PsiModifier.PRIVATE)) { + return; + } + } + registerError(lhs, type, rhs); } - } - registerError(lhs, type, rhs); } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToForLoopParameterInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToForLoopParameterInspection.java index e6a359e51e..2e30f19913 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToForLoopParameterInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToForLoopParameterInspection.java @@ -34,156 +34,159 @@ import javax.swing.*; @ExtensionImpl -public class AssignmentToForLoopParameterInspection - extends BaseInspection { - - /** - * @noinspection PublicField for externalization purposes - */ - public boolean m_checkForeachParameters = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.assignmentToForLoopParameterDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.assignmentToForLoopParameterProblemDescriptor().get(); - } - - @Override - @Nullable - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.assignmentToForLoopParameterCheckForeachOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "m_checkForeachParameters"); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - final Boolean foreachLoop = (Boolean)infos[0]; - if (!foreachLoop.booleanValue()) { - return null; - } - return new ExtractParameterAsLocalVariableFix(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new AssignmentToForLoopParameterVisitor(); - } - - private class AssignmentToForLoopParameterVisitor - extends BaseInspectionVisitor { +public class AssignmentToForLoopParameterInspection extends BaseInspection { + /** + * @noinspection PublicField for externalization purposes + */ + public boolean m_checkForeachParameters = false; + @Nonnull @Override - public void visitAssignmentExpression( - @Nonnull PsiAssignmentExpression expression) { - super.visitAssignmentExpression(expression); - if (!WellFormednessUtils.isWellFormed(expression)) { - return; - } - final PsiExpression lhs = expression.getLExpression(); - checkForForLoopParam(lhs); - checkForForeachLoopParam(lhs); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.assignmentToForLoopParameterDisplayName(); } + @Nonnull @Override - public void visitPrefixExpression( - @Nonnull PsiPrefixExpression expression) { - super.visitPrefixExpression(expression); - final IElementType tokenType = expression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.PLUSPLUS) && - !tokenType.equals(JavaTokenType.MINUSMINUS)) { - return; - } - final PsiExpression operand = expression.getOperand(); - if (operand == null) { - return; - } - checkForForLoopParam(operand); - checkForForeachLoopParam(operand); //sensible due to autoboxing/unboxing + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.assignmentToForLoopParameterProblemDescriptor().get(); } @Override - public void visitPostfixExpression( - @Nonnull PsiPostfixExpression expression) { - super.visitPostfixExpression(expression); - final IElementType tokenType = expression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.PLUSPLUS) && - !tokenType.equals(JavaTokenType.MINUSMINUS)) { - return; - } - final PsiExpression operand = expression.getOperand(); - checkForForLoopParam(operand); - checkForForeachLoopParam(operand); //sensible due to autoboxing/unboxing + @Nullable + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.assignmentToForLoopParameterCheckForeachOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "m_checkForeachParameters"); } - private void checkForForLoopParam(PsiExpression expression) { - if (!(expression instanceof PsiReferenceExpression)) { - return; - } - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)expression; - final PsiElement element = referenceExpression.resolve(); - if (!(element instanceof PsiLocalVariable)) { - return; - } - final PsiLocalVariable variable = (PsiLocalVariable)element; - final PsiElement variableParent = variable.getParent(); - if (!(variableParent instanceof PsiDeclarationStatement)) { - return; - } - final PsiDeclarationStatement declarationStatement = - (PsiDeclarationStatement)variableParent; - final PsiElement parent = declarationStatement.getParent(); - if (!(parent instanceof PsiForStatement)) { - return; - } - final PsiForStatement forStatement = (PsiForStatement)parent; - final PsiStatement initialization = - forStatement.getInitialization(); - if (initialization == null) { - return; - } - if (!initialization.equals(declarationStatement)) { - return; - } - if (!isInForStatementBody(expression, forStatement)) { - return; - } - registerError(expression, Boolean.FALSE); + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + final Boolean foreachLoop = (Boolean) infos[0]; + if (!foreachLoop.booleanValue()) { + return null; + } + return new ExtractParameterAsLocalVariableFix(); } - private void checkForForeachLoopParam(PsiExpression expression) { - if (!m_checkForeachParameters) { - return; - } - if (!(expression instanceof PsiReferenceExpression)) { - return; - } - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)expression; - final PsiElement element = referenceExpression.resolve(); - if (!(element instanceof PsiParameter)) { - return; - } - final PsiParameter parameter = (PsiParameter)element; - if (!(parameter.getParent() instanceof PsiForeachStatement)) { - return; - } - registerError(expression, Boolean.TRUE); + @Override + public BaseInspectionVisitor buildVisitor() { + return new AssignmentToForLoopParameterVisitor(); } - private boolean isInForStatementBody(PsiExpression expression, - PsiForStatement statement) { - final PsiStatement body = statement.getBody(); - if (body == null) { - return false; - } - return PsiTreeUtil.isAncestor(body, expression, true); + private class AssignmentToForLoopParameterVisitor + extends BaseInspectionVisitor { + + @Override + public void visitAssignmentExpression( + @Nonnull PsiAssignmentExpression expression + ) { + super.visitAssignmentExpression(expression); + if (!WellFormednessUtils.isWellFormed(expression)) { + return; + } + final PsiExpression lhs = expression.getLExpression(); + checkForForLoopParam(lhs); + checkForForeachLoopParam(lhs); + } + + @Override + public void visitPrefixExpression( + @Nonnull PsiPrefixExpression expression + ) { + super.visitPrefixExpression(expression); + final IElementType tokenType = expression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.PLUSPLUS) && + !tokenType.equals(JavaTokenType.MINUSMINUS)) { + return; + } + final PsiExpression operand = expression.getOperand(); + if (operand == null) { + return; + } + checkForForLoopParam(operand); + checkForForeachLoopParam(operand); //sensible due to autoboxing/unboxing + } + + @Override + public void visitPostfixExpression( + @Nonnull PsiPostfixExpression expression + ) { + super.visitPostfixExpression(expression); + final IElementType tokenType = expression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.PLUSPLUS) && + !tokenType.equals(JavaTokenType.MINUSMINUS)) { + return; + } + final PsiExpression operand = expression.getOperand(); + checkForForLoopParam(operand); + checkForForeachLoopParam(operand); //sensible due to autoboxing/unboxing + } + + private void checkForForLoopParam(PsiExpression expression) { + if (!(expression instanceof PsiReferenceExpression)) { + return; + } + final PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) expression; + final PsiElement element = referenceExpression.resolve(); + if (!(element instanceof PsiLocalVariable)) { + return; + } + final PsiLocalVariable variable = (PsiLocalVariable) element; + final PsiElement variableParent = variable.getParent(); + if (!(variableParent instanceof PsiDeclarationStatement)) { + return; + } + final PsiDeclarationStatement declarationStatement = + (PsiDeclarationStatement) variableParent; + final PsiElement parent = declarationStatement.getParent(); + if (!(parent instanceof PsiForStatement)) { + return; + } + final PsiForStatement forStatement = (PsiForStatement) parent; + final PsiStatement initialization = + forStatement.getInitialization(); + if (initialization == null) { + return; + } + if (!initialization.equals(declarationStatement)) { + return; + } + if (!isInForStatementBody(expression, forStatement)) { + return; + } + registerError(expression, Boolean.FALSE); + } + + private void checkForForeachLoopParam(PsiExpression expression) { + if (!m_checkForeachParameters) { + return; + } + if (!(expression instanceof PsiReferenceExpression)) { + return; + } + final PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) expression; + final PsiElement element = referenceExpression.resolve(); + if (!(element instanceof PsiParameter)) { + return; + } + final PsiParameter parameter = (PsiParameter) element; + if (!(parameter.getParent() instanceof PsiForeachStatement)) { + return; + } + registerError(expression, Boolean.TRUE); + } + + private boolean isInForStatementBody( + PsiExpression expression, + PsiForStatement statement + ) { + final PsiStatement body = statement.getBody(); + if (body == null) { + return false; + } + return PsiTreeUtil.isAncestor(body, expression, true); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToMethodParameterInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToMethodParameterInspection.java index aabbb96f4f..cc18ac9c14 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToMethodParameterInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToMethodParameterInspection.java @@ -33,140 +33,141 @@ import javax.swing.*; @ExtensionImpl -public class AssignmentToMethodParameterInspection - extends BaseInspection { +public class AssignmentToMethodParameterInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean ignoreTransformationOfOriginalParameter = false; - @SuppressWarnings({"PublicField"}) - public boolean ignoreTransformationOfOriginalParameter = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.assignmentToMethodParameterDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.assignmentToMethodParameterProblemDescriptor().get(); - } - - @Override - @Nullable - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.assignmentToMethodParameterIgnoreTransformationOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreTransformationOfOriginalParameter"); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new ExtractParameterAsLocalVariableFix(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new AssignmentToMethodParameterVisitor(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.assignmentToMethodParameterDisplayName(); + } - private class AssignmentToMethodParameterVisitor - extends BaseInspectionVisitor { + @Nonnull + @Override + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.assignmentToMethodParameterProblemDescriptor().get(); + } @Override - public void visitAssignmentExpression( - @Nonnull PsiAssignmentExpression expression) { - super.visitAssignmentExpression(expression); - final PsiExpression lhs = expression.getLExpression(); - final PsiParameter parameter = getMethodParameter(lhs); - if (parameter == null) { - return; - } - if (ignoreTransformationOfOriginalParameter) { - final PsiExpression rhs = expression.getRExpression(); - if (rhs != null && VariableAccessUtils.variableIsUsed(parameter, rhs)) { - return; - } - final IElementType tokenType = - expression.getOperationTokenType(); - if (tokenType == JavaTokenType.PLUSEQ || - tokenType == JavaTokenType.MINUSEQ || - tokenType == JavaTokenType.ASTERISKEQ || - tokenType == JavaTokenType.DIVEQ || - tokenType == JavaTokenType.ANDEQ || - tokenType == JavaTokenType.OREQ || - tokenType == JavaTokenType.XOREQ || - tokenType == JavaTokenType.PERCEQ || - tokenType == JavaTokenType.LTLTEQ || - tokenType == JavaTokenType.GTGTEQ || - tokenType == JavaTokenType.GTGTGTEQ) { - return; - } - } - registerError(lhs); + @Nullable + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.assignmentToMethodParameterIgnoreTransformationOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreTransformationOfOriginalParameter"); } @Override - public void visitPrefixExpression( - @Nonnull PsiPrefixExpression expression) { - if (ignoreTransformationOfOriginalParameter) { - return; - } - super.visitPrefixExpression(expression); - final IElementType tokenType = expression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.PLUSPLUS) && - !tokenType.equals(JavaTokenType.MINUSMINUS)) { - return; - } - final PsiExpression operand = expression.getOperand(); - if (operand == null) { - return; - } - final PsiParameter parameter = getMethodParameter(operand); - if (parameter == null) { - return; - } - registerError(operand); + protected InspectionGadgetsFix buildFix(Object... infos) { + return new ExtractParameterAsLocalVariableFix(); } @Override - public void visitPostfixExpression( - @Nonnull PsiPostfixExpression expression) { - if (ignoreTransformationOfOriginalParameter) { - return; - } - super.visitPostfixExpression(expression); - final IElementType tokenType = expression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.PLUSPLUS) && - !tokenType.equals(JavaTokenType.MINUSMINUS)) { - return; - } - final PsiExpression operand = expression.getOperand(); - final PsiParameter parameter = getMethodParameter(operand); - if (parameter == null) { - return; - } - registerError(operand); + public BaseInspectionVisitor buildVisitor() { + return new AssignmentToMethodParameterVisitor(); } - @Nullable - private PsiParameter getMethodParameter(PsiExpression expression) { - if (!(expression instanceof PsiReferenceExpression)) { - return null; - } - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)expression; - final PsiElement variable = referenceExpression.resolve(); - if (!(variable instanceof PsiParameter)) { - return null; - } - final PsiParameter parameter = (PsiParameter)variable; - final PsiElement declarationScope = parameter.getDeclarationScope(); - if (declarationScope instanceof PsiCatchSection) { - return null; - } - if (declarationScope instanceof PsiForeachStatement) { - return null; - } - return parameter; + private class AssignmentToMethodParameterVisitor + extends BaseInspectionVisitor { + + @Override + public void visitAssignmentExpression( + @Nonnull PsiAssignmentExpression expression + ) { + super.visitAssignmentExpression(expression); + final PsiExpression lhs = expression.getLExpression(); + final PsiParameter parameter = getMethodParameter(lhs); + if (parameter == null) { + return; + } + if (ignoreTransformationOfOriginalParameter) { + final PsiExpression rhs = expression.getRExpression(); + if (rhs != null && VariableAccessUtils.variableIsUsed(parameter, rhs)) { + return; + } + final IElementType tokenType = + expression.getOperationTokenType(); + if (tokenType == JavaTokenType.PLUSEQ || + tokenType == JavaTokenType.MINUSEQ || + tokenType == JavaTokenType.ASTERISKEQ || + tokenType == JavaTokenType.DIVEQ || + tokenType == JavaTokenType.ANDEQ || + tokenType == JavaTokenType.OREQ || + tokenType == JavaTokenType.XOREQ || + tokenType == JavaTokenType.PERCEQ || + tokenType == JavaTokenType.LTLTEQ || + tokenType == JavaTokenType.GTGTEQ || + tokenType == JavaTokenType.GTGTGTEQ) { + return; + } + } + registerError(lhs); + } + + @Override + public void visitPrefixExpression( + @Nonnull PsiPrefixExpression expression + ) { + if (ignoreTransformationOfOriginalParameter) { + return; + } + super.visitPrefixExpression(expression); + final IElementType tokenType = expression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.PLUSPLUS) && + !tokenType.equals(JavaTokenType.MINUSMINUS)) { + return; + } + final PsiExpression operand = expression.getOperand(); + if (operand == null) { + return; + } + final PsiParameter parameter = getMethodParameter(operand); + if (parameter == null) { + return; + } + registerError(operand); + } + + @Override + public void visitPostfixExpression( + @Nonnull PsiPostfixExpression expression + ) { + if (ignoreTransformationOfOriginalParameter) { + return; + } + super.visitPostfixExpression(expression); + final IElementType tokenType = expression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.PLUSPLUS) && + !tokenType.equals(JavaTokenType.MINUSMINUS)) { + return; + } + final PsiExpression operand = expression.getOperand(); + final PsiParameter parameter = getMethodParameter(operand); + if (parameter == null) { + return; + } + registerError(operand); + } + + @Nullable + private PsiParameter getMethodParameter(PsiExpression expression) { + if (!(expression instanceof PsiReferenceExpression)) { + return null; + } + final PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) expression; + final PsiElement variable = referenceExpression.resolve(); + if (!(variable instanceof PsiParameter)) { + return null; + } + final PsiParameter parameter = (PsiParameter) variable; + final PsiElement declarationScope = parameter.getDeclarationScope(); + if (declarationScope instanceof PsiCatchSection) { + return null; + } + if (declarationScope instanceof PsiForeachStatement) { + return null; + } + return parameter; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToNullInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToNullInspection.java index 08c7532979..657027fd8b 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToNullInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToNullInspection.java @@ -34,92 +34,93 @@ @ExtensionImpl public class AssignmentToNullInspection extends BaseInspection { + @SuppressWarnings("PublicField") + public boolean ignoreAssignmentsToFields = false; - @SuppressWarnings("PublicField") - public boolean ignoreAssignmentsToFields = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.assignmentToNullDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.assignmentToNullProblemDescriptor().get(); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - final Object info = infos[0]; - if (!(info instanceof PsiReferenceExpression)) { - return null; - } - final PsiElement target = ((PsiReferenceExpression)info).resolve(); - if (!(target instanceof PsiVariable)) { - return null; + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.assignmentToNullDisplayName(); } - final NullableNotNullManager manager = NullableNotNullManager.getInstance(target.getProject()); - return new DelegatingFix(new AddAnnotationFix(manager.getDefaultNullable(), (PsiVariable)target)); - } - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.assignmentToNullOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreAssignmentsToFields"); - } + @Nonnull + @Override + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.assignmentToNullProblemDescriptor().get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new AssignmentToNullVisitor(); - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + final Object info = infos[0]; + if (!(info instanceof PsiReferenceExpression)) { + return null; + } + final PsiElement target = ((PsiReferenceExpression) info).resolve(); + if (!(target instanceof PsiVariable)) { + return null; + } + final NullableNotNullManager manager = NullableNotNullManager.getInstance(target.getProject()); + return new DelegatingFix(new AddAnnotationFix(manager.getDefaultNullable(), (PsiVariable) target)); + } - private class AssignmentToNullVisitor extends BaseInspectionVisitor { + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.assignmentToNullOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreAssignmentsToFields"); + } @Override - public void visitLiteralExpression( - @Nonnull PsiLiteralExpression value) { - super.visitLiteralExpression(value); - final String text = value.getText(); - if (!PsiKeyword.NULL.equals(text)) { - return; - } - PsiElement parent = value.getParent(); - while (parent instanceof PsiParenthesizedExpression || - parent instanceof PsiConditionalExpression || - parent instanceof PsiTypeCastExpression) { - parent = parent.getParent(); - } - if (!(parent instanceof PsiAssignmentExpression)) { - return; - } - final PsiAssignmentExpression assignmentExpression = - (PsiAssignmentExpression)parent; - final PsiExpression lhs = ParenthesesUtils.stripParentheses( - assignmentExpression.getLExpression()); - if (lhs == null || isReferenceToNullableVariable(lhs)) { - return; - } - registerError(lhs, lhs); + public BaseInspectionVisitor buildVisitor() { + return new AssignmentToNullVisitor(); } - private boolean isReferenceToNullableVariable( - PsiExpression lhs) { - if (!(lhs instanceof PsiReferenceExpression)) { - return false; - } - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)lhs; - final PsiElement element = referenceExpression.resolve(); - if (!(element instanceof PsiVariable)) { - return false; - } - final PsiVariable variable = (PsiVariable)element; - if (ignoreAssignmentsToFields && variable instanceof PsiField) { - return true; - } - return NullableNotNullManager.isNullable(variable); + private class AssignmentToNullVisitor extends BaseInspectionVisitor { + + @Override + public void visitLiteralExpression( + @Nonnull PsiLiteralExpression value + ) { + super.visitLiteralExpression(value); + final String text = value.getText(); + if (!PsiKeyword.NULL.equals(text)) { + return; + } + PsiElement parent = value.getParent(); + while (parent instanceof PsiParenthesizedExpression || + parent instanceof PsiConditionalExpression || + parent instanceof PsiTypeCastExpression) { + parent = parent.getParent(); + } + if (!(parent instanceof PsiAssignmentExpression)) { + return; + } + final PsiAssignmentExpression assignmentExpression = + (PsiAssignmentExpression) parent; + final PsiExpression lhs = ParenthesesUtils.stripParentheses( + assignmentExpression.getLExpression()); + if (lhs == null || isReferenceToNullableVariable(lhs)) { + return; + } + registerError(lhs, lhs); + } + + private boolean isReferenceToNullableVariable( + PsiExpression lhs + ) { + if (!(lhs instanceof PsiReferenceExpression)) { + return false; + } + final PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) lhs; + final PsiElement element = referenceExpression.resolve(); + if (!(element instanceof PsiVariable)) { + return false; + } + final PsiVariable variable = (PsiVariable) element; + if (ignoreAssignmentsToFields && variable instanceof PsiField) { + return true; + } + return NullableNotNullManager.isNullable(variable); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToStaticFieldFromInstanceMethodInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToStaticFieldFromInstanceMethodInspection.java index e58b2eaf73..9ae607f69e 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToStaticFieldFromInstanceMethodInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToStaticFieldFromInstanceMethodInspection.java @@ -25,94 +25,98 @@ import consulo.language.psi.PsiElement; import consulo.language.psi.PsiReference; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl -public class AssignmentToStaticFieldFromInstanceMethodInspection - extends BaseInspection { - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.assignmentToStaticFieldFromInstanceMethodDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.assignmentToStaticFieldFromInstanceMethodProblemDescriptor().get(); - } - - public BaseInspectionVisitor buildVisitor() { - return new AssignmentToStaticFieldFromInstanceMethod(); - } - - private static class AssignmentToStaticFieldFromInstanceMethod - extends BaseInspectionVisitor { - +public class AssignmentToStaticFieldFromInstanceMethodInspection extends BaseInspection { + @Nonnull @Override - public void visitAssignmentExpression( - @Nonnull PsiAssignmentExpression expression) { - if (!WellFormednessUtils.isWellFormed(expression)) { - return; - } - final PsiExpression lhs = expression.getLExpression(); - checkForStaticFieldAccess(lhs); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.assignmentToStaticFieldFromInstanceMethodDisplayName(); } - @Override - public void visitPrefixExpression( - @Nonnull PsiPrefixExpression expression) { - final IElementType tokenType = expression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.PLUSPLUS) && - !tokenType.equals(JavaTokenType.MINUSMINUS)) { - return; - } - final PsiExpression operand = expression.getOperand(); - if (operand == null) { - return; - } - checkForStaticFieldAccess(operand); + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.assignmentToStaticFieldFromInstanceMethodProblemDescriptor().get(); } - @Override - public void visitPostfixExpression( - @Nonnull PsiPostfixExpression expression) { - final IElementType tokenType = expression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.PLUSPLUS) && - !tokenType.equals(JavaTokenType.MINUSMINUS)) { - return; - } - final PsiExpression operand = expression.getOperand(); - checkForStaticFieldAccess(operand); + public BaseInspectionVisitor buildVisitor() { + return new AssignmentToStaticFieldFromInstanceMethod(); } - private void checkForStaticFieldAccess(PsiExpression expression) { - if (!(expression instanceof PsiReferenceExpression)) { - return; - } - if (isInStaticMethod(expression)) { - return; - } - final PsiElement referent = ((PsiReference)expression).resolve(); - if (referent == null) { - return; - } - if (!(referent instanceof PsiField)) { - return; - } - final PsiField fieldReferenced = (PsiField)referent; - if (fieldReferenced.hasModifierProperty(PsiModifier.STATIC)) { - registerError(expression); - } - } + private static class AssignmentToStaticFieldFromInstanceMethod + extends BaseInspectionVisitor { + + @Override + public void visitAssignmentExpression( + @Nonnull PsiAssignmentExpression expression + ) { + if (!WellFormednessUtils.isWellFormed(expression)) { + return; + } + final PsiExpression lhs = expression.getLExpression(); + checkForStaticFieldAccess(lhs); + } + + @Override + public void visitPrefixExpression( + @Nonnull PsiPrefixExpression expression + ) { + final IElementType tokenType = expression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.PLUSPLUS) && + !tokenType.equals(JavaTokenType.MINUSMINUS)) { + return; + } + final PsiExpression operand = expression.getOperand(); + if (operand == null) { + return; + } + checkForStaticFieldAccess(operand); + } + + @Override + public void visitPostfixExpression( + @Nonnull PsiPostfixExpression expression + ) { + final IElementType tokenType = expression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.PLUSPLUS) && + !tokenType.equals(JavaTokenType.MINUSMINUS)) { + return; + } + final PsiExpression operand = expression.getOperand(); + checkForStaticFieldAccess(operand); + } + + private void checkForStaticFieldAccess(PsiExpression expression) { + if (!(expression instanceof PsiReferenceExpression)) { + return; + } + if (isInStaticMethod(expression)) { + return; + } + final PsiElement referent = ((PsiReference) expression).resolve(); + if (referent == null) { + return; + } + if (!(referent instanceof PsiField)) { + return; + } + final PsiField fieldReferenced = (PsiField) referent; + if (fieldReferenced.hasModifierProperty(PsiModifier.STATIC)) { + registerError(expression); + } + } - private static boolean isInStaticMethod(PsiElement element) { - final PsiMember member = - PsiTreeUtil.getParentOfType(element, - PsiMethod.class, PsiClassInitializer.class); - if (member == null) { - return false; - } - return member.hasModifierProperty(PsiModifier.STATIC); + private static boolean isInStaticMethod(PsiElement element) { + final PsiMember member = + PsiTreeUtil.getParentOfType(element, + PsiMethod.class, PsiClassInitializer.class + ); + if (member == null) { + return false; + } + return member.hasModifierProperty(PsiModifier.STATIC); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToSuperclassFieldInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToSuperclassFieldInspection.java index 7a03028e26..e612dbd41b 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToSuperclassFieldInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentToSuperclassFieldInspection.java @@ -24,91 +24,89 @@ import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.PsiElement; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.Nls; /** * @author Bas Leijdekkers */ @ExtensionImpl public class AssignmentToSuperclassFieldInspection extends BaseInspection { - - @Nls - @Nonnull - @Override - public String getDisplayName() { - return InspectionGadgetsLocalize.assignmentToSuperclassFieldDisplayName().get(); - } - - @Nonnull - @Override - @RequiredReadAction - protected String buildErrorString(Object... infos) { - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) infos[0]; - final PsiClass superclass = (PsiClass) infos[1]; - return InspectionGadgetsLocalize.assignmentToSuperclassFieldProblemDescriptor( - referenceExpression.getReferenceName(), - superclass.getName() - ).get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new AssignmentToSuperclassFieldVisitor(); - } - - private static class AssignmentToSuperclassFieldVisitor extends BaseInspectionVisitor { - + @Nonnull @Override - public void visitAssignmentExpression(PsiAssignmentExpression expression) { - super.visitAssignmentExpression(expression); - final PsiExpression lhs = expression.getLExpression(); - checkSuperclassField(lhs); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.assignmentToSuperclassFieldDisplayName(); } + @Nonnull @Override - public void visitPrefixExpression(PsiPrefixExpression expression) { - super.visitPrefixExpression(expression); - final PsiExpression operand = expression.getOperand(); - checkSuperclassField(operand); + @RequiredReadAction + protected String buildErrorString(Object... infos) { + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) infos[0]; + final PsiClass superclass = (PsiClass) infos[1]; + return InspectionGadgetsLocalize.assignmentToSuperclassFieldProblemDescriptor( + referenceExpression.getReferenceName(), + superclass.getName() + ).get(); } @Override - public void visitPostfixExpression(PsiPostfixExpression expression) { - super.visitPostfixExpression(expression); - final PsiExpression operand = expression.getOperand(); - checkSuperclassField(operand); + public BaseInspectionVisitor buildVisitor() { + return new AssignmentToSuperclassFieldVisitor(); } - private void checkSuperclassField(PsiExpression expression) { - if (!(expression instanceof PsiReferenceExpression)) { - return; - } - final PsiMethod method = PsiTreeUtil.getParentOfType(expression, PsiMethod.class, true, PsiClass.class); - if (method == null || !method.isConstructor()) { - return; - } - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) expression; - final PsiExpression qualifierExpression = referenceExpression.getQualifierExpression(); - if (qualifierExpression != null && - !(qualifierExpression instanceof PsiThisExpression) && !(qualifierExpression instanceof PsiSuperExpression)) { - return; - } - final PsiElement target = referenceExpression.resolve(); - if (!(target instanceof PsiField)) { - return; - } - final PsiField field = (PsiField) target; - final PsiClass fieldClass = field.getContainingClass(); - if (fieldClass == null) { - return; - } - final PsiClass assignmentClass = method.getContainingClass(); - final String name = fieldClass.getQualifiedName(); - if (name == null || !InheritanceUtil.isInheritor(assignmentClass, true, name)) { - return; - } - registerError(expression, referenceExpression, fieldClass); + private static class AssignmentToSuperclassFieldVisitor extends BaseInspectionVisitor { + + @Override + public void visitAssignmentExpression(PsiAssignmentExpression expression) { + super.visitAssignmentExpression(expression); + final PsiExpression lhs = expression.getLExpression(); + checkSuperclassField(lhs); + } + + @Override + public void visitPrefixExpression(PsiPrefixExpression expression) { + super.visitPrefixExpression(expression); + final PsiExpression operand = expression.getOperand(); + checkSuperclassField(operand); + } + + @Override + public void visitPostfixExpression(PsiPostfixExpression expression) { + super.visitPostfixExpression(expression); + final PsiExpression operand = expression.getOperand(); + checkSuperclassField(operand); + } + + private void checkSuperclassField(PsiExpression expression) { + if (!(expression instanceof PsiReferenceExpression)) { + return; + } + final PsiMethod method = PsiTreeUtil.getParentOfType(expression, PsiMethod.class, true, PsiClass.class); + if (method == null || !method.isConstructor()) { + return; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) expression; + final PsiExpression qualifierExpression = referenceExpression.getQualifierExpression(); + if (qualifierExpression != null && + !(qualifierExpression instanceof PsiThisExpression) && !(qualifierExpression instanceof PsiSuperExpression)) { + return; + } + final PsiElement target = referenceExpression.resolve(); + if (!(target instanceof PsiField)) { + return; + } + final PsiField field = (PsiField) target; + final PsiClass fieldClass = field.getContainingClass(); + if (fieldClass == null) { + return; + } + final PsiClass assignmentClass = method.getContainingClass(); + final String name = fieldClass.getQualifiedName(); + if (name == null || !InheritanceUtil.isInheritor(assignmentClass, true, name)) { + return; + } + registerError(expression, referenceExpression, fieldClass); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentUsedAsConditionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentUsedAsConditionInspection.java index 3c718fa2d6..39478fe779 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentUsedAsConditionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/AssignmentUsedAsConditionInspection.java @@ -25,111 +25,120 @@ 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 AssignmentUsedAsConditionInspection extends BaseInspection { - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.assignmentUsedAsConditionDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.assignmentUsedAsConditionProblemDescriptor().get(); - } - - public InspectionGadgetsFix buildFix(Object... infos) { - return new AssignmentUsedAsConditionFix(); - } - - private static class AssignmentUsedAsConditionFix - extends InspectionGadgetsFix { - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.assignmentUsedAsConditionReplaceQuickfix().get(); + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.assignmentUsedAsConditionDisplayName(); } - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiAssignmentExpression expression = - (PsiAssignmentExpression)descriptor.getPsiElement(); - final PsiExpression leftExpression = expression.getLExpression(); - final PsiExpression rightExpression = expression.getRExpression(); - assert rightExpression != null; - final String newExpression = - leftExpression.getText() + "==" + rightExpression.getText(); - replaceExpression(expression, newExpression); + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.assignmentUsedAsConditionProblemDescriptor().get(); } - } - public BaseInspectionVisitor buildVisitor() { - return new AssignmentUsedAsConditionVisitor(); - } + public InspectionGadgetsFix buildFix(Object... infos) { + return new AssignmentUsedAsConditionFix(); + } - private static class AssignmentUsedAsConditionVisitor - extends BaseInspectionVisitor { + private static class AssignmentUsedAsConditionFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.assignmentUsedAsConditionReplaceQuickfix(); + } - @Override - public void visitAssignmentExpression( - @Nonnull PsiAssignmentExpression expression) { - super.visitAssignmentExpression(expression); - if (!WellFormednessUtils.isWellFormed(expression)) { - return; - } - final PsiElement parent = expression.getParent(); - if (parent == null) { - return; - } - if (parent instanceof PsiIfStatement) { - checkIfStatementCondition((PsiIfStatement)parent, expression); - } - if (parent instanceof PsiWhileStatement) { - checkWhileStatementCondition((PsiWhileStatement)parent, - expression); - } - if (parent instanceof PsiForStatement) { - checkForStatementCondition((PsiForStatement)parent, expression); - } - if (parent instanceof PsiDoWhileStatement) { - checkDoWhileStatementCondition((PsiDoWhileStatement)parent, - expression); - } + public void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiAssignmentExpression expression = + (PsiAssignmentExpression) descriptor.getPsiElement(); + final PsiExpression leftExpression = expression.getLExpression(); + final PsiExpression rightExpression = expression.getRExpression(); + assert rightExpression != null; + final String newExpression = + leftExpression.getText() + "==" + rightExpression.getText(); + replaceExpression(expression, newExpression); + } } - private void checkIfStatementCondition( - PsiIfStatement ifStatement, PsiAssignmentExpression expression) { - final PsiExpression condition = ifStatement.getCondition(); - if (expression.equals(condition)) { - registerError(expression); - } + public BaseInspectionVisitor buildVisitor() { + return new AssignmentUsedAsConditionVisitor(); } - private void checkDoWhileStatementCondition( - PsiDoWhileStatement doWhileStatement, PsiAssignmentExpression expression) { - final PsiExpression condition = doWhileStatement.getCondition(); - if (expression.equals(condition)) { - registerError(expression); - } - } + private static class AssignmentUsedAsConditionVisitor + extends BaseInspectionVisitor { - private void checkForStatementCondition( - PsiForStatement forStatement, PsiAssignmentExpression expression) { - final PsiExpression condition = forStatement.getCondition(); - if (expression.equals(condition)) { - registerError(expression); - } - } + @Override + public void visitAssignmentExpression( + @Nonnull PsiAssignmentExpression expression + ) { + super.visitAssignmentExpression(expression); + if (!WellFormednessUtils.isWellFormed(expression)) { + return; + } + final PsiElement parent = expression.getParent(); + if (parent == null) { + return; + } + if (parent instanceof PsiIfStatement) { + checkIfStatementCondition((PsiIfStatement) parent, expression); + } + if (parent instanceof PsiWhileStatement) { + checkWhileStatementCondition( + (PsiWhileStatement) parent, + expression + ); + } + if (parent instanceof PsiForStatement) { + checkForStatementCondition((PsiForStatement) parent, expression); + } + if (parent instanceof PsiDoWhileStatement) { + checkDoWhileStatementCondition( + (PsiDoWhileStatement) parent, + expression + ); + } + } + + private void checkIfStatementCondition( + PsiIfStatement ifStatement, PsiAssignmentExpression expression + ) { + final PsiExpression condition = ifStatement.getCondition(); + if (expression.equals(condition)) { + registerError(expression); + } + } + + private void checkDoWhileStatementCondition( + PsiDoWhileStatement doWhileStatement, PsiAssignmentExpression expression + ) { + final PsiExpression condition = doWhileStatement.getCondition(); + if (expression.equals(condition)) { + registerError(expression); + } + } + + private void checkForStatementCondition( + PsiForStatement forStatement, PsiAssignmentExpression expression + ) { + final PsiExpression condition = forStatement.getCondition(); + if (expression.equals(condition)) { + registerError(expression); + } + } - private void checkWhileStatementCondition( - PsiWhileStatement whileStatement, PsiAssignmentExpression expression) { - final PsiExpression condition = whileStatement.getCondition(); - if (expression.equals(condition)) { - registerError(expression); - } + private void checkWhileStatementCondition( + PsiWhileStatement whileStatement, PsiAssignmentExpression expression + ) { + final PsiExpression condition = whileStatement.getCondition(); + if (expression.equals(condition)) { + registerError(expression); + } + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/IncrementDecrementUsedAsExpressionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/IncrementDecrementUsedAsExpressionInspection.java index 1c441af874..b8ecfd8fe4 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/IncrementDecrementUsedAsExpressionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/IncrementDecrementUsedAsExpressionInspection.java @@ -29,323 +29,333 @@ import consulo.language.psi.scope.LocalSearchScope; import consulo.language.psi.util.PsiTreeUtil; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl -public class IncrementDecrementUsedAsExpressionInspection - extends BaseInspection { - - @Override - @Nonnull - public String getID() { - return "ValueOfIncrementOrDecrementUsed"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.incrementDecrementDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final Object info = infos[0]; - if (info instanceof PsiPostfixExpression) { - final PsiPostfixExpression postfixExpression = - (PsiPostfixExpression)info; - final IElementType tokenType = - postfixExpression.getOperationTokenType(); - return JavaTokenType.PLUSPLUS.equals(tokenType) - ? InspectionGadgetsLocalize.valueOfPostIncrementProblemDescriptor().get() - : InspectionGadgetsLocalize.valueOfPostDecrementProblemDescriptor().get(); - } - else { - final PsiPrefixExpression prefixExpression = (PsiPrefixExpression)info; - final IElementType tokenType = prefixExpression.getOperationTokenType(); - return JavaTokenType.PLUSPLUS.equals(tokenType) - ? InspectionGadgetsLocalize.valueOfPreIncrementProblemDescriptor().get() - : InspectionGadgetsLocalize.valueOfPreDecrementProblemDescriptor().get(); - } - } - - @Override - @Nullable - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiExpression expression = (PsiExpression)infos[0]; - return new IncrementDecrementUsedAsExpressionFix(expression.getText()); - } - - private static class IncrementDecrementUsedAsExpressionFix - extends InspectionGadgetsFix { - - private final String elementText; - - IncrementDecrementUsedAsExpressionFix(String elementText) { - this.elementText = elementText; +public class IncrementDecrementUsedAsExpressionInspection extends BaseInspection { + @Nonnull + @Override + @Pattern("[a-zA-Z_0-9.]+") + public String getID() { + return "ValueOfIncrementOrDecrementUsed"; } @Nonnull - public String getName() { - return InspectionGadgetsLocalize.incrementDecrementUsedAsExpressionQuickfix(elementText).get(); + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.incrementDecrementDisplayName(); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - // see also the Extract Increment intention of IPP - final PsiElement element = descriptor.getPsiElement(); - final PsiExpression operand; - if (element instanceof PsiPostfixExpression) { - final PsiPostfixExpression postfixExpression = - (PsiPostfixExpression)element; - operand = postfixExpression.getOperand(); - } - else { - final PsiPrefixExpression prefixExpression = - (PsiPrefixExpression)element; - operand = prefixExpression.getOperand(); - } - if (operand == null) { - return; - } - final PsiStatement statement = - PsiTreeUtil.getParentOfType(element, PsiStatement.class); - if (statement == null) { - return; - } - final PsiElement parent = statement.getParent(); - if (parent == null) { - return; - } - final PsiElementFactory factory = - JavaPsiFacade.getInstance(project).getElementFactory(); - final String newStatementText = element.getText() + ';'; - final String operandText = operand.getText(); - if (parent instanceof PsiIfStatement || - parent instanceof PsiLoopStatement) { - // need to add braces because - // in/decrement is inside braceless control statement body - final StringBuilder text = new StringBuilder(); - text.append('{'); - final String elementText = - getElementText(statement, element, operandText); - if (element instanceof PsiPostfixExpression) { - text.append(elementText); - text.append(newStatementText); - } - else { - text.append(newStatementText); - text.append(elementText); - } - text.append('}'); - final PsiCodeBlock codeBlock = - factory.createCodeBlockFromText(text.toString(), parent); - statement.replace(codeBlock); - return; - } - final PsiStatement newStatement = - factory.createStatementFromText(newStatementText, element); - if (statement instanceof PsiReturnStatement) { - if (element instanceof PsiPostfixExpression) { - // special handling of postfix expression in return statement - final PsiReturnStatement returnStatement = - (PsiReturnStatement)statement; - final PsiExpression returnValue = - returnStatement.getReturnValue(); - if (returnValue == null) { - return; - } - final JavaCodeStyleManager javaCodeStyleManager = - JavaCodeStyleManager.getInstance(project); - final String variableName = - javaCodeStyleManager.suggestUniqueVariableName( - "result", returnValue, true); - final PsiType type = returnValue.getType(); - if (type == null) { - return; - } - final String newReturnValueText = getElementText( - returnValue, element, operandText); - final String declarationStatementText = - type.getCanonicalText() + ' ' + variableName + - '=' + newReturnValueText + ';'; - final PsiStatement declarationStatement = - factory.createStatementFromText(declarationStatementText, - returnStatement); - parent.addBefore(declarationStatement, statement); - parent.addBefore(newStatement, statement); - final PsiStatement newReturnStatement = - factory.createStatementFromText( - "return " + variableName + ';', - returnStatement); - returnStatement.replace(newReturnStatement); - return; - } - else { - parent.addBefore(newStatement, statement); - } - } - else if (statement instanceof PsiThrowStatement) { - if (element instanceof PsiPostfixExpression) { - // special handling of postfix expression in throw statement - final PsiThrowStatement returnStatement = - (PsiThrowStatement)statement; - final PsiExpression exception = - returnStatement.getException(); - if (exception == null) { - return; - } - final JavaCodeStyleManager javaCodeStyleManager = - JavaCodeStyleManager.getInstance(project); - final String variableName = - javaCodeStyleManager.suggestUniqueVariableName( - "e", exception, true); - final PsiType type = exception.getType(); - if (type == null) { - return; - } - final String newReturnValueText = getElementText( - exception, element, operandText); - final String declarationStatementText = - type.getCanonicalText() + ' ' + variableName + - '=' + newReturnValueText + ';'; - final PsiStatement declarationStatement = - factory.createStatementFromText(declarationStatementText, - returnStatement); - parent.addBefore(declarationStatement, statement); - parent.addBefore(newStatement, statement); - final PsiStatement newReturnStatement = - factory.createStatementFromText( - "throw " + variableName + ';', - returnStatement); - returnStatement.replace(newReturnStatement); - return; + @Nonnull + public String buildErrorString(Object... infos) { + final Object info = infos[0]; + if (info instanceof PsiPostfixExpression) { + final PsiPostfixExpression postfixExpression = + (PsiPostfixExpression) info; + final IElementType tokenType = + postfixExpression.getOperationTokenType(); + return JavaTokenType.PLUSPLUS.equals(tokenType) + ? InspectionGadgetsLocalize.valueOfPostIncrementProblemDescriptor().get() + : InspectionGadgetsLocalize.valueOfPostDecrementProblemDescriptor().get(); } else { - parent.addBefore(newStatement, statement); + final PsiPrefixExpression prefixExpression = (PsiPrefixExpression) info; + final IElementType tokenType = prefixExpression.getOperationTokenType(); + return JavaTokenType.PLUSPLUS.equals(tokenType) + ? InspectionGadgetsLocalize.valueOfPreIncrementProblemDescriptor().get() + : InspectionGadgetsLocalize.valueOfPreDecrementProblemDescriptor().get(); } - } - else if (!(statement instanceof PsiForStatement)) { - if (element instanceof PsiPostfixExpression) { - parent.addAfter(newStatement, statement); + } + + @Override + @Nullable + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiExpression expression = (PsiExpression) infos[0]; + return new IncrementDecrementUsedAsExpressionFix(expression.getText()); + } + + private static class IncrementDecrementUsedAsExpressionFix + extends InspectionGadgetsFix { + + private final String elementText; + + IncrementDecrementUsedAsExpressionFix(String elementText) { + this.elementText = elementText; } - else { - parent.addBefore(newStatement, statement); + + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.incrementDecrementUsedAsExpressionQuickfix(elementText); } - } - else if (operand instanceof PsiReferenceExpression) { - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)operand; - final PsiElement target = referenceExpression.resolve(); - if (target != null) { - final SearchScope useScope = target.getUseScope(); - if (!new LocalSearchScope(statement).equals(useScope)) { + + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + // see also the Extract Increment intention of IPP + final PsiElement element = descriptor.getPsiElement(); + final PsiExpression operand; if (element instanceof PsiPostfixExpression) { - parent.addAfter(newStatement, statement); + final PsiPostfixExpression postfixExpression = + (PsiPostfixExpression) element; + operand = postfixExpression.getOperand(); } else { - parent.addBefore(newStatement, statement); + final PsiPrefixExpression prefixExpression = + (PsiPrefixExpression) element; + operand = prefixExpression.getOperand(); } - } - } - } - if (statement instanceof PsiLoopStatement) { - // in/decrement inside loop statement condition - final PsiLoopStatement loopStatement = - (PsiLoopStatement)statement; - final PsiStatement body = loopStatement.getBody(); - if (body instanceof PsiBlockStatement) { - final PsiBlockStatement blockStatement = - (PsiBlockStatement)body; - final PsiCodeBlock codeBlock = - blockStatement.getCodeBlock(); - if (element instanceof PsiPostfixExpression) { - final PsiElement firstElement = - codeBlock.getFirstBodyElement(); - codeBlock.addBefore(newStatement, firstElement); - } - else { - codeBlock.add(newStatement); - } - } - else { - final StringBuilder blockText = new StringBuilder(); - blockText.append('{'); - if (element instanceof PsiPostfixExpression) { - blockText.append(newStatementText); - if (body != null) { - blockText.append(body.getText()); + if (operand == null) { + return; + } + final PsiStatement statement = + PsiTreeUtil.getParentOfType(element, PsiStatement.class); + if (statement == null) { + return; + } + final PsiElement parent = statement.getParent(); + if (parent == null) { + return; + } + final PsiElementFactory factory = + JavaPsiFacade.getInstance(project).getElementFactory(); + final String newStatementText = element.getText() + ';'; + final String operandText = operand.getText(); + if (parent instanceof PsiIfStatement || + parent instanceof PsiLoopStatement) { + // need to add braces because + // in/decrement is inside braceless control statement body + final StringBuilder text = new StringBuilder(); + text.append('{'); + final String elementText = + getElementText(statement, element, operandText); + if (element instanceof PsiPostfixExpression) { + text.append(elementText); + text.append(newStatementText); + } + else { + text.append(newStatementText); + text.append(elementText); + } + text.append('}'); + final PsiCodeBlock codeBlock = + factory.createCodeBlockFromText(text.toString(), parent); + statement.replace(codeBlock); + return; + } + final PsiStatement newStatement = + factory.createStatementFromText(newStatementText, element); + if (statement instanceof PsiReturnStatement) { + if (element instanceof PsiPostfixExpression) { + // special handling of postfix expression in return statement + final PsiReturnStatement returnStatement = + (PsiReturnStatement) statement; + final PsiExpression returnValue = + returnStatement.getReturnValue(); + if (returnValue == null) { + return; + } + final JavaCodeStyleManager javaCodeStyleManager = + JavaCodeStyleManager.getInstance(project); + final String variableName = + javaCodeStyleManager.suggestUniqueVariableName( + "result", returnValue, true); + final PsiType type = returnValue.getType(); + if (type == null) { + return; + } + final String newReturnValueText = getElementText( + returnValue, element, operandText); + final String declarationStatementText = + type.getCanonicalText() + ' ' + variableName + + '=' + newReturnValueText + ';'; + final PsiStatement declarationStatement = + factory.createStatementFromText( + declarationStatementText, + returnStatement + ); + parent.addBefore(declarationStatement, statement); + parent.addBefore(newStatement, statement); + final PsiStatement newReturnStatement = + factory.createStatementFromText( + "return " + variableName + ';', + returnStatement + ); + returnStatement.replace(newReturnStatement); + return; + } + else { + parent.addBefore(newStatement, statement); + } + } + else if (statement instanceof PsiThrowStatement) { + if (element instanceof PsiPostfixExpression) { + // special handling of postfix expression in throw statement + final PsiThrowStatement returnStatement = + (PsiThrowStatement) statement; + final PsiExpression exception = + returnStatement.getException(); + if (exception == null) { + return; + } + final JavaCodeStyleManager javaCodeStyleManager = + JavaCodeStyleManager.getInstance(project); + final String variableName = + javaCodeStyleManager.suggestUniqueVariableName( + "e", exception, true); + final PsiType type = exception.getType(); + if (type == null) { + return; + } + final String newReturnValueText = getElementText( + exception, element, operandText); + final String declarationStatementText = + type.getCanonicalText() + ' ' + variableName + + '=' + newReturnValueText + ';'; + final PsiStatement declarationStatement = + factory.createStatementFromText( + declarationStatementText, + returnStatement + ); + parent.addBefore(declarationStatement, statement); + parent.addBefore(newStatement, statement); + final PsiStatement newReturnStatement = + factory.createStatementFromText( + "throw " + variableName + ';', + returnStatement + ); + returnStatement.replace(newReturnStatement); + return; + } + else { + parent.addBefore(newStatement, statement); + } + } + else if (!(statement instanceof PsiForStatement)) { + if (element instanceof PsiPostfixExpression) { + parent.addAfter(newStatement, statement); + } + else { + parent.addBefore(newStatement, statement); + } } - } - else { - if (body != null) { - blockText.append(body.getText()); + else if (operand instanceof PsiReferenceExpression) { + final PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) operand; + final PsiElement target = referenceExpression.resolve(); + if (target != null) { + final SearchScope useScope = target.getUseScope(); + if (!new LocalSearchScope(statement).equals(useScope)) { + if (element instanceof PsiPostfixExpression) { + parent.addAfter(newStatement, statement); + } + else { + parent.addBefore(newStatement, statement); + } + } + } } - blockText.append(newStatementText); - } - blockText.append('}'); - final PsiStatement blockStatement = - factory.createStatementFromText( - blockText.toString(), statement); - if (body == null) { - loopStatement.add(blockStatement); - } - else { - body.replace(blockStatement); - } + if (statement instanceof PsiLoopStatement) { + // in/decrement inside loop statement condition + final PsiLoopStatement loopStatement = + (PsiLoopStatement) statement; + final PsiStatement body = loopStatement.getBody(); + if (body instanceof PsiBlockStatement) { + final PsiBlockStatement blockStatement = + (PsiBlockStatement) body; + final PsiCodeBlock codeBlock = + blockStatement.getCodeBlock(); + if (element instanceof PsiPostfixExpression) { + final PsiElement firstElement = + codeBlock.getFirstBodyElement(); + codeBlock.addBefore(newStatement, firstElement); + } + else { + codeBlock.add(newStatement); + } + } + else { + final StringBuilder blockText = new StringBuilder(); + blockText.append('{'); + if (element instanceof PsiPostfixExpression) { + blockText.append(newStatementText); + if (body != null) { + blockText.append(body.getText()); + } + } + else { + if (body != null) { + blockText.append(body.getText()); + } + blockText.append(newStatementText); + } + blockText.append('}'); + final PsiStatement blockStatement = + factory.createStatementFromText( + blockText.toString(), statement); + if (body == null) { + loopStatement.add(blockStatement); + } + else { + body.replace(blockStatement); + } + } + } + replaceExpression((PsiExpression) element, operandText); } - } - replaceExpression((PsiExpression)element, operandText); } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new IncrementDecrementUsedAsExpressionVisitor(); - } - - private static class IncrementDecrementUsedAsExpressionVisitor - extends BaseInspectionVisitor { @Override - public void visitPostfixExpression( - @Nonnull PsiPostfixExpression expression) { - super.visitPostfixExpression(expression); - final PsiElement parent = expression.getParent(); - if (parent instanceof PsiExpressionStatement || - (parent instanceof PsiExpressionList && - parent.getParent() instanceof - PsiExpressionListStatement)) { - return; - } - final IElementType tokenType = expression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.PLUSPLUS) && - !tokenType.equals(JavaTokenType.MINUSMINUS)) { - return; - } - registerError(expression, expression); + public BaseInspectionVisitor buildVisitor() { + return new IncrementDecrementUsedAsExpressionVisitor(); } - @Override - public void visitPrefixExpression( - @Nonnull PsiPrefixExpression expression) { - super.visitPrefixExpression(expression); - final PsiElement parent = expression.getParent(); - if (parent instanceof PsiExpressionStatement || - (parent instanceof PsiExpressionList && - parent.getParent() instanceof - PsiExpressionListStatement)) { - return; - } - final IElementType tokenType = expression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.PLUSPLUS) && - !tokenType.equals(JavaTokenType.MINUSMINUS)) { - return; - } - registerError(expression, expression); + private static class IncrementDecrementUsedAsExpressionVisitor + extends BaseInspectionVisitor { + + @Override + public void visitPostfixExpression( + @Nonnull PsiPostfixExpression expression + ) { + super.visitPostfixExpression(expression); + final PsiElement parent = expression.getParent(); + if (parent instanceof PsiExpressionStatement || + (parent instanceof PsiExpressionList && + parent.getParent() instanceof + PsiExpressionListStatement)) { + return; + } + final IElementType tokenType = expression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.PLUSPLUS) && + !tokenType.equals(JavaTokenType.MINUSMINUS)) { + return; + } + registerError(expression, expression); + } + + @Override + public void visitPrefixExpression( + @Nonnull PsiPrefixExpression expression + ) { + super.visitPrefixExpression(expression); + final PsiElement parent = expression.getParent(); + if (parent instanceof PsiExpressionStatement || + (parent instanceof PsiExpressionList && + parent.getParent() instanceof + PsiExpressionListStatement)) { + return; + } + final IElementType tokenType = expression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.PLUSPLUS) && + !tokenType.equals(JavaTokenType.MINUSMINUS)) { + return; + } + registerError(expression, expression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/NestedAssignmentInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/NestedAssignmentInspection.java index 5e4c9e4124..d406fe35ce 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/NestedAssignmentInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/NestedAssignmentInspection.java @@ -23,41 +23,42 @@ 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 NestedAssignmentInspection extends BaseInspection { + @Nonnull + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nestedAssignmentDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.nestedAssignmentDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.nestedAssignmentProblemDescriptor().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.nestedAssignmentProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new NestedAssignmentVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new NestedAssignmentVisitor(); + } - private static class NestedAssignmentVisitor extends BaseInspectionVisitor { + private static class NestedAssignmentVisitor extends BaseInspectionVisitor { - @Override - public void visitAssignmentExpression( - @Nonnull PsiAssignmentExpression expression) { - super.visitAssignmentExpression(expression); - final PsiElement parent = expression.getParent(); - if (parent == null) { - return; - } - final PsiElement grandparent = parent.getParent(); - if (parent instanceof PsiExpressionStatement || - grandparent instanceof PsiExpressionListStatement) { - return; - } - registerError(expression); + @Override + public void visitAssignmentExpression( + @Nonnull PsiAssignmentExpression expression + ) { + super.visitAssignmentExpression(expression); + final PsiElement parent = expression.getParent(); + if (parent == null) { + return; + } + final PsiElement grandparent = parent.getParent(); + if (parent instanceof PsiExpressionStatement || + grandparent instanceof PsiExpressionListStatement) { + return; + } + registerError(expression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/ReplaceAssignmentWithOperatorAssignmentInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/ReplaceAssignmentWithOperatorAssignmentInspection.java index feab978387..aaa011b4cb 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/assignment/ReplaceAssignmentWithOperatorAssignmentInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/assignment/ReplaceAssignmentWithOperatorAssignmentInspection.java @@ -28,206 +28,209 @@ 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; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; @ExtensionImpl public class ReplaceAssignmentWithOperatorAssignmentInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean ignoreLazyOperators = true; - /** - * @noinspection PublicField - */ - public boolean ignoreLazyOperators = true; - - /** - * @noinspection PublicField - */ - public boolean ignoreObscureOperators = false; - - @Override - @Nonnull - public String getID() { - return "AssignmentReplaceableWithOperatorAssignment"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.assignmentReplaceableWithOperatorAssignmentDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final PsiExpression lhs = (PsiExpression)infos[0]; - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)infos[1]; - return InspectionGadgetsLocalize.assignmentReplaceableWithOperatorAssignmentProblemDescriptor( - calculateReplacementExpression(lhs, polyadicExpression) - ).get(); - } - - @Override - @Nullable - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this); - optionsPanel.addCheckbox( - InspectionGadgetsLocalize.assignmentReplaceableWithOperatorAssignmentIgnoreConditionalOperatorsOption().get(), - "ignoreLazyOperators" - ); - optionsPanel.addCheckbox( - InspectionGadgetsLocalize.assignmentReplaceableWithOperatorAssignmentIgnoreObscureOperatorsOption().get(), - "ignoreObscureOperators" - ); - return optionsPanel; - } - - static String calculateReplacementExpression(PsiExpression lhs, PsiPolyadicExpression polyadicExpression) { - final PsiExpression[] operands = polyadicExpression.getOperands(); - final PsiJavaToken sign = polyadicExpression.getTokenBeforeOperand(operands[1]); - String signText = sign.getText(); - if ("&&".equals(signText)) { - signText = "&"; - } - else if ("||".equals(signText)) { - signText = "|"; - } - final StringBuilder text = new StringBuilder(lhs.getText()); - text.append(' '); - text.append(signText); - text.append("= "); - boolean addToken = false; - for (int i = 1; i < operands.length; i++) { - final PsiExpression operand = operands[i]; - if (addToken) { - final PsiJavaToken token = polyadicExpression.getTokenBeforeOperand(operand); - text.append(' '); - if (token != null) { - text.append(token.getText()); - } - text.append(' '); - } - else { - addToken = true; - } - text.append(operand.getText()); - } - return text.toString(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new ReplaceAssignmentWithOperatorAssignmentFix((PsiPolyadicExpression)infos[1]); - } - - private static class ReplaceAssignmentWithOperatorAssignmentFix extends InspectionGadgetsFix { - - private final String m_name; - - private ReplaceAssignmentWithOperatorAssignmentFix(PsiPolyadicExpression expression) { - final PsiJavaToken sign = expression.getTokenBeforeOperand(expression.getOperands()[1]); - String signText = sign.getText(); - if ("&&".equals(signText)) { - signText = "&"; - } - else if ("||".equals(signText)) { - signText = "|"; - } - m_name = InspectionGadgetsLocalize.assignmentReplaceableWithOperatorReplaceQuickfix(signText).get(); + /** + * @noinspection PublicField + */ + public boolean ignoreObscureOperators = false; + + @Nonnull + @Override + @Pattern("[a-zA-Z_0-9.]+") + public String getID() { + return "AssignmentReplaceableWithOperatorAssignment"; } @Nonnull - public String getName() { - return m_name; + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.assignmentReplaceableWithOperatorAssignmentDisplayName(); } @Override - public void doFix(@Nonnull Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - if (!(element instanceof PsiAssignmentExpression)) { - return; - } - final PsiAssignmentExpression expression = (PsiAssignmentExpression)element; - final PsiExpression lhs = expression.getLExpression(); - PsiExpression rhs = ParenthesesUtils.stripParentheses(expression.getRExpression()); - if (rhs instanceof PsiTypeCastExpression) { - final PsiTypeCastExpression typeCastExpression = (PsiTypeCastExpression)rhs; - final PsiType castType = typeCastExpression.getType(); - if (castType == null || !castType.equals(lhs.getType())) { - return; - } - rhs = ParenthesesUtils.stripParentheses(typeCastExpression.getOperand()); - } - if (!(rhs instanceof PsiPolyadicExpression)) { - return; - } - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)rhs; - final String newExpression = calculateReplacementExpression(lhs, polyadicExpression); - replaceExpression(expression, newExpression); + @Nonnull + public String buildErrorString(Object... infos) { + final PsiExpression lhs = (PsiExpression) infos[0]; + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) infos[1]; + return InspectionGadgetsLocalize.assignmentReplaceableWithOperatorAssignmentProblemDescriptor( + calculateReplacementExpression(lhs, polyadicExpression) + ).get(); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new ReplaceAssignmentWithOperatorAssignmentVisitor(); - } + @Override + @Nullable + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this); + optionsPanel.addCheckbox( + InspectionGadgetsLocalize.assignmentReplaceableWithOperatorAssignmentIgnoreConditionalOperatorsOption().get(), + "ignoreLazyOperators" + ); + optionsPanel.addCheckbox( + InspectionGadgetsLocalize.assignmentReplaceableWithOperatorAssignmentIgnoreObscureOperatorsOption().get(), + "ignoreObscureOperators" + ); + return optionsPanel; + } - private class ReplaceAssignmentWithOperatorAssignmentVisitor extends BaseInspectionVisitor { + static String calculateReplacementExpression(PsiExpression lhs, PsiPolyadicExpression polyadicExpression) { + final PsiExpression[] operands = polyadicExpression.getOperands(); + final PsiJavaToken sign = polyadicExpression.getTokenBeforeOperand(operands[1]); + String signText = sign.getText(); + if ("&&".equals(signText)) { + signText = "&"; + } + else if ("||".equals(signText)) { + signText = "|"; + } + final StringBuilder text = new StringBuilder(lhs.getText()); + text.append(' '); + text.append(signText); + text.append("= "); + boolean addToken = false; + for (int i = 1; i < operands.length; i++) { + final PsiExpression operand = operands[i]; + if (addToken) { + final PsiJavaToken token = polyadicExpression.getTokenBeforeOperand(operand); + text.append(' '); + if (token != null) { + text.append(token.getText()); + } + text.append(' '); + } + else { + addToken = true; + } + text.append(operand.getText()); + } + return text.toString(); + } @Override - public void visitAssignmentExpression(@Nonnull PsiAssignmentExpression assignment) { - super.visitAssignmentExpression(assignment); - final IElementType assignmentTokenType = assignment.getOperationTokenType(); - if (!assignmentTokenType.equals(JavaTokenType.EQ)) { - return; - } - final PsiExpression lhs = assignment.getLExpression(); - PsiExpression rhs = ParenthesesUtils.stripParentheses(assignment.getRExpression()); - if (rhs instanceof PsiTypeCastExpression) { - final PsiTypeCastExpression typeCastExpression = (PsiTypeCastExpression)rhs; - final PsiType castType = typeCastExpression.getType(); - if (castType == null || !castType.equals(lhs.getType())) { - return; + public InspectionGadgetsFix buildFix(Object... infos) { + return new ReplaceAssignmentWithOperatorAssignmentFix((PsiPolyadicExpression) infos[1]); + } + + private static class ReplaceAssignmentWithOperatorAssignmentFix extends InspectionGadgetsFix { + @Nonnull + private final LocalizeValue myName; + + private ReplaceAssignmentWithOperatorAssignmentFix(PsiPolyadicExpression expression) { + final PsiJavaToken sign = expression.getTokenBeforeOperand(expression.getOperands()[1]); + String signText = sign.getText(); + if ("&&".equals(signText)) { + signText = "&"; + } + else if ("||".equals(signText)) { + signText = "|"; + } + myName = InspectionGadgetsLocalize.assignmentReplaceableWithOperatorReplaceQuickfix(signText); } - rhs = ParenthesesUtils.stripParentheses(typeCastExpression.getOperand()); - } - if (!(rhs instanceof PsiPolyadicExpression)) { - return; - } - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)rhs; - final PsiExpression[] operands = polyadicExpression.getOperands(); - if (operands.length < 2) { - return; - } - if (operands.length > 2 && !ParenthesesUtils.isAssociativeOperation(polyadicExpression)) { - return; - } - for (PsiExpression operand : operands) { - if (operand == null) { - return; + + @Nonnull + @Override + public LocalizeValue getName() { + return myName; } - } - final IElementType expressionTokenType = polyadicExpression.getOperationTokenType(); - if (JavaTokenType.EQEQ.equals(expressionTokenType) || JavaTokenType.NE.equals(expressionTokenType)) { - return; - } - if (ignoreLazyOperators) { - if (JavaTokenType.ANDAND.equals(expressionTokenType) || JavaTokenType.OROR.equals(expressionTokenType)) { - return; + + @Override + public void doFix(@Nonnull Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + if (!(element instanceof PsiAssignmentExpression)) { + return; + } + final PsiAssignmentExpression expression = (PsiAssignmentExpression) element; + final PsiExpression lhs = expression.getLExpression(); + PsiExpression rhs = ParenthesesUtils.stripParentheses(expression.getRExpression()); + if (rhs instanceof PsiTypeCastExpression) { + final PsiTypeCastExpression typeCastExpression = (PsiTypeCastExpression) rhs; + final PsiType castType = typeCastExpression.getType(); + if (castType == null || !castType.equals(lhs.getType())) { + return; + } + rhs = ParenthesesUtils.stripParentheses(typeCastExpression.getOperand()); + } + if (!(rhs instanceof PsiPolyadicExpression)) { + return; + } + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) rhs; + final String newExpression = calculateReplacementExpression(lhs, polyadicExpression); + replaceExpression(expression, newExpression); } - } - if (ignoreObscureOperators) { - if (JavaTokenType.XOR.equals(expressionTokenType) || JavaTokenType.PERC.equals(expressionTokenType)) { - return; + } + + @Override + public BaseInspectionVisitor buildVisitor() { + return new ReplaceAssignmentWithOperatorAssignmentVisitor(); + } + + private class ReplaceAssignmentWithOperatorAssignmentVisitor extends BaseInspectionVisitor { + + @Override + public void visitAssignmentExpression(@Nonnull PsiAssignmentExpression assignment) { + super.visitAssignmentExpression(assignment); + final IElementType assignmentTokenType = assignment.getOperationTokenType(); + if (!assignmentTokenType.equals(JavaTokenType.EQ)) { + return; + } + final PsiExpression lhs = assignment.getLExpression(); + PsiExpression rhs = ParenthesesUtils.stripParentheses(assignment.getRExpression()); + if (rhs instanceof PsiTypeCastExpression) { + final PsiTypeCastExpression typeCastExpression = (PsiTypeCastExpression) rhs; + final PsiType castType = typeCastExpression.getType(); + if (castType == null || !castType.equals(lhs.getType())) { + return; + } + rhs = ParenthesesUtils.stripParentheses(typeCastExpression.getOperand()); + } + if (!(rhs instanceof PsiPolyadicExpression)) { + return; + } + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) rhs; + final PsiExpression[] operands = polyadicExpression.getOperands(); + if (operands.length < 2) { + return; + } + if (operands.length > 2 && !ParenthesesUtils.isAssociativeOperation(polyadicExpression)) { + return; + } + for (PsiExpression operand : operands) { + if (operand == null) { + return; + } + } + final IElementType expressionTokenType = polyadicExpression.getOperationTokenType(); + if (JavaTokenType.EQEQ.equals(expressionTokenType) || JavaTokenType.NE.equals(expressionTokenType)) { + return; + } + if (ignoreLazyOperators) { + if (JavaTokenType.ANDAND.equals(expressionTokenType) || JavaTokenType.OROR.equals(expressionTokenType)) { + return; + } + } + if (ignoreObscureOperators) { + if (JavaTokenType.XOR.equals(expressionTokenType) || JavaTokenType.PERC.equals(expressionTokenType)) { + return; + } + } + if (!EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(lhs, operands[0])) { + return; + } + registerError(assignment, lhs, polyadicExpression); } - } - if (!EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(lhs, operands[0])) { - return; - } - registerError(assignment, lhs, polyadicExpression); } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bitwise/IncompatibleMaskInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bitwise/IncompatibleMaskInspection.java index 31bd99e6ed..0de4a7fb2c 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bitwise/IncompatibleMaskInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bitwise/IncompatibleMaskInspection.java @@ -28,147 +28,157 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.language.ast.IElementType; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl public class IncompatibleMaskInspection extends BaseInspection { + @Nonnull + @Override + @Pattern("[a-zA-Z_0-9.]+") + public String getID() { + return "IncompatibleBitwiseMaskOperation"; + } - @Override - @Nonnull - public String getID() { - return "IncompatibleBitwiseMaskOperation"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.incompatibleMaskOperationDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)infos[0]; - final IElementType tokenType = binaryExpression.getOperationTokenType(); - return JavaTokenType.EQEQ.equals(tokenType) - ? InspectionGadgetsLocalize.incompatibleMaskOperationProblemDescriptorAlwaysFalse().get() - : InspectionGadgetsLocalize.incompatibleMaskOperationProblemDescriptorAlwaysTrue().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.incompatibleMaskOperationDisplayName(); + } - @Override - public boolean isEnabledByDefault() { - return true; - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final PsiBinaryExpression binaryExpression = + (PsiBinaryExpression) infos[0]; + final IElementType tokenType = binaryExpression.getOperationTokenType(); + return JavaTokenType.EQEQ.equals(tokenType) + ? InspectionGadgetsLocalize.incompatibleMaskOperationProblemDescriptorAlwaysFalse().get() + : InspectionGadgetsLocalize.incompatibleMaskOperationProblemDescriptorAlwaysTrue().get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new IncompatibleMaskVisitor(); - } + @Override + public boolean isEnabledByDefault() { + return true; + } - private static class IncompatibleMaskVisitor extends BaseInspectionVisitor { @Override - public void visitBinaryExpression( - @Nonnull PsiBinaryExpression expression) { - super.visitBinaryExpression(expression); - final PsiExpression rhs = expression.getROperand(); - if (!ComparisonUtils.isEqualityComparison(expression)) { - return; - } - final PsiType expressionType = expression.getType(); - if (expressionType == null) { - return; - } - final PsiExpression strippedRhs = ParenthesesUtils.stripParentheses(rhs); - if (strippedRhs == null) { - return; - } - final PsiExpression lhs = expression.getLOperand(); - final PsiExpression strippedLhs = ParenthesesUtils.stripParentheses(lhs); - if (strippedLhs == null) { - return; - } - if (isConstantMask(strippedLhs) && PsiUtil.isConstantExpression(strippedRhs)) { - if (isIncompatibleMask((PsiBinaryExpression)strippedLhs, strippedRhs)) { - registerError(expression, expression); - } - } - else if (isConstantMask(strippedRhs) && PsiUtil.isConstantExpression(strippedLhs)) { - if (isIncompatibleMask((PsiBinaryExpression)strippedRhs, strippedLhs)) { - registerError(expression, expression); - } - } + public BaseInspectionVisitor buildVisitor() { + return new IncompatibleMaskVisitor(); } - private static boolean isIncompatibleMask( - PsiBinaryExpression maskExpression, - PsiExpression constantExpression) { - final IElementType tokenType = - maskExpression.getOperationTokenType(); - final Object constantValue = - ConstantExpressionUtil.computeCastTo(constantExpression, - PsiType.LONG); - if (constantValue == null) { - return false; - } - final long constantLongValue = ((Long)constantValue).longValue(); - final PsiExpression maskRhs = maskExpression.getROperand(); - final PsiExpression maskLhs = maskExpression.getLOperand(); - final long constantMaskValue; - if (PsiUtil.isConstantExpression(maskRhs)) { - final Object rhsValue = - ConstantExpressionUtil.computeCastTo(maskRhs, - PsiType.LONG); - if (rhsValue == null) { - return false; // Might indeed be the case with "null" literal - // whoes constant value evaluates to null. Check out (a|null) case. + private static class IncompatibleMaskVisitor extends BaseInspectionVisitor { + @Override + public void visitBinaryExpression( + @Nonnull PsiBinaryExpression expression + ) { + super.visitBinaryExpression(expression); + final PsiExpression rhs = expression.getROperand(); + if (!ComparisonUtils.isEqualityComparison(expression)) { + return; + } + final PsiType expressionType = expression.getType(); + if (expressionType == null) { + return; + } + final PsiExpression strippedRhs = ParenthesesUtils.stripParentheses(rhs); + if (strippedRhs == null) { + return; + } + final PsiExpression lhs = expression.getLOperand(); + final PsiExpression strippedLhs = ParenthesesUtils.stripParentheses(lhs); + if (strippedLhs == null) { + return; + } + if (isConstantMask(strippedLhs) && PsiUtil.isConstantExpression(strippedRhs)) { + if (isIncompatibleMask((PsiBinaryExpression) strippedLhs, strippedRhs)) { + registerError(expression, expression); + } + } + else if (isConstantMask(strippedRhs) && PsiUtil.isConstantExpression(strippedLhs)) { + if (isIncompatibleMask((PsiBinaryExpression) strippedRhs, strippedLhs)) { + registerError(expression, expression); + } + } } - constantMaskValue = ((Long)rhsValue).longValue(); - } - else { - final Object lhsValue = - ConstantExpressionUtil.computeCastTo(maskLhs, - PsiType.LONG); - if (lhsValue == null) { - return false; - } - constantMaskValue = ((Long)lhsValue).longValue(); - } - if (tokenType.equals(JavaTokenType.OR)) { - if ((constantMaskValue | constantLongValue) != constantLongValue) { - return true; - } - } - if (tokenType.equals(JavaTokenType.AND)) { - if ((constantMaskValue | constantLongValue) != constantMaskValue) { - return true; + private static boolean isIncompatibleMask( + PsiBinaryExpression maskExpression, + PsiExpression constantExpression + ) { + final IElementType tokenType = + maskExpression.getOperationTokenType(); + final Object constantValue = + ConstantExpressionUtil.computeCastTo( + constantExpression, + PsiType.LONG + ); + if (constantValue == null) { + return false; + } + final long constantLongValue = ((Long) constantValue).longValue(); + final PsiExpression maskRhs = maskExpression.getROperand(); + final PsiExpression maskLhs = maskExpression.getLOperand(); + final long constantMaskValue; + if (PsiUtil.isConstantExpression(maskRhs)) { + final Object rhsValue = + ConstantExpressionUtil.computeCastTo( + maskRhs, + PsiType.LONG + ); + if (rhsValue == null) { + return false; // Might indeed be the case with "null" literal + // whoes constant value evaluates to null. Check out (a|null) case. + } + constantMaskValue = ((Long) rhsValue).longValue(); + } + else { + final Object lhsValue = + ConstantExpressionUtil.computeCastTo( + maskLhs, + PsiType.LONG + ); + if (lhsValue == null) { + return false; + } + constantMaskValue = ((Long) lhsValue).longValue(); + } + + if (tokenType.equals(JavaTokenType.OR)) { + if ((constantMaskValue | constantLongValue) != constantLongValue) { + return true; + } + } + if (tokenType.equals(JavaTokenType.AND)) { + if ((constantMaskValue | constantLongValue) != constantMaskValue) { + return true; + } + } + return false; } - } - return false; - } - private static boolean isConstantMask(PsiExpression expression) { - if (expression == null) { - return false; - } - if (!(expression instanceof PsiBinaryExpression)) { - return false; - } - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)expression; - final IElementType tokenType = - binaryExpression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.OR) && - !tokenType.equals(JavaTokenType.AND)) { - return false; - } - final PsiExpression rhs = binaryExpression.getROperand(); - if (PsiUtil.isConstantExpression(rhs)) { - return true; - } - final PsiExpression lhs = binaryExpression.getLOperand(); - return PsiUtil.isConstantExpression(lhs); + private static boolean isConstantMask(PsiExpression expression) { + if (expression == null) { + return false; + } + if (!(expression instanceof PsiBinaryExpression)) { + return false; + } + final PsiBinaryExpression binaryExpression = + (PsiBinaryExpression) expression; + final IElementType tokenType = + binaryExpression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.OR) && + !tokenType.equals(JavaTokenType.AND)) { + return false; + } + final PsiExpression rhs = binaryExpression.getROperand(); + if (PsiUtil.isConstantExpression(rhs)) { + return true; + } + final PsiExpression lhs = binaryExpression.getLOperand(); + return PsiUtil.isConstantExpression(lhs); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bitwise/PointlessBitwiseExpressionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bitwise/PointlessBitwiseExpressionInspection.java index 5f3a4abcdd..bfd39a4348 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bitwise/PointlessBitwiseExpressionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bitwise/PointlessBitwiseExpressionInspection.java @@ -28,6 +28,7 @@ import consulo.language.ast.IElementType; import consulo.language.editor.inspection.ProblemDescriptor; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; import org.jetbrains.annotations.NonNls; @@ -38,247 +39,251 @@ @ExtensionImpl public class PointlessBitwiseExpressionInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean m_ignoreExpressionsContainingConstants = false; - /** - * @noinspection PublicField - */ - public boolean m_ignoreExpressionsContainingConstants = false; + static final Set bitwiseTokens = new HashSet(6); - static final Set bitwiseTokens = - new HashSet(6); - - static { - bitwiseTokens.add(JavaTokenType.AND); - bitwiseTokens.add(JavaTokenType.OR); - bitwiseTokens.add(JavaTokenType.XOR); - bitwiseTokens.add(JavaTokenType.LTLT); - bitwiseTokens.add(JavaTokenType.GTGT); - bitwiseTokens.add(JavaTokenType.GTGTGT); - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.pointlessBitwiseExpressionDisplayName().get(); - } + static { + bitwiseTokens.add(JavaTokenType.AND); + bitwiseTokens.add(JavaTokenType.OR); + bitwiseTokens.add(JavaTokenType.XOR); + bitwiseTokens.add(JavaTokenType.LTLT); + bitwiseTokens.add(JavaTokenType.GTGT); + bitwiseTokens.add(JavaTokenType.GTGTGT); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)infos[0]; - final String replacementExpression = calculateReplacementExpression(polyadicExpression); - return InspectionGadgetsLocalize.expressionCanBeReplacedProblemDescriptor(replacementExpression).get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.pointlessBitwiseExpressionDisplayName(); + } - @Override - public boolean isEnabledByDefault() { - return true; - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) infos[0]; + final String replacementExpression = calculateReplacementExpression(polyadicExpression); + return InspectionGadgetsLocalize.expressionCanBeReplacedProblemDescriptor(replacementExpression).get(); + } - @Override - public JComponent createOptionsPanel() { - return new SingleCheckboxOptionsPanel( - InspectionGadgetsBundle.message( - "pointless.bitwise.expression.ignore.option"), - this, "m_ignoreExpressionsContainingConstants"); - } + @Override + public boolean isEnabledByDefault() { + return true; + } - @NonNls - String calculateReplacementExpression(PsiPolyadicExpression expression) { - final IElementType tokenType = expression.getOperationTokenType(); - final PsiExpression[] operands = expression.getOperands(); - if (tokenType.equals(JavaTokenType.AND)) { - for (PsiExpression operand : operands) { - if (isZero(operand)) { - return operand.getText(); - } - else if (isAllOnes(operand)) { - return getText(expression, operand); - } - } + @Override + public JComponent createOptionsPanel() { + return new SingleCheckboxOptionsPanel( + InspectionGadgetsBundle.message( + "pointless.bitwise.expression.ignore.option"), + this, "m_ignoreExpressionsContainingConstants" + ); } - else if (tokenType.equals(JavaTokenType.OR)) { - for (PsiExpression operand : operands) { - if (isZero(operand)) { - return getText(expression, operand); - } - else if (isAllOnes(operand)) { - return operand.getText(); + + @NonNls + String calculateReplacementExpression(PsiPolyadicExpression expression) { + final IElementType tokenType = expression.getOperationTokenType(); + final PsiExpression[] operands = expression.getOperands(); + if (tokenType.equals(JavaTokenType.AND)) { + for (PsiExpression operand : operands) { + if (isZero(operand)) { + return operand.getText(); + } + else if (isAllOnes(operand)) { + return getText(expression, operand); + } + } } - } - } - else if (tokenType.equals(JavaTokenType.XOR)) { - for (PsiExpression operand : operands) { - if (isAllOnes(operand)) { - return '~' + getText(expression, operand); + else if (tokenType.equals(JavaTokenType.OR)) { + for (PsiExpression operand : operands) { + if (isZero(operand)) { + return getText(expression, operand); + } + else if (isAllOnes(operand)) { + return operand.getText(); + } + } } - else if (isZero(operand)) { - return getText(expression, operand); + else if (tokenType.equals(JavaTokenType.XOR)) { + for (PsiExpression operand : operands) { + if (isAllOnes(operand)) { + return '~' + getText(expression, operand); + } + else if (isZero(operand)) { + return getText(expression, operand); + } + } } - } - } - else if (tokenType.equals(JavaTokenType.LTLT) || - tokenType.equals(JavaTokenType.GTGT) || - tokenType.equals(JavaTokenType.GTGTGT)) { - for (PsiExpression operand : operands) { - if (isZero(operand)) { - return getText(expression, operand); + else if (tokenType.equals(JavaTokenType.LTLT) || + tokenType.equals(JavaTokenType.GTGT) || + tokenType.equals(JavaTokenType.GTGTGT)) { + for (PsiExpression operand : operands) { + if (isZero(operand)) { + return getText(expression, operand); + } + } } - } + return ""; } - return ""; - } - private static String getText(PsiPolyadicExpression expression, - PsiExpression exclude) { - final PsiExpression[] operands = expression.getOperands(); - boolean addToken = false; - final StringBuilder text = new StringBuilder(); - for (PsiExpression operand : operands) { - if (operand == exclude) { - continue; - } - if (addToken) { - final PsiJavaToken token = - expression.getTokenBeforeOperand(operand); - text.append(' '); - if (token != null) { - text.append(token.getText()); - text.append(' '); + private static String getText( + PsiPolyadicExpression expression, + PsiExpression exclude + ) { + final PsiExpression[] operands = expression.getOperands(); + boolean addToken = false; + final StringBuilder text = new StringBuilder(); + for (PsiExpression operand : operands) { + if (operand == exclude) { + continue; + } + if (addToken) { + final PsiJavaToken token = + expression.getTokenBeforeOperand(operand); + text.append(' '); + if (token != null) { + text.append(token.getText()); + text.append(' '); + } + } + else { + addToken = true; + } + text.append(operand.getText()); } - } - else { - addToken = true; - } - text.append(operand.getText()); + return text.toString(); } - return text.toString(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new PointlessBitwiseVisitor(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new PointlessBitwiseFix(); - } - - private class PointlessBitwiseFix extends InspectionGadgetsFix { - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.pointlessBitwiseExpressionSimplifyQuickfix().get(); + @Override + public BaseInspectionVisitor buildVisitor() { + return new PointlessBitwiseVisitor(); } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiPolyadicExpression expression = (PsiPolyadicExpression) - descriptor.getPsiElement(); - final String newExpression = - calculateReplacementExpression(expression); - replaceExpression(expression, newExpression); + public InspectionGadgetsFix buildFix(Object... infos) { + return new PointlessBitwiseFix(); } - } - - private class PointlessBitwiseVisitor extends BaseInspectionVisitor { - @Override - public void visitPolyadicExpression( - @Nonnull PsiPolyadicExpression expression) { - super.visitPolyadicExpression(expression); - final IElementType sign = expression.getOperationTokenType(); - if (!bitwiseTokens.contains(sign)) { - return; - } - final PsiExpression[] operands = expression.getOperands(); - for (PsiExpression operand : operands) { - if (operand == null) { - return; + private class PointlessBitwiseFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.pointlessBitwiseExpressionSimplifyQuickfix(); } - final PsiType type = operand.getType(); - if (type == null || type.equals(PsiType.BOOLEAN) || type.equalsToText(CommonClassNames.JAVA_LANG_BOOLEAN)) { - return; + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiPolyadicExpression expression = (PsiPolyadicExpression) + descriptor.getPsiElement(); + final String newExpression = + calculateReplacementExpression(expression); + replaceExpression(expression, newExpression); } - } - final boolean isPointless; - if (sign.equals(JavaTokenType.AND) || sign.equals(JavaTokenType.OR) || - sign.equals(JavaTokenType.XOR)) { - isPointless = booleanExpressionIsPointless(operands); - } - else if (sign.equals(JavaTokenType.LTLT) || - sign.equals(JavaTokenType.GTGT) || - sign.equals(JavaTokenType.GTGTGT)) { - isPointless = shiftExpressionIsPointless(operands); - } - else { - isPointless = false; - } - if (!isPointless) { - return; - } - registerError(expression, expression); } - private boolean booleanExpressionIsPointless(PsiExpression[] operands) { - for (PsiExpression operand : operands) { - if (isZero(operand) || isAllOnes(operand)) { - return true; + private class PointlessBitwiseVisitor extends BaseInspectionVisitor { + + @Override + public void visitPolyadicExpression( + @Nonnull PsiPolyadicExpression expression + ) { + super.visitPolyadicExpression(expression); + final IElementType sign = expression.getOperationTokenType(); + if (!bitwiseTokens.contains(sign)) { + return; + } + final PsiExpression[] operands = expression.getOperands(); + for (PsiExpression operand : operands) { + if (operand == null) { + return; + } + final PsiType type = operand.getType(); + if (type == null || type.equals(PsiType.BOOLEAN) || type.equalsToText(CommonClassNames.JAVA_LANG_BOOLEAN)) { + return; + } + } + final boolean isPointless; + if (sign.equals(JavaTokenType.AND) || sign.equals(JavaTokenType.OR) || + sign.equals(JavaTokenType.XOR)) { + isPointless = booleanExpressionIsPointless(operands); + } + else if (sign.equals(JavaTokenType.LTLT) || + sign.equals(JavaTokenType.GTGT) || + sign.equals(JavaTokenType.GTGTGT)) { + isPointless = shiftExpressionIsPointless(operands); + } + else { + isPointless = false; + } + if (!isPointless) { + return; + } + registerError(expression, expression); } - } - return false; - } - private boolean shiftExpressionIsPointless(PsiExpression[] operands) { - for (int i = 1; i < operands.length; i++) { - final PsiExpression operand = operands[i]; - if (isZero(operand)) { - return true; + private boolean booleanExpressionIsPointless(PsiExpression[] operands) { + for (PsiExpression operand : operands) { + if (isZero(operand) || isAllOnes(operand)) { + return true; + } + } + return false; } - } - return false; - } - } - private boolean isZero(PsiExpression expression) { - if (m_ignoreExpressionsContainingConstants - && !(expression instanceof PsiLiteralExpression)) { - return false; + private boolean shiftExpressionIsPointless(PsiExpression[] operands) { + for (int i = 1; i < operands.length; i++) { + final PsiExpression operand = operands[i]; + if (isZero(operand)) { + return true; + } + } + return false; + } } - return ExpressionUtils.isZero(expression); - } - private boolean isAllOnes(PsiExpression expression) { - if (m_ignoreExpressionsContainingConstants - && !(expression instanceof PsiLiteralExpression)) { - return false; - } - final PsiType expressionType = expression.getType(); - final Object value = - ConstantExpressionUtil.computeCastTo(expression, - expressionType); - if (value == null) { - return false; - } - if (value instanceof Integer && - ((Integer)value).intValue() == 0xffffffff) { - return true; - } - if (value instanceof Long && - ((Long)value).longValue() == 0xffffffffffffffffL) { - return true; - } - if (value instanceof Short && - ((Short)value).shortValue() == (short)0xffff) { - return true; + private boolean isZero(PsiExpression expression) { + if (m_ignoreExpressionsContainingConstants + && !(expression instanceof PsiLiteralExpression)) { + return false; + } + return ExpressionUtils.isZero(expression); } - if (value instanceof Character && - ((Character)value).charValue() == (char)0xffff) { - return true; + + private boolean isAllOnes(PsiExpression expression) { + if (m_ignoreExpressionsContainingConstants + && !(expression instanceof PsiLiteralExpression)) { + return false; + } + final PsiType expressionType = expression.getType(); + final Object value = + ConstantExpressionUtil.computeCastTo( + expression, + expressionType + ); + if (value == null) { + return false; + } + if (value instanceof Integer && + ((Integer) value).intValue() == 0xffffffff) { + return true; + } + if (value instanceof Long && + ((Long) value).longValue() == 0xffffffffffffffffL) { + return true; + } + if (value instanceof Short && + ((Short) value).shortValue() == (short) 0xffff) { + return true; + } + if (value instanceof Character && + ((Character) value).charValue() == (char) 0xffff) { + return true; + } + return value instanceof Byte && + ((Byte) value).byteValue() == (byte) 0xff; } - return value instanceof Byte && - ((Byte)value).byteValue() == (byte)0xff; - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bitwise/ShiftOutOfRangeInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bitwise/ShiftOutOfRangeInspection.java index 9eb09165c1..daddbb06f3 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bitwise/ShiftOutOfRangeInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bitwise/ShiftOutOfRangeInspection.java @@ -27,136 +27,134 @@ 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 ShiftOutOfRangeInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.shiftOperationByInappropriateConstantDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.shiftOperationByInappropriateConstantDisplayName().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final Integer value = (Integer) infos[0]; + return value > 0 + ? InspectionGadgetsLocalize.shiftOperationByInappropriateConstantProblemDescriptorTooLarge().get() + : InspectionGadgetsLocalize.shiftOperationByInappropriateConstantProblemDescriptorNegative().get(); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final Integer value = (Integer)infos[0]; - return value > 0 - ? InspectionGadgetsLocalize.shiftOperationByInappropriateConstantProblemDescriptorTooLarge().get() - : InspectionGadgetsLocalize.shiftOperationByInappropriateConstantProblemDescriptorNegative().get(); - } + @Override + public boolean isEnabledByDefault() { + return true; + } - @Override - public boolean isEnabledByDefault() { - return true; - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new ShiftOutOfRangeFix((Integer) infos[0], (Boolean) infos[1]); + } - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new ShiftOutOfRangeFix((Integer)infos[0], (Boolean)infos[1]); - } + private static class ShiftOutOfRangeFix extends InspectionGadgetsFix { - private static class ShiftOutOfRangeFix extends InspectionGadgetsFix { + private final int value; + private final boolean isLong; - private final int value; - private final boolean isLong; + ShiftOutOfRangeFix(int value, boolean isLong) { + this.value = value; + this.isLong = isLong; + } - ShiftOutOfRangeFix(int value, boolean isLong) { - this.value = value; - this.isLong = isLong; - } + @Nonnull + @Override + public LocalizeValue getName() { + int newValue = isLong ? value & 0b111111 : value & 0b11111; + return InspectionGadgetsLocalize.shiftOutOfRangeQuickfix(value, newValue); + } - @Nonnull - public String getName() { - final int newValue; - if (isLong) { - newValue = value & 0b111111; - } - else { - newValue = value & 0b11111; - } - return InspectionGadgetsLocalize.shiftOutOfRangeQuickfix(value, newValue).get(); + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiElement parent = element.getParent(); + if (!(parent instanceof PsiBinaryExpression)) { + return; + } + final PsiBinaryExpression binaryExpression = + (PsiBinaryExpression) parent; + final PsiExpression rhs = binaryExpression.getROperand(); + if (rhs == null) { + return; + } + final PsiElementFactory factory = + JavaPsiFacade.getElementFactory(project); + final String text; + final PsiExpression lhs = binaryExpression.getLOperand(); + if (PsiType.LONG.equals(lhs.getType())) { + text = String.valueOf(value & 63); + } + else { + text = String.valueOf(value & 31); + } + final PsiExpression newExpression = + factory.createExpressionFromText( + text, element); + rhs.replace(newExpression); + } } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiElement parent = element.getParent(); - if (!(parent instanceof PsiBinaryExpression)) { - return; - } - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)parent; - final PsiExpression rhs = binaryExpression.getROperand(); - if (rhs == null) { - return; - } - final PsiElementFactory factory = - JavaPsiFacade.getElementFactory(project); - final String text; - final PsiExpression lhs = binaryExpression.getLOperand(); - if (PsiType.LONG.equals(lhs.getType())) { - text = String.valueOf(value & 63); - } - else { - text = String.valueOf(value & 31); - } - final PsiExpression newExpression = - factory.createExpressionFromText( - text, element); - rhs.replace(newExpression); + public BaseInspectionVisitor buildVisitor() { + return new ShiftOutOfRange(); } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ShiftOutOfRange(); - } - private static class ShiftOutOfRange extends BaseInspectionVisitor { + private static class ShiftOutOfRange extends BaseInspectionVisitor { - @Override - public void visitBinaryExpression( - @Nonnull PsiBinaryExpression expression) { - super.visitBinaryExpression(expression); - final PsiJavaToken sign = expression.getOperationSign(); - final IElementType tokenType = sign.getTokenType(); - if (!tokenType.equals(JavaTokenType.LTLT) && - !tokenType.equals(JavaTokenType.GTGT) && - !tokenType.equals(JavaTokenType.GTGTGT)) { - return; - } - final PsiType expressionType = expression.getType(); - if (expressionType == null) { - return; - } - final PsiExpression rhs = expression.getROperand(); - if (rhs == null) { - return; - } - if (!PsiUtil.isConstantExpression(rhs)) { - return; - } - final Integer valueObject = - (Integer)ConstantExpressionUtil.computeCastTo(rhs, - PsiType.INT); - if (valueObject == null) { - return; - } - final int value = valueObject.intValue(); - if (expressionType.equals(PsiType.LONG)) { - if (value < 0 || value > 63) { - registerError(sign, valueObject, Boolean.TRUE); - } - } - if (expressionType.equals(PsiType.INT)) { - if (value < 0 || value > 31) { - registerError(sign, valueObject, Boolean.FALSE); + @Override + public void visitBinaryExpression( + @Nonnull PsiBinaryExpression expression + ) { + super.visitBinaryExpression(expression); + final PsiJavaToken sign = expression.getOperationSign(); + final IElementType tokenType = sign.getTokenType(); + if (!tokenType.equals(JavaTokenType.LTLT) && + !tokenType.equals(JavaTokenType.GTGT) && + !tokenType.equals(JavaTokenType.GTGTGT)) { + return; + } + final PsiType expressionType = expression.getType(); + if (expressionType == null) { + return; + } + final PsiExpression rhs = expression.getROperand(); + if (rhs == null) { + return; + } + if (!PsiUtil.isConstantExpression(rhs)) { + return; + } + final Integer valueObject = + (Integer) ConstantExpressionUtil.computeCastTo( + rhs, + PsiType.INT + ); + if (valueObject == null) { + return; + } + final int value = valueObject.intValue(); + if (expressionType.equals(PsiType.LONG)) { + if (value < 0 || value > 63) { + registerError(sign, valueObject, Boolean.TRUE); + } + } + if (expressionType.equals(PsiType.INT)) { + if (value < 0 || value > 31) { + registerError(sign, valueObject, Boolean.FALSE); + } + } } - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ArrayEqualityInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ArrayEqualityInspection.java index aa1ae8611a..9633cd3a33 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ArrayEqualityInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ArrayEqualityInspection.java @@ -26,125 +26,127 @@ 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.jetbrains.annotations.NonNls; @ExtensionImpl public class ArrayEqualityInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.arrayComparisonDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.arrayComparisonDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.arrayComparisonProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.arrayComparisonProblemDescriptor().get(); + } - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - final PsiArrayType type = (PsiArrayType)infos[0]; - final PsiType componentType = type.getComponentType(); - if (componentType instanceof PsiArrayType) { - return new ArrayEqualityFix(true); + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + final PsiArrayType type = (PsiArrayType) infos[0]; + final PsiType componentType = type.getComponentType(); + if (componentType instanceof PsiArrayType) { + return new ArrayEqualityFix(true); + } + return new ArrayEqualityFix(false); } - return new ArrayEqualityFix(false); - } - private static class ArrayEqualityFix extends InspectionGadgetsFix { + private static class ArrayEqualityFix extends InspectionGadgetsFix { + private final boolean deepEquals; - private final boolean deepEquals; + public ArrayEqualityFix(boolean deepEquals) { + this.deepEquals = deepEquals; + } - public ArrayEqualityFix(boolean deepEquals) { - this.deepEquals = deepEquals; - } + @Nonnull + @Override + public LocalizeValue getName() { + return deepEquals + ? InspectionGadgetsLocalize.replaceWithArraysDeepEquals() + : InspectionGadgetsLocalize.replaceWithArraysEquals(); + } - @Nonnull - @Override - public String getName() { - return deepEquals - ? InspectionGadgetsLocalize.replaceWithArraysDeepEquals().get() - : InspectionGadgetsLocalize.replaceWithArraysEquals().get(); + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiElement parent = element.getParent(); + if (!(parent instanceof PsiBinaryExpression)) { + return; + } + final PsiBinaryExpression binaryExpression = + (PsiBinaryExpression) parent; + final IElementType tokenType = + binaryExpression.getOperationTokenType(); + @NonNls final StringBuilder newExpressionText = new StringBuilder(); + if (JavaTokenType.NE.equals(tokenType)) { + newExpressionText.append('!'); + } + else if (!JavaTokenType.EQEQ.equals(tokenType)) { + return; + } + if (deepEquals) { + newExpressionText.append("java.util.Arrays.deepEquals("); + } + else { + newExpressionText.append("java.util.Arrays.equals("); + } + newExpressionText.append(binaryExpression.getLOperand().getText()); + newExpressionText.append(','); + final PsiExpression rhs = binaryExpression.getROperand(); + if (rhs == null) { + return; + } + newExpressionText.append(rhs.getText()); + newExpressionText.append(')'); + replaceExpressionAndShorten( + binaryExpression, + newExpressionText.toString() + ); + } } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiElement parent = element.getParent(); - if (!(parent instanceof PsiBinaryExpression)) { - return; - } - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)parent; - final IElementType tokenType = - binaryExpression.getOperationTokenType(); - @NonNls final StringBuilder newExpressionText = new StringBuilder(); - if (JavaTokenType.NE.equals(tokenType)) { - newExpressionText.append('!'); - } - else if (!JavaTokenType.EQEQ.equals(tokenType)) { - return; - } - if (deepEquals) { - newExpressionText.append("java.util.Arrays.deepEquals("); - } - else { - newExpressionText.append("java.util.Arrays.equals("); - } - newExpressionText.append(binaryExpression.getLOperand().getText()); - newExpressionText.append(','); - final PsiExpression rhs = binaryExpression.getROperand(); - if (rhs == null) { - return; - } - newExpressionText.append(rhs.getText()); - newExpressionText.append(')'); - replaceExpressionAndShorten(binaryExpression, - newExpressionText.toString()); + public BaseInspectionVisitor buildVisitor() { + return new ArrayEqualityVisitor(); } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ArrayEqualityVisitor(); - } - private static class ArrayEqualityVisitor extends BaseInspectionVisitor { + private static class ArrayEqualityVisitor extends BaseInspectionVisitor { - @Override - public void visitBinaryExpression( - @Nonnull PsiBinaryExpression expression) { - super.visitBinaryExpression(expression); - final PsiExpression rhs = expression.getROperand(); - if (rhs == null) { - return; - } - if (!ComparisonUtils.isEqualityComparison(expression)) { - return; - } - final PsiExpression lhs = expression.getLOperand(); - final PsiType lhsType = lhs.getType(); - if (!(lhsType instanceof PsiArrayType)) { - return; - } - if (!(rhs.getType() instanceof PsiArrayType)) { - return; - } - final String lhsText = lhs.getText(); - if (PsiKeyword.NULL.equals(lhsText)) { - return; - } - final String rhsText = rhs.getText(); - if (PsiKeyword.NULL.equals(rhsText)) { - return; - } - final PsiJavaToken sign = expression.getOperationSign(); - registerError(sign, lhsType); + @Override + public void visitBinaryExpression( + @Nonnull PsiBinaryExpression expression + ) { + super.visitBinaryExpression(expression); + final PsiExpression rhs = expression.getROperand(); + if (rhs == null) { + return; + } + if (!ComparisonUtils.isEqualityComparison(expression)) { + return; + } + final PsiExpression lhs = expression.getLOperand(); + final PsiType lhsType = lhs.getType(); + if (!(lhsType instanceof PsiArrayType)) { + return; + } + if (!(rhs.getType() instanceof PsiArrayType)) { + return; + } + final String lhsText = lhs.getText(); + if (PsiKeyword.NULL.equals(lhsText)) { + return; + } + final String rhsText = rhs.getText(); + if (PsiKeyword.NULL.equals(rhsText)) { + return; + } + final PsiJavaToken sign = expression.getOperationSign(); + registerError(sign, lhsType); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ArrayEqualsInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ArrayEqualsInspection.java index e21941baa6..fc319069f6 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ArrayEqualsInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ArrayEqualsInspection.java @@ -24,125 +24,125 @@ 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; import org.jetbrains.annotations.NonNls; @ExtensionImpl public class ArrayEqualsInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.equalsCalledOnArrayDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.equalsCalledOnArrayDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.equalsCalledOnArrayProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.equalsCalledOnArrayProblemDescriptor().get(); + } - @Override - public boolean isEnabledByDefault() { - return true; - } + @Override + public boolean isEnabledByDefault() { + return true; + } - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - final PsiArrayType type = (PsiArrayType)infos[0]; - if (type != null) { - final PsiType componentType = type.getComponentType(); - if (componentType instanceof PsiArrayType) { - return new ArrayEqualsFix(true); - } + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + final PsiArrayType type = (PsiArrayType) infos[0]; + if (type != null) { + final PsiType componentType = type.getComponentType(); + if (componentType instanceof PsiArrayType) { + return new ArrayEqualsFix(true); + } + } + return new ArrayEqualsFix(false); } - return new ArrayEqualsFix(false); - } - private static class ArrayEqualsFix extends InspectionGadgetsFix { + private static class ArrayEqualsFix extends InspectionGadgetsFix { + private final boolean deepEquals; - private final boolean deepEquals; + public ArrayEqualsFix(boolean deepEquals) { + this.deepEquals = deepEquals; + } - public ArrayEqualsFix(boolean deepEquals) { - this.deepEquals = deepEquals; - } + @Nonnull + public LocalizeValue getName() { + return deepEquals + ? InspectionGadgetsLocalize.replaceWithArraysDeepEquals() + : InspectionGadgetsLocalize.replaceWithArraysEquals(); + } - @Nonnull - public String getName() { - return deepEquals - ? InspectionGadgetsLocalize.replaceWithArraysDeepEquals().get() - : InspectionGadgetsLocalize.replaceWithArraysEquals().get(); + @Override + public void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiIdentifier name = (PsiIdentifier) descriptor.getPsiElement(); + final PsiReferenceExpression expression = (PsiReferenceExpression) name.getParent(); + assert expression != null; + final PsiMethodCallExpression call = (PsiMethodCallExpression) expression.getParent(); + final PsiExpression qualifier = expression.getQualifierExpression(); + assert qualifier != null; + final String qualifierText = qualifier.getText(); + assert call != null; + final PsiExpressionList argumentList = call.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + final String argumentText = arguments[0].getText(); + @NonNls final StringBuilder newExpressionText = new StringBuilder(); + if (deepEquals) { + newExpressionText.append("java.util.Arrays.deepEquals("); + } + else { + newExpressionText.append("java.util.Arrays.equals("); + } + newExpressionText.append(qualifierText); + newExpressionText.append(", "); + newExpressionText.append(argumentText); + newExpressionText.append(')'); + replaceExpressionAndShorten(call, newExpressionText.toString()); + } } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiIdentifier name = (PsiIdentifier)descriptor.getPsiElement(); - final PsiReferenceExpression expression = (PsiReferenceExpression)name.getParent(); - assert expression != null; - final PsiMethodCallExpression call = (PsiMethodCallExpression)expression.getParent(); - final PsiExpression qualifier = expression.getQualifierExpression(); - assert qualifier != null; - final String qualifierText = qualifier.getText(); - assert call != null; - final PsiExpressionList argumentList = call.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - final String argumentText = arguments[0].getText(); - @NonNls final StringBuilder newExpressionText = new StringBuilder(); - if (deepEquals) { - newExpressionText.append("java.util.Arrays.deepEquals("); - } - else { - newExpressionText.append("java.util.Arrays.equals("); - } - newExpressionText.append(qualifierText); - newExpressionText.append(", "); - newExpressionText.append(argumentText); - newExpressionText.append(')'); - replaceExpressionAndShorten(call, newExpressionText.toString()); + public BaseInspectionVisitor buildVisitor() { + return new ArrayEqualsVisitor(); } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ArrayEqualsVisitor(); - } - private static class ArrayEqualsVisitor extends BaseInspectionVisitor { - @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - if (!HardcodedMethodConstants.EQUALS.equals(methodName)) { - return; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 1) { - return; - } - final PsiExpression argument = arguments[0]; - if (argument == null) { - return; - } - final PsiType argumentType = argument.getType(); - if (!(argumentType instanceof PsiArrayType)) { - return; - } - final PsiExpression qualifier = - methodExpression.getQualifierExpression(); - if (qualifier == null) { - return; - } - final PsiType qualifierType = qualifier.getType(); - if (!(qualifierType instanceof PsiArrayType)) { - return; - } - registerMethodCallError(expression, qualifierType); + private static class ArrayEqualsVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression( + @Nonnull PsiMethodCallExpression expression + ) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = + expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!HardcodedMethodConstants.EQUALS.equals(methodName)) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 1) { + return; + } + final PsiExpression argument = arguments[0]; + if (argument == null) { + return; + } + final PsiType argumentType = argument.getType(); + if (!(argumentType instanceof PsiArrayType)) { + return; + } + final PsiExpression qualifier = + methodExpression.getQualifierExpression(); + if (qualifier == null) { + return; + } + final PsiType qualifierType = qualifier.getType(); + if (!(qualifierType instanceof PsiArrayType)) { + return; + } + registerMethodCallError(expression, qualifierType); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ArrayHashCodeInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ArrayHashCodeInspection.java index 22609fb82e..e170401af9 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ArrayHashCodeInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ArrayHashCodeInspection.java @@ -25,120 +25,122 @@ 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.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; @ExtensionImpl public class ArrayHashCodeInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.arrayHashCodeDisplayName(); + } - @Nls - @Nonnull - @Override - public String getDisplayName() { - return InspectionGadgetsLocalize.arrayHashCodeDisplayName().get(); - } - - @Nonnull - @Override - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.arrayHashCodeProblemDescriptor().get(); - } + @Nonnull + @Override + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.arrayHashCodeProblemDescriptor().get(); + } - @Override - public boolean isEnabledByDefault() { - return true; - } + @Override + public boolean isEnabledByDefault() { + return true; + } - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiArrayType type = (PsiArrayType)infos[0]; - if (type.getComponentType() instanceof PsiArrayType) { - return new ArrayHashCodeFix(true); + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiArrayType type = (PsiArrayType) infos[0]; + if (type.getComponentType() instanceof PsiArrayType) { + return new ArrayHashCodeFix(true); + } + return new ArrayHashCodeFix(false); } - return new ArrayHashCodeFix(false); - } - private static class ArrayHashCodeFix extends InspectionGadgetsFix { + private static class ArrayHashCodeFix extends InspectionGadgetsFix { - private final boolean deepHashCode; + private final boolean deepHashCode; - public ArrayHashCodeFix(boolean deepHashCode) { - this.deepHashCode = deepHashCode; - } + public ArrayHashCodeFix(boolean deepHashCode) { + this.deepHashCode = deepHashCode; + } - @Nonnull - public String getName() { - return deepHashCode - ? InspectionGadgetsLocalize.arraysDeepHashCodeQuickfix().get() - : InspectionGadgetsLocalize.arraysHashCodeQuickfix().get(); + @Nonnull + @Override + public LocalizeValue getName() { + return deepHashCode + ? InspectionGadgetsLocalize.arraysDeepHashCodeQuickfix() + : InspectionGadgetsLocalize.arraysHashCodeQuickfix(); + } + + @Override + protected 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 PsiMethodCallExpression)) { + return; + } + final PsiMethodCallExpression methodCallExpression = + (PsiMethodCallExpression) grandParent; + final PsiReferenceExpression methodExpression = + methodCallExpression.getMethodExpression(); + final PsiExpression qualifier = + methodExpression.getQualifierExpression(); + if (qualifier == null) { + return; + } + @NonNls final StringBuilder newExpressionText = new StringBuilder(); + if (deepHashCode) { + newExpressionText.append("java.util.Arrays.deepHashCode("); + } + else { + newExpressionText.append("java.util.Arrays.hashCode("); + } + newExpressionText.append(qualifier.getText()); + newExpressionText.append(')'); + replaceExpressionAndShorten( + methodCallExpression, + newExpressionText.toString() + ); + } } @Override - protected 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 PsiMethodCallExpression)) { - return; - } - final PsiMethodCallExpression methodCallExpression = - (PsiMethodCallExpression)grandParent; - final PsiReferenceExpression methodExpression = - methodCallExpression.getMethodExpression(); - final PsiExpression qualifier = - methodExpression.getQualifierExpression(); - if (qualifier == null) { - return; - } - @NonNls final StringBuilder newExpressionText = new StringBuilder(); - if (deepHashCode) { - newExpressionText.append("java.util.Arrays.deepHashCode("); - } - else { - newExpressionText.append("java.util.Arrays.hashCode("); - } - newExpressionText.append(qualifier.getText()); - newExpressionText.append(')'); - replaceExpressionAndShorten(methodCallExpression, - newExpressionText.toString()); + public BaseInspectionVisitor buildVisitor() { + return new ArrayHashCodeVisitor(); } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ArrayHashCodeVisitor(); - } - private static class ArrayHashCodeVisitor extends BaseInspectionVisitor { + private static class ArrayHashCodeVisitor extends BaseInspectionVisitor { - @Override - public void visitMethodCallExpression( - PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - if (!HardcodedMethodConstants.HASH_CODE.equals(methodName)) { - return; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 0) { - return; - } - final PsiExpression qualifier = - methodExpression.getQualifierExpression(); - if (qualifier == null) { - return; - } - final PsiType type = qualifier.getType(); - if (!(type instanceof PsiArrayType)) { - return; - } - registerMethodCallError(expression, type); + @Override + public void visitMethodCallExpression( + PsiMethodCallExpression expression + ) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = + expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!HardcodedMethodConstants.HASH_CODE.equals(methodName)) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 0) { + return; + } + final PsiExpression qualifier = + methodExpression.getQualifierExpression(); + if (qualifier == null) { + return; + } + final PsiType type = qualifier.getType(); + if (!(type instanceof PsiArrayType)) { + return; + } + registerMethodCallError(expression, type); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/AssertWithSideEffectsInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/AssertWithSideEffectsInspection.java index ad5df2217e..4017fea99a 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/AssertWithSideEffectsInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/AssertWithSideEffectsInspection.java @@ -22,178 +22,179 @@ import consulo.annotation.component.ExtensionImpl; import consulo.language.ast.IElementType; import consulo.language.psi.PsiElement; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.Nls; @ExtensionImpl public class AssertWithSideEffectsInspection extends BaseInspection { - - @Override - @Nls - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.assertWithSideEffectsDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.assertWithSideEffectsProblemDescriptor().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new AssertWithSideEffectsVisitor(); - } - - private static class AssertWithSideEffectsVisitor - extends BaseInspectionVisitor { - + @Nonnull @Override - public void visitAssertStatement(PsiAssertStatement statement) { - super.visitAssertStatement(statement); - final PsiExpression condition = statement.getAssertCondition(); - if (condition == null) { - return; - } - final SideEffectVistor visitor = new SideEffectVistor(); - condition.accept(visitor); - if (!visitor.hasSideEffects()) { - return; - } - registerStatementError(statement); - } - } - - private static class SideEffectVistor extends JavaRecursiveElementVisitor { - - private boolean hasSideEffects = false; - - public boolean hasSideEffects() { - return hasSideEffects; + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.assertWithSideEffectsDisplayName(); } @Override - public void visitAssignmentExpression( - PsiAssignmentExpression expression) { - hasSideEffects = true; + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.assertWithSideEffectsProblemDescriptor().get(); } @Override - public void visitElement(PsiElement element) { - if (hasSideEffects) { - return; - } - super.visitElement(element); + public boolean isEnabledByDefault() { + return true; } @Override - public void visitMethodCallExpression( - PsiMethodCallExpression expression) { - if (hasSideEffects) { - return; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return; - } - if (methodHasSideEffects(method)) { - hasSideEffects = true; - } - else { - super.visitMethodCallExpression(expression); - } + public BaseInspectionVisitor buildVisitor() { + return new AssertWithSideEffectsVisitor(); } - @Override - public void visitPrefixExpression(PsiPrefixExpression expression) { - final IElementType tokenType = expression.getOperationTokenType(); - if (JavaTokenType.PLUSPLUS.equals(tokenType) || - JavaTokenType.MINUSMINUS.equals(tokenType)) { - hasSideEffects = true; - } + private static class AssertWithSideEffectsVisitor + extends BaseInspectionVisitor { + + @Override + public void visitAssertStatement(PsiAssertStatement statement) { + super.visitAssertStatement(statement); + final PsiExpression condition = statement.getAssertCondition(); + if (condition == null) { + return; + } + final SideEffectVistor visitor = new SideEffectVistor(); + condition.accept(visitor); + if (!visitor.hasSideEffects()) { + return; + } + registerStatementError(statement); + } } - @Override - public void visitPostfixExpression(PsiPostfixExpression expression) { - final IElementType tokenType = expression.getOperationTokenType(); - if (JavaTokenType.PLUSPLUS.equals(tokenType) || - JavaTokenType.MINUSMINUS.equals(tokenType)) { - hasSideEffects = true; - } - } - } - - private static boolean methodHasSideEffects(PsiMethod method) { - final PsiCodeBlock body = method.getBody(); - if (body == null) { - return false; - } - final MethodSideEffectVisitor visitor = new MethodSideEffectVisitor(); - body.accept(visitor); - return visitor.hasSideEffects(); - } - - private static class MethodSideEffectVisitor - extends JavaRecursiveElementVisitor { - - private boolean hasSideEffects = false; - - @Override - public void visitAssignmentExpression( - PsiAssignmentExpression expression) { - if (hasSideEffects) { - return; - } - checkExpression(expression.getLExpression()); - super.visitAssignmentExpression(expression); - } - - @Override - public void visitPrefixExpression(PsiPrefixExpression expression) { - if (hasSideEffects) { - return; - } - final IElementType tokenType = expression.getOperationTokenType(); - if (JavaTokenType.PLUSPLUS.equals(tokenType) || - JavaTokenType.MINUSMINUS.equals(tokenType)) { - checkExpression(expression.getOperand()); - } - super.visitPrefixExpression(expression); - } - - @Override - public void visitPostfixExpression(PsiPostfixExpression expression) { - if (hasSideEffects) { - return; - } - final IElementType tokenType = expression.getOperationTokenType(); - if (JavaTokenType.PLUSPLUS.equals(tokenType) || - JavaTokenType.MINUSMINUS.equals(tokenType)) { - checkExpression(expression.getOperand()); - } - super.visitPostfixExpression(expression); + private static class SideEffectVistor extends JavaRecursiveElementVisitor { + + private boolean hasSideEffects = false; + + public boolean hasSideEffects() { + return hasSideEffects; + } + + @Override + public void visitAssignmentExpression( + PsiAssignmentExpression expression + ) { + hasSideEffects = true; + } + + @Override + public void visitElement(PsiElement element) { + if (hasSideEffects) { + return; + } + super.visitElement(element); + } + + @Override + public void visitMethodCallExpression( + PsiMethodCallExpression expression + ) { + if (hasSideEffects) { + return; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return; + } + if (methodHasSideEffects(method)) { + hasSideEffects = true; + } + else { + super.visitMethodCallExpression(expression); + } + } + + @Override + public void visitPrefixExpression(PsiPrefixExpression expression) { + final IElementType tokenType = expression.getOperationTokenType(); + if (JavaTokenType.PLUSPLUS.equals(tokenType) || + JavaTokenType.MINUSMINUS.equals(tokenType)) { + hasSideEffects = true; + } + } + + @Override + public void visitPostfixExpression(PsiPostfixExpression expression) { + final IElementType tokenType = expression.getOperationTokenType(); + if (JavaTokenType.PLUSPLUS.equals(tokenType) || + JavaTokenType.MINUSMINUS.equals(tokenType)) { + hasSideEffects = true; + } + } } - private void checkExpression(PsiExpression operand) { - if (!(operand instanceof PsiReferenceExpression)) { - return; - } - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)operand; - final PsiElement target = referenceExpression.resolve(); - if (target instanceof PsiField) { - hasSideEffects = true; - } + private static boolean methodHasSideEffects(PsiMethod method) { + final PsiCodeBlock body = method.getBody(); + if (body == null) { + return false; + } + final MethodSideEffectVisitor visitor = new MethodSideEffectVisitor(); + body.accept(visitor); + return visitor.hasSideEffects(); } - public boolean hasSideEffects() { - return hasSideEffects; + private static class MethodSideEffectVisitor + extends JavaRecursiveElementVisitor { + + private boolean hasSideEffects = false; + + @Override + public void visitAssignmentExpression( + PsiAssignmentExpression expression + ) { + if (hasSideEffects) { + return; + } + checkExpression(expression.getLExpression()); + super.visitAssignmentExpression(expression); + } + + @Override + public void visitPrefixExpression(PsiPrefixExpression expression) { + if (hasSideEffects) { + return; + } + final IElementType tokenType = expression.getOperationTokenType(); + if (JavaTokenType.PLUSPLUS.equals(tokenType) || + JavaTokenType.MINUSMINUS.equals(tokenType)) { + checkExpression(expression.getOperand()); + } + super.visitPrefixExpression(expression); + } + + @Override + public void visitPostfixExpression(PsiPostfixExpression expression) { + if (hasSideEffects) { + return; + } + final IElementType tokenType = expression.getOperationTokenType(); + if (JavaTokenType.PLUSPLUS.equals(tokenType) || + JavaTokenType.MINUSMINUS.equals(tokenType)) { + checkExpression(expression.getOperand()); + } + super.visitPostfixExpression(expression); + } + + private void checkExpression(PsiExpression operand) { + if (!(operand instanceof PsiReferenceExpression)) { + return; + } + final PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) operand; + final PsiElement target = referenceExpression.resolve(); + if (target instanceof PsiField) { + hasSideEffects = true; + } + } + + public boolean hasSideEffects() { + return hasSideEffects; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/CastToIncompatibleInterfaceInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/CastToIncompatibleInterfaceInspection.java index 54fce56a61..84b940577c 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/CastToIncompatibleInterfaceInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/CastToIncompatibleInterfaceInspection.java @@ -21,68 +21,70 @@ 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 CastToIncompatibleInterfaceInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.castingToIncompatibleInterfaceDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.castingToIncompatibleInterfaceDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.castingToIncompatibleInterfaceProblemDescriptor().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.castingToIncompatibleInterfaceProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new CastToIncompatibleInterfaceVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new CastToIncompatibleInterfaceVisitor(); + } - private static class CastToIncompatibleInterfaceVisitor - extends BaseInspectionVisitor { + private static class CastToIncompatibleInterfaceVisitor + extends BaseInspectionVisitor { - @Override - public void visitTypeCastExpression( - @Nonnull PsiTypeCastExpression expression) { - super.visitTypeCastExpression(expression); - final PsiTypeElement castTypeElement = expression.getCastType(); - if (castTypeElement == null) { - return; - } - final PsiType castType = castTypeElement.getType(); - if (!(castType instanceof PsiClassType)) { - return; - } - final PsiClassType castClassType = (PsiClassType)castType; - final PsiExpression operand = expression.getOperand(); - if (operand == null) { - return; - } - final PsiType operandType = operand.getType(); - if (!(operandType instanceof PsiClassType)) { - return; - } - final PsiClassType operandClassType = (PsiClassType)operandType; - final PsiClass castClass = castClassType.resolve(); - if (castClass == null) { - return; - } - if (!castClass.isInterface()) { - return; - } - final PsiClass operandClass = operandClassType.resolve(); - if (operandClass == null) { - return; - } - if (operandClass.isInterface()) { - return; - } - if (InheritanceUtil.existsMutualSubclass(operandClass, castClass)) { - return; - } - registerError(castTypeElement); + @Override + public void visitTypeCastExpression( + @Nonnull PsiTypeCastExpression expression + ) { + super.visitTypeCastExpression(expression); + final PsiTypeElement castTypeElement = expression.getCastType(); + if (castTypeElement == null) { + return; + } + final PsiType castType = castTypeElement.getType(); + if (!(castType instanceof PsiClassType)) { + return; + } + final PsiClassType castClassType = (PsiClassType) castType; + final PsiExpression operand = expression.getOperand(); + if (operand == null) { + return; + } + final PsiType operandType = operand.getType(); + if (!(operandType instanceof PsiClassType)) { + return; + } + final PsiClassType operandClassType = (PsiClassType) operandType; + final PsiClass castClass = castClassType.resolve(); + if (castClass == null) { + return; + } + if (!castClass.isInterface()) { + return; + } + final PsiClass operandClass = operandClassType.resolve(); + if (operandClass == null) { + return; + } + if (operandClass.isInterface()) { + return; + } + if (InheritanceUtil.existsMutualSubclass(operandClass, castClass)) { + return; + } + registerError(castTypeElement); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ClassNewInstanceInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ClassNewInstanceInspection.java index beccfc24e9..dc8c686e29 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ClassNewInstanceInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ClassNewInstanceInspection.java @@ -27,9 +27,9 @@ import consulo.language.psi.scope.GlobalSearchScope; import consulo.language.psi.util.PsiTreeUtil; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; import java.util.HashSet; @@ -37,150 +37,149 @@ @ExtensionImpl public class ClassNewInstanceInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.classNewInstanceDisplayName(); + } - @Override - @Nls - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.classNewInstanceDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.classNewInstanceProblemDescriptor().get(); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new ClassNewInstanceFix(); - } - - private static class ClassNewInstanceFix extends InspectionGadgetsFix { - + @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.classNewInstanceQuickfix().get(); + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.classNewInstanceProblemDescriptor().get(); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiElement parent = element.getParent(); - if (!(parent instanceof PsiReferenceExpression)) { - return; - } - final PsiReferenceExpression methodExpression = (PsiReferenceExpression)parent; - final PsiExpression qualifier = methodExpression.getQualifierExpression(); - if (qualifier == null) { - return; - } - final PsiElement grandParent = parent.getParent(); - if (!(grandParent instanceof PsiMethodCallExpression)) { - return; - } - final PsiElement parentOfType = PsiTreeUtil.getParentOfType(element, PsiMethod.class, PsiTryStatement.class); - if (parentOfType instanceof PsiTryStatement) { - final PsiTryStatement tryStatement = - (PsiTryStatement)parentOfType; - addCatchBlock( - tryStatement, - "java.lang.NoSuchMethodException", - "java.lang.reflect.InvocationTargetException" - ); - } - else { - final PsiMethod method = (PsiMethod)parentOfType; - addThrowsClause( - method, - "java.lang.NoSuchMethodException", - "java.lang.reflect.InvocationTargetException" - ); - } - final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)grandParent; - @NonNls final String newExpression = qualifier.getText() + ".getConstructor().newInstance()"; - replaceExpression(methodCallExpression, newExpression); + protected InspectionGadgetsFix buildFix(Object... infos) { + return new ClassNewInstanceFix(); } - private static void addThrowsClause(PsiMethod method, String... exceptionNames) { - final PsiReferenceList throwsList = method.getThrowsList(); - final PsiClassType[] referencedTypes = throwsList.getReferencedTypes(); - final Set presentExceptionNames = new HashSet(); - for (PsiClassType referencedType : referencedTypes) { - final String exceptionName = referencedType.getCanonicalText(); - presentExceptionNames.add(exceptionName); - } - final Project project = method.getProject(); - final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); - final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project); - final GlobalSearchScope scope = method.getResolveScope(); - for (String exceptionName : exceptionNames) { - if (presentExceptionNames.contains(exceptionName)) { - continue; + private static class ClassNewInstanceFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.classNewInstanceQuickfix(); } - final PsiJavaCodeReferenceElement throwsReference = factory.createReferenceElementByFQClassName(exceptionName, scope); - final PsiElement element = throwsList.add(throwsReference); - codeStyleManager.shortenClassReferences(element); - } - } - protected static void addCatchBlock(PsiTryStatement tryStatement, String... exceptionNames) - throws IncorrectOperationException { - final Project project = tryStatement.getProject(); - final PsiParameter[] parameters = tryStatement.getCatchBlockParameters(); - final Set presentExceptionNames = new HashSet(); - for (PsiParameter parameter : parameters) { - final PsiType type = parameter.getType(); - final String exceptionName = type.getCanonicalText(); - presentExceptionNames.add(exceptionName); - } - final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project); - final String name = codeStyleManager.suggestUniqueVariableName("e", tryStatement.getTryBlock(), false); - final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); - for (String exceptionName : exceptionNames) { - if (presentExceptionNames.contains(exceptionName)) { - continue; + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiElement parent = element.getParent(); + if (!(parent instanceof PsiReferenceExpression)) { + return; + } + final PsiReferenceExpression methodExpression = (PsiReferenceExpression) parent; + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (qualifier == null) { + return; + } + final PsiElement grandParent = parent.getParent(); + if (!(grandParent instanceof PsiMethodCallExpression)) { + return; + } + final PsiElement parentOfType = PsiTreeUtil.getParentOfType(element, PsiMethod.class, PsiTryStatement.class); + if (parentOfType instanceof PsiTryStatement) { + final PsiTryStatement tryStatement = + (PsiTryStatement) parentOfType; + addCatchBlock( + tryStatement, + "java.lang.NoSuchMethodException", + "java.lang.reflect.InvocationTargetException" + ); + } + else { + final PsiMethod method = (PsiMethod) parentOfType; + addThrowsClause( + method, + "java.lang.NoSuchMethodException", + "java.lang.reflect.InvocationTargetException" + ); + } + final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression) grandParent; + @NonNls final String newExpression = qualifier.getText() + ".getConstructor().newInstance()"; + replaceExpression(methodCallExpression, newExpression); + } + + private static void addThrowsClause(PsiMethod method, String... exceptionNames) { + final PsiReferenceList throwsList = method.getThrowsList(); + final PsiClassType[] referencedTypes = throwsList.getReferencedTypes(); + final Set presentExceptionNames = new HashSet(); + for (PsiClassType referencedType : referencedTypes) { + final String exceptionName = referencedType.getCanonicalText(); + presentExceptionNames.add(exceptionName); + } + final Project project = method.getProject(); + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); + final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project); + final GlobalSearchScope scope = method.getResolveScope(); + for (String exceptionName : exceptionNames) { + if (presentExceptionNames.contains(exceptionName)) { + continue; + } + final PsiJavaCodeReferenceElement throwsReference = factory.createReferenceElementByFQClassName(exceptionName, scope); + final PsiElement element = throwsList.add(throwsReference); + codeStyleManager.shortenClassReferences(element); + } } - final PsiClassType type = (PsiClassType)factory.createTypeFromText(exceptionName, tryStatement); - final PsiCatchSection section = factory.createCatchSection(type, name, tryStatement); - final PsiCatchSection element = (PsiCatchSection)tryStatement.add(section); - codeStyleManager.shortenClassReferences(element); - } - } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new ClassNewInstanceVisitor(); - } + protected static void addCatchBlock(PsiTryStatement tryStatement, String... exceptionNames) + throws IncorrectOperationException { + final Project project = tryStatement.getProject(); + final PsiParameter[] parameters = tryStatement.getCatchBlockParameters(); + final Set presentExceptionNames = new HashSet(); + for (PsiParameter parameter : parameters) { + final PsiType type = parameter.getType(); + final String exceptionName = type.getCanonicalText(); + presentExceptionNames.add(exceptionName); + } + final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project); + final String name = codeStyleManager.suggestUniqueVariableName("e", tryStatement.getTryBlock(), false); + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); + for (String exceptionName : exceptionNames) { + if (presentExceptionNames.contains(exceptionName)) { + continue; + } + final PsiClassType type = (PsiClassType) factory.createTypeFromText(exceptionName, tryStatement); + final PsiCatchSection section = factory.createCatchSection(type, name, tryStatement); + final PsiCatchSection element = (PsiCatchSection) tryStatement.add(section); + codeStyleManager.shortenClassReferences(element); + } + } + } - private static class ClassNewInstanceVisitor extends BaseInspectionVisitor { @Override - public void visitMethodCallExpression( - PsiMethodCallExpression expression) { - final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - @NonNls final String methodName = methodExpression.getReferenceName(); - if (!"newInstance".equals(methodName)) { - return; - } - final PsiExpression qualifier = methodExpression.getQualifierExpression(); - if (qualifier == null) { - return; - } - final PsiType qualifierType = qualifier.getType(); - if (!(qualifierType instanceof PsiClassType)) { - return; - } - final PsiClassType classType = (PsiClassType)qualifierType; - final PsiClass aClass = classType.resolve(); - if (aClass == null) { - return; - } - final String className = aClass.getQualifiedName(); - if (!CommonClassNames.JAVA_LANG_CLASS.equals(className)) { - return; - } - registerMethodCallError(expression); + public BaseInspectionVisitor buildVisitor() { + return new ClassNewInstanceVisitor(); + } + + private static class ClassNewInstanceVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression( + PsiMethodCallExpression expression + ) { + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + @NonNls final String methodName = methodExpression.getReferenceName(); + if (!"newInstance".equals(methodName)) { + return; + } + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (qualifier == null) { + return; + } + final PsiType qualifierType = qualifier.getType(); + if (!(qualifierType instanceof PsiClassType)) { + return; + } + final PsiClassType classType = (PsiClassType) qualifierType; + final PsiClass aClass = classType.resolve(); + if (aClass == null) { + return; + } + final String className = aClass.getQualifiedName(); + if (!CommonClassNames.JAVA_LANG_CLASS.equals(className)) { + return; + } + registerMethodCallError(expression); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ComparableImplementedButEqualsNotOverriddenInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ComparableImplementedButEqualsNotOverriddenInspection.java index 0714912fda..23477d04ad 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ComparableImplementedButEqualsNotOverriddenInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ComparableImplementedButEqualsNotOverriddenInspection.java @@ -27,70 +27,69 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.scope.GlobalSearchScope; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; @ExtensionImpl -public class ComparableImplementedButEqualsNotOverriddenInspection - extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.comparableImplementedButEqualsNotOverriddenDisplayName().get(); - } +public class ComparableImplementedButEqualsNotOverriddenInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.comparableImplementedButEqualsNotOverriddenDisplayName(); + } - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.comparableImplementedButEqualsNotOverriddenProblemDescriptor().get(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.comparableImplementedButEqualsNotOverriddenProblemDescriptor().get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new CompareToAndEqualsNotPairedVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new CompareToAndEqualsNotPairedVisitor(); + } - private static class CompareToAndEqualsNotPairedVisitor - extends BaseInspectionVisitor { + private static class CompareToAndEqualsNotPairedVisitor + extends BaseInspectionVisitor { - @Override - public void visitClass(PsiClass aClass) { - super.visitClass(aClass); - final PsiMethod[] methods = aClass.findMethodsByName( - HardcodedMethodConstants.COMPARE_TO, false); - if (methods.length == 0) { - return; - } - final Project project = aClass.getProject(); - final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); - final GlobalSearchScope scope = aClass.getResolveScope(); - final PsiClass comparableClass = psiFacade.findClass(CommonClassNames.JAVA_LANG_COMPARABLE, scope); - if (comparableClass == null) { - return; - } - if (!aClass.isInheritor(comparableClass, true)) { - return; - } - final PsiMethod compareToMethod = comparableClass.getMethods()[0]; - boolean foundCompareTo = false; - for (PsiMethod method : methods) { - if (MethodSignatureUtil.isSuperMethod(compareToMethod, method)) { - foundCompareTo = true; - break; - } - } - if (!foundCompareTo) { - return; - } - final PsiMethod[] equalsMethods = aClass.findMethodsByName( - HardcodedMethodConstants.EQUALS, false); - for (PsiMethod equalsMethod : equalsMethods) { - if (MethodUtils.isEquals(equalsMethod)) { - return; + @Override + public void visitClass(PsiClass aClass) { + super.visitClass(aClass); + final PsiMethod[] methods = aClass.findMethodsByName( + HardcodedMethodConstants.COMPARE_TO, false); + if (methods.length == 0) { + return; + } + final Project project = aClass.getProject(); + final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); + final GlobalSearchScope scope = aClass.getResolveScope(); + final PsiClass comparableClass = psiFacade.findClass(CommonClassNames.JAVA_LANG_COMPARABLE, scope); + if (comparableClass == null) { + return; + } + if (!aClass.isInheritor(comparableClass, true)) { + return; + } + final PsiMethod compareToMethod = comparableClass.getMethods()[0]; + boolean foundCompareTo = false; + for (PsiMethod method : methods) { + if (MethodSignatureUtil.isSuperMethod(compareToMethod, method)) { + foundCompareTo = true; + break; + } + } + if (!foundCompareTo) { + return; + } + final PsiMethod[] equalsMethods = aClass.findMethodsByName( + HardcodedMethodConstants.EQUALS, false); + for (PsiMethod equalsMethod : equalsMethods) { + if (MethodUtils.isEquals(equalsMethod)) { + return; + } + } + registerClassError(aClass); } - } - registerClassError(aClass); } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/CompareToUsesNonFinalVariableInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/CompareToUsesNonFinalVariableInspection.java index 41643e7867..771be72fea 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/CompareToUsesNonFinalVariableInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/CompareToUsesNonFinalVariableInspection.java @@ -24,63 +24,64 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.PsiElement; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @ExtensionImpl -public class CompareToUsesNonFinalVariableInspection - extends BaseInspection { - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.nonFinalFieldComparetoDisplayName().get(); - } +public class CompareToUsesNonFinalVariableInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nonFinalFieldComparetoDisplayName(); + } - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.nonFinalFieldComparetoProblemDescriptor().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.nonFinalFieldComparetoProblemDescriptor().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 CompareToUsesNonFinalVariableVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new CompareToUsesNonFinalVariableVisitor(); + } - private static class CompareToUsesNonFinalVariableVisitor - extends BaseInspectionVisitor { + private static class CompareToUsesNonFinalVariableVisitor + extends BaseInspectionVisitor { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - final boolean isCompareTo = MethodUtils.isCompareTo(method); - if (isCompareTo) { - method.accept(new JavaRecursiveElementVisitor() { + @Override + public void visitMethod(@Nonnull PsiMethod method) { + final boolean isCompareTo = MethodUtils.isCompareTo(method); + if (isCompareTo) { + method.accept(new JavaRecursiveElementVisitor() { - @Override - public void visitClass(PsiClass aClass) { - // Do not recurse into. - } + @Override + public void visitClass(PsiClass aClass) { + // Do not recurse into. + } - @Override - public void visitReferenceExpression( - @Nonnull PsiReferenceExpression expression) { - super.visitReferenceExpression(expression); - final PsiElement element = expression.resolve(); - if (!(element instanceof PsiField)) { - return; - } - final PsiField field = (PsiField)element; - if (field.hasModifierProperty(PsiModifier.FINAL)) { - return; + @Override + public void visitReferenceExpression( + @Nonnull PsiReferenceExpression expression + ) { + super.visitReferenceExpression(expression); + final PsiElement element = expression.resolve(); + if (!(element instanceof PsiField)) { + return; + } + final PsiField field = (PsiField) element; + if (field.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + registerError(expression, field); + } + }); } - registerError(expression, field); - } - }); - } + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ConstantAssertConditionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ConstantAssertConditionInspection.java index 14ed223bdf..fe9567a3ff 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ConstantAssertConditionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ConstantAssertConditionInspection.java @@ -24,50 +24,48 @@ import com.siyeh.ig.psiutils.ParenthesesUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.Nls; @ExtensionImpl public class ConstantAssertConditionInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.constantAssertConditionDisplayName(); + } - @Override - @Nls - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.constantAssertConditionDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.constantAssertConditionProblemDescriptor().get(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.constantAssertConditionProblemDescriptor().get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new ConstantAssertConditionVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new ConstantAssertConditionVisitor(); + } - private static class ConstantAssertConditionVisitor - extends BaseInspectionVisitor { + private static class ConstantAssertConditionVisitor + extends BaseInspectionVisitor { - @Override - public void visitAssertStatement(PsiAssertStatement statement) { - super.visitAssertStatement(statement); - final PsiExpression assertCondition = - statement.getAssertCondition(); - final PsiExpression expression = - ParenthesesUtils.stripParentheses(assertCondition); - if (expression == null) { - return; - } - if (BoolUtils.isFalse(expression)) { - return; - } - if (!PsiUtil.isConstantExpression(expression)) { - return; - } - registerError(expression); + @Override + public void visitAssertStatement(PsiAssertStatement statement) { + super.visitAssertStatement(statement); + final PsiExpression assertCondition = + statement.getAssertCondition(); + final PsiExpression expression = + ParenthesesUtils.stripParentheses(assertCondition); + if (expression == null) { + return; + } + if (BoolUtils.isFalse(expression)) { + return; + } + if (!PsiUtil.isConstantExpression(expression)) { + return; + } + registerError(expression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/CovariantEqualsInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/CovariantEqualsInspection.java index d2fc25dfe6..91177c159a 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/CovariantEqualsInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/CovariantEqualsInspection.java @@ -22,71 +22,72 @@ import com.siyeh.ig.psiutils.TypeUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class CovariantEqualsInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.covariantEqualsDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.covariantEqualsDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.covariantEqualsProblemDescriptor().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.covariantEqualsProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new CovariantEqualsVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new CovariantEqualsVisitor(); + } - private static class CovariantEqualsVisitor extends BaseInspectionVisitor { + private static class CovariantEqualsVisitor extends BaseInspectionVisitor { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - // note: no call to super - final String name = method.getName(); - if (!HardcodedMethodConstants.EQUALS.equals(name)) { - return; - } - if (!method.hasModifierProperty(PsiModifier.PUBLIC)) { - return; - } - final PsiParameterList parameterList = method.getParameterList(); - if (parameterList.getParametersCount() != 1) { - return; - } - final PsiParameter[] parameters = parameterList.getParameters(); - final PsiType argType = parameters[0].getType(); - if (TypeUtils.isJavaLangObject(argType)) { - return; - } - final PsiClass aClass = method.getContainingClass(); - if (aClass == null || aClass.isInterface()) { - return; - } - final PsiMethod[] methods = aClass.getMethods(); - for (PsiMethod method1 : methods) { - if (isNonVariantEquals(method1)) { - return; + @Override + public void visitMethod(@Nonnull PsiMethod method) { + // note: no call to super + final String name = method.getName(); + if (!HardcodedMethodConstants.EQUALS.equals(name)) { + return; + } + if (!method.hasModifierProperty(PsiModifier.PUBLIC)) { + return; + } + final PsiParameterList parameterList = method.getParameterList(); + if (parameterList.getParametersCount() != 1) { + return; + } + final PsiParameter[] parameters = parameterList.getParameters(); + final PsiType argType = parameters[0].getType(); + if (TypeUtils.isJavaLangObject(argType)) { + return; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null || aClass.isInterface()) { + return; + } + final PsiMethod[] methods = aClass.getMethods(); + for (PsiMethod method1 : methods) { + if (isNonVariantEquals(method1)) { + return; + } + } + registerMethodError(method); } - } - registerMethodError(method); - } - private static boolean isNonVariantEquals(PsiMethod method) { - final String name = method.getName(); - if (!HardcodedMethodConstants.EQUALS.equals(name)) { - return false; - } - final PsiParameterList paramList = method.getParameterList(); - final PsiParameter[] parameters = paramList.getParameters(); - if (parameters.length != 1) { - return false; - } - final PsiType argType = parameters[0].getType(); - return TypeUtils.isJavaLangObject(argType); + private static boolean isNonVariantEquals(PsiMethod method) { + final String name = method.getName(); + if (!HardcodedMethodConstants.EQUALS.equals(name)) { + return false; + } + final PsiParameterList paramList = method.getParameterList(); + final PsiParameter[] parameters = paramList.getParameters(); + if (parameters.length != 1) { + return false; + } + final PsiType argType = parameters[0].getType(); + return TypeUtils.isJavaLangObject(argType); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EmptyInitializerInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EmptyInitializerInspection.java index 82456bfaa1..172ce8036b 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EmptyInitializerInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EmptyInitializerInspection.java @@ -26,69 +26,74 @@ 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 EmptyInitializerInspection extends BaseInspection { + @Nonnull + @Override + @Pattern("[a-zA-Z_0-9.]+") + public String getID() { + return "EmptyClassInitializer"; + } - @Nonnull - public String getID() { - return "EmptyClassInitializer"; - } - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.emptyClassInitializerDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.emptyClassInitializerProblemDescriptor().get(); - } - - protected InspectionGadgetsFix buildFix(Object... infos) { - return new EmptyInitializerFix(); - } - - private static class EmptyInitializerFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.emptyClassInitializerDisplayName(); + } @Nonnull - public String getName() { - return InspectionGadgetsLocalize.emptyClassInitializerDeleteQuickfix().get(); + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.emptyClassInitializerProblemDescriptor().get(); } - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiElement codeBlock = element.getParent(); - assert codeBlock != null; - final PsiElement classInitializer = codeBlock.getParent(); - assert classInitializer != null; - deleteElement(classInitializer); + protected InspectionGadgetsFix buildFix(Object... infos) { + return new EmptyInitializerFix(); } - } - public BaseInspectionVisitor buildVisitor() { - return new EmptyInitializerVisitor(); - } + private static class EmptyInitializerFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.emptyClassInitializerDeleteQuickfix(); + } - private static class EmptyInitializerVisitor extends BaseInspectionVisitor { + public void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiElement codeBlock = element.getParent(); + assert codeBlock != null; + final PsiElement classInitializer = codeBlock.getParent(); + assert classInitializer != null; + deleteElement(classInitializer); + } + } - @Override - public void visitClassInitializer( - @Nonnull PsiClassInitializer initializer) { - super.visitClassInitializer(initializer); - final PsiCodeBlock body = initializer.getBody(); - if (!codeBlockIsEmpty(body)) { - return; - } - registerClassInitializerError(initializer); + public BaseInspectionVisitor buildVisitor() { + return new EmptyInitializerVisitor(); } - private static boolean codeBlockIsEmpty(PsiCodeBlock codeBlock) { - final PsiStatement[] statements = codeBlock.getStatements(); - return statements.length == 0; + private static class EmptyInitializerVisitor extends BaseInspectionVisitor { + + @Override + public void visitClassInitializer( + @Nonnull PsiClassInitializer initializer + ) { + super.visitClassInitializer(initializer); + final PsiCodeBlock body = initializer.getBody(); + if (!codeBlockIsEmpty(body)) { + return; + } + registerClassInitializerError(initializer); + } + + private static boolean codeBlockIsEmpty(PsiCodeBlock codeBlock) { + final PsiStatement[] statements = codeBlock.getStatements(); + return statements.length == 0; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EmptyStatementBodyInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EmptyStatementBodyInspection.java index ea55177893..23f2f261e1 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EmptyStatementBodyInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EmptyStatementBodyInspection.java @@ -16,146 +16,148 @@ package com.intellij.java.impl.ig.bugs; import com.intellij.java.language.psi.*; -import com.siyeh.localize.InspectionGadgetsLocalize; -import consulo.annotation.component.ExtensionImpl; -import consulo.language.psi.*; -import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; +import com.siyeh.localize.InspectionGadgetsLocalize; +import consulo.annotation.component.ExtensionImpl; import consulo.deadCodeNotWorking.impl.SingleCheckboxOptionsPanel; +import consulo.language.psi.PsiElement; import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; @ExtensionImpl public class EmptyStatementBodyInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean m_reportEmptyBlocks = true; - /** - * @noinspection PublicField - */ - public boolean m_reportEmptyBlocks = true; - - @Nonnull - public String getID() { - return "StatementWithEmptyBody"; - } - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.statementWithEmptyBodyDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.statementWithEmptyBodyProblemDescriptor().get(); - } - - public boolean isEnabledByDefault() { - return true; - } - - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.statementWithEmptyBodyIncludeOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "m_reportEmptyBlocks"); - } - - public BaseInspectionVisitor buildVisitor() { - return new EmptyStatementVisitor(); - } - - private class EmptyStatementVisitor extends BaseInspectionVisitor { + @Nonnull @Override - public void visitDoWhileStatement(@Nonnull PsiDoWhileStatement statement) { - super.visitDoWhileStatement(statement); - checkLoopStatement(statement); + @Pattern("[a-zA-Z_0-9.]+") + public String getID() { + return "StatementWithEmptyBody"; } + @Nonnull @Override - public void visitWhileStatement(@Nonnull PsiWhileStatement statement) { - super.visitWhileStatement(statement); - checkLoopStatement(statement); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.statementWithEmptyBodyDisplayName(); } - @Override - public void visitForStatement(@Nonnull PsiForStatement statement) { - super.visitForStatement(statement); - checkLoopStatement(statement); + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.statementWithEmptyBodyProblemDescriptor().get(); } - @Override - public void visitForeachStatement(@Nonnull PsiForeachStatement statement) { - super.visitForeachStatement(statement); - checkLoopStatement(statement); + public boolean isEnabledByDefault() { + return true; + } + + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.statementWithEmptyBodyIncludeOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "m_reportEmptyBlocks"); + } + + public BaseInspectionVisitor buildVisitor() { + return new EmptyStatementVisitor(); } - private void checkLoopStatement(PsiLoopStatement statement) { + private class EmptyStatementVisitor extends BaseInspectionVisitor { + @Override + public void visitDoWhileStatement(@Nonnull PsiDoWhileStatement statement) { + super.visitDoWhileStatement(statement); + checkLoopStatement(statement); + } + + @Override + public void visitWhileStatement(@Nonnull PsiWhileStatement statement) { + super.visitWhileStatement(statement); + checkLoopStatement(statement); + } + + @Override + public void visitForStatement(@Nonnull PsiForStatement statement) { + super.visitForStatement(statement); + checkLoopStatement(statement); + } + + @Override + public void visitForeachStatement(@Nonnull PsiForeachStatement statement) { + super.visitForeachStatement(statement); + checkLoopStatement(statement); + } + + private void checkLoopStatement(PsiLoopStatement statement) { /* if (JspPsiUtil.isInJspFile(statement)) { return; } */ - final PsiStatement body = statement.getBody(); - if (body == null || !isEmpty(body)) { - return; - } - registerStatementError(statement); - } + final PsiStatement body = statement.getBody(); + if (body == null || !isEmpty(body)) { + return; + } + registerStatementError(statement); + } - @Override - public void visitIfStatement(@Nonnull PsiIfStatement statement) { - super.visitIfStatement(statement); + @Override + public void visitIfStatement(@Nonnull PsiIfStatement statement) { + super.visitIfStatement(statement); /*if (JspPsiUtil.isInJspFile(statement)) { return; } */ - final PsiStatement thenBranch = statement.getThenBranch(); - if (thenBranch != null && isEmpty(thenBranch)) { - registerStatementError(statement); - return; - } - final PsiStatement elseBranch = statement.getElseBranch(); - if (elseBranch != null && isEmpty(elseBranch)) { - final PsiElement elseToken = statement.getElseElement(); - if (elseToken == null) { - return; + final PsiStatement thenBranch = statement.getThenBranch(); + if (thenBranch != null && isEmpty(thenBranch)) { + registerStatementError(statement); + return; + } + final PsiStatement elseBranch = statement.getElseBranch(); + if (elseBranch != null && isEmpty(elseBranch)) { + final PsiElement elseToken = statement.getElseElement(); + if (elseToken == null) { + return; + } + registerError(elseToken); + } } - registerError(elseToken); - } - } - @Override - public void visitSwitchStatement(PsiSwitchStatement statement) { - super.visitSwitchStatement(statement); + @Override + public void visitSwitchStatement(PsiSwitchStatement statement) { + super.visitSwitchStatement(statement); /* if (JspPsiUtil.isInJspFile(statement)) { return; } */ - final PsiCodeBlock body = statement.getBody(); - if (body == null || !isEmpty(body)) { - return; - } - registerStatementError(statement); - } - - private boolean isEmpty(PsiElement body) { - if (body instanceof PsiEmptyStatement) { - return true; - } - else if (body instanceof PsiBlockStatement) { - final PsiBlockStatement block = (PsiBlockStatement)body; - return isEmpty(block.getCodeBlock()); - } - else if (m_reportEmptyBlocks && body instanceof PsiCodeBlock) { - final PsiCodeBlock codeBlock = (PsiCodeBlock)body; - final PsiStatement[] statements = codeBlock.getStatements(); - if (statements.length == 0) { - return true; + final PsiCodeBlock body = statement.getBody(); + if (body == null || !isEmpty(body)) { + return; + } + registerStatementError(statement); } - for (PsiStatement statement : statements) { - if (!isEmpty(statement)) { + + private boolean isEmpty(PsiElement body) { + if (body instanceof PsiEmptyStatement) { + return true; + } + else if (body instanceof PsiBlockStatement) { + final PsiBlockStatement block = (PsiBlockStatement) body; + return isEmpty(block.getCodeBlock()); + } + else if (m_reportEmptyBlocks && body instanceof PsiCodeBlock) { + final PsiCodeBlock codeBlock = (PsiCodeBlock) body; + final PsiStatement[] statements = codeBlock.getStatements(); + if (statements.length == 0) { + return true; + } + for (PsiStatement statement : statements) { + if (!isEmpty(statement)) { + return false; + } + } + return true; + } return false; - } } - return true; - } - return false; } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EqualsBetweenInconvertibleTypesInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EqualsBetweenInconvertibleTypesInspection.java index 78ebf01179..efe703f0d8 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EqualsBetweenInconvertibleTypesInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EqualsBetweenInconvertibleTypesInspection.java @@ -22,74 +22,75 @@ import com.siyeh.ig.psiutils.MethodCallUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl -public class EqualsBetweenInconvertibleTypesInspection - extends BaseInspection { - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.equalsBetweenInconvertibleTypesDisplayName().get(); - } +public class EqualsBetweenInconvertibleTypesInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.equalsBetweenInconvertibleTypesDisplayName(); + } - @Nonnull - public String buildErrorString(Object... infos) { - final PsiType comparedType = (PsiType)infos[0]; - final PsiType comparisonType = (PsiType)infos[1]; - return InspectionGadgetsLocalize.equalsBetweenInconvertibleTypesProblemDescriptor( - comparedType.getPresentableText(), - comparisonType.getPresentableText() - ).get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + final PsiType comparedType = (PsiType) infos[0]; + final PsiType comparisonType = (PsiType) infos[1]; + return InspectionGadgetsLocalize.equalsBetweenInconvertibleTypesProblemDescriptor( + comparedType.getPresentableText(), + comparisonType.getPresentableText() + ).get(); + } - public boolean isEnabledByDefault() { - return true; - } + public boolean isEnabledByDefault() { + return true; + } - public BaseInspectionVisitor buildVisitor() { - return new EqualsBetweenInconvertibleTypesVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new EqualsBetweenInconvertibleTypesVisitor(); + } - private static class EqualsBetweenInconvertibleTypesVisitor - extends BaseInspectionVisitor { + private static class EqualsBetweenInconvertibleTypesVisitor + extends BaseInspectionVisitor { - @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - if (!MethodCallUtils.isEqualsCall(expression)) { - return; - } - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] args = argumentList.getExpressions(); - if (args.length != 1) { - return; - } - final PsiExpression expression1 = args[0]; - final PsiExpression expression2 = - methodExpression.getQualifierExpression(); - if (expression2 == null) { - return; - } - final PsiType comparedType = expression1.getType(); - if (comparedType == null) { - return; - } - final PsiType comparisonType = expression2.getType(); - if (comparisonType == null) { - return; - } - final PsiType comparedTypeErasure = TypeConversionUtil.erasure(comparedType); - final PsiType comparisonTypeErasure = TypeConversionUtil.erasure(comparisonType); - if (comparedTypeErasure == null || - comparisonTypeErasure == null || - TypeConversionUtil.areTypesConvertible(comparedTypeErasure, comparisonTypeErasure)) { - return; - } - registerMethodCallError(expression, comparedType, comparisonType); + @Override + public void visitMethodCallExpression( + @Nonnull PsiMethodCallExpression expression + ) { + super.visitMethodCallExpression(expression); + if (!MethodCallUtils.isEqualsCall(expression)) { + return; + } + final PsiReferenceExpression methodExpression = + expression.getMethodExpression(); + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] args = argumentList.getExpressions(); + if (args.length != 1) { + return; + } + final PsiExpression expression1 = args[0]; + final PsiExpression expression2 = + methodExpression.getQualifierExpression(); + if (expression2 == null) { + return; + } + final PsiType comparedType = expression1.getType(); + if (comparedType == null) { + return; + } + final PsiType comparisonType = expression2.getType(); + if (comparisonType == null) { + return; + } + final PsiType comparedTypeErasure = TypeConversionUtil.erasure(comparedType); + final PsiType comparisonTypeErasure = TypeConversionUtil.erasure(comparisonType); + if (comparedTypeErasure == null || + comparisonTypeErasure == null || + TypeConversionUtil.areTypesConvertible(comparedTypeErasure, comparisonTypeErasure)) { + return; + } + registerMethodCallError(expression, comparedType, comparisonType); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EqualsUsesNonFinalVariableInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EqualsUsesNonFinalVariableInspection.java index c66d207722..f69eb0f5e7 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EqualsUsesNonFinalVariableInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EqualsUsesNonFinalVariableInspection.java @@ -24,66 +24,71 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.PsiElement; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl public class EqualsUsesNonFinalVariableInspection extends BaseInspection { + @Nonnull + @Override + @Pattern("[a-zA-Z_0-9.]+") + public String getID() { + return "NonFinalFieldReferenceInEquals"; + } - @Nonnull - public String getID() { - return "NonFinalFieldReferenceInEquals"; - } - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.nonFinalFieldInEqualsDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nonFinalFieldInEqualsDisplayName(); + } - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.nonFinalFieldInEqualsProblemDescriptor().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.nonFinalFieldInEqualsProblemDescriptor().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 EqualsUsesNonFinalVariableVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new EqualsUsesNonFinalVariableVisitor(); + } - private static class EqualsUsesNonFinalVariableVisitor - extends BaseInspectionVisitor { + private static class EqualsUsesNonFinalVariableVisitor + extends BaseInspectionVisitor { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - if (MethodUtils.isEquals(method)) { - method.accept(new JavaRecursiveElementVisitor() { + @Override + public void visitMethod(@Nonnull PsiMethod method) { + if (MethodUtils.isEquals(method)) { + method.accept(new JavaRecursiveElementVisitor() { - @Override - public void visitClass(PsiClass aClass) { - // Do not recurse into. - } + @Override + public void visitClass(PsiClass aClass) { + // Do not recurse into. + } - @Override - public void visitReferenceExpression( - @Nonnull PsiReferenceExpression expression) { - super.visitReferenceExpression(expression); - final PsiElement element = expression.resolve(); - if (!(element instanceof PsiField)) { - return; - } - final PsiField field = (PsiField)element; - if (field.hasModifierProperty(PsiModifier.FINAL)) { - return; + @Override + public void visitReferenceExpression( + @Nonnull PsiReferenceExpression expression + ) { + super.visitReferenceExpression(expression); + final PsiElement element = expression.resolve(); + if (!(element instanceof PsiField)) { + return; + } + final PsiField field = (PsiField) element; + if (field.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + registerError(expression, field); + } + }); } - registerError(expression, field); - } - }); - } + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EqualsWhichDoesntCheckParameterClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EqualsWhichDoesntCheckParameterClassInspection.java index fba6a5a644..e50fc25408 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EqualsWhichDoesntCheckParameterClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/EqualsWhichDoesntCheckParameterClassInspection.java @@ -24,132 +24,132 @@ 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.jetbrains.annotations.NonNls; @ExtensionImpl public class EqualsWhichDoesntCheckParameterClassInspection extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.equalsDoesntCheckClassParameterDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.equalsDoesntCheckClassParameterProblemDescriptor().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new EqualsWhichDoesntCheckParameterClassVisitor(); - } - - private static class EqualsWhichDoesntCheckParameterClassVisitor extends BaseInspectionVisitor { - + @Nonnull @Override - public void visitMethod(@Nonnull PsiMethod method) { - // note: no call to super - if (!MethodUtils.isEquals(method)) { - return; - } - final PsiParameterList parameterList = method.getParameterList(); - final PsiParameter[] parameters = parameterList.getParameters(); - final PsiParameter parameter = parameters[0]; - final PsiCodeBlock body = method.getBody(); - if (body == null || isParameterChecked(body, parameter) || isParameterCheckNotNeeded(body, parameter)) { - return; - } - registerMethodError(method); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.equalsDoesntCheckClassParameterDisplayName(); } - private static boolean isParameterChecked(PsiCodeBlock body, PsiParameter parameter) { - final ParameterClassCheckVisitor visitor = new ParameterClassCheckVisitor(parameter); - body.accept(visitor); - return visitor.isChecked(); + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.equalsDoesntCheckClassParameterProblemDescriptor().get(); } - private static boolean isParameterCheckNotNeeded(PsiCodeBlock body, PsiParameter parameter) { - if (ControlFlowUtils.isEmptyCodeBlock(body)) { - return true; // incomplete code - } - final PsiStatement statement = ControlFlowUtils.getOnlyStatementInBlock(body); - if (statement == null) { - return false; - } - if (!(statement instanceof PsiReturnStatement)) { - return true; // incomplete code - } - final PsiReturnStatement returnStatement = (PsiReturnStatement)statement; - final PsiExpression returnValue = returnStatement.getReturnValue(); - final Object constant = ExpressionUtils.computeConstantExpression(returnValue); - if (Boolean.FALSE.equals(constant)) { - return true; // incomplete code - } - if (isEqualsBuilderReflectionEquals(returnValue)) { - return true; - } - if (isIdentityEquals(returnValue, parameter)) { + @Override + public boolean isEnabledByDefault() { return true; - } - return false; } - private static boolean isIdentityEquals(PsiExpression expression, PsiParameter parameter) { - if (!(expression instanceof PsiBinaryExpression)) { - return false; - } - final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)expression; - final PsiExpression lhs = binaryExpression.getLOperand(); - final PsiExpression rhs = binaryExpression.getROperand(); - return isIdentityEquals(lhs, rhs, parameter) || isIdentityEquals(rhs, lhs, parameter); + @Override + public BaseInspectionVisitor buildVisitor() { + return new EqualsWhichDoesntCheckParameterClassVisitor(); } - private static boolean isIdentityEquals(PsiExpression lhs, PsiExpression rhs, PsiParameter parameter) { - if (!(lhs instanceof PsiReferenceExpression)) { - return false; - } - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)lhs; - final PsiElement target = referenceExpression.resolve(); - if (target != parameter) { - return false; - } - if (!(rhs instanceof PsiThisExpression)) { - return false; - } - final PsiThisExpression thisExpression = (PsiThisExpression)rhs; - return thisExpression.getQualifier() == null; - } + private static class EqualsWhichDoesntCheckParameterClassVisitor extends BaseInspectionVisitor { + + @Override + public void visitMethod(@Nonnull PsiMethod method) { + // note: no call to super + if (!MethodUtils.isEquals(method)) { + return; + } + final PsiParameterList parameterList = method.getParameterList(); + final PsiParameter[] parameters = parameterList.getParameters(); + final PsiParameter parameter = parameters[0]; + final PsiCodeBlock body = method.getBody(); + if (body == null || isParameterChecked(body, parameter) || isParameterCheckNotNeeded(body, parameter)) { + return; + } + registerMethodError(method); + } + + private static boolean isParameterChecked(PsiCodeBlock body, PsiParameter parameter) { + final ParameterClassCheckVisitor visitor = new ParameterClassCheckVisitor(parameter); + body.accept(visitor); + return visitor.isChecked(); + } + + private static boolean isParameterCheckNotNeeded(PsiCodeBlock body, PsiParameter parameter) { + if (ControlFlowUtils.isEmptyCodeBlock(body)) { + return true; // incomplete code + } + final PsiStatement statement = ControlFlowUtils.getOnlyStatementInBlock(body); + if (statement == null) { + return false; + } + if (!(statement instanceof PsiReturnStatement)) { + return true; // incomplete code + } + final PsiReturnStatement returnStatement = (PsiReturnStatement) statement; + final PsiExpression returnValue = returnStatement.getReturnValue(); + final Object constant = ExpressionUtils.computeConstantExpression(returnValue); + if (Boolean.FALSE.equals(constant)) { + return true; // incomplete code + } + if (isEqualsBuilderReflectionEquals(returnValue)) { + return true; + } + if (isIdentityEquals(returnValue, parameter)) { + return true; + } + return false; + } + + private static boolean isIdentityEquals(PsiExpression expression, PsiParameter parameter) { + if (!(expression instanceof PsiBinaryExpression)) { + return false; + } + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression) expression; + final PsiExpression lhs = binaryExpression.getLOperand(); + final PsiExpression rhs = binaryExpression.getROperand(); + return isIdentityEquals(lhs, rhs, parameter) || isIdentityEquals(rhs, lhs, parameter); + } + + private static boolean isIdentityEquals(PsiExpression lhs, PsiExpression rhs, PsiParameter parameter) { + if (!(lhs instanceof PsiReferenceExpression)) { + return false; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) lhs; + final PsiElement target = referenceExpression.resolve(); + if (target != parameter) { + return false; + } + if (!(rhs instanceof PsiThisExpression)) { + return false; + } + final PsiThisExpression thisExpression = (PsiThisExpression) rhs; + return thisExpression.getQualifier() == null; + } - private static boolean isEqualsBuilderReflectionEquals(PsiExpression expression) { - if (!(expression instanceof PsiMethodCallExpression)) { - return false; - } - final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)expression; - final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); - @NonNls final String referenceName = methodExpression.getReferenceName(); - if (!"reflectionEquals".equals(referenceName)) { - return false; - } - final PsiExpression qualifier = methodExpression.getQualifierExpression(); - if (!(qualifier instanceof PsiReferenceExpression)) { - return false; - } - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)qualifier; - final PsiElement target = referenceExpression.resolve(); - if (!(target instanceof PsiClass)) { - return false; - } - final PsiClass aClass = (PsiClass)target; - final String className = aClass.getQualifiedName(); - return "org.apache.commons.lang.builder.EqualsBuilder".equals(className); + private static boolean isEqualsBuilderReflectionEquals(PsiExpression expression) { + if (!(expression instanceof PsiMethodCallExpression)) { + return false; + } + final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression) expression; + final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); + @NonNls final String referenceName = methodExpression.getReferenceName(); + if (!"reflectionEquals".equals(referenceName)) { + return false; + } + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (!(qualifier instanceof PsiReferenceExpression)) { + return false; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) qualifier; + final PsiElement target = referenceExpression.resolve(); + if (!(target instanceof PsiClass)) { + return false; + } + final PsiClass aClass = (PsiClass) target; + final String className = aClass.getQualifiedName(); + return "org.apache.commons.lang.builder.EqualsBuilder".equals(className); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ForLoopThatDoesntUseLoopVariableInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ForLoopThatDoesntUseLoopVariableInspection.java index 79a2467eb1..2e5de7847e 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ForLoopThatDoesntUseLoopVariableInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ForLoopThatDoesntUseLoopVariableInspection.java @@ -21,164 +21,173 @@ 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 ForLoopThatDoesntUseLoopVariableInspection - extends BaseInspection { - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.forLoopNotUseLoopVariableDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - final boolean condition = ((Boolean)infos[0]).booleanValue(); - final boolean update = ((Boolean)infos[1]).booleanValue(); - if (condition && update) { - return InspectionGadgetsLocalize.forLoopNotUseLoopVariableProblemDescriptorBothConditionAndUpdate().get(); - } - if (condition) { - return InspectionGadgetsLocalize.forLoopNotUseLoopVariableProblemDescriptorCondition().get(); +public class ForLoopThatDoesntUseLoopVariableInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.forLoopNotUseLoopVariableDisplayName(); } - return InspectionGadgetsLocalize.forLoopNotUseLoopVariableProblemDescriptorUpdate().get(); - } - - public BaseInspectionVisitor buildVisitor() { - return new ForLoopThatDoesntUseLoopVariableVisitor(); - } - private static class ForLoopThatDoesntUseLoopVariableVisitor - extends BaseInspectionVisitor { - - @Override - public void visitForStatement(@Nonnull PsiForStatement statement) { - super.visitForStatement(statement); - if (conditionUsesInitializer(statement)) { - if (!updateUsesInitializer(statement)) { - registerStatementError(statement, - Boolean.FALSE, Boolean.TRUE); - } - } - else { - if (updateUsesInitializer(statement)) { - registerStatementError(statement, - Boolean.TRUE, Boolean.FALSE); + @Nonnull + public String buildErrorString(Object... infos) { + final boolean condition = ((Boolean) infos[0]).booleanValue(); + final boolean update = ((Boolean) infos[1]).booleanValue(); + if (condition && update) { + return InspectionGadgetsLocalize.forLoopNotUseLoopVariableProblemDescriptorBothConditionAndUpdate().get(); } - else { - registerStatementError(statement, - Boolean.TRUE, Boolean.TRUE); + if (condition) { + return InspectionGadgetsLocalize.forLoopNotUseLoopVariableProblemDescriptorCondition().get(); } - } + return InspectionGadgetsLocalize.forLoopNotUseLoopVariableProblemDescriptorUpdate().get(); } - private static boolean conditionUsesInitializer( - PsiForStatement statement) { - final PsiStatement initialization = statement.getInitialization(); - final PsiExpression condition = statement.getCondition(); - - if (initialization == null) { - return true; - } - if (condition == null) { - return true; - } - if (!(initialization instanceof PsiDeclarationStatement)) { - return true; - } - final PsiDeclarationStatement declaration = - (PsiDeclarationStatement)initialization; - final PsiElement[] declaredElements = - declaration.getDeclaredElements(); - if (declaredElements.length != 1) { - return true; - } - if (declaredElements[0] == null || - !(declaredElements[0] instanceof PsiLocalVariable)) { - return true; - } - final PsiLocalVariable localVar = - (PsiLocalVariable)declaredElements[0]; - return expressionUsesVariable(condition, localVar); + public BaseInspectionVisitor buildVisitor() { + return new ForLoopThatDoesntUseLoopVariableVisitor(); } - private static boolean updateUsesInitializer(PsiForStatement statement) { - final PsiStatement initialization = statement.getInitialization(); - final PsiStatement update = statement.getUpdate(); - - if (initialization == null) { - return true; - } - if (update == null) { - return true; - } - if (!(initialization instanceof PsiDeclarationStatement)) { - return true; - } - final PsiDeclarationStatement declaration = - (PsiDeclarationStatement)initialization; - final PsiElement[] declaredElements = - declaration.getDeclaredElements(); - if (declaredElements.length != 1) { - return true; - } - if (declaredElements[0] == null || - !(declaredElements[0] instanceof PsiLocalVariable)) { - return true; - } - final PsiLocalVariable localVar = - (PsiLocalVariable)declaredElements[0]; - return statementUsesVariable(update, localVar); - } + private static class ForLoopThatDoesntUseLoopVariableVisitor + extends BaseInspectionVisitor { + + @Override + public void visitForStatement(@Nonnull PsiForStatement statement) { + super.visitForStatement(statement); + if (conditionUsesInitializer(statement)) { + if (!updateUsesInitializer(statement)) { + registerStatementError(statement, + Boolean.FALSE, Boolean.TRUE + ); + } + } + else { + if (updateUsesInitializer(statement)) { + registerStatementError(statement, + Boolean.TRUE, Boolean.FALSE + ); + } + else { + registerStatementError(statement, + Boolean.TRUE, Boolean.TRUE + ); + } + } + } - private static boolean statementUsesVariable(PsiStatement statement, - PsiLocalVariable localVar) { - final UseVisitor useVisitor = new UseVisitor(localVar); - statement.accept(useVisitor); - return useVisitor.isUsed(); - } + private static boolean conditionUsesInitializer( + PsiForStatement statement + ) { + final PsiStatement initialization = statement.getInitialization(); + final PsiExpression condition = statement.getCondition(); + + if (initialization == null) { + return true; + } + if (condition == null) { + return true; + } + if (!(initialization instanceof PsiDeclarationStatement)) { + return true; + } + final PsiDeclarationStatement declaration = + (PsiDeclarationStatement) initialization; + final PsiElement[] declaredElements = + declaration.getDeclaredElements(); + if (declaredElements.length != 1) { + return true; + } + if (declaredElements[0] == null || + !(declaredElements[0] instanceof PsiLocalVariable)) { + return true; + } + final PsiLocalVariable localVar = + (PsiLocalVariable) declaredElements[0]; + return expressionUsesVariable(condition, localVar); + } + + private static boolean updateUsesInitializer(PsiForStatement statement) { + final PsiStatement initialization = statement.getInitialization(); + final PsiStatement update = statement.getUpdate(); + + if (initialization == null) { + return true; + } + if (update == null) { + return true; + } + if (!(initialization instanceof PsiDeclarationStatement)) { + return true; + } + final PsiDeclarationStatement declaration = + (PsiDeclarationStatement) initialization; + final PsiElement[] declaredElements = + declaration.getDeclaredElements(); + if (declaredElements.length != 1) { + return true; + } + if (declaredElements[0] == null || + !(declaredElements[0] instanceof PsiLocalVariable)) { + return true; + } + final PsiLocalVariable localVar = + (PsiLocalVariable) declaredElements[0]; + return statementUsesVariable(update, localVar); + } - private static boolean expressionUsesVariable(PsiExpression expression, - PsiLocalVariable localVar) { - final UseVisitor useVisitor = new UseVisitor(localVar); - expression.accept(useVisitor); - return useVisitor.isUsed(); + private static boolean statementUsesVariable( + PsiStatement statement, + PsiLocalVariable localVar + ) { + final UseVisitor useVisitor = new UseVisitor(localVar); + statement.accept(useVisitor); + return useVisitor.isUsed(); + } + + private static boolean expressionUsesVariable( + PsiExpression expression, + PsiLocalVariable localVar + ) { + final UseVisitor useVisitor = new UseVisitor(localVar); + expression.accept(useVisitor); + return useVisitor.isUsed(); + } } - } - private static class UseVisitor extends JavaRecursiveElementVisitor { + private static class UseVisitor extends JavaRecursiveElementVisitor { - private final PsiLocalVariable variable; - private boolean used = false; + private final PsiLocalVariable variable; + private boolean used = false; - private UseVisitor(PsiLocalVariable var) { - super(); - variable = var; - } + private UseVisitor(PsiLocalVariable var) { + super(); + variable = var; + } - @Override - public void visitElement(@Nonnull PsiElement element) { - if (!used) { - super.visitElement(element); - } - } + @Override + public void visitElement(@Nonnull PsiElement element) { + if (!used) { + super.visitElement(element); + } + } - @Override - public void visitReferenceExpression( - @Nonnull PsiReferenceExpression ref) { - if (used) { - return; - } - super.visitReferenceExpression(ref); - final PsiElement resolvedElement = ref.resolve(); - if (variable.equals(resolvedElement)) { - used = true; - } - } + @Override + public void visitReferenceExpression( + @Nonnull PsiReferenceExpression ref + ) { + if (used) { + return; + } + super.visitReferenceExpression(ref); + final PsiElement resolvedElement = ref.resolve(); + if (variable.equals(resolvedElement)) { + used = true; + } + } - public boolean isUsed() { - return used; + public boolean isUsed() { + return used; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/HashCodeUsesNonFinalVariableInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/HashCodeUsesNonFinalVariableInspection.java index 0fe71aa263..e2dbe247f8 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/HashCodeUsesNonFinalVariableInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/HashCodeUsesNonFinalVariableInspection.java @@ -24,68 +24,72 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.PsiElement; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl -public class HashCodeUsesNonFinalVariableInspection - extends BaseInspection { - - @Nonnull - public String getID() { - return "NonFinalFieldReferencedInHashCode"; - } +public class HashCodeUsesNonFinalVariableInspection extends BaseInspection { + @Nonnull + @Override + @Pattern("[a-zA-Z_0-9.]+") + public String getID() { + return "NonFinalFieldReferencedInHashCode"; + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.nonFinalFieldInHashcodeDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nonFinalFieldInHashcodeDisplayName(); + } - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.nonFinalFieldInHashcodeProblemDescriptor().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.nonFinalFieldInHashcodeProblemDescriptor().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 HashCodeUsesNonFinalVariableVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new HashCodeUsesNonFinalVariableVisitor(); + } - private static class HashCodeUsesNonFinalVariableVisitor - extends BaseInspectionVisitor { + private static class HashCodeUsesNonFinalVariableVisitor + extends BaseInspectionVisitor { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - final boolean isHashCode = MethodUtils.isHashCode(method); - if (isHashCode) { - method.accept(new JavaRecursiveElementVisitor() { + @Override + public void visitMethod(@Nonnull PsiMethod method) { + final boolean isHashCode = MethodUtils.isHashCode(method); + if (isHashCode) { + method.accept(new JavaRecursiveElementVisitor() { - @Override - public void visitClass(PsiClass aClass) { - // Do not recurse into. - } + @Override + public void visitClass(PsiClass aClass) { + // Do not recurse into. + } - @Override - public void visitReferenceExpression( - @Nonnull PsiReferenceExpression expression) { - super.visitReferenceExpression(expression); - final PsiElement element = expression.resolve(); - if (!(element instanceof PsiField)) { - return; - } - final PsiField field = (PsiField)element; - if (field.hasModifierProperty(PsiModifier.FINAL)) { - return; + @Override + public void visitReferenceExpression( + @Nonnull PsiReferenceExpression expression + ) { + super.visitReferenceExpression(expression); + final PsiElement element = expression.resolve(); + if (!(element instanceof PsiField)) { + return; + } + final PsiField field = (PsiField) element; + if (field.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + registerError(expression, field); + } + }); } - registerError(expression, field); - } - }); - } + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/IgnoreResultOfCallInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/IgnoreResultOfCallInspection.java index c303b30fa5..740e74ef13 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/IgnoreResultOfCallInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/IgnoreResultOfCallInspection.java @@ -25,6 +25,7 @@ import consulo.annotation.component.ExtensionImpl; import consulo.deadCodeNotWorking.impl.CheckBox; import consulo.language.psi.PsiUtilCore; +import consulo.localize.LocalizeValue; import consulo.ui.ex.awt.table.ListTable; import consulo.ui.ex.awt.table.ListWrappingTableModel; import consulo.util.xml.serializer.InvalidDataException; @@ -43,169 +44,169 @@ @ExtensionImpl public class IgnoreResultOfCallInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean m_reportAllNonLibraryCalls = false; + + /** + * @noinspection PublicField + */ + @NonNls + public String callCheckString = "java.io.InputStream,read," + + "java.io.InputStream,skip," + + "java.lang.StringBuffer,toString," + + "java.lang.StringBuilder,toString," + + "java.lang.String,.*," + + "java.math.BigInteger,.*," + + "java.math.BigDecimal,.*," + + "java.net.InetAddress,.*," + + "java.io.File,.*," + + "java.lang.Object,equals|hashCode"; + + final List methodNamePatterns = new ArrayList(); + final List classNames = new ArrayList(); + Map patternCache = null; + + public IgnoreResultOfCallInspection() { + parseString(callCheckString, classNames, methodNamePatterns); + } - /** - * @noinspection PublicField - */ - public boolean m_reportAllNonLibraryCalls = false; - - /** - * @noinspection PublicField - */ - @NonNls public String callCheckString = "java.io.InputStream,read," + - "java.io.InputStream,skip," + - "java.lang.StringBuffer,toString," + - "java.lang.StringBuilder,toString," + - "java.lang.String,.*," + - "java.math.BigInteger,.*," + - "java.math.BigDecimal,.*," + - "java.net.InetAddress,.*," + - "java.io.File,.*," + - "java.lang.Object,equals|hashCode"; - - final List methodNamePatterns = new ArrayList(); - final List classNames = new ArrayList(); - Map patternCache = null; - - public IgnoreResultOfCallInspection() { - parseString(callCheckString, classNames, methodNamePatterns); - } - - @Override - @Nonnull - public String getID() { - return "ResultOfMethodCallIgnored"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.resultOfMethodCallIgnoredDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final PsiClass containingClass = (PsiClass)infos[0]; - final String className = containingClass.getName(); - return InspectionGadgetsLocalize.resultOfMethodCallIgnoredProblemDescriptor(className).get(); - } - - @Override - public void readSettings(@Nonnull Element element) throws InvalidDataException { - super.readSettings(element); - parseString(callCheckString, classNames, methodNamePatterns); - } - - @Override - public void writeSettings(@Nonnull Element element) throws WriteExternalException { - callCheckString = formatString(classNames, methodNamePatterns); - super.writeSettings(element); - } - - @Override - public JComponent createOptionsPanel() { - final JPanel panel = new JPanel(new BorderLayout()); - final ListTable table = new ListTable(new ListWrappingTableModel( - Arrays.asList(classNames, methodNamePatterns), - InspectionGadgetsLocalize.resultOfMethodCallIgnoredClassColumnTitle().get(), - InspectionGadgetsLocalize.resultOfMethodCallIgnoredMethodColumnTitle().get() - )); - final JPanel tablePanel = UiUtils.createAddRemovePanel(table); - final CheckBox checkBox = new CheckBox( - InspectionGadgetsLocalize.resultOfMethodCallIgnoredNonLibraryOption().get(), - this, - "m_reportAllNonLibraryCalls" - ); - panel.add(tablePanel, BorderLayout.CENTER); - panel.add(checkBox, BorderLayout.SOUTH); - return panel; - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new IgnoreResultOfCallVisitor(); - } - - private class IgnoreResultOfCallVisitor extends BaseInspectionVisitor { + @Nonnull + @Override + public String getID() { + return "ResultOfMethodCallIgnored"; + } + @Nonnull @Override - public void visitExpressionStatement(@Nonnull PsiExpressionStatement statement) { - super.visitExpressionStatement(statement); - final PsiExpression expression = statement.getExpression(); - if (!(expression instanceof PsiMethodCallExpression)) { - return; - } - final PsiMethodCallExpression call = (PsiMethodCallExpression)expression; - final PsiMethod method = call.resolveMethod(); - if (method == null || method.isConstructor()) { - return; - } - final PsiType returnType = method.getReturnType(); - if (PsiType.VOID.equals(returnType)) { - return; - } - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return; - } - if (PsiUtilCore.hasErrorElementChild(statement)) { - return; - } - if (m_reportAllNonLibraryCalls && !LibraryUtil.classIsInLibrary(aClass)) { - registerMethodCallError(call, aClass); - return; - } - final PsiReferenceExpression methodExpression = call.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - if (methodName == null) { - return; - } - for (int i = 0; i < methodNamePatterns.size(); i++) { - final String methodNamePattern = methodNamePatterns.get(i); - if (!methodNamesMatch(methodName, methodNamePattern)) { - continue; - } - final String className = classNames.get(i); - if (!InheritanceUtil.isInheritor(aClass, className)) { - continue; - } - registerMethodCallError(call, aClass); - return; - } + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.resultOfMethodCallIgnoredDisplayName(); } - private boolean methodNamesMatch(String methodName, String methodNamePattern) { - Pattern pattern; - if (patternCache != null) { - pattern = patternCache.get(methodNamePattern); - } - else { - patternCache = new HashMap(methodNamePatterns.size()); - pattern = null; - } - if (pattern == null) { - try { - pattern = Pattern.compile(methodNamePattern); - patternCache.put(methodNamePattern, pattern); - } - catch (PatternSyntaxException ignore) { - return false; + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final PsiClass containingClass = (PsiClass) infos[0]; + final String className = containingClass.getName(); + return InspectionGadgetsLocalize.resultOfMethodCallIgnoredProblemDescriptor(className).get(); + } + + @Override + public void readSettings(@Nonnull Element element) throws InvalidDataException { + super.readSettings(element); + parseString(callCheckString, classNames, methodNamePatterns); + } + + @Override + public void writeSettings(@Nonnull Element element) throws WriteExternalException { + callCheckString = formatString(classNames, methodNamePatterns); + super.writeSettings(element); + } + + @Override + public JComponent createOptionsPanel() { + final JPanel panel = new JPanel(new BorderLayout()); + final ListTable table = new ListTable(new ListWrappingTableModel( + Arrays.asList(classNames, methodNamePatterns), + InspectionGadgetsLocalize.resultOfMethodCallIgnoredClassColumnTitle().get(), + InspectionGadgetsLocalize.resultOfMethodCallIgnoredMethodColumnTitle().get() + )); + final JPanel tablePanel = UiUtils.createAddRemovePanel(table); + final CheckBox checkBox = new CheckBox( + InspectionGadgetsLocalize.resultOfMethodCallIgnoredNonLibraryOption().get(), + this, + "m_reportAllNonLibraryCalls" + ); + panel.add(tablePanel, BorderLayout.CENTER); + panel.add(checkBox, BorderLayout.SOUTH); + return panel; + } + + @Override + public boolean isEnabledByDefault() { + return true; + } + + @Override + public BaseInspectionVisitor buildVisitor() { + return new IgnoreResultOfCallVisitor(); + } + + private class IgnoreResultOfCallVisitor extends BaseInspectionVisitor { + + @Override + public void visitExpressionStatement(@Nonnull PsiExpressionStatement statement) { + super.visitExpressionStatement(statement); + final PsiExpression expression = statement.getExpression(); + if (!(expression instanceof PsiMethodCallExpression)) { + return; + } + final PsiMethodCallExpression call = (PsiMethodCallExpression) expression; + final PsiMethod method = call.resolveMethod(); + if (method == null || method.isConstructor()) { + return; + } + final PsiType returnType = method.getReturnType(); + if (PsiType.VOID.equals(returnType)) { + return; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return; + } + if (PsiUtilCore.hasErrorElementChild(statement)) { + return; + } + if (m_reportAllNonLibraryCalls && !LibraryUtil.classIsInLibrary(aClass)) { + registerMethodCallError(call, aClass); + return; + } + final PsiReferenceExpression methodExpression = call.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (methodName == null) { + return; + } + for (int i = 0; i < methodNamePatterns.size(); i++) { + final String methodNamePattern = methodNamePatterns.get(i); + if (!methodNamesMatch(methodName, methodNamePattern)) { + continue; + } + final String className = classNames.get(i); + if (!InheritanceUtil.isInheritor(aClass, className)) { + continue; + } + registerMethodCallError(call, aClass); + return; + } } - catch (NullPointerException ignore) { - return false; + + private boolean methodNamesMatch(String methodName, String methodNamePattern) { + Pattern pattern; + if (patternCache != null) { + pattern = patternCache.get(methodNamePattern); + } + else { + patternCache = new HashMap(methodNamePatterns.size()); + pattern = null; + } + if (pattern == null) { + try { + pattern = Pattern.compile(methodNamePattern); + patternCache.put(methodNamePattern, pattern); + } + catch (PatternSyntaxException ignore) { + return false; + } + catch (NullPointerException ignore) { + return false; + } + } + if (pattern == null) { + return false; + } + final Matcher matcher = pattern.matcher(methodName); + return matcher.matches(); } - } - if (pattern == null) { - return false; - } - final Matcher matcher = pattern.matcher(methodName); - return matcher.matches(); } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ImplicitArrayToStringInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ImplicitArrayToStringInspection.java index eccfd304cb..25f1629c7f 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ImplicitArrayToStringInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ImplicitArrayToStringInspection.java @@ -27,6 +27,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; import jakarta.annotation.Nullable; @@ -34,286 +35,291 @@ @ExtensionImpl public class ImplicitArrayToStringInspection extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.implicitArrayToStringDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - if ((Boolean)infos[1]) { - return InspectionGadgetsLocalize.explicitArrayToStringProblemDescriptor().get(); - } - else if (infos[0] instanceof PsiMethodCallExpression) { - return InspectionGadgetsLocalize.implicitArrayToStringMethodCallProblemDescriptor().get(); - } - else { - return InspectionGadgetsLocalize.implicitArrayToStringProblemDescriptor().get(); - } - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - @Nullable - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiExpression expression = (PsiExpression)infos[0]; - final boolean removeToString = ((Boolean)infos[1]).booleanValue(); - final PsiArrayType type = (PsiArrayType)expression.getType(); - if (type != null) { - final PsiType componentType = type.getComponentType(); - if (componentType instanceof PsiArrayType) { - return new ImplicitArrayToStringFix(true, removeToString); - } - } - return new ImplicitArrayToStringFix(false, removeToString); - } - - private static class ImplicitArrayToStringFix extends InspectionGadgetsFix { - - private final boolean deepString; - private final boolean removeToString; - - ImplicitArrayToStringFix(boolean deepString, boolean removeToString) { - this.deepString = deepString; - this.removeToString = removeToString; - } - @Nonnull - public String getName() { - @NonNls final String expressionText; - if (deepString) { - expressionText = "java.util.Arrays.deepToString()"; - } - else { - expressionText = "java.util.Arrays.toString()"; - } - return InspectionGadgetsLocalize.implicitArrayToStringQuickfix(expressionText).get(); + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.implicitArrayToStringDisplayName(); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiExpression expression; - if (element instanceof PsiExpression) { - expression = (PsiExpression)element; - } - else { - expression = (PsiExpression)element.getParent().getParent(); - } - final String expressionText; - if (removeToString) { - final PsiMethodCallExpression methodCallExpression = - (PsiMethodCallExpression)expression; - final PsiReferenceExpression methodExpression = - methodCallExpression.getMethodExpression(); - final PsiExpression qualifier = - methodExpression.getQualifierExpression(); - if (qualifier == null) { - return; + @Nonnull + protected String buildErrorString(Object... infos) { + if ((Boolean) infos[1]) { + return InspectionGadgetsLocalize.explicitArrayToStringProblemDescriptor().get(); } - expressionText = qualifier.getText(); - } - else { - expressionText = expression.getText(); - } - @NonNls final String newExpressionText; - if (deepString) { - newExpressionText = - "java.util.Arrays.deepToString(" + expressionText + ')'; - } - else { - newExpressionText = - "java.util.Arrays.toString(" + expressionText + ')'; - } - final PsiElement parent = expression.getParent(); - if (parent instanceof PsiExpressionList) { - final PsiElement grandParent = parent.getParent(); - if (grandParent instanceof PsiMethodCallExpression) { - final PsiMethodCallExpression methodCallExpression = - (PsiMethodCallExpression)grandParent; - final PsiReferenceExpression methodExpression = - methodCallExpression.getMethodExpression(); - if ("valueOf".equals(methodExpression.getReferenceName())) { - replaceExpressionAndShorten(methodCallExpression, - newExpressionText); - return; - } + else if (infos[0] instanceof PsiMethodCallExpression) { + return InspectionGadgetsLocalize.implicitArrayToStringMethodCallProblemDescriptor().get(); + } + else { + return InspectionGadgetsLocalize.implicitArrayToStringProblemDescriptor().get(); } - } - replaceExpressionAndShorten(expression, newExpressionText); } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ImplicitArrayToStringVisitor(); - } - - private static class ImplicitArrayToStringVisitor - extends BaseInspectionVisitor { @Override - public void visitReferenceExpression( - PsiReferenceExpression expression) { - super.visitReferenceExpression(expression); - if (!isImplicitArrayToStringCall(expression)) { - return; - } - registerError(expression, expression, Boolean.FALSE); + public boolean isEnabledByDefault() { + return true; } @Override - public void visitNewExpression(PsiNewExpression expression) { - super.visitNewExpression(expression); - if (!isImplicitArrayToStringCall(expression)) { - return; - } - registerError(expression, expression, Boolean.FALSE); + @Nullable + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiExpression expression = (PsiExpression) infos[0]; + final boolean removeToString = ((Boolean) infos[1]).booleanValue(); + final PsiArrayType type = (PsiArrayType) expression.getType(); + if (type != null) { + final PsiType componentType = type.getComponentType(); + if (componentType instanceof PsiArrayType) { + return new ImplicitArrayToStringFix(true, removeToString); + } + } + return new ImplicitArrayToStringFix(false, removeToString); } - @Override - public void visitMethodCallExpression( - PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - if (isExplicitArrayToStringCall(expression)) { - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - final PsiExpression qualifier = - methodExpression.getQualifierExpression(); - registerMethodCallError(expression, qualifier, Boolean.TRUE); - return; - } - if (!isImplicitArrayToStringCall(expression)) { - return; - } - registerError(expression, expression, Boolean.FALSE); - } + private static class ImplicitArrayToStringFix extends InspectionGadgetsFix { - private static boolean isExplicitArrayToStringCall( - PsiMethodCallExpression expression) { - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - if (!HardcodedMethodConstants.TO_STRING.equals(methodName)) { - return false; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 0) { - return false; - } - final PsiExpression qualifier = - methodExpression.getQualifierExpression(); - if (qualifier == null) { - return false; - } - final PsiType type = qualifier.getType(); - return type instanceof PsiArrayType; - } + private final boolean deepString; + private final boolean removeToString; - private static boolean isImplicitArrayToStringCall( - PsiExpression expression) { - final PsiType type = expression.getType(); - if (!(type instanceof PsiArrayType)) { - return false; - } - if (ExpressionUtils.isStringConcatenationOperand(expression)) { - return true; - } - final PsiElement parent = expression.getParent(); - if (parent instanceof PsiExpressionList) { - final PsiExpressionList expressionList = - (PsiExpressionList)parent; - final PsiArrayType arrayType = (PsiArrayType)type; - final PsiType componentType = arrayType.getComponentType(); - if (componentType.equals(PsiType.CHAR)) { - return false; + ImplicitArrayToStringFix(boolean deepString, boolean removeToString) { + this.deepString = deepString; + this.removeToString = removeToString; } - final PsiElement grandParent = expressionList.getParent(); - if (!(grandParent instanceof PsiMethodCallExpression)) { - return false; + + @Nonnull + public String getName() { + @NonNls final String expressionText; + if (deepString) { + expressionText = "java.util.Arrays.deepToString()"; + } + else { + expressionText = "java.util.Arrays.toString()"; + } + return InspectionGadgetsLocalize.implicitArrayToStringQuickfix(expressionText).get(); } - final PsiExpression[] arguments = - expressionList.getExpressions(); - final PsiMethodCallExpression methodCallExpression = - (PsiMethodCallExpression)grandParent; - final PsiReferenceExpression methodExpression = - methodCallExpression.getMethodExpression(); - @NonNls final String methodName = - methodExpression.getReferenceName(); - final PsiMethod method = - methodCallExpression.resolveMethod(); - if (method == null) { - return false; + + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiExpression expression; + if (element instanceof PsiExpression) { + expression = (PsiExpression) element; + } + else { + expression = (PsiExpression) element.getParent().getParent(); + } + final String expressionText; + if (removeToString) { + final PsiMethodCallExpression methodCallExpression = + (PsiMethodCallExpression) expression; + final PsiReferenceExpression methodExpression = + methodCallExpression.getMethodExpression(); + final PsiExpression qualifier = + methodExpression.getQualifierExpression(); + if (qualifier == null) { + return; + } + expressionText = qualifier.getText(); + } + else { + expressionText = expression.getText(); + } + @NonNls final String newExpressionText; + if (deepString) { + newExpressionText = + "java.util.Arrays.deepToString(" + expressionText + ')'; + } + else { + newExpressionText = + "java.util.Arrays.toString(" + expressionText + ')'; + } + final PsiElement parent = expression.getParent(); + if (parent instanceof PsiExpressionList) { + final PsiElement grandParent = parent.getParent(); + if (grandParent instanceof PsiMethodCallExpression) { + final PsiMethodCallExpression methodCallExpression = + (PsiMethodCallExpression) grandParent; + final PsiReferenceExpression methodExpression = + methodCallExpression.getMethodExpression(); + if ("valueOf".equals(methodExpression.getReferenceName())) { + replaceExpressionAndShorten( + methodCallExpression, + newExpressionText + ); + return; + } + } + } + replaceExpressionAndShorten(expression, newExpressionText); } - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null) { - return false; + } + + @Override + public BaseInspectionVisitor buildVisitor() { + return new ImplicitArrayToStringVisitor(); + } + + private static class ImplicitArrayToStringVisitor + extends BaseInspectionVisitor { + + @Override + public void visitReferenceExpression( + PsiReferenceExpression expression + ) { + super.visitReferenceExpression(expression); + if (!isImplicitArrayToStringCall(expression)) { + return; + } + registerError(expression, expression, Boolean.FALSE); } - if ("append".equals(methodName)) { - if (arguments.length != 1) { - return false; - } - return InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_LANG_ABSTRACT_STRING_BUILDER); + + @Override + public void visitNewExpression(PsiNewExpression expression) { + super.visitNewExpression(expression); + if (!isImplicitArrayToStringCall(expression)) { + return; + } + registerError(expression, expression, Boolean.FALSE); } - else if ("valueOf".equals(methodName)) { - if (arguments.length != 1) { - return false; - } - final String qualifiedName = - containingClass.getQualifiedName(); - return CommonClassNames.JAVA_LANG_STRING.equals(qualifiedName); + + @Override + public void visitMethodCallExpression( + PsiMethodCallExpression expression + ) { + super.visitMethodCallExpression(expression); + if (isExplicitArrayToStringCall(expression)) { + final PsiReferenceExpression methodExpression = + expression.getMethodExpression(); + final PsiExpression qualifier = + methodExpression.getQualifierExpression(); + registerMethodCallError(expression, qualifier, Boolean.TRUE); + return; + } + if (!isImplicitArrayToStringCall(expression)) { + return; + } + registerError(expression, expression, Boolean.FALSE); } - if (!"print".equals(methodName) && - !"println".equals(methodName)) { - if (!"printf".equals(methodName) && - !"format".equals(methodName)) { - return false; - } - else { - if (arguments.length < 1) { - return false; + + private static boolean isExplicitArrayToStringCall( + PsiMethodCallExpression expression + ) { + final PsiReferenceExpression methodExpression = + expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!HardcodedMethodConstants.TO_STRING.equals(methodName)) { + return false; } - final PsiParameterList parameterList = - method.getParameterList(); - final PsiParameter[] parameters = - parameterList.getParameters(); - final PsiParameter parameter = parameters[0]; - final PsiType firstParameterType = parameter.getType(); - if (firstParameterType.equalsToText( - "java.util.Locale")) { - if (arguments.length < 4) { + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 0) { return false; - } } - else { - if (arguments.length < 3) { + final PsiExpression qualifier = + methodExpression.getQualifierExpression(); + if (qualifier == null) { return false; - } } - } + final PsiType type = qualifier.getType(); + return type instanceof PsiArrayType; } - final String qualifiedName = containingClass.getQualifiedName(); - if ("java.util.Formatter".equals(qualifiedName) || - CommonClassNames.JAVA_LANG_STRING.equals(qualifiedName)) { - return true; - } - if (InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_IO_PRINT_STREAM)) { - return true; - } - else if (InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_IO_PRINT_WRITER)) { - return true; + + private static boolean isImplicitArrayToStringCall( + PsiExpression expression + ) { + final PsiType type = expression.getType(); + if (!(type instanceof PsiArrayType)) { + return false; + } + if (ExpressionUtils.isStringConcatenationOperand(expression)) { + return true; + } + final PsiElement parent = expression.getParent(); + if (parent instanceof PsiExpressionList) { + final PsiExpressionList expressionList = + (PsiExpressionList) parent; + final PsiArrayType arrayType = (PsiArrayType) type; + final PsiType componentType = arrayType.getComponentType(); + if (componentType.equals(PsiType.CHAR)) { + return false; + } + final PsiElement grandParent = expressionList.getParent(); + if (!(grandParent instanceof PsiMethodCallExpression)) { + return false; + } + final PsiExpression[] arguments = + expressionList.getExpressions(); + final PsiMethodCallExpression methodCallExpression = + (PsiMethodCallExpression) grandParent; + final PsiReferenceExpression methodExpression = + methodCallExpression.getMethodExpression(); + @NonNls final String methodName = + methodExpression.getReferenceName(); + final PsiMethod method = + methodCallExpression.resolveMethod(); + if (method == null) { + return false; + } + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) { + return false; + } + if ("append".equals(methodName)) { + if (arguments.length != 1) { + return false; + } + return InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_LANG_ABSTRACT_STRING_BUILDER); + } + else if ("valueOf".equals(methodName)) { + if (arguments.length != 1) { + return false; + } + final String qualifiedName = + containingClass.getQualifiedName(); + return CommonClassNames.JAVA_LANG_STRING.equals(qualifiedName); + } + if (!"print".equals(methodName) && + !"println".equals(methodName)) { + if (!"printf".equals(methodName) && + !"format".equals(methodName)) { + return false; + } + else { + if (arguments.length < 1) { + return false; + } + final PsiParameterList parameterList = + method.getParameterList(); + final PsiParameter[] parameters = + parameterList.getParameters(); + final PsiParameter parameter = parameters[0]; + final PsiType firstParameterType = parameter.getType(); + if (firstParameterType.equalsToText( + "java.util.Locale")) { + if (arguments.length < 4) { + return false; + } + } + else { + if (arguments.length < 3) { + return false; + } + } + } + } + final String qualifiedName = containingClass.getQualifiedName(); + if ("java.util.Formatter".equals(qualifiedName) || + CommonClassNames.JAVA_LANG_STRING.equals(qualifiedName)) { + return true; + } + if (InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_IO_PRINT_STREAM)) { + return true; + } + else if (InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_IO_PRINT_WRITER)) { + return true; + } + } + return false; } - } - return false; } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/InfiniteRecursionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/InfiniteRecursionInspection.java index 69dab0da60..ccc29d7db5 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/InfiniteRecursionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/InfiniteRecursionInspection.java @@ -22,49 +22,49 @@ 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 InfiniteRecursionInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.infiniteRecursionDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.infiniteRecursionDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.infiniteRecursionProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.infiniteRecursionProblemDescriptor().get(); + } - @Override - public boolean isEnabledByDefault() { - return true; - } + @Override + public boolean isEnabledByDefault() { + return true; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new InfiniteRecursionVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new InfiniteRecursionVisitor(); + } - private static class InfiniteRecursionVisitor - extends BaseInspectionVisitor { + private static class InfiniteRecursionVisitor + extends BaseInspectionVisitor { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - super.visitMethod(method); - if (method.hasModifierProperty(PsiModifier.ABSTRACT)) { - return; - } - if (!RecursionUtils.methodMayRecurse(method)) { - return; - } - if (!RecursionUtils.methodDefinitelyRecurses(method)) { - return; - } - registerMethodError(method); + @Override + public void visitMethod(@Nonnull PsiMethod method) { + super.visitMethod(method); + if (method.hasModifierProperty(PsiModifier.ABSTRACT)) { + return; + } + if (!RecursionUtils.methodMayRecurse(method)) { + return; + } + if (!RecursionUtils.methodDefinitelyRecurses(method)) { + return; + } + registerMethodError(method); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/InstanceofIncompatibleInterfaceInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/InstanceofIncompatibleInterfaceInspection.java index c19f9234f6..f7dba2981a 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/InstanceofIncompatibleInterfaceInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/InstanceofIncompatibleInterfaceInspection.java @@ -21,15 +21,15 @@ 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 InstanceofIncompatibleInterfaceInspection - extends BaseInspection { - +public class InstanceofIncompatibleInterfaceInspection extends BaseInspection { @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.instanceofWithIncompatibleInterfaceDisplayName().get(); + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.instanceofWithIncompatibleInterfaceDisplayName(); } @Nonnull diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/InstantiationOfUtilityClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/InstantiationOfUtilityClassInspection.java index e4dd37ca94..bd87cdaae9 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/InstantiationOfUtilityClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/InstantiationOfUtilityClassInspection.java @@ -24,40 +24,41 @@ 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 InstantiationOfUtilityClassInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.instantiationUtilityClassDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.instantiationUtilityClassDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.instantiationUtilityClassProblemDescriptor().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.instantiationUtilityClassProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new InstantiationOfUtilityClassVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new InstantiationOfUtilityClassVisitor(); + } - private static class InstantiationOfUtilityClassVisitor extends BaseInspectionVisitor { - @Override - public void visitNewExpression(@Nonnull PsiNewExpression expression) { - final PsiType type = expression.getType(); - if (!(type instanceof PsiClassType)) { - return; - } - final PsiClass aClass = ((PsiClassType)type).resolve(); - if (aClass == null) { - return; - } - if (!UtilityClassUtil.isUtilityClass(aClass)) { - return; - } - registerNewExpressionError(expression); + private static class InstantiationOfUtilityClassVisitor extends BaseInspectionVisitor { + @Override + public void visitNewExpression(@Nonnull PsiNewExpression expression) { + final PsiType type = expression.getType(); + if (!(type instanceof PsiClassType)) { + return; + } + final PsiClass aClass = ((PsiClassType) type).resolve(); + if (aClass == null) { + return; + } + if (!UtilityClassUtil.isUtilityClass(aClass)) { + return; + } + registerNewExpressionError(expression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/IteratorHasNextCallsIteratorNextInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/IteratorHasNextCallsIteratorNextInspection.java index 6c031eba5c..61eedcce77 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/IteratorHasNextCallsIteratorNextInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/IteratorHasNextCallsIteratorNextInspection.java @@ -24,41 +24,41 @@ import com.siyeh.ig.psiutils.MethodUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import org.jetbrains.annotations.NonNls; @ExtensionImpl -public class IteratorHasNextCallsIteratorNextInspection - extends BaseInspection { - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.iteratorHasnextWhichCallsNextDisplayName().get(); - } +public class IteratorHasNextCallsIteratorNextInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.iteratorHasnextWhichCallsNextDisplayName(); + } - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.iteratorHasnextWhichCallsNextProblemDescriptor().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.iteratorHasnextWhichCallsNextProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new IteratorHasNextCallsIteratorNext(); - } + public BaseInspectionVisitor buildVisitor() { + return new IteratorHasNextCallsIteratorNext(); + } - private static class IteratorHasNextCallsIteratorNext - extends BaseInspectionVisitor { + private static class IteratorHasNextCallsIteratorNext + extends BaseInspectionVisitor { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - // note: no call to super - @NonNls final String name = method.getName(); - if (!MethodUtils.methodMatches(method, CommonClassNames.JAVA_UTIL_ITERATOR, null, HardcodedMethodConstants.HAS_NEXT)) { - return; - } - if (!IteratorUtils.containsCallToIteratorNext(method, null, true)) { - return; - } - registerMethodError(method); + @Override + public void visitMethod(@Nonnull PsiMethod method) { + // note: no call to super + @NonNls final String name = method.getName(); + if (!MethodUtils.methodMatches(method, CommonClassNames.JAVA_UTIL_ITERATOR, null, HardcodedMethodConstants.HAS_NEXT)) { + return; + } + if (!IteratorUtils.containsCallToIteratorNext(method, null, true)) { + return; + } + registerMethodError(method); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/IteratorNextDoesNotThrowNoSuchElementExceptionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/IteratorNextDoesNotThrowNoSuchElementExceptionInspection.java index ea128838f9..c051217338 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/IteratorNextDoesNotThrowNoSuchElementExceptionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/IteratorNextDoesNotThrowNoSuchElementExceptionInspection.java @@ -25,96 +25,98 @@ 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; import java.util.Set; @ExtensionImpl -public class IteratorNextDoesNotThrowNoSuchElementExceptionInspection - extends BaseInspection { - - @Override - @Nonnull - public String getID() { - return "IteratorNextCanNotThrowNoSuchElementException"; - } +public class IteratorNextDoesNotThrowNoSuchElementExceptionInspection extends BaseInspection { + @Nonnull + @Override + @Pattern("[a-zA-Z_0-9.]+") + public String getID() { + return "IteratorNextCanNotThrowNoSuchElementException"; + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.iteratorNextDoesNotThrowNosuchelementexceptionDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.iteratorNextDoesNotThrowNosuchelementexceptionDisplayName(); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.iteratorNextDoesNotThrowNosuchelementexceptionProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.iteratorNextDoesNotThrowNosuchelementexceptionProblemDescriptor().get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new IteratorNextDoesNotThrowNoSuchElementExceptionVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new IteratorNextDoesNotThrowNoSuchElementExceptionVisitor(); + } - private static class IteratorNextDoesNotThrowNoSuchElementExceptionVisitor - extends BaseInspectionVisitor { + private static class IteratorNextDoesNotThrowNoSuchElementExceptionVisitor + extends BaseInspectionVisitor { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - // note: no call to super - if (!MethodUtils.methodMatches(method, CommonClassNames.JAVA_UTIL_ITERATOR, null, HardcodedMethodConstants.NEXT)) { - return; - } - final Set exceptions = - ExceptionUtils.calculateExceptionsThrown(method); - for (final PsiType exception : exceptions) { - if (exception.equalsToText( - "java.util.NoSuchElementException")) { - return; + @Override + public void visitMethod(@Nonnull PsiMethod method) { + // note: no call to super + if (!MethodUtils.methodMatches(method, CommonClassNames.JAVA_UTIL_ITERATOR, null, HardcodedMethodConstants.NEXT)) { + return; + } + final Set exceptions = + ExceptionUtils.calculateExceptionsThrown(method); + for (final PsiType exception : exceptions) { + if (exception.equalsToText( + "java.util.NoSuchElementException")) { + return; + } + } + if (IteratorUtils.containsCallToIteratorNext(method, null, false)) { + return; + } + final CalledMethodsVisitor visitor = new CalledMethodsVisitor(); + method.accept(visitor); + if (visitor.isNoSuchElementExceptionThrown()) { + return; + } + registerMethodError(method); } - } - if (IteratorUtils.containsCallToIteratorNext(method, null, false)) { - return; - } - final CalledMethodsVisitor visitor = new CalledMethodsVisitor(); - method.accept(visitor); - if (visitor.isNoSuchElementExceptionThrown()) { - return; - } - registerMethodError(method); } - } - private static class CalledMethodsVisitor - extends JavaRecursiveElementVisitor { + private static class CalledMethodsVisitor + extends JavaRecursiveElementVisitor { - private boolean noSuchElementExceptionThrown = false; + private boolean noSuchElementExceptionThrown = false; - @Override - public void visitMethodCallExpression( - PsiMethodCallExpression expression) { - if (noSuchElementExceptionThrown) { - return; - } - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - final PsiElement method = methodExpression.resolve(); - if (method == null) { - return; - } - final Set exceptions = - ExceptionUtils.calculateExceptionsThrown(method); - for (final PsiType exception : exceptions) { - if (exception.equalsToText( - "java.util.NoSuchElementException")) { - noSuchElementExceptionThrown = true; + @Override + public void visitMethodCallExpression( + PsiMethodCallExpression expression + ) { + if (noSuchElementExceptionThrown) { + return; + } + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = + expression.getMethodExpression(); + final PsiElement method = methodExpression.resolve(); + if (method == null) { + return; + } + final Set exceptions = + ExceptionUtils.calculateExceptionsThrown(method); + for (final PsiType exception : exceptions) { + if (exception.equalsToText( + "java.util.NoSuchElementException")) { + noSuchElementExceptionThrown = true; + } + } } - } - } - public boolean isNoSuchElementExceptionThrown() { - return noSuchElementExceptionThrown; + public boolean isNoSuchElementExceptionThrown() { + return noSuchElementExceptionThrown; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/internationalization/AbsoluteAlignmentInUserInterfaceInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/internationalization/AbsoluteAlignmentInUserInterfaceInspection.java index 7c325435ad..81110e1531 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/internationalization/AbsoluteAlignmentInUserInterfaceInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/internationalization/AbsoluteAlignmentInUserInterfaceInspection.java @@ -26,145 +26,157 @@ 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.jetbrains.annotations.Nls; import java.util.HashMap; import java.util.Map; public abstract class AbsoluteAlignmentInUserInterfaceInspection extends BaseInspection { + private static final Map gridbagConstants = new HashMap(); - private static final Map gridbagConstants = new HashMap(); - static { - gridbagConstants.put("NORTHWEST", "FIRST_LINE_START"); - gridbagConstants.put("NORTHEAST", "FIRST_LINE_END"); - gridbagConstants.put("SOUTHWEST", "LAST_LINE_START"); - gridbagConstants.put("SOUTHEAST", "LAST_LINE_END"); - } - private static final Map borderLayoutConstants = new HashMap(); - static { - borderLayoutConstants.put("NORTH", "PAGE_START"); - borderLayoutConstants.put("SOUTH", "PAGE_END"); - borderLayoutConstants.put("EAST", "LINE_END"); - borderLayoutConstants.put("WEST", "LINE_START"); - } - private static final Map flowLayoutConstants = new HashMap(); - static { - flowLayoutConstants.put("LEFT", "LEADING"); - flowLayoutConstants.put("RIGHT", "TRAILING"); - } - private static final Map scrollPaneConstants = new HashMap(); - static { - scrollPaneConstants.put("LOWER_LEFT_CORNER", "LOWER_LEADING_CORNER"); - scrollPaneConstants.put("LOWER_RIGHT_CORNER", "LOWER_TRAILING_CORNER"); - scrollPaneConstants.put("UPPER_LEFT_CORNER", "UPPER_LEADING_CORNER"); - scrollPaneConstants.put("UPPER_RIGHT_CORNER", "UPPER_TRAILING_CORNER"); - } - private static final Map boxLayoutConstants = new HashMap(); - static { - boxLayoutConstants.put("X_AXIS", "LINE_AXIS"); - boxLayoutConstants.put("Y_AXIS", "PAGE_AXIS"); - } - - @Nls - @Nonnull - @Override - public String getDisplayName() { - return InspectionGadgetsLocalize.absoluteAlignmentInUserInterfaceDisplayName().get(); - } - - @Nonnull - @Override - protected String buildErrorString(Object... infos) { - final String className = (String)infos[0]; - final String shortClassName = className.substring(className.lastIndexOf('.') + 1); - return InspectionGadgetsLocalize.absoluteAlignmentInUserInterfaceProblemDescriptor(shortClassName).get(); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new AbsoluteAlignmentInUserInterfaceFix((String)infos[0], (String)infos[1]); - } - - private static class AbsoluteAlignmentInUserInterfaceFix extends InspectionGadgetsFix { - - private final String myClassName; - private final String myReplacement; - - public AbsoluteAlignmentInUserInterfaceFix(String className, String replacement) { - myClassName = className; - myReplacement = replacement; + static { + gridbagConstants.put("NORTHWEST", "FIRST_LINE_START"); + gridbagConstants.put("NORTHEAST", "FIRST_LINE_END"); + gridbagConstants.put("SOUTHWEST", "LAST_LINE_START"); + gridbagConstants.put("SOUTHEAST", "LAST_LINE_END"); + } + + private static final Map borderLayoutConstants = new HashMap(); + + static { + borderLayoutConstants.put("NORTH", "PAGE_START"); + borderLayoutConstants.put("SOUTH", "PAGE_END"); + borderLayoutConstants.put("EAST", "LINE_END"); + borderLayoutConstants.put("WEST", "LINE_START"); + } + + private static final Map flowLayoutConstants = new HashMap(); + + static { + flowLayoutConstants.put("LEFT", "LEADING"); + flowLayoutConstants.put("RIGHT", "TRAILING"); + } + + private static final Map scrollPaneConstants = new HashMap(); + + static { + scrollPaneConstants.put("LOWER_LEFT_CORNER", "LOWER_LEADING_CORNER"); + scrollPaneConstants.put("LOWER_RIGHT_CORNER", "LOWER_TRAILING_CORNER"); + scrollPaneConstants.put("UPPER_LEFT_CORNER", "UPPER_LEADING_CORNER"); + scrollPaneConstants.put("UPPER_RIGHT_CORNER", "UPPER_TRAILING_CORNER"); + } + + private static final Map boxLayoutConstants = new HashMap(); + + static { + boxLayoutConstants.put("X_AXIS", "LINE_AXIS"); + boxLayoutConstants.put("Y_AXIS", "PAGE_AXIS"); } @Nonnull @Override - public String getName() { - final String shortClassName = myClassName.substring(myClassName.lastIndexOf('.') + 1); - return InspectionGadgetsLocalize.absoluteAlignmentInUserInterfaceQuickfix(shortClassName, myReplacement).get(); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.absoluteAlignmentInUserInterfaceDisplayName(); } + @Nonnull @Override - protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiElement parent = element.getParent(); - if (!(parent instanceof PsiReferenceExpression)) { - return; - } - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)parent; - replaceExpression(referenceExpression, myClassName + '.' + myReplacement); + protected String buildErrorString(Object... infos) { + final String className = (String) infos[0]; + final String shortClassName = className.substring(className.lastIndexOf('.') + 1); + return InspectionGadgetsLocalize.absoluteAlignmentInUserInterfaceProblemDescriptor(shortClassName).get(); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new AbsoluteAlignmentInUserInterfaceVisitor(); - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new AbsoluteAlignmentInUserInterfaceFix((String) infos[0], (String) infos[1]); + } + + private static class AbsoluteAlignmentInUserInterfaceFix extends InspectionGadgetsFix { + + private final String myClassName; + private final String myReplacement; + + public AbsoluteAlignmentInUserInterfaceFix(String className, String replacement) { + myClassName = className; + myReplacement = replacement; + } - private static class AbsoluteAlignmentInUserInterfaceVisitor extends BaseInspectionVisitor { + @Nonnull + @Override + public LocalizeValue getName() { + String shortClassName = myClassName.substring(myClassName.lastIndexOf('.') + 1); + return InspectionGadgetsLocalize.absoluteAlignmentInUserInterfaceQuickfix(shortClassName, myReplacement); + } + + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiElement parent = element.getParent(); + if (!(parent instanceof PsiReferenceExpression)) { + return; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) parent; + replaceExpression(referenceExpression, myClassName + '.' + myReplacement); + } + } @Override - public void visitReferenceExpression(PsiReferenceExpression expression) { - super.visitReferenceExpression(expression); - final PsiElement referenceNameElement = expression.getReferenceNameElement(); - if (referenceNameElement == null) { - return; - } - final String referenceName = expression.getReferenceName(); - final String className; - String value; - if ((value = gridbagConstants.get(referenceName)) != null) { - className = checkExpression(expression, "java.awt.GridBagConstraints"); - } else if ((value = borderLayoutConstants.get(referenceName)) != null) { - className = checkExpression(expression, "java.awt.BorderLayout", "java.awt.GridBagConstraints"); - } else if ((value = flowLayoutConstants.get(referenceName)) != null) { - className = checkExpression(expression, "java.awt.FlowLayout"); - } else if ((value = scrollPaneConstants.get(referenceName)) != null) { - className = checkExpression(expression, "javax.swing.ScrollPaneConstants"); - } else if ((value = boxLayoutConstants.get(referenceName)) != null) { - className = checkExpression(expression, "javax.swing.BoxLayout"); - } else { - return; - } - if (className == null) { - return; - } - registerError(referenceNameElement, className, value); + public BaseInspectionVisitor buildVisitor() { + return new AbsoluteAlignmentInUserInterfaceVisitor(); } - private static String checkExpression(PsiReferenceExpression expression, String... classNames) { - final PsiElement target = expression.resolve(); - if (!(target instanceof PsiField)) { - return null; - } - final PsiField field = (PsiField)target; - final PsiClass containingClass = field.getContainingClass(); - for (String className : classNames) { - if (InheritanceUtil.isInheritor(containingClass, className)) { - return className; + private static class AbsoluteAlignmentInUserInterfaceVisitor extends BaseInspectionVisitor { + + @Override + public void visitReferenceExpression(PsiReferenceExpression expression) { + super.visitReferenceExpression(expression); + final PsiElement referenceNameElement = expression.getReferenceNameElement(); + if (referenceNameElement == null) { + return; + } + final String referenceName = expression.getReferenceName(); + final String className; + String value; + if ((value = gridbagConstants.get(referenceName)) != null) { + className = checkExpression(expression, "java.awt.GridBagConstraints"); + } + else if ((value = borderLayoutConstants.get(referenceName)) != null) { + className = checkExpression(expression, "java.awt.BorderLayout", "java.awt.GridBagConstraints"); + } + else if ((value = flowLayoutConstants.get(referenceName)) != null) { + className = checkExpression(expression, "java.awt.FlowLayout"); + } + else if ((value = scrollPaneConstants.get(referenceName)) != null) { + className = checkExpression(expression, "javax.swing.ScrollPaneConstants"); + } + else if ((value = boxLayoutConstants.get(referenceName)) != null) { + className = checkExpression(expression, "javax.swing.BoxLayout"); + } + else { + return; + } + if (className == null) { + return; + } + registerError(referenceNameElement, className, value); + } + + private static String checkExpression(PsiReferenceExpression expression, String... classNames) { + final PsiElement target = expression.resolve(); + if (!(target instanceof PsiField)) { + return null; + } + final PsiField field = (PsiField) target; + final PsiClass containingClass = field.getContainingClass(); + for (String className : classNames) { + if (InheritanceUtil.isInheritor(containingClass, className)) { + return className; + } + } + return null; } - } - return null; } - } }