diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/naming/OverloadedMethodsWithSameNumberOfParametersInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/naming/OverloadedMethodsWithSameNumberOfParametersInspection.java index 13d7dac4d..0a8de785c 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/naming/OverloadedMethodsWithSameNumberOfParametersInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/naming/OverloadedMethodsWithSameNumberOfParametersInspection.java @@ -29,83 +29,82 @@ @ExtensionImpl public class OverloadedMethodsWithSameNumberOfParametersInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean ignoreInconvertibleTypes = true; - @SuppressWarnings({"PublicField"}) - public boolean ignoreInconvertibleTypes = true; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.overloadedMethodsWithSameNumberParametersDisplayName().get(); - } + @Override + @Nonnull + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.overloadedMethodsWithSameNumberParametersDisplayName(); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.overloadedMethodsWithSameNumberParametersProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.overloadedMethodsWithSameNumberParametersProblemDescriptor().get(); + } - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.overloadedMethodsWithSameNumberParametersOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreInconvertibleTypes"); - } + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.overloadedMethodsWithSameNumberParametersOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreInconvertibleTypes"); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new OverloadedMethodsWithSameNumberOfParametersVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new OverloadedMethodsWithSameNumberOfParametersVisitor(); + } - private class OverloadedMethodsWithSameNumberOfParametersVisitor extends BaseInspectionVisitor { + private class OverloadedMethodsWithSameNumberOfParametersVisitor extends BaseInspectionVisitor { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - if (method.isConstructor()) { - return; - } - if (method.getNameIdentifier() == null) { - return; - } - final PsiParameterList parameterList = method.getParameterList(); - final int parameterCount = parameterList.getParametersCount(); - if (parameterCount == 0) { - return; - } - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return; - } - if (MethodUtils.hasSuper(method)) { - return; - } - final String methodName = method.getName(); - final PsiMethod[] sameNameMethods = aClass.findMethodsByName(methodName, false); - for (PsiMethod sameNameMethod : sameNameMethods) { - if (method.equals(sameNameMethod)) { - continue; - } - final PsiParameterList otherParameterList = sameNameMethod.getParameterList(); - if (parameterCount == otherParameterList.getParametersCount()) { - if (ignoreInconvertibleTypes && !areParameterTypesConvertible(parameterList, otherParameterList)) { - return; - } - registerMethodError(method); - return; + @Override + public void visitMethod(@Nonnull PsiMethod method) { + if (method.isConstructor()) { + return; + } + if (method.getNameIdentifier() == null) { + return; + } + final PsiParameterList parameterList = method.getParameterList(); + final int parameterCount = parameterList.getParametersCount(); + if (parameterCount == 0) { + return; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return; + } + if (MethodUtils.hasSuper(method)) { + return; + } + final String methodName = method.getName(); + final PsiMethod[] sameNameMethods = aClass.findMethodsByName(methodName, false); + for (PsiMethod sameNameMethod : sameNameMethods) { + if (method.equals(sameNameMethod)) { + continue; + } + final PsiParameterList otherParameterList = sameNameMethod.getParameterList(); + if (parameterCount == otherParameterList.getParametersCount()) { + if (ignoreInconvertibleTypes && !areParameterTypesConvertible(parameterList, otherParameterList)) { + return; + } + registerMethodError(method); + return; + } + } } - } - } - private boolean areParameterTypesConvertible(PsiParameterList parameterList, PsiParameterList otherParameterList) { - final PsiParameter[] parameters = parameterList.getParameters(); - final PsiParameter[] otherParameters = otherParameterList.getParameters(); - for (int i = 0; i < parameters.length; i++) { - final PsiType type = parameters[i].getType(); - final PsiType otherType = otherParameters[i].getType(); - if (!type.isAssignableFrom(otherType) && !otherType.isAssignableFrom(type)) { - return false; + private boolean areParameterTypesConvertible(PsiParameterList parameterList, PsiParameterList otherParameterList) { + final PsiParameter[] parameters = parameterList.getParameters(); + final PsiParameter[] otherParameters = otherParameterList.getParameters(); + for (int i = 0; i < parameters.length; i++) { + final PsiType type = parameters[i].getType(); + final PsiType otherType = otherParameters[i].getType(); + if (!type.isAssignableFrom(otherType) && !otherType.isAssignableFrom(type)) { + return false; + } + } + return true; } - } - return true; } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/naming/OverloadedVarargsMethodInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/naming/OverloadedVarargsMethodInspection.java index c5d7f60fb..541044151 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/naming/OverloadedVarargsMethodInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/naming/OverloadedVarargsMethodInspection.java @@ -21,48 +21,46 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class OverloadedVarargsMethodInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.overloadedVarargMethodDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.overloadedVarargMethodDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - final PsiMethod element = (PsiMethod)infos[0]; - return element.isConstructor() - ? InspectionGadgetsLocalize.overloadedVarargConstructorProblemDescriptor().get() - : InspectionGadgetsLocalize.overloadedVarargMethodProblemDescriptor().get(); - } - - public BaseInspectionVisitor buildVisitor() { - return new OverloadedVarargMethodVisitor(); - } + @Nonnull + public String buildErrorString(Object... infos) { + final PsiMethod element = (PsiMethod) infos[0]; + return element.isConstructor() + ? InspectionGadgetsLocalize.overloadedVarargConstructorProblemDescriptor().get() + : InspectionGadgetsLocalize.overloadedVarargMethodProblemDescriptor().get(); + } - private static class OverloadedVarargMethodVisitor - extends BaseInspectionVisitor { + public BaseInspectionVisitor buildVisitor() { + return new OverloadedVarargMethodVisitor(); + } - @Override - public void visitMethod(@Nonnull PsiMethod method) { - if (!method.isVarArgs()) { - return; - } - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return; - } - final String methodName = method.getName(); - final PsiMethod[] sameNameMethods = - aClass.findMethodsByName(methodName, false); - for (PsiMethod sameNameMethod : sameNameMethods) { - if (!sameNameMethod.equals(method)) { - registerMethodError(method, method); + private static class OverloadedVarargMethodVisitor extends BaseInspectionVisitor { + @Override + public void visitMethod(@Nonnull PsiMethod method) { + if (!method.isVarArgs()) { + return; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return; + } + final String methodName = method.getName(); + final PsiMethod[] sameNameMethods = aClass.findMethodsByName(methodName, false); + for (PsiMethod sameNameMethod : sameNameMethods) { + if (!sameNameMethod.equals(method)) { + registerMethodError(method, method); + } + } } - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/naming/ParameterNameDiffersFromOverriddenParameterInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/naming/ParameterNameDiffersFromOverriddenParameterInspection.java index 139d9ae03..18e84995f 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/naming/ParameterNameDiffersFromOverriddenParameterInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/naming/ParameterNameDiffersFromOverriddenParameterInspection.java @@ -30,109 +30,99 @@ import consulo.annotation.component.ExtensionImpl; import consulo.application.util.query.Query; import consulo.deadCodeNotWorking.impl.MultipleCheckboxOptionsPanel; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; import javax.swing.*; @ExtensionImpl -public class ParameterNameDiffersFromOverriddenParameterInspection - extends BaseInspection { +public class ParameterNameDiffersFromOverriddenParameterInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean m_ignoreSingleCharacterNames = false; - /** - * @noinspection PublicField - */ - public boolean m_ignoreSingleCharacterNames = false; + /** + * @noinspection PublicField + */ + public boolean m_ignoreOverridesOfLibraryMethods = false; - /** - * @noinspection PublicField - */ - public boolean m_ignoreOverridesOfLibraryMethods = false; - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.parameterNameDiffersFromOverriddenParameterDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.parameterNameDiffersFromOverriddenParameterProblemDescriptor(infos[0]).get(); - } - - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this); - optionsPanel.addCheckbox( - InspectionGadgetsLocalize.parameterNameDiffersFromOverriddenParameterIgnoreCharacterOption().get(), - "m_ignoreSingleCharacterNames" - ); - optionsPanel.addCheckbox( - InspectionGadgetsLocalize.parameterNameDiffersFromOverriddenParameterIgnoreLibraryOption().get(), - "m_ignoreOverridesOfLibraryMethods" - ); - return optionsPanel; - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.parameterNameDiffersFromOverriddenParameterDisplayName(); + } - @Nullable - protected InspectionGadgetsFix buildFix(Object... infos) { - return new RenameParameterFix((String)infos[0]); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.parameterNameDiffersFromOverriddenParameterProblemDescriptor(infos[0]).get(); + } - public BaseInspectionVisitor buildVisitor() { - return new ParameterNameDiffersFromOverriddenParameterVisitor(); - } + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this); + optionsPanel.addCheckbox( + InspectionGadgetsLocalize.parameterNameDiffersFromOverriddenParameterIgnoreCharacterOption().get(), + "m_ignoreSingleCharacterNames" + ); + optionsPanel.addCheckbox( + InspectionGadgetsLocalize.parameterNameDiffersFromOverriddenParameterIgnoreLibraryOption().get(), + "m_ignoreOverridesOfLibraryMethods" + ); + return optionsPanel; + } - private class ParameterNameDiffersFromOverriddenParameterVisitor - extends BaseInspectionVisitor { + @Nullable + protected InspectionGadgetsFix buildFix(Object... infos) { + return new RenameParameterFix((String) infos[0]); + } - @Override - public void visitMethod(@Nonnull PsiMethod method) { - final PsiParameterList parameterList = method.getParameterList(); - if (parameterList.getParametersCount() == 0) { - return; - } - final Query query = - SuperMethodsSearch.search( - method, method.getContainingClass(), true, false); - final MethodSignatureBackedByPsiMethod methodSignature = - query.findFirst(); - if (methodSignature == null) { - return; - } - final PsiMethod superMethod = methodSignature.getMethod(); - final PsiParameter[] parameters = parameterList.getParameters(); - checkParameters(superMethod, parameters); + public BaseInspectionVisitor buildVisitor() { + return new ParameterNameDiffersFromOverriddenParameterVisitor(); } - private void checkParameters(PsiMethod superMethod, - PsiParameter[] parameters) { - if (m_ignoreOverridesOfLibraryMethods) { - final PsiClass containingClass = - superMethod.getContainingClass(); - if (containingClass != null && - LibraryUtil.classIsInLibrary(containingClass)) { - return; + private class ParameterNameDiffersFromOverriddenParameterVisitor extends BaseInspectionVisitor { + @Override + public void visitMethod(@Nonnull PsiMethod method) { + final PsiParameterList parameterList = method.getParameterList(); + if (parameterList.getParametersCount() == 0) { + return; + } + final Query query = + SuperMethodsSearch.search(method, method.getContainingClass(), true, false); + final MethodSignatureBackedByPsiMethod methodSignature = query.findFirst(); + if (methodSignature == null) { + return; + } + final PsiMethod superMethod = methodSignature.getMethod(); + final PsiParameter[] parameters = parameterList.getParameters(); + checkParameters(superMethod, parameters); } - } - final PsiParameterList superParameterList = - superMethod.getParameterList(); - final PsiParameter[] superParameters = - superParameterList.getParameters(); - for (int i = 0; i < parameters.length; i++) { - final PsiParameter parameter = parameters[i]; - final String parameterName = parameter.getName(); - final String superParameterName = superParameters[i].getName(); - if (superParameterName == null) { - continue; - } - if (superParameterName.equals(parameterName)) { - continue; - } - if (m_ignoreSingleCharacterNames && - superParameterName.length() == 1) { - continue; + + private void checkParameters(PsiMethod superMethod, PsiParameter[] parameters) { + if (m_ignoreOverridesOfLibraryMethods) { + final PsiClass containingClass = superMethod.getContainingClass(); + if (containingClass != null && LibraryUtil.classIsInLibrary(containingClass)) { + return; + } + } + final PsiParameterList superParameterList = superMethod.getParameterList(); + final PsiParameter[] superParameters = superParameterList.getParameters(); + for (int i = 0; i < parameters.length; i++) { + final PsiParameter parameter = parameters[i]; + final String parameterName = parameter.getName(); + final String superParameterName = superParameters[i].getName(); + if (superParameterName == null) { + continue; + } + if (superParameterName.equals(parameterName)) { + continue; + } + if (m_ignoreSingleCharacterNames && superParameterName.length() == 1) { + continue; + } + registerVariableError(parameter, superParameterName); + } } - registerVariableError(parameter, superParameterName); - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/naming/QuestionableNameInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/naming/QuestionableNameInspection.java index e36c92029..26e2a5969 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/naming/QuestionableNameInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/naming/QuestionableNameInspection.java @@ -25,13 +25,13 @@ import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import consulo.ui.ex.awt.table.ListTable; import consulo.ui.ex.awt.table.ListWrappingTableModel; import consulo.util.xml.serializer.InvalidDataException; import consulo.util.xml.serializer.WriteExternalException; import jakarta.annotation.Nonnull; import org.jdom.Element; -import org.jetbrains.annotations.NonNls; import javax.swing.*; import java.util.ArrayList; @@ -41,94 +41,91 @@ @ExtensionImpl public class QuestionableNameInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public String nameString = "aa,abc,bad,bar,bar2,baz,baz1,baz2," + + "baz3,bb,blah,bogus,bool,cc,dd,defau1t,dummy,dummy2,ee,fa1se," + + "ff,foo,foo1,foo2,foo3,foobar,four,fred,fred1,fred2,gg,hh,hello," + + "hello1,hello2,hello3,ii,nu11,one,silly,silly2,string,two,that," + + "then,three,whi1e,var"; + + List nameList = new ArrayList(32); + + public QuestionableNameInspection() { + parseString(nameString, nameList); + } - /** - * @noinspection PublicField - */ - @NonNls public String nameString = "aa,abc,bad,bar,bar2,baz,baz1,baz2," + - "baz3,bb,blah,bogus,bool,cc,dd,defau1t,dummy,dummy2,ee,fa1se," + - "ff,foo,foo1,foo2,foo3,foobar,four,fred,fred1,fred2,gg,hh,hello," + - "hello1,hello2,hello3,ii,nu11,one,silly,silly2,string,two,that," + - "then,three,whi1e,var"; - - List nameList = new ArrayList(32); - - public QuestionableNameInspection() { - parseString(nameString, nameList); - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.questionableNameDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.questionableNameProblemDescriptor().get(); - } - - @Override - public void readSettings(@Nonnull Element element) throws InvalidDataException { - super.readSettings(element); - parseString(nameString, nameList); - } - - @Override - public void writeSettings(@Nonnull Element element) throws WriteExternalException { - nameString = formatString(nameList); - super.writeSettings(element); - } - - @Override - public JComponent createOptionsPanel() { - final ListTable table = - new ListTable(new ListWrappingTableModel(nameList, InspectionGadgetsLocalize.questionableNameColumnTitle().get())); - return UiUtils.createAddRemovePanel(table); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new RenameFix(); - } - - @Override - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new QuestionableNameVisitor(); - } - - private class QuestionableNameVisitor extends BaseInspectionVisitor { - - private final Set nameSet = new HashSet(nameList); + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.questionableNameDisplayName(); + } + + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.questionableNameProblemDescriptor().get(); + } + + @Override + public void readSettings(@Nonnull Element element) throws InvalidDataException { + super.readSettings(element); + parseString(nameString, nameList); + } @Override - public void visitVariable(@Nonnull PsiVariable variable) { - final String name = variable.getName(); - if (nameSet.contains(name)) { - registerVariableError(variable); - } + public void writeSettings(@Nonnull Element element) throws WriteExternalException { + nameString = formatString(nameList); + super.writeSettings(element); } @Override - public void visitMethod(@Nonnull PsiMethod method) { - final String name = method.getName(); - if (nameSet.contains(name)) { - registerMethodError(method); - } + public JComponent createOptionsPanel() { + final ListTable table = new ListTable(new ListWrappingTableModel(nameList, InspectionGadgetsLocalize.questionableNameColumnTitle().get())); + return UiUtils.createAddRemovePanel(table); } @Override - public void visitClass(@Nonnull PsiClass aClass) { - final String name = aClass.getName(); - if (nameSet.contains(name)) { - registerClassError(aClass); - } + protected InspectionGadgetsFix buildFix(Object... infos) { + return new RenameFix(); + } + + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } + + @Override + public BaseInspectionVisitor buildVisitor() { + return new QuestionableNameVisitor(); + } + + private class QuestionableNameVisitor extends BaseInspectionVisitor { + private final Set nameSet = new HashSet(nameList); + + @Override + public void visitVariable(@Nonnull PsiVariable variable) { + final String name = variable.getName(); + if (nameSet.contains(name)) { + registerVariableError(variable); + } + } + + @Override + public void visitMethod(@Nonnull PsiMethod method) { + final String name = method.getName(); + if (nameSet.contains(name)) { + registerMethodError(method); + } + } + + @Override + public void visitClass(@Nonnull PsiClass aClass) { + final String name = aClass.getName(); + if (nameSet.contains(name)) { + registerClassError(aClass); + } + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/naming/StandardVariableNamesInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/naming/StandardVariableNamesInspection.java index 7d0110551..d2d06b039 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/naming/StandardVariableNamesInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/naming/StandardVariableNamesInspection.java @@ -27,7 +27,6 @@ import consulo.language.psi.PsiElement; import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.NonNls; import javax.swing.*; import java.util.HashMap; @@ -35,139 +34,129 @@ @ExtensionImpl public class StandardVariableNamesInspection extends BaseInspection { + static final Map s_expectedTypes = new HashMap(13); + static final Map s_boxingClasses = new HashMap(8); + + static { + s_expectedTypes.put("b", "byte"); + s_expectedTypes.put("c", "char"); + s_expectedTypes.put("ch", "char"); + s_expectedTypes.put("d", "double"); + s_expectedTypes.put("f", "float"); + s_expectedTypes.put("i", "int"); + s_expectedTypes.put("j", "int"); + s_expectedTypes.put("k", "int"); + s_expectedTypes.put("m", "int"); + s_expectedTypes.put("n", "int"); + s_expectedTypes.put("l", "long"); + s_expectedTypes.put("s", CommonClassNames.JAVA_LANG_STRING); + s_expectedTypes.put("str", CommonClassNames.JAVA_LANG_STRING); + + s_boxingClasses.put("int", CommonClassNames.JAVA_LANG_INTEGER); + s_boxingClasses.put("short", CommonClassNames.JAVA_LANG_SHORT); + s_boxingClasses.put("boolean", CommonClassNames.JAVA_LANG_BOOLEAN); + s_boxingClasses.put("long", CommonClassNames.JAVA_LANG_LONG); + s_boxingClasses.put("byte", CommonClassNames.JAVA_LANG_BYTE); + s_boxingClasses.put("float", CommonClassNames.JAVA_LANG_FLOAT); + s_boxingClasses.put("double", CommonClassNames.JAVA_LANG_DOUBLE); + s_boxingClasses.put("char", CommonClassNames.JAVA_LANG_CHARACTER); + } - @NonNls static final Map s_expectedTypes = - new HashMap(13); - @NonNls static final Map s_boxingClasses = - new HashMap(8); - - static { - s_expectedTypes.put("b", "byte"); - s_expectedTypes.put("c", "char"); - s_expectedTypes.put("ch", "char"); - s_expectedTypes.put("d", "double"); - s_expectedTypes.put("f", "float"); - s_expectedTypes.put("i", "int"); - s_expectedTypes.put("j", "int"); - s_expectedTypes.put("k", "int"); - s_expectedTypes.put("m", "int"); - s_expectedTypes.put("n", "int"); - s_expectedTypes.put("l", "long"); - s_expectedTypes.put("s", CommonClassNames.JAVA_LANG_STRING); - s_expectedTypes.put("str", CommonClassNames.JAVA_LANG_STRING); - - s_boxingClasses.put("int", CommonClassNames.JAVA_LANG_INTEGER); - s_boxingClasses.put("short", CommonClassNames.JAVA_LANG_SHORT); - s_boxingClasses.put("boolean", CommonClassNames.JAVA_LANG_BOOLEAN); - s_boxingClasses.put("long", CommonClassNames.JAVA_LANG_LONG); - s_boxingClasses.put("byte", CommonClassNames.JAVA_LANG_BYTE); - s_boxingClasses.put("float", CommonClassNames.JAVA_LANG_FLOAT); - s_boxingClasses.put("double", CommonClassNames.JAVA_LANG_DOUBLE); - s_boxingClasses.put("char", CommonClassNames.JAVA_LANG_CHARACTER); - } - - @SuppressWarnings("PublicField") - public boolean ignoreParameterNameSameAsSuper = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.standardVariableNamesDisplayName().get(); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new RenameFix(); - } + @SuppressWarnings("PublicField") + public boolean ignoreParameterNameSameAsSuper = false; - @Override - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.standardVariableNamesDisplayName(); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final PsiVariable variable = (PsiVariable)infos[0]; - final String name = variable.getName(); - final String expectedType = s_expectedTypes.get(name); - if (PsiUtil.isLanguageLevel5OrHigher(variable)) { - final String boxedType = s_boxingClasses.get(expectedType); - if (boxedType != null) { - return InspectionGadgetsLocalize.standardVariableNamesProblemDescriptor2(expectedType, boxedType).get(); - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new RenameFix(); } - return InspectionGadgetsLocalize.standardVariableNamesProblemDescriptor(expectedType).get(); - } - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.standardVariableNamesIgnoreOverrideOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreParameterNameSameAsSuper"); - } + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new StandardVariableNamesVisitor(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final PsiVariable variable = (PsiVariable) infos[0]; + final String name = variable.getName(); + final String expectedType = s_expectedTypes.get(name); + if (PsiUtil.isLanguageLevel5OrHigher(variable)) { + final String boxedType = s_boxingClasses.get(expectedType); + if (boxedType != null) { + return InspectionGadgetsLocalize.standardVariableNamesProblemDescriptor2(expectedType, boxedType).get(); + } + } + return InspectionGadgetsLocalize.standardVariableNamesProblemDescriptor(expectedType).get(); + } - private class StandardVariableNamesVisitor - extends BaseInspectionVisitor { + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.standardVariableNamesIgnoreOverrideOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreParameterNameSameAsSuper"); + } @Override - public void visitVariable(@Nonnull PsiVariable variable) { - super.visitVariable(variable); - final String variableName = variable.getName(); - final String expectedType = s_expectedTypes.get(variableName); - if (expectedType == null) { - return; - } - final PsiType type = variable.getType(); - final String typeText = type.getCanonicalText(); - if (expectedType.equals(typeText)) { - return; - } - if (PsiUtil.isLanguageLevel5OrHigher(variable)) { - final PsiPrimitiveType unboxedType = - PsiPrimitiveType.getUnboxedType(type); - if (unboxedType != null) { - final String unboxedTypeText = - unboxedType.getCanonicalText(); - if (expectedType.equals(unboxedTypeText)) { - return; - } - } - } - if (ignoreParameterNameSameAsSuper && - isVariableNamedSameAsSuper(variable)) { - return; - } - registerVariableError(variable, variable); + public BaseInspectionVisitor buildVisitor() { + return new StandardVariableNamesVisitor(); } - private boolean isVariableNamedSameAsSuper(PsiVariable variable) { - if (!(variable instanceof PsiParameter)) { - return false; - } - final PsiParameter parameter = (PsiParameter)variable; - final PsiElement scope = parameter.getDeclarationScope(); - if (!(scope instanceof PsiMethod)) { - return false; - } - final String variableName = variable.getName(); - final PsiMethod method = (PsiMethod)scope; - final int index = - method.getParameterList().getParameterIndex(parameter); - final PsiMethod[] superMethods = method.findSuperMethods(); - for (PsiMethod superMethod : superMethods) { - final PsiParameter[] parameters = - superMethod.getParameterList().getParameters(); - final PsiParameter overriddenParameter = parameters[index]; - if (variableName.equals(overriddenParameter.getName())) { - return true; + private class StandardVariableNamesVisitor extends BaseInspectionVisitor { + @Override + public void visitVariable(@Nonnull PsiVariable variable) { + super.visitVariable(variable); + final String variableName = variable.getName(); + final String expectedType = s_expectedTypes.get(variableName); + if (expectedType == null) { + return; + } + final PsiType type = variable.getType(); + final String typeText = type.getCanonicalText(); + if (expectedType.equals(typeText)) { + return; + } + if (PsiUtil.isLanguageLevel5OrHigher(variable)) { + final PsiPrimitiveType unboxedType = PsiPrimitiveType.getUnboxedType(type); + if (unboxedType != null) { + final String unboxedTypeText = unboxedType.getCanonicalText(); + if (expectedType.equals(unboxedTypeText)) { + return; + } + } + } + if (ignoreParameterNameSameAsSuper && isVariableNamedSameAsSuper(variable)) { + return; + } + registerVariableError(variable, variable); + } + + private boolean isVariableNamedSameAsSuper(PsiVariable variable) { + if (!(variable instanceof PsiParameter)) { + return false; + } + final PsiParameter parameter = (PsiParameter) variable; + final PsiElement scope = parameter.getDeclarationScope(); + if (!(scope instanceof PsiMethod)) { + return false; + } + final String variableName = variable.getName(); + final PsiMethod method = (PsiMethod) scope; + final int index = method.getParameterList().getParameterIndex(parameter); + final PsiMethod[] superMethods = method.findSuperMethods(); + for (PsiMethod superMethod : superMethods) { + final PsiParameter[] parameters = superMethod.getParameterList().getParameters(); + final PsiParameter overriddenParameter = parameters[index]; + if (variableName.equals(overriddenParameter.getName())) { + return true; + } + } + return false; } - } - return false; } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/numeric/NonReproducibleMathCallInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/numeric/NonReproducibleMathCallInspection.java index 8a0c6f53d..d6a2baddd 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/numeric/NonReproducibleMathCallInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/numeric/NonReproducibleMathCallInspection.java @@ -23,100 +23,97 @@ 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; import java.util.HashSet; import java.util.Set; @ExtensionImpl public class NonReproducibleMathCallInspection extends BaseInspection { + @SuppressWarnings("StaticCollection") + private static final Set nonReproducibleMethods = new HashSet<>(20); - @SuppressWarnings("StaticCollection") - @NonNls private static final Set nonReproducibleMethods = - new HashSet<>(20); - - static { - nonReproducibleMethods.add("acos"); - nonReproducibleMethods.add("asin"); - nonReproducibleMethods.add("atan"); - nonReproducibleMethods.add("atan2"); - nonReproducibleMethods.add("cbrt"); - nonReproducibleMethods.add("cos"); - nonReproducibleMethods.add("cosh"); - nonReproducibleMethods.add("exp"); - nonReproducibleMethods.add("expm1"); - nonReproducibleMethods.add("hypot"); - nonReproducibleMethods.add("log"); - nonReproducibleMethods.add("log10"); - nonReproducibleMethods.add("log1p"); - nonReproducibleMethods.add("pow"); - nonReproducibleMethods.add("sin"); - nonReproducibleMethods.add("sinh"); - nonReproducibleMethods.add("tan"); - nonReproducibleMethods.add("tanh"); - } - - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.nonReproducibleMathCallDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.nonReproducibleMathCallProblemDescriptor().get(); - } + static { + nonReproducibleMethods.add("acos"); + nonReproducibleMethods.add("asin"); + nonReproducibleMethods.add("atan"); + nonReproducibleMethods.add("atan2"); + nonReproducibleMethods.add("cbrt"); + nonReproducibleMethods.add("cos"); + nonReproducibleMethods.add("cosh"); + nonReproducibleMethods.add("exp"); + nonReproducibleMethods.add("expm1"); + nonReproducibleMethods.add("hypot"); + nonReproducibleMethods.add("log"); + nonReproducibleMethods.add("log10"); + nonReproducibleMethods.add("log1p"); + nonReproducibleMethods.add("pow"); + nonReproducibleMethods.add("sin"); + nonReproducibleMethods.add("sinh"); + nonReproducibleMethods.add("tan"); + nonReproducibleMethods.add("tanh"); + } - public InspectionGadgetsFix buildFix(Object... infos) { - return new MakeStrictFix(); - } - private static class MakeStrictFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nonReproducibleMathCallDisplayName(); + } @Nonnull - public String getName() { - return InspectionGadgetsLocalize.nonReproducibleMathCallReplaceQuickfix().get(); + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.nonReproducibleMathCallProblemDescriptor().get(); } - public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiIdentifier nameIdentifier = (PsiIdentifier)descriptor.getPsiElement(); - final PsiReferenceExpression reference = (PsiReferenceExpression)nameIdentifier.getParent(); - assert reference != null; - final String name = reference.getReferenceName(); - replaceExpression(reference, "StrictMath." + name); + public InspectionGadgetsFix buildFix(Object... infos) { + return new MakeStrictFix(); } - } - public BaseInspectionVisitor buildVisitor() { - return new BigDecimalEqualsVisitor(); - } + private static class MakeStrictFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.nonReproducibleMathCallReplaceQuickfix(); + } + + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiIdentifier nameIdentifier = (PsiIdentifier) descriptor.getPsiElement(); + final PsiReferenceExpression reference = (PsiReferenceExpression) nameIdentifier.getParent(); + assert reference != null; + final String name = reference.getReferenceName(); + replaceExpression(reference, "StrictMath." + name); + } + } - private static class BigDecimalEqualsVisitor extends BaseInspectionVisitor { + public BaseInspectionVisitor buildVisitor() { + return new BigDecimalEqualsVisitor(); + } - @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - if (!nonReproducibleMethods.contains(methodName)) { - return; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return; - } - final PsiClass referencedClass = method.getContainingClass(); - if (referencedClass == null) { - return; - } - final String className = referencedClass.getQualifiedName(); - if (!CommonClassNames.JAVA_LANG_MATH.equals(className)) { - return; - } - registerMethodCallError(expression); + private static class BigDecimalEqualsVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!nonReproducibleMethods.contains(methodName)) { + return; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return; + } + final PsiClass referencedClass = method.getContainingClass(); + if (referencedClass == null) { + return; + } + final String className = referencedClass.getQualifiedName(); + if (!CommonClassNames.JAVA_LANG_MATH.equals(className)) { + return; + } + registerMethodCallError(expression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/numeric/OctalAndDecimalIntegersMixedInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/numeric/OctalAndDecimalIntegersMixedInspection.java index 0882072bf..f98a62cdf 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/numeric/OctalAndDecimalIntegersMixedInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/numeric/OctalAndDecimalIntegersMixedInspection.java @@ -24,96 +24,88 @@ import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.NonNls; @ExtensionImpl -public class OctalAndDecimalIntegersMixedInspection - extends BaseInspection { - - @Override - @Nonnull - public String getID() { - return "OctalAndDecimalIntegersInSameArray"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.octalAndDecimalIntegersInSameArrayDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.octalAndDecimalIntegersInSameArrayProblemDescriptor().get(); - } - - @Nonnull - @Override - protected InspectionGadgetsFix[] buildFixes(Object... infos) { - return new InspectionGadgetsFix[]{ - new ConvertOctalLiteralToDecimalFix(), - new RemoveLeadingZeroFix() - }; - } +public class OctalAndDecimalIntegersMixedInspection extends BaseInspection { + @Override + @Nonnull + public String getID() { + return "OctalAndDecimalIntegersInSameArray"; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new OctalAndDecimalIntegersMixedVisitor(); - } + @Override + @Nonnull + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.octalAndDecimalIntegersInSameArrayDisplayName(); + } - private static class OctalAndDecimalIntegersMixedVisitor - extends BaseInspectionVisitor { + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.octalAndDecimalIntegersInSameArrayProblemDescriptor().get(); + } + @Nonnull @Override - public void visitArrayInitializerExpression( - PsiArrayInitializerExpression expression) { - super.visitArrayInitializerExpression(expression); - final PsiExpression[] initializers = expression.getInitializers(); - boolean hasDecimalLiteral = false; - boolean hasOctalLiteral = false; - for (final PsiExpression initializer : initializers) { - if (initializer instanceof PsiLiteralExpression) { - final PsiLiteralExpression literal = - (PsiLiteralExpression)initializer; - if (isDecimalLiteral(literal)) { - hasDecimalLiteral = true; - } - if (isOctalLiteral(literal)) { - hasOctalLiteral = true; - } - } - } - if (hasOctalLiteral && hasDecimalLiteral) { - registerError(expression); - } + protected InspectionGadgetsFix[] buildFixes(Object... infos) { + return new InspectionGadgetsFix[]{ + new ConvertOctalLiteralToDecimalFix(), + new RemoveLeadingZeroFix() + }; } - private static boolean isDecimalLiteral(PsiLiteralExpression literal) { - final PsiType type = literal.getType(); - if (!PsiType.INT.equals(type) && - !PsiType.LONG.equals(type)) { - return false; - } - final String text = literal.getText(); - if ("0".equals(text)) { - return false; - } - return text.charAt(0) != '0'; + @Override + public BaseInspectionVisitor buildVisitor() { + return new OctalAndDecimalIntegersMixedVisitor(); } - private static boolean isOctalLiteral(PsiLiteralExpression literal) { - final PsiType type = literal.getType(); - if (!PsiType.INT.equals(type) && !PsiType.LONG.equals(type)) { - return false; - } - @NonNls final String text = literal.getText(); - if ("0".equals(text) || "0L".equals(text)) { - return false; - } - return text.charAt(0) == '0' && !text.startsWith("0x") && - !text.startsWith("0X"); + private static class OctalAndDecimalIntegersMixedVisitor extends BaseInspectionVisitor { + @Override + public void visitArrayInitializerExpression(PsiArrayInitializerExpression expression) { + super.visitArrayInitializerExpression(expression); + final PsiExpression[] initializers = expression.getInitializers(); + boolean hasDecimalLiteral = false; + boolean hasOctalLiteral = false; + for (final PsiExpression initializer : initializers) { + if (initializer instanceof PsiLiteralExpression) { + final PsiLiteralExpression literal = (PsiLiteralExpression) initializer; + if (isDecimalLiteral(literal)) { + hasDecimalLiteral = true; + } + if (isOctalLiteral(literal)) { + hasOctalLiteral = true; + } + } + } + if (hasOctalLiteral && hasDecimalLiteral) { + registerError(expression); + } + } + + private static boolean isDecimalLiteral(PsiLiteralExpression literal) { + final PsiType type = literal.getType(); + if (!PsiType.INT.equals(type) && !PsiType.LONG.equals(type)) { + return false; + } + final String text = literal.getText(); + if ("0".equals(text)) { + return false; + } + return text.charAt(0) != '0'; + } + + private static boolean isOctalLiteral(PsiLiteralExpression literal) { + final PsiType type = literal.getType(); + if (!PsiType.INT.equals(type) && !PsiType.LONG.equals(type)) { + return false; + } + final String text = literal.getText(); + if ("0".equals(text) || "0L".equals(text)) { + return false; + } + return text.charAt(0) == '0' && !text.startsWith("0x") && !text.startsWith("0X"); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/numeric/OctalLiteralInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/numeric/OctalLiteralInspection.java index 7690c6a22..15d072398 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/numeric/OctalLiteralInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/numeric/OctalLiteralInspection.java @@ -22,79 +22,76 @@ import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import org.intellij.lang.annotations.Pattern; -import org.jetbrains.annotations.NonNls; @ExtensionImpl public class OctalLiteralInspection extends BaseInspection { - @Pattern(VALID_ID_PATTERN) - @Override - @Nonnull - public String getID() { - return "OctalInteger"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.octalLiteralDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.octalLiteralProblemDescriptor().get(); - } + @Pattern(VALID_ID_PATTERN) + @Override + @Nonnull + public String getID() { + return "OctalInteger"; + } - @Override - public boolean isEnabledByDefault() { - return true; - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.octalLiteralDisplayName(); + } - @Nonnull - @Override - protected InspectionGadgetsFix[] buildFixes(Object... infos) { - return new InspectionGadgetsFix[]{ - new ConvertOctalLiteralToDecimalFix(), - new RemoveLeadingZeroFix() - }; - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.octalLiteralProblemDescriptor().get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new OctalLiteralVisitor(); - } + @Override + public boolean isEnabledByDefault() { + return true; + } - private static class OctalLiteralVisitor extends BaseInspectionVisitor { + @Nonnull + @Override + protected InspectionGadgetsFix[] buildFixes(Object... infos) { + return new InspectionGadgetsFix[]{ + new ConvertOctalLiteralToDecimalFix(), + new RemoveLeadingZeroFix() + }; + } @Override - public void visitLiteralExpression( - @Nonnull PsiLiteralExpression literal) { - super.visitLiteralExpression(literal); - final PsiType type = literal.getType(); - if (type == null) { - return; - } - if (!(type.equals(PsiType.INT) - || type.equals(PsiType.LONG))) { - return; - } - @NonNls final String text = literal.getText(); - if (text.length() == 1) { - return; - } - if (text.charAt(0) != '0') { - return; - } - final char c1 = text.charAt(1); - if (c1 != '_' && (c1 < '0' || c1 > '7')) { - return; - } - if (literal.getValue() == null) { - return; - } - registerError(literal); + public BaseInspectionVisitor buildVisitor() { + return new OctalLiteralVisitor(); + } + + private static class OctalLiteralVisitor extends BaseInspectionVisitor { + @Override + public void visitLiteralExpression(@Nonnull PsiLiteralExpression literal) { + super.visitLiteralExpression(literal); + final PsiType type = literal.getType(); + if (type == null) { + return; + } + if (!(type.equals(PsiType.INT) || type.equals(PsiType.LONG))) { + return; + } + final String text = literal.getText(); + if (text.length() == 1) { + return; + } + if (text.charAt(0) != '0') { + return; + } + final char c1 = text.charAt(1); + if (c1 != '_' && (c1 < '0' || c1 > '7')) { + return; + } + if (literal.getValue() == null) { + return; + } + registerError(literal); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/numeric/OverlyComplexArithmeticExpressionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/numeric/OverlyComplexArithmeticExpressionInspection.java index 4f6535e58..283e67900 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/numeric/OverlyComplexArithmeticExpressionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/numeric/OverlyComplexArithmeticExpressionInspection.java @@ -32,155 +32,140 @@ import java.util.HashSet; import java.util.Set; -public abstract class OverlyComplexArithmeticExpressionInspection - extends BaseInspection { - - private static final int TERM_LIMIT = 6; - - /** - * @noinspection PublicField - */ - public int m_limit = TERM_LIMIT; //this is public for the DefaultJDOMExternalizer thingy - - private static final Set arithmeticTokens = - new HashSet(5); - - static { - arithmeticTokens.add(JavaTokenType.PLUS); - arithmeticTokens.add(JavaTokenType.MINUS); - arithmeticTokens.add(JavaTokenType.ASTERISK); - arithmeticTokens.add(JavaTokenType.DIV); - arithmeticTokens.add(JavaTokenType.PERC); - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.overlyComplexArithmeticExpressionDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.overlyComplexArithmeticExpressionProblemDescriptor().get(); - } - - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.overlyComplexArithmeticExpressionMaxNumberOption(); - return new SingleIntegerFieldOptionsPanel(message.get(), this, "m_limit"); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new ExtractMethodFix(); - } - - @Override - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new OverlyComplexArithmeticExpressionVisitor(); - } - - private class OverlyComplexArithmeticExpressionVisitor - extends BaseInspectionVisitor { +public abstract class OverlyComplexArithmeticExpressionInspection extends BaseInspection { + private static final int TERM_LIMIT = 6; + + /** + * @noinspection PublicField + */ + public int m_limit = TERM_LIMIT; //this is public for the DefaultJDOMExternalizer thingy + + private static final Set arithmeticTokens = new HashSet(5); + + static { + arithmeticTokens.add(JavaTokenType.PLUS); + arithmeticTokens.add(JavaTokenType.MINUS); + arithmeticTokens.add(JavaTokenType.ASTERISK); + arithmeticTokens.add(JavaTokenType.DIV); + arithmeticTokens.add(JavaTokenType.PERC); + } + @Nonnull @Override - public void visitBinaryExpression( - @Nonnull PsiBinaryExpression expression) { - super.visitBinaryExpression(expression); - checkExpression(expression); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.overlyComplexArithmeticExpressionDisplayName(); } @Override - public void visitPrefixExpression( - @Nonnull PsiPrefixExpression expression) { - super.visitPrefixExpression(expression); - checkExpression(expression); + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.overlyComplexArithmeticExpressionProblemDescriptor().get(); } @Override - public void visitParenthesizedExpression( - PsiParenthesizedExpression expression) { - super.visitParenthesizedExpression(expression); - checkExpression(expression); + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.overlyComplexArithmeticExpressionMaxNumberOption(); + return new SingleIntegerFieldOptionsPanel(message.get(), this, "m_limit"); } - private void checkExpression(PsiExpression expression) { - if (isParentArithmetic(expression)) { - return; - } - if (!isArithmetic(expression)) { - return; - } - final int numTerms = countTerms(expression); - if (numTerms <= m_limit) { - return; - } - registerError(expression); + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new ExtractMethodFix(); } - private int countTerms(PsiExpression expression) { - if (!isArithmetic(expression)) { - return 1; - } - if (expression instanceof PsiBinaryExpression) { - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)expression; - final PsiExpression lhs = binaryExpression.getLOperand(); - final PsiExpression rhs = binaryExpression.getROperand(); - return countTerms(lhs) + countTerms(rhs); - } - else if (expression instanceof PsiPrefixExpression) { - final PsiPrefixExpression prefixExpression = - (PsiPrefixExpression)expression; - final PsiExpression operand = prefixExpression.getOperand(); - return countTerms(operand); - } - else if (expression instanceof PsiParenthesizedExpression) { - final PsiParenthesizedExpression parenthesizedExpression = - (PsiParenthesizedExpression)expression; - final PsiExpression contents = parenthesizedExpression.getExpression(); - return countTerms(contents); - } - return 1; + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; } - private boolean isParentArithmetic(PsiExpression expression) { - final PsiElement parent = expression.getParent(); - if (!(parent instanceof PsiExpression)) { - return false; - } - return isArithmetic((PsiExpression)parent); + @Override + public BaseInspectionVisitor buildVisitor() { + return new OverlyComplexArithmeticExpressionVisitor(); } - private boolean isArithmetic(PsiExpression expression) { - if (expression instanceof PsiBinaryExpression) { - final PsiType type = expression.getType(); - if (TypeUtils.isJavaLangString(type)) { - return false; //ignore string concatenations + private class OverlyComplexArithmeticExpressionVisitor extends BaseInspectionVisitor { + @Override + public void visitBinaryExpression(@Nonnull PsiBinaryExpression expression) { + super.visitBinaryExpression(expression); + checkExpression(expression); + } + + @Override + public void visitPrefixExpression(@Nonnull PsiPrefixExpression expression) { + super.visitPrefixExpression(expression); + checkExpression(expression); + } + + @Override + public void visitParenthesizedExpression(PsiParenthesizedExpression expression) { + super.visitParenthesizedExpression(expression); + checkExpression(expression); + } + + private void checkExpression(PsiExpression expression) { + if (isParentArithmetic(expression)) { + return; + } + if (!isArithmetic(expression)) { + return; + } + final int numTerms = countTerms(expression); + if (numTerms <= m_limit) { + return; + } + registerError(expression); + } + + private int countTerms(PsiExpression expression) { + if (!isArithmetic(expression)) { + return 1; + } + if (expression instanceof PsiBinaryExpression) { + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression) expression; + final PsiExpression lhs = binaryExpression.getLOperand(); + final PsiExpression rhs = binaryExpression.getROperand(); + return countTerms(lhs) + countTerms(rhs); + } + else if (expression instanceof PsiPrefixExpression) { + final PsiPrefixExpression prefixExpression = (PsiPrefixExpression) expression; + final PsiExpression operand = prefixExpression.getOperand(); + return countTerms(operand); + } + else if (expression instanceof PsiParenthesizedExpression) { + final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression) expression; + final PsiExpression contents = parenthesizedExpression.getExpression(); + return countTerms(contents); + } + return 1; + } + + private boolean isParentArithmetic(PsiExpression expression) { + final PsiElement parent = expression.getParent(); + if (!(parent instanceof PsiExpression)) { + return false; + } + return isArithmetic((PsiExpression) parent); + } + + private boolean isArithmetic(PsiExpression expression) { + if (expression instanceof PsiBinaryExpression) { + final PsiType type = expression.getType(); + if (TypeUtils.isJavaLangString(type)) { + return false; //ignore string concatenations + } + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression) expression; + return arithmeticTokens.contains(binaryExpression.getOperationTokenType()); + } + else if (expression instanceof PsiPrefixExpression) { + final PsiPrefixExpression prefixExpression = (PsiPrefixExpression) expression; + return arithmeticTokens.contains(prefixExpression.getOperationTokenType()); + } + else if (expression instanceof PsiParenthesizedExpression) { + final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression) expression; + final PsiExpression contents = parenthesizedExpression.getExpression(); + return isArithmetic(contents); + } + return false; } - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)expression; - return arithmeticTokens.contains(binaryExpression.getOperationTokenType()); - } - else if (expression instanceof PsiPrefixExpression) { - final PsiPrefixExpression prefixExpression = - (PsiPrefixExpression)expression; - return arithmeticTokens.contains(prefixExpression.getOperationTokenType()); - } - else if (expression instanceof PsiParenthesizedExpression) { - final PsiParenthesizedExpression parenthesizedExpression = - (PsiParenthesizedExpression)expression; - final PsiExpression contents = - parenthesizedExpression.getExpression(); - return isArithmetic(contents); - } - return false; } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/numeric/PointlessArithmeticExpressionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/numeric/PointlessArithmeticExpressionInspection.java index 81161e87b..844f1c003 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/numeric/PointlessArithmeticExpressionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/numeric/PointlessArithmeticExpressionInspection.java @@ -30,335 +30,292 @@ import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.NonNls; import javax.swing.*; import java.util.HashSet; import java.util.Set; @ExtensionImpl -public class PointlessArithmeticExpressionInspection - extends BaseInspection { - - private static final Set arithmeticTokens = - new HashSet(5); - - static { - arithmeticTokens.add(JavaTokenType.PLUS); - arithmeticTokens.add(JavaTokenType.MINUS); - arithmeticTokens.add(JavaTokenType.ASTERISK); - arithmeticTokens.add(JavaTokenType.DIV); - arithmeticTokens.add(JavaTokenType.PERC); - arithmeticTokens.add(JavaTokenType.GT); - arithmeticTokens.add(JavaTokenType.LT); - arithmeticTokens.add(JavaTokenType.LE); - arithmeticTokens.add(JavaTokenType.GE); - } - - /** - * @noinspection PublicField - */ - public boolean m_ignoreExpressionsContainingConstants = false; - - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.pointlessBooleanExpressionIgnoreOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "m_ignoreExpressionsContainingConstants"); - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.pointlessArithmeticExpressionDisplayName().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - String replacementExpression = calculateReplacementExpression((PsiExpression)infos[0]); - return InspectionGadgetsLocalize.expressionCanBeReplacedProblemDescriptor(replacementExpression).get(); - } - - @NonNls - String calculateReplacementExpression( - PsiExpression expression) { - final PsiBinaryExpression exp = (PsiBinaryExpression)expression; - final PsiExpression lhs = exp.getLOperand(); - final PsiExpression rhs = exp.getROperand(); - assert rhs != null; - final IElementType tokenType = exp.getOperationTokenType(); - if (tokenType.equals(JavaTokenType.PLUS)) { - if (isZero(lhs)) { - return rhs.getText(); - } - else { - return lhs.getText(); - } +public class PointlessArithmeticExpressionInspection extends BaseInspection { + private static final Set arithmeticTokens = new HashSet(5); + + static { + arithmeticTokens.add(JavaTokenType.PLUS); + arithmeticTokens.add(JavaTokenType.MINUS); + arithmeticTokens.add(JavaTokenType.ASTERISK); + arithmeticTokens.add(JavaTokenType.DIV); + arithmeticTokens.add(JavaTokenType.PERC); + arithmeticTokens.add(JavaTokenType.GT); + arithmeticTokens.add(JavaTokenType.LT); + arithmeticTokens.add(JavaTokenType.LE); + arithmeticTokens.add(JavaTokenType.GE); } - else if (tokenType.equals(JavaTokenType.MINUS)) { - return lhs.getText(); - } - else if (tokenType.equals(JavaTokenType.ASTERISK)) { - if (isOne(lhs)) { - return rhs.getText(); - } - else if (isOne(rhs)) { - return lhs.getText(); - } - else { - return "0"; - } - } - else if (tokenType.equals(JavaTokenType.DIV)) { - return lhs.getText(); + + /** + * @noinspection PublicField + */ + public boolean m_ignoreExpressionsContainingConstants = false; + + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.pointlessBooleanExpressionIgnoreOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "m_ignoreExpressionsContainingConstants"); } - else if (tokenType.equals(JavaTokenType.PERC)) { - return "0"; + + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.pointlessArithmeticExpressionDisplayName(); } - else if (tokenType.equals(JavaTokenType.LE) || - tokenType.equals(JavaTokenType.GE)) { - return "true"; + + @Override + public boolean isEnabledByDefault() { + return true; } - else if (tokenType.equals(JavaTokenType.LT) || - tokenType.equals(JavaTokenType.GT)) { - return "false"; + + @Override + @Nonnull + public String buildErrorString(Object... infos) { + String replacementExpression = calculateReplacementExpression((PsiExpression) infos[0]); + return InspectionGadgetsLocalize.expressionCanBeReplacedProblemDescriptor(replacementExpression).get(); } - else { - return ""; + + String calculateReplacementExpression(PsiExpression expression) { + final PsiBinaryExpression exp = (PsiBinaryExpression) expression; + final PsiExpression lhs = exp.getLOperand(); + final PsiExpression rhs = exp.getROperand(); + assert rhs != null; + final IElementType tokenType = exp.getOperationTokenType(); + if (tokenType.equals(JavaTokenType.PLUS)) { + if (isZero(lhs)) { + return rhs.getText(); + } + else { + return lhs.getText(); + } + } + else if (tokenType.equals(JavaTokenType.MINUS)) { + return lhs.getText(); + } + else if (tokenType.equals(JavaTokenType.ASTERISK)) { + if (isOne(lhs)) { + return rhs.getText(); + } + else if (isOne(rhs)) { + return lhs.getText(); + } + else { + return "0"; + } + } + else if (tokenType.equals(JavaTokenType.DIV)) { + return lhs.getText(); + } + else if (tokenType.equals(JavaTokenType.PERC)) { + return "0"; + } + else if (tokenType.equals(JavaTokenType.LE) || tokenType.equals(JavaTokenType.GE)) { + return "true"; + } + else if (tokenType.equals(JavaTokenType.LT) || tokenType.equals(JavaTokenType.GT)) { + return "false"; + } + else { + return ""; + } } - } - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new PointlessArithmeticFix(); - } + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + return new PointlessArithmeticFix(); + } - private class PointlessArithmeticFix extends InspectionGadgetsFix { + private class PointlessArithmeticFix extends InspectionGadgetsFix { + @Nonnull + public LocalizeValue getName() { + return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix(); + } - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix().get(); + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiExpression expression = (PsiExpression) descriptor.getPsiElement(); + final String newExpression = calculateReplacementExpression(expression); + replaceExpression(expression, newExpression); + } } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiExpression expression = - (PsiExpression)descriptor.getPsiElement(); - final String newExpression = - calculateReplacementExpression(expression); - replaceExpression(expression, newExpression); + public BaseInspectionVisitor buildVisitor() { + return new PointlessArithmeticVisitor(); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new PointlessArithmeticVisitor(); - } + private class PointlessArithmeticVisitor extends BaseInspectionVisitor { + @Override + public void visitBinaryExpression(@Nonnull PsiBinaryExpression expression) { + super.visitBinaryExpression(expression); + final PsiExpression rhs = expression.getROperand(); + if (rhs == null) { + return; + } + final PsiType expressionType = expression.getType(); + if (PsiType.DOUBLE.equals(expressionType) || PsiType.FLOAT.equals(expressionType)) { + return; + } + if (!arithmeticTokens.contains(expression.getOperationTokenType())) { + return; + } + if (ExpressionUtils.hasStringType(expression)) { + return; + } + final PsiExpression lhs = expression.getLOperand(); + final IElementType tokenType = expression.getOperationTokenType(); + final boolean isPointless; + if (tokenType.equals(JavaTokenType.PLUS)) { + isPointless = additionExpressionIsPointless(lhs, rhs); + } + else if (tokenType.equals(JavaTokenType.MINUS)) { + isPointless = subtractionExpressionIsPointless(rhs); + } + else if (tokenType.equals(JavaTokenType.ASTERISK)) { + isPointless = multiplyExpressionIsPointless(lhs, rhs); + } + else if (tokenType.equals(JavaTokenType.DIV)) { + isPointless = divideExpressionIsPointless(rhs); + } + else if (tokenType.equals(JavaTokenType.PERC)) { + isPointless = modExpressionIsPointless(rhs); + } + else if (tokenType.equals(JavaTokenType.LE) + || tokenType.equals(JavaTokenType.GE) + || tokenType.equals(JavaTokenType.GT) + || tokenType.equals(JavaTokenType.LT)) { + isPointless = comparisonExpressionIsPointless(lhs, rhs, tokenType); + } + else { + isPointless = false; + } + if (!isPointless) { + return; + } + if (!PsiType.BOOLEAN.equals(expressionType)) { + if (expressionType == null || + !expressionType.equals(rhs.getType()) || + !expressionType.equals(lhs.getType())) { + // A bit rude way to avoid false positive of + // 'int sum = 5, n = 6; float p = (1.0f * sum) / n;' + return; + } + } + registerError(expression, expression); + } - private class PointlessArithmeticVisitor extends BaseInspectionVisitor { + private boolean subtractionExpressionIsPointless(PsiExpression rhs) { + return isZero(rhs); + } - @Override - public void visitBinaryExpression( - @Nonnull PsiBinaryExpression expression) { - super.visitBinaryExpression(expression); - final PsiExpression rhs = expression.getROperand(); - if (rhs == null) { - return; - } - final PsiType expressionType = expression.getType(); - if (PsiType.DOUBLE.equals(expressionType) || - PsiType.FLOAT.equals(expressionType)) { - return; - } - if (!arithmeticTokens.contains(expression.getOperationTokenType())) { - return; - } - if (ExpressionUtils.hasStringType(expression)) { - return; - } - final PsiExpression lhs = expression.getLOperand(); - final IElementType tokenType = expression.getOperationTokenType(); - final boolean isPointless; - if (tokenType.equals(JavaTokenType.PLUS)) { - isPointless = additionExpressionIsPointless(lhs, rhs); - } - else if (tokenType.equals(JavaTokenType.MINUS)) { - isPointless = subtractionExpressionIsPointless(rhs); - } - else if (tokenType.equals(JavaTokenType.ASTERISK)) { - isPointless = multiplyExpressionIsPointless(lhs, rhs); - } - else if (tokenType.equals(JavaTokenType.DIV)) { - isPointless = divideExpressionIsPointless(rhs); - } - else if (tokenType.equals(JavaTokenType.PERC)) { - isPointless = modExpressionIsPointless(rhs); - } - else if (tokenType.equals(JavaTokenType.LE) || - tokenType.equals(JavaTokenType.GE) || - tokenType.equals(JavaTokenType.GT) || - tokenType.equals(JavaTokenType.LT)) { - isPointless = comparisonExpressionIsPointless(lhs, rhs, - tokenType); - } - else { - isPointless = false; - } - if (!isPointless) { - return; - } - if (!PsiType.BOOLEAN.equals(expressionType)) { - if (expressionType == null || - !expressionType.equals(rhs.getType()) || - !expressionType.equals(lhs.getType())) { - // A bit rude way to avoid false positive of - // 'int sum = 5, n = 6; float p = (1.0f * sum) / n;' - return; + private boolean additionExpressionIsPointless(PsiExpression lhs, PsiExpression rhs) { + return isZero(lhs) || isZero(rhs); + } + + private boolean multiplyExpressionIsPointless(PsiExpression lhs, PsiExpression rhs) { + return isZero(lhs) || isZero(rhs) || isOne(lhs) || isOne(rhs); + } + + private boolean divideExpressionIsPointless(PsiExpression rhs) { + return isOne(rhs); + } + + private boolean modExpressionIsPointless(PsiExpression rhs) { + return PsiType.INT.equals(rhs.getType()) && isOne(rhs); + } + + private boolean comparisonExpressionIsPointless(PsiExpression lhs, PsiExpression rhs, IElementType comparison) { + if (PsiType.INT.equals(lhs.getType()) && PsiType.INT.equals(rhs.getType())) { + return intComparisonIsPointless(lhs, rhs, comparison); + } + else if (PsiType.LONG.equals(lhs.getType()) && PsiType.LONG.equals(rhs.getType())) { + return longComparisonIsPointless(lhs, rhs, comparison); + } + return false; + } + + private boolean intComparisonIsPointless(PsiExpression lhs, PsiExpression rhs, IElementType comparison) { + if (isMaxInt(lhs) || isMinInt(rhs)) { + return JavaTokenType.GE.equals(comparison) || JavaTokenType.LT.equals(comparison); + } + if (isMinInt(lhs) || isMaxInt(rhs)) { + return JavaTokenType.LE.equals(comparison) || JavaTokenType.GT.equals(comparison); + } + return false; + } + + private boolean longComparisonIsPointless(PsiExpression lhs, PsiExpression rhs, IElementType comparison) { + if (isMaxLong(lhs) || isMinLong(rhs)) { + return JavaTokenType.GE.equals(comparison) || JavaTokenType.LT.equals(comparison); + } + if (isMinLong(lhs) || isMaxLong(rhs)) { + return JavaTokenType.LE.equals(comparison) || JavaTokenType.GT.equals(comparison); + } + return false; } - } - registerError(expression, expression); } - private boolean subtractionExpressionIsPointless(PsiExpression rhs) { - return isZero(rhs); + boolean isZero(PsiExpression expression) { + if (m_ignoreExpressionsContainingConstants && !(expression instanceof PsiLiteralExpression)) { + return false; + } + return ExpressionUtils.isZero(expression); } - private boolean additionExpressionIsPointless(PsiExpression lhs, - PsiExpression rhs) { - return isZero(lhs) || isZero(rhs); + boolean isOne(PsiExpression expression) { + if (m_ignoreExpressionsContainingConstants && !(expression instanceof PsiLiteralExpression)) { + return false; + } + return ExpressionUtils.isOne(expression); } - private boolean multiplyExpressionIsPointless(PsiExpression lhs, - PsiExpression rhs) { - return isZero(lhs) || isZero(rhs) || isOne(lhs) || isOne(rhs); + private static boolean isMinDouble(PsiExpression expression) { + final Double value = (Double) ConstantExpressionUtil.computeCastTo(expression, PsiType.DOUBLE); + return value != null && value.doubleValue() == Double.MIN_VALUE; } - private boolean divideExpressionIsPointless(PsiExpression rhs) { - return isOne(rhs); + private static boolean isMaxDouble(PsiExpression expression) { + final Double value = (Double) ConstantExpressionUtil.computeCastTo(expression, PsiType.DOUBLE); + //noinspection FloatingPointEquality + return value != null && value.doubleValue() == Double.MAX_VALUE; } - private boolean modExpressionIsPointless(PsiExpression rhs) { - return PsiType.INT.equals(rhs.getType()) && isOne(rhs); + private static boolean isMinFloat(PsiExpression expression) { + final Float value = (Float) ConstantExpressionUtil.computeCastTo(expression, PsiType.FLOAT); + //noinspection FloatingPointEquality + return value != null && value.floatValue() == Float.MIN_VALUE; } - private boolean comparisonExpressionIsPointless( - PsiExpression lhs, PsiExpression rhs, IElementType comparison) { - if (PsiType.INT.equals(lhs.getType()) && - PsiType.INT.equals(rhs.getType())) { - return intComparisonIsPointless(lhs, rhs, comparison); - } - else if (PsiType.LONG.equals(lhs.getType()) && - PsiType.LONG.equals(rhs.getType())) { - return longComparisonIsPointless(lhs, rhs, comparison); - } - return false; + private static boolean isMaxFloat(PsiExpression expression) { + final Float value = (Float) ConstantExpressionUtil.computeCastTo(expression, PsiType.FLOAT); + //noinspection FloatingPointEquality + return value != null && value.floatValue() == Float.MAX_VALUE; } - private boolean intComparisonIsPointless( - PsiExpression lhs, PsiExpression rhs, IElementType comparison) { - if (isMaxInt(lhs) || isMinInt(rhs)) { - return JavaTokenType.GE.equals(comparison) || - JavaTokenType.LT.equals(comparison); - } - if (isMinInt(lhs) || isMaxInt(rhs)) { - return JavaTokenType.LE.equals(comparison) || - JavaTokenType.GT.equals(comparison); - } - return false; + private static boolean isMinInt(PsiExpression expression) { + final Integer value = (Integer) ConstantExpressionUtil.computeCastTo(expression, PsiType.INT); + return value != null && value.intValue() == Integer.MIN_VALUE; } - private boolean longComparisonIsPointless( - PsiExpression lhs, PsiExpression rhs, IElementType comparison) { - if (isMaxLong(lhs) || isMinLong(rhs)) { - return JavaTokenType.GE.equals(comparison) || - JavaTokenType.LT.equals(comparison); - } - if (isMinLong(lhs) || isMaxLong(rhs)) { - return JavaTokenType.LE.equals(comparison) || - JavaTokenType.GT.equals(comparison); - } - return false; + private static boolean isMaxInt(PsiExpression expression) { + final Integer value = (Integer) + ConstantExpressionUtil.computeCastTo( + expression, PsiType.INT); + return value != null && value.intValue() == Integer.MAX_VALUE; } - } - boolean isZero(PsiExpression expression) { - if (m_ignoreExpressionsContainingConstants && - !(expression instanceof PsiLiteralExpression)) { - return false; + private static boolean isMinLong(PsiExpression expression) { + final Long value = (Long) ConstantExpressionUtil.computeCastTo(expression, PsiType.LONG); + return value != null && value.longValue() == Long.MIN_VALUE; } - return ExpressionUtils.isZero(expression); - } - boolean isOne(PsiExpression expression) { - if (m_ignoreExpressionsContainingConstants && - !(expression instanceof PsiLiteralExpression)) { - return false; + private static boolean isMaxLong(PsiExpression expression) { + final Long value = (Long) ConstantExpressionUtil.computeCastTo(expression, PsiType.LONG); + return value != null && value.longValue() == Long.MAX_VALUE; } - return ExpressionUtils.isOne(expression); - } - - private static boolean isMinDouble(PsiExpression expression) { - final Double value = (Double) - ConstantExpressionUtil.computeCastTo( - expression, PsiType.DOUBLE); - return value != null && value.doubleValue() == Double.MIN_VALUE; - } - - private static boolean isMaxDouble(PsiExpression expression) { - final Double value = (Double) - ConstantExpressionUtil.computeCastTo( - expression, PsiType.DOUBLE); - //noinspection FloatingPointEquality - return value != null && value.doubleValue() == Double.MAX_VALUE; - } - - private static boolean isMinFloat(PsiExpression expression) { - final Float value = (Float) - ConstantExpressionUtil.computeCastTo( - expression, PsiType.FLOAT); - //noinspection FloatingPointEquality - return value != null && value.floatValue() == Float.MIN_VALUE; - } - - private static boolean isMaxFloat(PsiExpression expression) { - final Float value = (Float) - ConstantExpressionUtil.computeCastTo( - expression, PsiType.FLOAT); - //noinspection FloatingPointEquality - return value != null && value.floatValue() == Float.MAX_VALUE; - } - - private static boolean isMinInt(PsiExpression expression) { - final Integer value = (Integer) - ConstantExpressionUtil.computeCastTo( - expression, PsiType.INT); - return value != null && value.intValue() == Integer.MIN_VALUE; - } - - private static boolean isMaxInt(PsiExpression expression) { - final Integer value = (Integer) - ConstantExpressionUtil.computeCastTo( - expression, PsiType.INT); - return value != null && value.intValue() == Integer.MAX_VALUE; - } - - private static boolean isMinLong(PsiExpression expression) { - final Long value = (Long) - ConstantExpressionUtil.computeCastTo( - expression, PsiType.LONG); - return value != null && value.longValue() == Long.MIN_VALUE; - } - - private static boolean isMaxLong(PsiExpression expression) { - final Long value = (Long) - ConstantExpressionUtil.computeCastTo( - expression, PsiType.LONG); - return value != null && value.longValue() == Long.MAX_VALUE; - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/numeric/UnaryPlusInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/numeric/UnaryPlusInspection.java index ad8820fd4..8263e643a 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/numeric/UnaryPlusInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/numeric/UnaryPlusInspection.java @@ -23,37 +23,36 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.language.ast.IElementType; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class UnaryPlusInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.unaryPlusDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.unaryPlusDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.unaryPlusProblemDescriptor().get(); - } - - public BaseInspectionVisitor buildVisitor() { - return new UnaryPlusVisitor(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.unaryPlusProblemDescriptor().get(); + } - private static class UnaryPlusVisitor extends BaseInspectionVisitor { + public BaseInspectionVisitor buildVisitor() { + return new UnaryPlusVisitor(); + } - @Override - public void visitPrefixExpression( - PsiPrefixExpression prefixExpression) { - super.visitPrefixExpression(prefixExpression); - final PsiJavaToken token = prefixExpression.getOperationSign(); - final IElementType tokenType = token.getTokenType(); - if (!tokenType.equals(JavaTokenType.PLUS)) { - return; - } - registerError(token); + private static class UnaryPlusVisitor extends BaseInspectionVisitor { + @Override + public void visitPrefixExpression(PsiPrefixExpression prefixExpression) { + super.visitPrefixExpression(prefixExpression); + final PsiJavaToken token = prefixExpression.getOperationSign(); + final IElementType tokenType = token.getTokenType(); + if (!tokenType.equals(JavaTokenType.PLUS)) { + return; + } + registerError(token); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/numeric/UnnecessaryUnaryMinusInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/numeric/UnnecessaryUnaryMinusInspection.java index 4e1b8d9c1..cf2fd74ea 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/numeric/UnnecessaryUnaryMinusInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/numeric/UnnecessaryUnaryMinusInspection.java @@ -25,6 +25,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; @@ -32,114 +33,99 @@ @ExtensionImpl public class UnnecessaryUnaryMinusInspection extends BaseInspection { - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.unnecessaryUnaryMinusDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.unnecessaryUnaryMinusProblemDescriptor().get(); - } - - @Nullable - protected InspectionGadgetsFix buildFix(Object... infos) { - return new UnnecessaryUnaryMinusFix(); - } - - private static class UnnecessaryUnaryMinusFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.unnecessaryUnaryMinusDisplayName(); + } @Nonnull - public String getName() { - return InspectionGadgetsLocalize.unnecessaryUnaryMinusQuickfix().get(); + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.unnecessaryUnaryMinusProblemDescriptor().get(); } - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiPrefixExpression prefixExpression = - (PsiPrefixExpression)element.getParent(); - final PsiExpression parentExpression = - (PsiExpression)prefixExpression.getParent(); - @NonNls final StringBuilder newExpression = new StringBuilder(); - if (parentExpression instanceof PsiAssignmentExpression) { - final PsiAssignmentExpression assignmentExpression = - (PsiAssignmentExpression)parentExpression; - final PsiExpression lhs = assignmentExpression.getLExpression(); - newExpression.append(lhs.getText()); - final IElementType tokenType = - assignmentExpression.getOperationTokenType(); - if (tokenType.equals(JavaTokenType.PLUSEQ)) { - newExpression.append("-="); - } - else { - newExpression.append("+="); - } - } - else if (parentExpression instanceof PsiBinaryExpression) { - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)parentExpression; - final PsiExpression lhs = binaryExpression.getLOperand(); - newExpression.append(lhs.getText()); - final IElementType tokenType = - binaryExpression.getOperationTokenType(); - if (tokenType.equals(JavaTokenType.PLUS)) { - newExpression.append('-'); + @Nullable + protected InspectionGadgetsFix buildFix(Object... infos) { + return new UnnecessaryUnaryMinusFix(); + } + + private static class UnnecessaryUnaryMinusFix extends InspectionGadgetsFix { + @Nonnull + public LocalizeValue getName() { + return InspectionGadgetsLocalize.unnecessaryUnaryMinusQuickfix(); } - else { - newExpression.append('+'); + + protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiPrefixExpression prefixExpression = (PsiPrefixExpression) element.getParent(); + final PsiExpression parentExpression = (PsiExpression) prefixExpression.getParent(); + @NonNls final StringBuilder newExpression = new StringBuilder(); + if (parentExpression instanceof PsiAssignmentExpression) { + final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression) parentExpression; + final PsiExpression lhs = assignmentExpression.getLExpression(); + newExpression.append(lhs.getText()); + final IElementType tokenType = assignmentExpression.getOperationTokenType(); + if (tokenType.equals(JavaTokenType.PLUSEQ)) { + newExpression.append("-="); + } + else { + newExpression.append("+="); + } + } + else if (parentExpression instanceof PsiBinaryExpression) { + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression) parentExpression; + final PsiExpression lhs = binaryExpression.getLOperand(); + newExpression.append(lhs.getText()); + final IElementType tokenType = binaryExpression.getOperationTokenType(); + if (tokenType.equals(JavaTokenType.PLUS)) { + newExpression.append('-'); + } + else { + newExpression.append('+'); + } + } + final PsiExpression operand = prefixExpression.getOperand(); + if (operand == null) { + return; + } + newExpression.append(operand.getText()); + replaceExpression(parentExpression, newExpression.toString()); } - } - final PsiExpression operand = prefixExpression.getOperand(); - if (operand == null) { - return; - } - newExpression.append(operand.getText()); - replaceExpression(parentExpression, newExpression.toString()); } - } - - public BaseInspectionVisitor buildVisitor() { - return new UnnecessaryUnaryMinusVisitor(); - } - private static class UnnecessaryUnaryMinusVisitor - extends BaseInspectionVisitor { + public BaseInspectionVisitor buildVisitor() { + return new UnnecessaryUnaryMinusVisitor(); + } - @Override - public void visitPrefixExpression(PsiPrefixExpression expression) { - super.visitPrefixExpression(expression); - final IElementType operationTokenType = - expression.getOperationTokenType(); - if (!JavaTokenType.MINUS.equals(operationTokenType)) { - return; - } - final PsiElement parent = expression.getParent(); - if (parent instanceof PsiBinaryExpression) { - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)parent; - final IElementType binaryExpressionTokenType = - binaryExpression.getOperationTokenType(); - if (!JavaTokenType.PLUS.equals(binaryExpressionTokenType)) { - return; - } - final PsiExpression rhs = binaryExpression.getROperand(); - if (!expression.equals(rhs)) { - return; - } - registerError(expression.getOperationSign()); - } - else if (parent instanceof PsiAssignmentExpression) { - final PsiAssignmentExpression assignmentExpression = - (PsiAssignmentExpression)parent; - final IElementType assignmentTokenType = - assignmentExpression.getOperationTokenType(); - if (!JavaTokenType.PLUSEQ.equals(assignmentTokenType)) { - return; + private static class UnnecessaryUnaryMinusVisitor extends BaseInspectionVisitor { + @Override + public void visitPrefixExpression(PsiPrefixExpression expression) { + super.visitPrefixExpression(expression); + final IElementType operationTokenType = expression.getOperationTokenType(); + if (!JavaTokenType.MINUS.equals(operationTokenType)) { + return; + } + final PsiElement parent = expression.getParent(); + if (parent instanceof PsiBinaryExpression) { + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression) parent; + final IElementType binaryExpressionTokenType = binaryExpression.getOperationTokenType(); + if (!JavaTokenType.PLUS.equals(binaryExpressionTokenType)) { + return; + } + final PsiExpression rhs = binaryExpression.getROperand(); + if (!expression.equals(rhs)) { + return; + } + registerError(expression.getOperationSign()); + } + else if (parent instanceof PsiAssignmentExpression) { + final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression) parent; + final IElementType assignmentTokenType = assignmentExpression.getOperationTokenType(); + if (!JavaTokenType.PLUSEQ.equals(assignmentTokenType)) { + return; + } + registerError(expression.getOperationSign()); + } } - registerError(expression.getOperationSign()); - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/packaging/PackageInMultipleModulesInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/packaging/PackageInMultipleModulesInspection.java index 5d07ad2d8..a71da5ade 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/packaging/PackageInMultipleModulesInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/packaging/PackageInMultipleModulesInspection.java @@ -25,6 +25,7 @@ import consulo.language.editor.inspection.reference.RefModule; import consulo.language.editor.inspection.scheme.InspectionManager; import consulo.language.editor.scope.AnalysisScope; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @@ -32,53 +33,45 @@ import java.util.List; import java.util.Set; -public abstract class PackageInMultipleModulesInspection extends BaseGlobalInspection -{ +public abstract class PackageInMultipleModulesInspection extends BaseGlobalInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.packageInMultipleModulesDisplayName(); + } - @Nonnull - @Override - public String getDisplayName() - { - return InspectionGadgetsLocalize.packageInMultipleModulesDisplayName().get(); - } + @Override + @Nullable + public CommonProblemDescriptor[] checkElement( + RefEntity refEntity, + AnalysisScope analysisScope, + InspectionManager inspectionManager, + GlobalInspectionContext globalInspectionContext, + Object state + ) { + if (!(refEntity instanceof RefPackage)) { + return null; + } + final List children = refEntity.getChildren(); + if (children == null) { + return null; + } + final Set modules = new HashSet(); + for (RefEntity child : children) { + if (!(child instanceof RefClass)) { + continue; + } + final RefClass refClass = (RefClass) child; + final RefModule module = refClass.getModule(); + modules.add(module); + } + if (modules.size() <= 1) { + return null; + } + final String errorString = InspectionGadgetsLocalize.packageInMultipleModulesProblemDescriptor(refEntity.getQualifiedName()).get(); - @Override - @Nullable - public CommonProblemDescriptor[] checkElement( - RefEntity refEntity, AnalysisScope analysisScope, - InspectionManager inspectionManager, - GlobalInspectionContext globalInspectionContext, - Object state) - { - if(!(refEntity instanceof RefPackage)) - { - return null; - } - final List children = refEntity.getChildren(); - if(children == null) - { - return null; - } - final Set modules = new HashSet(); - for(RefEntity child : children) - { - if(!(child instanceof RefClass)) - { - continue; - } - final RefClass refClass = (RefClass) child; - final RefModule module = refClass.getModule(); - modules.add(module); - } - if(modules.size() <= 1) - { - return null; - } - final String errorString = - InspectionGadgetsLocalize.packageInMultipleModulesProblemDescriptor(refEntity.getQualifiedName()).get(); - - return new CommonProblemDescriptor[]{ - inspectionManager.createProblemDescriptor(errorString) - }; - } + return new CommonProblemDescriptor[]{ + inspectionManager.createProblemDescriptor(errorString) + }; + } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/packaging/PackageWithTooFewClassesInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/packaging/PackageWithTooFewClassesInspection.java index 723c6ea0e..94a968057 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/packaging/PackageWithTooFewClassesInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/packaging/PackageWithTooFewClassesInspection.java @@ -32,58 +32,49 @@ import javax.swing.*; import java.util.List; -public abstract class PackageWithTooFewClassesInspection extends BaseGlobalInspection -{ +public abstract class PackageWithTooFewClassesInspection extends BaseGlobalInspection { + @SuppressWarnings({"PublicField"}) + public int limit = 3; - @SuppressWarnings({"PublicField"}) - public int limit = 3; + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.packageWithTooFewClassesDisplayName(); + } - @Nonnull - @Override - public String getDisplayName() - { - return InspectionGadgetsLocalize.packageWithTooFewClassesDisplayName().get(); - } + @Override + @Nullable + public CommonProblemDescriptor[] checkElement( + RefEntity refEntity, + AnalysisScope analysisScope, + InspectionManager inspectionManager, + GlobalInspectionContext globalInspectionContext, + Object state + ) { + if (!(refEntity instanceof RefPackage)) { + return null; + } + final List children = refEntity.getChildren(); + if (children == null) { + return null; + } + int numClasses = 0; + for (RefEntity child : children) { + if (child instanceof RefClass) { + numClasses++; + } + } + if (numClasses >= limit || numClasses == 0) { + return null; + } + final LocalizeValue errorString = + InspectionGadgetsLocalize.packageWithTooFewClassesProblemDescriptor(refEntity.getQualifiedName(), numClasses, limit); + return new CommonProblemDescriptor[]{inspectionManager.createProblemDescriptor(errorString.get())}; + } - @Override - @Nullable - public CommonProblemDescriptor[] checkElement( - RefEntity refEntity, - AnalysisScope analysisScope, - InspectionManager inspectionManager, - GlobalInspectionContext globalInspectionContext, - Object state) - { - if(!(refEntity instanceof RefPackage)) - { - return null; - } - final List children = refEntity.getChildren(); - if(children == null) - { - return null; - } - int numClasses = 0; - for(RefEntity child : children) - { - if(child instanceof RefClass) - { - numClasses++; - } - } - if(numClasses >= limit || numClasses == 0) - { - return null; - } - final LocalizeValue errorString = - InspectionGadgetsLocalize.packageWithTooFewClassesProblemDescriptor(refEntity.getQualifiedName(), numClasses, limit); - return new CommonProblemDescriptor[]{inspectionManager.createProblemDescriptor(errorString.get())}; - } - - @Override - public JComponent createOptionsPanel() - { - LocalizeValue message = InspectionGadgetsLocalize.packageWithTooFewClassesMinOption(); - return new SingleIntegerFieldOptionsPanel(message.get(), this, "limit"); - } + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.packageWithTooFewClassesMinOption(); + return new SingleIntegerFieldOptionsPanel(message.get(), this, "limit"); + } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/packaging/PackageWithTooManyClassesInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/packaging/PackageWithTooManyClassesInspection.java index 385aa1404..0f6be0740 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/packaging/PackageWithTooManyClassesInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/packaging/PackageWithTooManyClassesInspection.java @@ -32,58 +32,49 @@ import javax.swing.*; import java.util.List; -public abstract class PackageWithTooManyClassesInspection extends BaseGlobalInspection -{ +public abstract class PackageWithTooManyClassesInspection extends BaseGlobalInspection { + @SuppressWarnings({"PublicField"}) + public int limit = 10; - @SuppressWarnings({"PublicField"}) - public int limit = 10; + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.packageWithTooManyClassesDisplayName(); + } - @Nonnull - @Override - public String getDisplayName() - { - return InspectionGadgetsLocalize.packageWithTooManyClassesDisplayName().get(); - } + @Override + @Nullable + public CommonProblemDescriptor[] checkElement( + RefEntity refEntity, + AnalysisScope analysisScope, + InspectionManager inspectionManager, + GlobalInspectionContext globalInspectionContext, + Object state + ) { + if (!(refEntity instanceof RefPackage)) { + return null; + } + final List children = refEntity.getChildren(); + if (children == null) { + return null; + } + int numClasses = 0; + for (RefEntity child : children) { + if (child instanceof RefClass) { + numClasses++; + } + } + if (numClasses <= limit) { + return null; + } + final LocalizeValue errorString = + InspectionGadgetsLocalize.packageWithTooManyClassesProblemDescriptor(refEntity.getQualifiedName(), numClasses, limit); + return new CommonProblemDescriptor[]{inspectionManager.createProblemDescriptor(errorString.get())}; + } - @Override - @Nullable - public CommonProblemDescriptor[] checkElement( - RefEntity refEntity, - AnalysisScope analysisScope, - InspectionManager inspectionManager, - GlobalInspectionContext globalInspectionContext, - Object state) - { - if(!(refEntity instanceof RefPackage)) - { - return null; - } - final List children = refEntity.getChildren(); - if(children == null) - { - return null; - } - int numClasses = 0; - for(RefEntity child : children) - { - if(child instanceof RefClass) - { - numClasses++; - } - } - if(numClasses <= limit) - { - return null; - } - final LocalizeValue errorString = - InspectionGadgetsLocalize.packageWithTooManyClassesProblemDescriptor(refEntity.getQualifiedName(), numClasses, limit); - return new CommonProblemDescriptor[]{inspectionManager.createProblemDescriptor(errorString.get())}; - } - - @Override - public JComponent createOptionsPanel() - { - LocalizeValue message = InspectionGadgetsLocalize.packageWithTooManyClassesMaxOption(); - return new SingleIntegerFieldOptionsPanel(message.get(), this, "limit"); - } + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.packageWithTooManyClassesMaxOption(); + return new SingleIntegerFieldOptionsPanel(message.get(), this, "limit"); + } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/ObjectAllocationInLoopInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/ObjectAllocationInLoopInspection.java index 61c8c92d1..47defd7d6 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/ObjectAllocationInLoopInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/ObjectAllocationInLoopInspection.java @@ -23,109 +23,98 @@ 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 ObjectAllocationInLoopInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.objectAllocationInLoopDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.objectAllocationInLoopDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.objectAllocationInLoopProblemDescriptor().get(); - } - - public BaseInspectionVisitor buildVisitor() { - return new ObjectAllocationInLoopsVisitor(); - } - - private static class ObjectAllocationInLoopsVisitor - extends BaseInspectionVisitor { + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.objectAllocationInLoopProblemDescriptor().get(); + } - @Override - public void visitNewExpression(@Nonnull PsiNewExpression expression) { - super.visitNewExpression(expression); - if (!ControlFlowUtils.isInLoop(expression)) { - return; - } - if (ControlFlowUtils.isInExitStatement(expression)) { - return; - } - final PsiStatement newExpressionStatement = - PsiTreeUtil.getParentOfType(expression, PsiStatement.class); - if (newExpressionStatement == null) { - return; - } - final PsiStatement parentStatement = - PsiTreeUtil.getParentOfType(newExpressionStatement, - PsiStatement.class); - if (!ControlFlowUtils.statementMayCompleteNormally( - parentStatement)) { - return; - } - if (isAllocatedOnlyOnce(expression)) { - return; - } - registerError(expression); + public BaseInspectionVisitor buildVisitor() { + return new ObjectAllocationInLoopsVisitor(); } - private static boolean isAllocatedOnlyOnce( - PsiNewExpression expression) { - final PsiElement parent = expression.getParent(); - if (!(parent instanceof PsiAssignmentExpression)) { - return false; - } - final PsiAssignmentExpression assignmentExpression = - (PsiAssignmentExpression)parent; - final PsiExpression lExpression = - assignmentExpression.getLExpression(); - if (!(lExpression instanceof PsiReferenceExpression)) { - return false; - } - final PsiIfStatement ifStatement = - PsiTreeUtil.getParentOfType(assignmentExpression, - PsiIfStatement.class); - if (ifStatement == null) { - return false; - } - final PsiExpression condition = ifStatement.getCondition(); - if (!(condition instanceof PsiBinaryExpression)) { - return false; - } - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)condition; - if (binaryExpression.getOperationTokenType() != - JavaTokenType.EQEQ) { - return false; - } - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)lExpression; - final PsiExpression lhs = binaryExpression.getLOperand(); - final PsiExpression rhs = binaryExpression.getROperand(); - if (lhs instanceof PsiLiteralExpression) { - if (!"null".equals(lhs.getText())) { - return false; - } - if (!(rhs instanceof PsiReferenceExpression)) { - return false; - } - return referenceExpression.getText().equals(rhs.getText()); - } - else if (rhs instanceof PsiLiteralExpression) { - if (!"null".equals(rhs.getText())) { - return false; + private static class ObjectAllocationInLoopsVisitor + extends BaseInspectionVisitor { + + @Override + public void visitNewExpression(@Nonnull PsiNewExpression expression) { + super.visitNewExpression(expression); + if (!ControlFlowUtils.isInLoop(expression)) { + return; + } + if (ControlFlowUtils.isInExitStatement(expression)) { + return; + } + final PsiStatement newExpressionStatement = PsiTreeUtil.getParentOfType(expression, PsiStatement.class); + if (newExpressionStatement == null) { + return; + } + final PsiStatement parentStatement = PsiTreeUtil.getParentOfType(newExpressionStatement, PsiStatement.class); + if (!ControlFlowUtils.statementMayCompleteNormally(parentStatement)) { + return; + } + if (isAllocatedOnlyOnce(expression)) { + return; + } + registerError(expression); } - if (!(lhs instanceof PsiReferenceExpression)) { - return false; + + private static boolean isAllocatedOnlyOnce(PsiNewExpression expression) { + final PsiElement parent = expression.getParent(); + if (!(parent instanceof PsiAssignmentExpression)) { + return false; + } + final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression) parent; + final PsiExpression lExpression = assignmentExpression.getLExpression(); + if (!(lExpression instanceof PsiReferenceExpression)) { + return false; + } + final PsiIfStatement ifStatement = PsiTreeUtil.getParentOfType(assignmentExpression, PsiIfStatement.class); + if (ifStatement == null) { + return false; + } + final PsiExpression condition = ifStatement.getCondition(); + if (!(condition instanceof PsiBinaryExpression)) { + return false; + } + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression) condition; + if (binaryExpression.getOperationTokenType() != JavaTokenType.EQEQ) { + return false; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) lExpression; + final PsiExpression lhs = binaryExpression.getLOperand(); + final PsiExpression rhs = binaryExpression.getROperand(); + if (lhs instanceof PsiLiteralExpression) { + if (!"null".equals(lhs.getText())) { + return false; + } + if (!(rhs instanceof PsiReferenceExpression)) { + return false; + } + return referenceExpression.getText().equals(rhs.getText()); + } + else if (rhs instanceof PsiLiteralExpression) { + if (!"null".equals(rhs.getText())) { + return false; + } + if (!(lhs instanceof PsiReferenceExpression)) { + return false; + } + return referenceExpression.getText().equals(lhs.getText()); + } + else { + return false; + } } - return referenceExpression.getText().equals(lhs.getText()); - } - else { - return false; - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/RandomDoubleForRandomIntegerInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/RandomDoubleForRandomIntegerInspection.java index 1433d1487..367c34911 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/RandomDoubleForRandomIntegerInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/RandomDoubleForRandomIntegerInspection.java @@ -26,174 +26,156 @@ 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.jetbrains.annotations.NonNls; @ExtensionImpl -public class RandomDoubleForRandomIntegerInspection - extends BaseInspection { - - @Override - @Nonnull - public String getID() { - return "UsingRandomNextDoubleForRandomInteger"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.randomDoubleForRandomIntegerDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.randomDoubleForRandomIntegerProblemDescriptor().get(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new RandomDoubleForRandomIntegerFix(); - } +public class RandomDoubleForRandomIntegerInspection extends BaseInspection { + @Override + @Nonnull + public String getID() { + return "UsingRandomNextDoubleForRandomInteger"; + } - private static class RandomDoubleForRandomIntegerFix - extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.randomDoubleForRandomIntegerDisplayName(); + } + @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.randomDoubleForRandomIntegerReplaceQuickfix().get(); + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.randomDoubleForRandomIntegerProblemDescriptor().get(); } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiIdentifier name = - (PsiIdentifier)descriptor.getPsiElement(); - final PsiReferenceExpression expression = - (PsiReferenceExpression)name.getParent(); - if (expression == null) { - return; - } - final PsiExpression call = (PsiExpression)expression.getParent(); - final PsiExpression qualifier = expression.getQualifierExpression(); - if (qualifier == null) { - return; - } - final String qualifierText = qualifier.getText(); - final PsiBinaryExpression multiplication = - (PsiBinaryExpression)getContainingExpression(call); - if (multiplication == null) { - return; - } - final PsiExpression cast = getContainingExpression(multiplication); - if (cast == null) { - return; - } - final PsiExpression multiplierExpression; - final PsiExpression lhs = multiplication.getLOperand(); - final PsiExpression strippedLhs = - ParenthesesUtils.stripParentheses(lhs); - if (call.equals(strippedLhs)) { - multiplierExpression = multiplication.getROperand(); - } - else { - multiplierExpression = lhs; - } - assert multiplierExpression != null; - final String multiplierText = multiplierExpression.getText(); - @NonNls final String nextInt = ".nextInt((int) "; - replaceExpression(cast, qualifierText + nextInt + multiplierText + - ')'); + public InspectionGadgetsFix buildFix(Object... infos) { + return new RandomDoubleForRandomIntegerFix(); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new RandomDoubleForRandomIntegerVisitor(); - } + private static class RandomDoubleForRandomIntegerFix extends InspectionGadgetsFix { + @Nonnull + public LocalizeValue getName() { + return InspectionGadgetsLocalize.randomDoubleForRandomIntegerReplaceQuickfix(); + } - private static class RandomDoubleForRandomIntegerVisitor - extends BaseInspectionVisitor { + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiIdentifier name = (PsiIdentifier) descriptor.getPsiElement(); + final PsiReferenceExpression expression = (PsiReferenceExpression) name.getParent(); + if (expression == null) { + return; + } + final PsiExpression call = (PsiExpression) expression.getParent(); + final PsiExpression qualifier = expression.getQualifierExpression(); + if (qualifier == null) { + return; + } + final String qualifierText = qualifier.getText(); + final PsiBinaryExpression multiplication = (PsiBinaryExpression) getContainingExpression(call); + if (multiplication == null) { + return; + } + final PsiExpression cast = getContainingExpression(multiplication); + if (cast == null) { + return; + } + final PsiExpression multiplierExpression; + final PsiExpression lhs = multiplication.getLOperand(); + final PsiExpression strippedLhs = ParenthesesUtils.stripParentheses(lhs); + if (call.equals(strippedLhs)) { + multiplierExpression = multiplication.getROperand(); + } + else { + multiplierExpression = lhs; + } + assert multiplierExpression != null; + final String multiplierText = multiplierExpression.getText(); + final String nextInt = ".nextInt((int) "; + replaceExpression(cast, qualifierText + nextInt + multiplierText + ')'); + } + } @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression call) { - super.visitMethodCallExpression(call); - final PsiReferenceExpression methodExpression = - call.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - @NonNls final String nextDouble = "nextDouble"; - if (!nextDouble.equals(methodName)) { - return; - } - final PsiMethod method = call.resolveMethod(); - if (method == null) { - return; - } - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null) { - return; - } - final String className = containingClass.getQualifiedName(); - if (!"java.util.Random".equals(className)) { - return; - } - final PsiExpression possibleMultiplierExpression = - getContainingExpression(call); - if (!isMultiplier(possibleMultiplierExpression)) { - return; - } - final PsiExpression possibleIntCastExpression = - getContainingExpression(possibleMultiplierExpression); - if (!isIntCast(possibleIntCastExpression)) { - return; - } - registerMethodCallError(call); + public BaseInspectionVisitor buildVisitor() { + return new RandomDoubleForRandomIntegerVisitor(); } - private static boolean isMultiplier(PsiExpression expression) { - if (expression == null) { - return false; - } - if (!(expression instanceof PsiBinaryExpression)) { - return false; - } - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)expression; - final IElementType tokenType = binaryExpression.getOperationTokenType(); - return JavaTokenType.ASTERISK.equals(tokenType); - } + private static class RandomDoubleForRandomIntegerVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression call) { + super.visitMethodCallExpression(call); + final PsiReferenceExpression methodExpression = call.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + final String nextDouble = "nextDouble"; + if (!nextDouble.equals(methodName)) { + return; + } + final PsiMethod method = call.resolveMethod(); + if (method == null) { + return; + } + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) { + return; + } + final String className = containingClass.getQualifiedName(); + if (!"java.util.Random".equals(className)) { + return; + } + final PsiExpression possibleMultiplierExpression = getContainingExpression(call); + if (!isMultiplier(possibleMultiplierExpression)) { + return; + } + final PsiExpression possibleIntCastExpression = getContainingExpression(possibleMultiplierExpression); + if (!isIntCast(possibleIntCastExpression)) { + return; + } + registerMethodCallError(call); + } + + private static boolean isMultiplier(PsiExpression expression) { + if (expression == null) { + return false; + } + if (!(expression instanceof PsiBinaryExpression)) { + return false; + } + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression) expression; + final IElementType tokenType = binaryExpression.getOperationTokenType(); + return JavaTokenType.ASTERISK.equals(tokenType); + } - private static boolean isIntCast(PsiExpression expression) { - if (expression == null) { - return false; - } - if (!(expression instanceof PsiTypeCastExpression)) { - return false; - } - final PsiTypeCastExpression castExpression = - (PsiTypeCastExpression)expression; - final PsiType type = castExpression.getType(); - return PsiType.INT.equals(type); + private static boolean isIntCast(PsiExpression expression) { + if (expression == null) { + return false; + } + if (!(expression instanceof PsiTypeCastExpression)) { + return false; + } + final PsiTypeCastExpression castExpression = (PsiTypeCastExpression) expression; + final PsiType type = castExpression.getType(); + return PsiType.INT.equals(type); + } } - } - @Nullable - static PsiExpression getContainingExpression(PsiExpression expression) { - PsiElement ancestor = expression.getParent(); - while (true) { - if (ancestor == null) { - return null; - } - if (!(ancestor instanceof PsiExpression)) { - return null; - } - if (!(ancestor instanceof PsiParenthesizedExpression)) { - return (PsiExpression)ancestor; - } - ancestor = ancestor.getParent(); + @Nullable + static PsiExpression getContainingExpression(PsiExpression expression) { + PsiElement ancestor = expression.getParent(); + while (true) { + if (ancestor == null) { + return null; + } + if (!(ancestor instanceof PsiExpression)) { + return null; + } + if (!(ancestor instanceof PsiParenthesizedExpression)) { + return (PsiExpression) ancestor; + } + ancestor = ancestor.getParent(); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/RedundantStringFormatCallInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/RedundantStringFormatCallInspection.java index 776206ca6..0544b616d 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/RedundantStringFormatCallInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/RedundantStringFormatCallInspection.java @@ -25,135 +25,129 @@ 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 RedundantStringFormatCallInspection extends BaseInspection { - - @Override - @Nls - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.redundantStringFormatCallDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.redundantStringFormatCallProblemDescriptor().get(); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new RedundantStringFormatCallFix(); - } - - private static class RedundantStringFormatCallFix - extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.redundantStringFormatCallDisplayName(); + } @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.redundantStringFormatCallQuickfix().get(); + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.redundantStringFormatCallProblemDescriptor().get(); } @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 PsiExpressionList argumentList = methodCallExpression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - final PsiExpression lastArgument = arguments[arguments.length - 1]; - methodCallExpression.replace(lastArgument); + protected InspectionGadgetsFix buildFix(Object... infos) { + return new RedundantStringFormatCallFix(); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new RedundantStringFormatCallVisitor(); - } + private static class RedundantStringFormatCallFix extends InspectionGadgetsFix { + @Override + @Nonnull + public LocalizeValue getName() { + return InspectionGadgetsLocalize.redundantStringFormatCallQuickfix(); + } - private static class RedundantStringFormatCallVisitor extends BaseInspectionVisitor { + @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 PsiExpressionList argumentList = methodCallExpression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + final PsiExpression lastArgument = arguments[arguments.length - 1]; + methodCallExpression.replace(lastArgument); + } + } @Override - public void visitMethodCallExpression(PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - @NonNls final String methodName = methodExpression.getReferenceName(); - if (!"format".equals(methodName)) { - return; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length > 2 || arguments.length == 0) { - return; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return; - } - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return; - } - final String className = aClass.getQualifiedName(); - if (!CommonClassNames.JAVA_LANG_STRING.equals(className)) { - return; - } - final PsiExpression firstArgument = arguments[0]; - final PsiType firstType = firstArgument.getType(); - if (firstType == null || containsPercentN(firstArgument)) { - return; - } - if (firstType.equalsToText(CommonClassNames.JAVA_LANG_STRING) && arguments.length == 1) { - registerMethodCallError(expression); - } - else if (firstType.equalsToText("java.util.Locale")) { - if (arguments.length != 2) { - return; - } - final PsiExpression secondArgument = arguments[1]; - final PsiType secondType = secondArgument.getType(); - if (secondType == null) { - return; - } - if (secondType.equalsToText(CommonClassNames.JAVA_LANG_STRING)) { - registerMethodCallError(expression); - } - } + public BaseInspectionVisitor buildVisitor() { + return new RedundantStringFormatCallVisitor(); } - private static boolean containsPercentN(PsiExpression expression) { - if (expression == null) { - return false; - } - if (expression instanceof PsiLiteralExpression) { - final PsiLiteralExpression literalExpression = (PsiLiteralExpression)expression; - @NonNls final String expressionText = literalExpression.getText(); - return expressionText.contains("%n"); - } - if (expression instanceof PsiPolyadicExpression) { - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)expression; - final IElementType tokenType = polyadicExpression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.PLUS)) { - return false; + private static class RedundantStringFormatCallVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!"format".equals(methodName)) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length > 2 || arguments.length == 0) { + return; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return; + } + final String className = aClass.getQualifiedName(); + if (!CommonClassNames.JAVA_LANG_STRING.equals(className)) { + return; + } + final PsiExpression firstArgument = arguments[0]; + final PsiType firstType = firstArgument.getType(); + if (firstType == null || containsPercentN(firstArgument)) { + return; + } + if (firstType.equalsToText(CommonClassNames.JAVA_LANG_STRING) && arguments.length == 1) { + registerMethodCallError(expression); + } + else if (firstType.equalsToText("java.util.Locale")) { + if (arguments.length != 2) { + return; + } + final PsiExpression secondArgument = arguments[1]; + final PsiType secondType = secondArgument.getType(); + if (secondType == null) { + return; + } + if (secondType.equalsToText(CommonClassNames.JAVA_LANG_STRING)) { + registerMethodCallError(expression); + } + } } - final PsiExpression[] operands = polyadicExpression.getOperands(); - for (PsiExpression operand : operands) { - if (containsPercentN(operand)) { - return true; - } + + private static boolean containsPercentN(PsiExpression expression) { + if (expression == null) { + return false; + } + if (expression instanceof PsiLiteralExpression) { + final PsiLiteralExpression literalExpression = (PsiLiteralExpression) expression; + final String expressionText = literalExpression.getText(); + return expressionText.contains("%n"); + } + if (expression instanceof PsiPolyadicExpression) { + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) expression; + final IElementType tokenType = polyadicExpression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.PLUS)) { + return false; + } + final PsiExpression[] operands = polyadicExpression.getOperands(); + for (PsiExpression operand : operands) { + if (containsPercentN(operand)) { + return true; + } + } + } + return false; } - } - return false; } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/SetReplaceableByEnumSetInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/SetReplaceableByEnumSetInspection.java index adc59a4bd..b40c4424d 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/SetReplaceableByEnumSetInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/SetReplaceableByEnumSetInspection.java @@ -21,14 +21,15 @@ 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 SetReplaceableByEnumSetInspection extends BaseInspection { - @Override @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.setReplaceableByEnumSetDisplayName().get(); + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.setReplaceableByEnumSetDisplayName(); } @Override diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringBufferMustHaveInitialCapacityInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringBufferMustHaveInitialCapacityInspection.java index 15e7f1d70..ab61fcb99 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringBufferMustHaveInitialCapacityInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringBufferMustHaveInitialCapacityInspection.java @@ -21,57 +21,53 @@ 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 StringBufferMustHaveInitialCapacityInspection - extends BaseInspection { - - @Override - @Nonnull - public String getID() { - return "StringBufferWithoutInitialCapacity"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.stringBufferMustHaveInitialCapacityDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.stringBufferMustHaveInitialCapacityProblemDescriptor().get(); - } +public class StringBufferMustHaveInitialCapacityInspection extends BaseInspection { + @Override + @Nonnull + public String getID() { + return "StringBufferWithoutInitialCapacity"; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new StringBufferInitialCapacityVisitor(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.stringBufferMustHaveInitialCapacityDisplayName(); + } - private static class StringBufferInitialCapacityVisitor - extends BaseInspectionVisitor { + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.stringBufferMustHaveInitialCapacityProblemDescriptor().get(); + } @Override - public void visitNewExpression( - @Nonnull PsiNewExpression expression) { - super.visitNewExpression(expression); - final PsiType type = expression.getType(); + public BaseInspectionVisitor buildVisitor() { + return new StringBufferInitialCapacityVisitor(); + } + + private static class StringBufferInitialCapacityVisitor extends BaseInspectionVisitor { + @Override + public void visitNewExpression(@Nonnull PsiNewExpression expression) { + super.visitNewExpression(expression); + final PsiType type = expression.getType(); - if (!TypeUtils.typeEquals(CommonClassNames.JAVA_LANG_STRING_BUFFER, type) && - !TypeUtils.typeEquals(CommonClassNames.JAVA_LANG_STRING_BUILDER, type)) { - return; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - if (argumentList == null) { - return; - } - final PsiExpression[] args = argumentList.getExpressions(); - if (args.length != 0) { - return; - } - registerError(expression); + if (!TypeUtils.typeEquals(CommonClassNames.JAVA_LANG_STRING_BUFFER, type) + && !TypeUtils.typeEquals(CommonClassNames.JAVA_LANG_STRING_BUILDER, type)) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + if (argumentList == null) { + return; + } + final PsiExpression[] args = argumentList.getExpressions(); + if (args.length != 0) { + return; + } + registerError(expression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringBufferToStringInConcatenationInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringBufferToStringInConcatenationInspection.java index a0b7929e6..f84fa5519 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringBufferToStringInConcatenationInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringBufferToStringInConcatenationInspection.java @@ -26,99 +26,89 @@ 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 StringBufferToStringInConcatenationInspection - extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.stringBufferToStringInConcatenationDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.stringBufferToStringInConcatenationProblemDescriptor().get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new StringBufferToStringVisitor(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new StringBufferToStringFix(); - } - - private static class StringBufferToStringFix extends InspectionGadgetsFix { - +public class StringBufferToStringInConcatenationInspection extends BaseInspection { @Nonnull - public String getName() { - return InspectionGadgetsLocalize.stringBufferToStringInConcatenationRemoveQuickfix().get(); + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.stringBufferToStringInConcatenationDisplayName(); } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement methodNameToken = descriptor.getPsiElement(); - final PsiElement methodCallExpression = methodNameToken.getParent(); - assert methodCallExpression != null; - final PsiMethodCallExpression methodCall = - (PsiMethodCallExpression)methodCallExpression.getParent(); - assert methodCall != null; - final PsiReferenceExpression expression = - methodCall.getMethodExpression(); - final PsiExpression qualifier = expression.getQualifierExpression(); - assert qualifier != null; - final String newExpression = qualifier.getText(); - replaceExpression(methodCall, newExpression); + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.stringBufferToStringInConcatenationProblemDescriptor().get(); } - } - private static class StringBufferToStringVisitor - extends BaseInspectionVisitor { + @Override + public BaseInspectionVisitor buildVisitor() { + return new StringBufferToStringVisitor(); + } @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - if (!ExpressionUtils.isStringConcatenationOperand(expression)) { - return; - } - if (!isStringBufferToString(expression)) { - return; - } - registerMethodCallError(expression); + public InspectionGadgetsFix buildFix(Object... infos) { + return new StringBufferToStringFix(); } - private static boolean isStringBufferToString( - PsiMethodCallExpression expression) { - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - final String referenceName = methodExpression.getReferenceName(); - if (!HardcodedMethodConstants.TO_STRING.equals(referenceName)) { - return false; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return false; - } - final PsiParameterList parameterList = method.getParameterList(); - if (parameterList.getParametersCount() != 0) { - return false; - } - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return false; - } - final String className = aClass.getQualifiedName(); - return CommonClassNames.JAVA_LANG_STRING_BUFFER.equals(className) - || CommonClassNames.JAVA_LANG_STRING_BUILDER.equals(className); + private static class StringBufferToStringFix extends InspectionGadgetsFix { + @Nonnull + public LocalizeValue getName() { + return InspectionGadgetsLocalize.stringBufferToStringInConcatenationRemoveQuickfix(); + } + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement methodNameToken = descriptor.getPsiElement(); + final PsiElement methodCallExpression = methodNameToken.getParent(); + assert methodCallExpression != null; + final PsiMethodCallExpression methodCall = (PsiMethodCallExpression) methodCallExpression.getParent(); + assert methodCall != null; + final PsiReferenceExpression expression = methodCall.getMethodExpression(); + final PsiExpression qualifier = expression.getQualifierExpression(); + assert qualifier != null; + final String newExpression = qualifier.getText(); + replaceExpression(methodCall, newExpression); + } + } + + private static class StringBufferToStringVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + if (!ExpressionUtils.isStringConcatenationOperand(expression)) { + return; + } + if (!isStringBufferToString(expression)) { + return; + } + registerMethodCallError(expression); + } + + private static boolean isStringBufferToString(PsiMethodCallExpression expression) { + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String referenceName = methodExpression.getReferenceName(); + if (!HardcodedMethodConstants.TO_STRING.equals(referenceName)) { + return false; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return false; + } + final PsiParameterList parameterList = method.getParameterList(); + if (parameterList.getParametersCount() != 0) { + return false; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return false; + } + final String className = aClass.getQualifiedName(); + return CommonClassNames.JAVA_LANG_STRING_BUFFER.equals(className) + || CommonClassNames.JAVA_LANG_STRING_BUILDER.equals(className); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringConcatenationInLoopsInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringConcatenationInLoopsInspection.java index b37f2abdc..45e873e18 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringConcatenationInLoopsInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringConcatenationInLoopsInspection.java @@ -35,152 +35,151 @@ @ExtensionImpl public class StringConcatenationInLoopsInspection extends BaseInspection { + @SuppressWarnings("PublicField") + public boolean m_ignoreUnlessAssigned = true; - @SuppressWarnings("PublicField") - public boolean m_ignoreUnlessAssigned = true; - - @Override - @Nonnull - public String getID() { - return "StringContatenationInLoop"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.stringConcatenationInLoopsDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.stringConcatenationInLoopsProblemDescriptor().get(); - } - - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.stringConcatenationInLoopsOnlyOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "m_ignoreUnlessAssigned"); - } + @Override + @Nonnull + public String getID() { + return "StringContatenationInLoop"; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new StringConcatenationInLoopsVisitor(); - } + @Override + @Nonnull + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.stringConcatenationInLoopsDisplayName(); + } - private class StringConcatenationInLoopsVisitor extends BaseInspectionVisitor { + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.stringConcatenationInLoopsProblemDescriptor().get(); + } @Override - public void visitPolyadicExpression(PsiPolyadicExpression expression) { - super.visitPolyadicExpression(expression); - final PsiExpression[] operands = expression.getOperands(); - if (operands.length <= 1) { - return; - } - final IElementType tokenType = expression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.PLUS)) { - return; - } - final PsiType type = expression.getType(); - if (!TypeUtils.isJavaLangString(type)) { - return; - } - if (!ControlFlowUtils.isInLoop(expression)) { - return; - } - if (ControlFlowUtils.isInExitStatement(expression)) { - return; - } - if (ExpressionUtils.isEvaluatedAtCompileTime(expression)) { - return; - } - if (containingStatementExits(expression)) { - return; - } - if (m_ignoreUnlessAssigned && !isAppendedRepeatedly(expression)) { - return; - } - final PsiJavaToken sign = expression.getTokenBeforeOperand(operands[1]); - registerError(sign); + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.stringConcatenationInLoopsOnlyOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "m_ignoreUnlessAssigned"); } @Override - public void visitAssignmentExpression(@Nonnull PsiAssignmentExpression expression) { - super.visitAssignmentExpression(expression); - if (expression.getRExpression() == null) { - return; - } - final PsiJavaToken sign = expression.getOperationSign(); - final IElementType tokenType = sign.getTokenType(); - if (!tokenType.equals(JavaTokenType.PLUSEQ)) { - return; - } - PsiExpression lhs = expression.getLExpression(); - final PsiType type = lhs.getType(); - if (type == null) { - return; - } - if (!TypeUtils.isJavaLangString(type)) { - return; - } - if (!ControlFlowUtils.isInLoop(expression)) { - return; - } - if (ControlFlowUtils.isInExitStatement(expression)) { - return; - } - if (containingStatementExits(expression)) { - return; - } - if (m_ignoreUnlessAssigned) { - while (lhs instanceof PsiParenthesizedExpression) { - final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)lhs; - lhs = parenthesizedExpression.getExpression(); + public BaseInspectionVisitor buildVisitor() { + return new StringConcatenationInLoopsVisitor(); + } + + private class StringConcatenationInLoopsVisitor extends BaseInspectionVisitor { + + @Override + public void visitPolyadicExpression(PsiPolyadicExpression expression) { + super.visitPolyadicExpression(expression); + final PsiExpression[] operands = expression.getOperands(); + if (operands.length <= 1) { + return; + } + final IElementType tokenType = expression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.PLUS)) { + return; + } + final PsiType type = expression.getType(); + if (!TypeUtils.isJavaLangString(type)) { + return; + } + if (!ControlFlowUtils.isInLoop(expression)) { + return; + } + if (ControlFlowUtils.isInExitStatement(expression)) { + return; + } + if (ExpressionUtils.isEvaluatedAtCompileTime(expression)) { + return; + } + if (containingStatementExits(expression)) { + return; + } + if (m_ignoreUnlessAssigned && !isAppendedRepeatedly(expression)) { + return; + } + final PsiJavaToken sign = expression.getTokenBeforeOperand(operands[1]); + registerError(sign); } - if (!(lhs instanceof PsiReferenceExpression)) { - return; + + @Override + public void visitAssignmentExpression(@Nonnull PsiAssignmentExpression expression) { + super.visitAssignmentExpression(expression); + if (expression.getRExpression() == null) { + return; + } + final PsiJavaToken sign = expression.getOperationSign(); + final IElementType tokenType = sign.getTokenType(); + if (!tokenType.equals(JavaTokenType.PLUSEQ)) { + return; + } + PsiExpression lhs = expression.getLExpression(); + final PsiType type = lhs.getType(); + if (type == null) { + return; + } + if (!TypeUtils.isJavaLangString(type)) { + return; + } + if (!ControlFlowUtils.isInLoop(expression)) { + return; + } + if (ControlFlowUtils.isInExitStatement(expression)) { + return; + } + if (containingStatementExits(expression)) { + return; + } + if (m_ignoreUnlessAssigned) { + while (lhs instanceof PsiParenthesizedExpression) { + final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression) lhs; + lhs = parenthesizedExpression.getExpression(); + } + if (!(lhs instanceof PsiReferenceExpression)) { + return; + } + } + registerError(sign); } - } - registerError(sign); - } - private boolean containingStatementExits(PsiElement element) { - final PsiStatement newExpressionStatement = PsiTreeUtil.getParentOfType(element, PsiStatement.class); - if (newExpressionStatement == null) { - return containingStatementExits(element); - } - final PsiStatement parentStatement = PsiTreeUtil.getParentOfType(newExpressionStatement, PsiStatement.class); - return !ControlFlowUtils.statementMayCompleteNormally(parentStatement); - } + private boolean containingStatementExits(PsiElement element) { + final PsiStatement newExpressionStatement = PsiTreeUtil.getParentOfType(element, PsiStatement.class); + if (newExpressionStatement == null) { + return containingStatementExits(element); + } + final PsiStatement parentStatement = PsiTreeUtil.getParentOfType(newExpressionStatement, PsiStatement.class); + return !ControlFlowUtils.statementMayCompleteNormally(parentStatement); + } - private boolean isAppendedRepeatedly(PsiExpression expression) { - PsiElement parent = expression.getParent(); - while (parent instanceof PsiParenthesizedExpression || parent instanceof PsiPolyadicExpression) { - parent = parent.getParent(); - } - if (!(parent instanceof PsiAssignmentExpression)) { - return false; - } - final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)parent; - PsiExpression lhs = assignmentExpression.getLExpression(); - while (lhs instanceof PsiParenthesizedExpression) { - final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)lhs; - lhs = parenthesizedExpression.getExpression(); - } - if (!(lhs instanceof PsiReferenceExpression)) { - return false; - } - if (assignmentExpression.getOperationTokenType() == JavaTokenType.PLUSEQ) { - return true; - } - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)lhs; - final PsiElement element = referenceExpression.resolve(); - if (!(element instanceof PsiVariable)) { - return false; - } - final PsiVariable variable = (PsiVariable)element; - final PsiExpression rhs = assignmentExpression.getRExpression(); - return rhs != null && VariableAccessUtils.variableIsUsed(variable, rhs); + private boolean isAppendedRepeatedly(PsiExpression expression) { + PsiElement parent = expression.getParent(); + while (parent instanceof PsiParenthesizedExpression || parent instanceof PsiPolyadicExpression) { + parent = parent.getParent(); + } + if (!(parent instanceof PsiAssignmentExpression)) { + return false; + } + final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression) parent; + PsiExpression lhs = assignmentExpression.getLExpression(); + while (lhs instanceof PsiParenthesizedExpression) { + final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression) lhs; + lhs = parenthesizedExpression.getExpression(); + } + if (!(lhs instanceof PsiReferenceExpression)) { + return false; + } + if (assignmentExpression.getOperationTokenType() == JavaTokenType.PLUSEQ) { + return true; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) lhs; + final PsiElement element = referenceExpression.resolve(); + if (!(element instanceof PsiVariable)) { + return false; + } + final PsiVariable variable = (PsiVariable) element; + final PsiExpression rhs = assignmentExpression.getRExpression(); + return rhs != null && VariableAccessUtils.variableIsUsed(variable, rhs); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringConcatenationInsideStringBufferAppendInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringConcatenationInsideStringBufferAppendInspection.java index 582efeb3e..493a06110 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringConcatenationInsideStringBufferAppendInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringConcatenationInsideStringBufferAppendInspection.java @@ -29,137 +29,135 @@ import consulo.language.psi.PsiElement; import consulo.language.psi.scope.GlobalSearchScope; 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 StringConcatenationInsideStringBufferAppendInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.stringConcatenationInsideStringBufferAppendDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.stringConcatenationInsideStringBufferAppendDisplayName().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - @Nonnull - @RequiredReadAction - public String buildErrorString(Object... infos) { - final PsiClass aClass = (PsiClass)infos[0]; - final String className = aClass.getName(); - return InspectionGadgetsLocalize.stringConcatenationInsideStringBufferAppendProblemDescriptor(className).get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new StringConcatenationInsideStringBufferAppendVisitor(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new ReplaceWithChainedAppendFix(); - } - - private static class ReplaceWithChainedAppendFix extends InspectionGadgetsFix { + @Override + public boolean isEnabledByDefault() { + return true; + } + @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.stringConcatenationInsideStringBufferAppendReplaceQuickfix().get(); + @RequiredReadAction + public String buildErrorString(Object... infos) { + final PsiClass aClass = (PsiClass) infos[0]; + final String className = aClass.getName(); + return InspectionGadgetsLocalize.stringConcatenationInsideStringBufferAppendProblemDescriptor(className).get(); } @Override - public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement methodNameElement = descriptor.getPsiElement(); - final PsiReferenceExpression methodExpression = (PsiReferenceExpression)methodNameElement.getParent(); - if (methodExpression == null) { - return; - } - final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)methodExpression.getParent(); - if (methodCallExpression == null) { - return; - } - final PsiExpression qualifier = methodExpression.getQualifierExpression(); - if (qualifier == null) { - return; - } - final PsiExpressionList argumentList = methodCallExpression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - final PsiExpression argument = arguments[0]; - final PsiExpression appendExpression = ChangeToAppendFix.buildAppendExpression(qualifier, argument); - if (appendExpression == null) { - return; - } - methodCallExpression.replace(appendExpression); + public BaseInspectionVisitor buildVisitor() { + return new StringConcatenationInsideStringBufferAppendVisitor(); } - } - - private static class StringConcatenationInsideStringBufferAppendVisitor extends BaseInspectionVisitor { @Override - public void visitMethodCallExpression(PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - @NonNls final String methodName = methodExpression.getReferenceName(); - if (!"append".equals(methodName)) { - return; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 1) { - return; - } - final PsiExpression argument = arguments[0]; - if (!isConcatenation(argument)) { - return; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return; - } - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null) { - return; - } - final String className = containingClass.getQualifiedName(); - if (CommonClassNames.JAVA_LANG_STRING_BUFFER.equals(className) - || CommonClassNames.JAVA_LANG_STRING_BUILDER.equals(className)) { - registerMethodCallError(expression, containingClass); - return; - } - final Project project = containingClass.getProject(); - final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); - final PsiClass appendableClass = psiFacade.findClass("java.lang.Appendable", GlobalSearchScope.allScope(project)); - if (appendableClass == null) { - return; - } - if (!InheritanceUtil.isInheritorOrSelf(containingClass, appendableClass, true)) { - return; - } - registerMethodCallError(expression, containingClass); + public InspectionGadgetsFix buildFix(Object... infos) { + return new ReplaceWithChainedAppendFix(); } - private static boolean isConcatenation(PsiExpression expression) { - if (expression instanceof PsiParenthesizedExpression) { - final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)expression; - return isConcatenation(parenthesizedExpression.getExpression()); - } - if (!(expression instanceof PsiPolyadicExpression)) { - return false; - } - if (PsiUtil.isConstantExpression(expression)) { - return false; - } - final PsiType type = expression.getType(); - if (type == null) { - return false; - } - return type.equalsToText(CommonClassNames.JAVA_LANG_STRING); + private static class ReplaceWithChainedAppendFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.stringConcatenationInsideStringBufferAppendReplaceQuickfix(); + } + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement methodNameElement = descriptor.getPsiElement(); + final PsiReferenceExpression methodExpression = (PsiReferenceExpression) methodNameElement.getParent(); + if (methodExpression == null) { + return; + } + final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression) methodExpression.getParent(); + if (methodCallExpression == null) { + return; + } + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (qualifier == null) { + return; + } + final PsiExpressionList argumentList = methodCallExpression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + final PsiExpression argument = arguments[0]; + final PsiExpression appendExpression = ChangeToAppendFix.buildAppendExpression(qualifier, argument); + if (appendExpression == null) { + return; + } + methodCallExpression.replace(appendExpression); + } + } + + private static class StringConcatenationInsideStringBufferAppendVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!"append".equals(methodName)) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 1) { + return; + } + final PsiExpression argument = arguments[0]; + if (!isConcatenation(argument)) { + return; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return; + } + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) { + return; + } + final String className = containingClass.getQualifiedName(); + if (CommonClassNames.JAVA_LANG_STRING_BUFFER.equals(className) + || CommonClassNames.JAVA_LANG_STRING_BUILDER.equals(className)) { + registerMethodCallError(expression, containingClass); + return; + } + final Project project = containingClass.getProject(); + final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); + final PsiClass appendableClass = psiFacade.findClass("java.lang.Appendable", GlobalSearchScope.allScope(project)); + if (appendableClass == null) { + return; + } + if (!InheritanceUtil.isInheritorOrSelf(containingClass, appendableClass, true)) { + return; + } + registerMethodCallError(expression, containingClass); + } + + private static boolean isConcatenation(PsiExpression expression) { + if (expression instanceof PsiParenthesizedExpression) { + final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression) expression; + return isConcatenation(parenthesizedExpression.getExpression()); + } + if (!(expression instanceof PsiPolyadicExpression)) { + return false; + } + if (PsiUtil.isConstantExpression(expression)) { + return false; + } + final PsiType type = expression.getType(); + if (type == null) { + return false; + } + return type.equalsToText(CommonClassNames.JAVA_LANG_STRING); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringConstructorInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringConstructorInspection.java index 8e8df440f..1cec69806 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringConstructorInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringConstructorInspection.java @@ -30,145 +30,137 @@ import consulo.project.Project; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; -import org.jetbrains.annotations.NonNls; import javax.swing.*; @ExtensionImpl public class StringConstructorInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean ignoreSubstringArguments = false; - /** - * @noinspection PublicField - */ - public boolean ignoreSubstringArguments = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.stringConstructorDisplayName().get(); - } - - @Override - @Nonnull - public String getID() { - return "RedundantStringConstructorCall"; - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.stringConstructorProblemDescriptor().get(); - } - - @Override - @Nullable - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.stringConstructorSubstringParameterOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreSubstringArguments"); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new StringConstructorVisitor(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - final Boolean noArguments = (Boolean)infos[0]; - return new StringConstructorFix(noArguments.booleanValue()); - } - - private static class StringConstructorFix extends InspectionGadgetsFix { - private final String m_name; - - private StringConstructorFix(boolean noArguments) { - m_name = noArguments - ? InspectionGadgetsLocalize.stringConstructorReplaceEmptyQuickfix().get() - : InspectionGadgetsLocalize.stringConstructorReplaceArgQuickfix().get(); + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.stringConstructorDisplayName(); + } + + @Override + @Nonnull + public String getID() { + return "RedundantStringConstructorCall"; } + @Override @Nonnull - public String getName() { - return m_name; + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.stringConstructorProblemDescriptor().get(); } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiNewExpression expression = - (PsiNewExpression)descriptor.getPsiElement(); - final PsiExpressionList argList = expression.getArgumentList(); - assert argList != null; - final PsiExpression[] args = argList.getExpressions(); - final String argText; - if (args.length == 1) { - argText = args[0].getText(); - } - else { - argText = "\"\""; - } - replaceExpression(expression, argText); + @Nullable + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.stringConstructorSubstringParameterOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreSubstringArguments"); } - } - private class StringConstructorVisitor - extends BaseInspectionVisitor { + @Override + public boolean isEnabledByDefault() { + return true; + } @Override - public void visitNewExpression( - @Nonnull PsiNewExpression expression) { - super.visitNewExpression(expression); - final PsiType type = expression.getType(); - if (!TypeUtils.isJavaLangString(type)) { - return; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - if (argumentList == null) { - return; - } - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length > 1) { - return; - } - if (arguments.length == 1) { - final PsiExpression argument = arguments[0]; - final PsiType parameterType = argument.getType(); - if (!TypeUtils.isJavaLangString(parameterType)) { - return; + public BaseInspectionVisitor buildVisitor() { + return new StringConstructorVisitor(); + } + + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + final Boolean noArguments = (Boolean) infos[0]; + return new StringConstructorFix(noArguments.booleanValue()); + } + + private static class StringConstructorFix extends InspectionGadgetsFix { + private final LocalizeValue myName; + + private StringConstructorFix(boolean noArguments) { + myName = noArguments + ? InspectionGadgetsLocalize.stringConstructorReplaceEmptyQuickfix() + : InspectionGadgetsLocalize.stringConstructorReplaceArgQuickfix(); } - if (ignoreSubstringArguments && - hasSubstringArgument(argument)) { - return; + + @Nonnull + @Override + public LocalizeValue getName() { + return myName; + } + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiNewExpression expression = (PsiNewExpression) descriptor.getPsiElement(); + final PsiExpressionList argList = expression.getArgumentList(); + assert argList != null; + final PsiExpression[] args = argList.getExpressions(); + final String argText; + if (args.length == 1) { + argText = args[0].getText(); + } + else { + argText = "\"\""; + } + replaceExpression(expression, argText); } - } - registerError(expression, Boolean.valueOf(arguments.length == 0)); } - private boolean hasSubstringArgument(PsiExpression argument) { - if (!(argument instanceof PsiMethodCallExpression)) { - return false; - } - final PsiMethodCallExpression methodCallExpression = - (PsiMethodCallExpression)argument; - final PsiReferenceExpression methodExpression = - methodCallExpression.getMethodExpression(); - final PsiElement element = methodExpression.resolve(); - if (!(element instanceof PsiMethod)) { - return false; - } - final PsiMethod method = (PsiMethod)element; - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return true; - } - final String className = aClass.getQualifiedName(); - @NonNls final String methodName = method.getName(); - return CommonClassNames.JAVA_LANG_STRING.equals(className) && methodName.equals("substring"); + private class StringConstructorVisitor extends BaseInspectionVisitor { + @Override + public void visitNewExpression(@Nonnull PsiNewExpression expression) { + super.visitNewExpression(expression); + final PsiType type = expression.getType(); + if (!TypeUtils.isJavaLangString(type)) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + if (argumentList == null) { + return; + } + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length > 1) { + return; + } + if (arguments.length == 1) { + final PsiExpression argument = arguments[0]; + final PsiType parameterType = argument.getType(); + if (!TypeUtils.isJavaLangString(parameterType)) { + return; + } + if (ignoreSubstringArguments && + hasSubstringArgument(argument)) { + return; + } + } + registerError(expression, Boolean.valueOf(arguments.length == 0)); + } + + private boolean hasSubstringArgument(PsiExpression argument) { + if (!(argument instanceof PsiMethodCallExpression)) { + return false; + } + final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression) argument; + final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); + final PsiElement element = methodExpression.resolve(); + if (!(element instanceof PsiMethod)) { + return false; + } + final PsiMethod method = (PsiMethod) element; + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return true; + } + final String className = aClass.getQualifiedName(); + final String methodName = method.getName(); + return CommonClassNames.JAVA_LANG_STRING.equals(className) && methodName.equals("substring"); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringEqualsEmptyStringInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringEqualsEmptyStringInspection.java index 6bb2d67ff..cfceb5086 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringEqualsEmptyStringInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringEqualsEmptyStringInspection.java @@ -29,190 +29,188 @@ 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 StringEqualsEmptyStringInspection extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.stringEqualsEmptyStringDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - final boolean useIsEmpty = (Boolean)infos[0]; - return useIsEmpty - ? InspectionGadgetsLocalize.stringEqualsEmptyStringIsEmptyProblemDescriptor().get() - : InspectionGadgetsLocalize.stringEqualsEmptyStringProblemDescriptor().get(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - final boolean useIsEmpty = (Boolean)infos[0]; - return new StringEqualsEmptyStringFix(useIsEmpty); - } - - private static class StringEqualsEmptyStringFix extends InspectionGadgetsFix { - - private final boolean useIsEmpty; - - public StringEqualsEmptyStringFix(boolean useIsEmpty) { - this.useIsEmpty = useIsEmpty; + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.stringEqualsEmptyStringDisplayName(); } + @Override @Nonnull - public String getName() { - return useIsEmpty - ? InspectionGadgetsLocalize.stringEqualsEmptyStringIsemptyQuickfix().get() - : InspectionGadgetsLocalize.stringEqualsEmptyStringQuickfix().get(); + protected String buildErrorString(Object... infos) { + final boolean useIsEmpty = (Boolean) infos[0]; + return useIsEmpty + ? InspectionGadgetsLocalize.stringEqualsEmptyStringIsEmptyProblemDescriptor().get() + : InspectionGadgetsLocalize.stringEqualsEmptyStringProblemDescriptor().get(); } @Override - public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiIdentifier name = (PsiIdentifier)descriptor.getPsiElement(); - final PsiReferenceExpression expression = (PsiReferenceExpression)name.getParent(); - if (expression == null) { - return; - } - final PsiMethodCallExpression call = (PsiMethodCallExpression)expression.getParent(); - final PsiExpressionList argumentList = call.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length == 0) { - return; - } - final PsiExpression qualifier = expression.getQualifierExpression(); - final PsiExpression argument = arguments[0]; - final String variableText; - final boolean addNullCheck; - if (ExpressionUtils.isEmptyStringLiteral(argument)) { - variableText = getRemainingText(qualifier); - addNullCheck = false; - } - else { - variableText = getRemainingText(argument); - addNullCheck = true; - } - StringBuilder newExpression; - if (addNullCheck) { - newExpression = new StringBuilder(variableText); - newExpression.append("!=null&&"); - } else { - newExpression = new StringBuilder(""); - } - final PsiElement parent = call.getParent(); - final PsiExpression expressionToReplace; - if (parent instanceof PsiExpression) { - final PsiExpression parentExpression = (PsiExpression)parent; - if (BoolUtils.isNegation(parentExpression)) { - expressionToReplace = parentExpression; - if (useIsEmpty) { - newExpression.append('!').append(variableText).append(".isEmpty()"); - } - else { - newExpression.append(variableText).append(".length()!=0"); - } + public InspectionGadgetsFix buildFix(Object... infos) { + final boolean useIsEmpty = (Boolean) infos[0]; + return new StringEqualsEmptyStringFix(useIsEmpty); + } + + private static class StringEqualsEmptyStringFix extends InspectionGadgetsFix { + private final boolean useIsEmpty; + + public StringEqualsEmptyStringFix(boolean useIsEmpty) { + this.useIsEmpty = useIsEmpty; } - else { - expressionToReplace = call; - if (useIsEmpty) { - newExpression.append(variableText).append(".isEmpty()"); - } - else { - newExpression.append(variableText).append(".length()==0"); - } + + @Nonnull + @Override + public LocalizeValue getName() { + return useIsEmpty + ? InspectionGadgetsLocalize.stringEqualsEmptyStringIsemptyQuickfix() + : InspectionGadgetsLocalize.stringEqualsEmptyStringQuickfix(); } - } - else { - expressionToReplace = call; - if (useIsEmpty) { - newExpression.append(variableText).append(".isEmpty()"); + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiIdentifier name = (PsiIdentifier) descriptor.getPsiElement(); + final PsiReferenceExpression expression = (PsiReferenceExpression) name.getParent(); + if (expression == null) { + return; + } + final PsiMethodCallExpression call = (PsiMethodCallExpression) expression.getParent(); + final PsiExpressionList argumentList = call.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length == 0) { + return; + } + final PsiExpression qualifier = expression.getQualifierExpression(); + final PsiExpression argument = arguments[0]; + final String variableText; + final boolean addNullCheck; + if (ExpressionUtils.isEmptyStringLiteral(argument)) { + variableText = getRemainingText(qualifier); + addNullCheck = false; + } + else { + variableText = getRemainingText(argument); + addNullCheck = true; + } + StringBuilder newExpression; + if (addNullCheck) { + newExpression = new StringBuilder(variableText); + newExpression.append("!=null&&"); + } + else { + newExpression = new StringBuilder(""); + } + final PsiElement parent = call.getParent(); + final PsiExpression expressionToReplace; + if (parent instanceof PsiExpression) { + final PsiExpression parentExpression = (PsiExpression) parent; + if (BoolUtils.isNegation(parentExpression)) { + expressionToReplace = parentExpression; + if (useIsEmpty) { + newExpression.append('!').append(variableText).append(".isEmpty()"); + } + else { + newExpression.append(variableText).append(".length()!=0"); + } + } + else { + expressionToReplace = call; + if (useIsEmpty) { + newExpression.append(variableText).append(".isEmpty()"); + } + else { + newExpression.append(variableText).append(".length()==0"); + } + } + } + else { + expressionToReplace = call; + if (useIsEmpty) { + newExpression.append(variableText).append(".isEmpty()"); + } + else { + newExpression.append(variableText).append(".length()==0"); + } + } + replaceExpression(expressionToReplace, newExpression.toString()); } - else { - newExpression.append(variableText).append(".length()==0"); + + private String getRemainingText(PsiExpression expression) { + if (useIsEmpty || !(expression instanceof PsiMethodCallExpression)) { + return expression.getText(); + } + // to replace stringBuffer.toString().equals("") with + // stringBuffer.length() == 0 + final PsiMethodCallExpression callExpression = (PsiMethodCallExpression) expression; + final PsiReferenceExpression methodExpression = callExpression.getMethodExpression(); + final String referenceName = methodExpression.getReferenceName(); + final PsiExpression qualifierExpression = methodExpression.getQualifierExpression(); + if (qualifierExpression == null) { + return expression.getText(); + } + final PsiType type = qualifierExpression.getType(); + if (HardcodedMethodConstants.TO_STRING.equals(referenceName) && type != null && (type.equalsToText( + CommonClassNames.JAVA_LANG_STRING_BUFFER) || type.equalsToText(CommonClassNames.JAVA_LANG_STRING_BUILDER))) { + return qualifierExpression.getText(); + } + else { + return expression.getText(); + } } - } - replaceExpression(expressionToReplace, newExpression.toString()); } - private String getRemainingText(PsiExpression expression) { - if (useIsEmpty || - !(expression instanceof PsiMethodCallExpression)) { - return expression.getText(); - } - // to replace stringBuffer.toString().equals("") with - // stringBuffer.length() == 0 - final PsiMethodCallExpression callExpression = (PsiMethodCallExpression)expression; - final PsiReferenceExpression methodExpression = callExpression.getMethodExpression(); - final String referenceName = methodExpression.getReferenceName(); - final PsiExpression qualifierExpression = methodExpression.getQualifierExpression(); - if (qualifierExpression == null) { - return expression.getText(); - } - final PsiType type = qualifierExpression.getType(); - if (HardcodedMethodConstants.TO_STRING.equals(referenceName) && type != null && (type.equalsToText( - CommonClassNames.JAVA_LANG_STRING_BUFFER) || type.equalsToText(CommonClassNames.JAVA_LANG_STRING_BUILDER))) { - return qualifierExpression.getText(); - } - else { - return expression.getText(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new StringEqualsEmptyStringVisitor(); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new StringEqualsEmptyStringVisitor(); - } + private static class StringEqualsEmptyStringVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression call) { + super.visitMethodCallExpression(call); + final PsiReferenceExpression methodExpression = call.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!"equals".equals(methodName)) { + return; + } + final PsiExpressionList argumentList = call.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 1) { + return; + } + final PsiElement context = call.getParent(); + final boolean useIsEmpty = PsiUtil.isLanguageLevel6OrHigher(call); + if (!useIsEmpty && context instanceof PsiExpressionStatement) { + // cheesy, but necessary, because otherwise the quickfix will + // produce uncompilable code (out of merely incorrect code). + return; + } - private static class StringEqualsEmptyStringVisitor extends BaseInspectionVisitor { - - @Override - public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression call) { - super.visitMethodCallExpression(call); - final PsiReferenceExpression methodExpression = call.getMethodExpression(); - @NonNls final String methodName = methodExpression.getReferenceName(); - if (!"equals".equals(methodName)) { - return; - } - final PsiExpressionList argumentList = call.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 1) { - return; - } - final PsiElement context = call.getParent(); - final boolean useIsEmpty = PsiUtil.isLanguageLevel6OrHigher(call); - if (!useIsEmpty && context instanceof PsiExpressionStatement) { - // cheesy, but necessary, because otherwise the quickfix will - // produce uncompilable code (out of merely incorrect code). - return; - } - - final PsiExpression qualifier = methodExpression.getQualifierExpression(); - final PsiExpression argument = arguments[0]; - if (ExpressionUtils.isEmptyStringLiteral(qualifier)) { - final PsiType type = argument.getType(); - if (!TypeUtils.isJavaLangString(type)) { - return; - } - } - else if (ExpressionUtils.isEmptyStringLiteral(argument)) { - if (qualifier == null) { - return; - } - final PsiType type = qualifier.getType(); - if (!TypeUtils.isJavaLangString(type)) { - return; + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + final PsiExpression argument = arguments[0]; + if (ExpressionUtils.isEmptyStringLiteral(qualifier)) { + final PsiType type = argument.getType(); + if (!TypeUtils.isJavaLangString(type)) { + return; + } + } + else if (ExpressionUtils.isEmptyStringLiteral(argument)) { + if (qualifier == null) { + return; + } + final PsiType type = qualifier.getType(); + if (!TypeUtils.isJavaLangString(type)) { + return; + } + } + else { + return; + } + registerMethodCallError(call, Boolean.valueOf(useIsEmpty)); } - } - else { - return; - } - registerMethodCallError(call, Boolean.valueOf(useIsEmpty)); } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringReplaceableByStringBufferInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringReplaceableByStringBufferInspection.java index 880bd8d90..2f016cd30 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringReplaceableByStringBufferInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringReplaceableByStringBufferInspection.java @@ -31,68 +31,60 @@ @ExtensionImpl public class StringReplaceableByStringBufferInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean onlyWarnOnLoop = true; - @SuppressWarnings({"PublicField"}) - public boolean onlyWarnOnLoop = true; - - @Override - @Nonnull - public String getID() { - return "NonConstantStringShouldBeStringBuffer"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.stringReplaceableByStringBufferDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.stringReplaceableByStringBufferProblemDescriptor().get(); - } + @Override + @Nonnull + public String getID() { + return "NonConstantStringShouldBeStringBuffer"; + } - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.stringReplaceableByStringBufferInLoopOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "onlyWarnOnLoop"); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.stringReplaceableByStringBufferDisplayName(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new StringReplaceableByStringBufferVisitor(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.stringReplaceableByStringBufferProblemDescriptor().get(); + } - private class StringReplaceableByStringBufferVisitor - extends BaseInspectionVisitor { + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.stringReplaceableByStringBufferInLoopOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "onlyWarnOnLoop"); + } @Override - public void visitLocalVariable( - @Nonnull PsiLocalVariable variable) { - super.visitLocalVariable(variable); - final PsiCodeBlock codeBlock = - PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class); - if (codeBlock == null) { - return; - } - final PsiType type = variable.getType(); - if (!TypeUtils.typeEquals(CommonClassNames.JAVA_LANG_STRING, type)) { - return; - } - if (!variableIsAppendedTo(variable, codeBlock)) { - return; - } - registerVariableError(variable); + public BaseInspectionVisitor buildVisitor() { + return new StringReplaceableByStringBufferVisitor(); } - public boolean variableIsAppendedTo(PsiVariable variable, - PsiElement context) { - final StringVariableIsAppendedToVisitor visitor = - new StringVariableIsAppendedToVisitor(variable, - onlyWarnOnLoop); - context.accept(visitor); - return visitor.isAppendedTo(); + private class StringReplaceableByStringBufferVisitor extends BaseInspectionVisitor { + @Override + public void visitLocalVariable(@Nonnull PsiLocalVariable variable) { + super.visitLocalVariable(variable); + final PsiCodeBlock codeBlock = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class); + if (codeBlock == null) { + return; + } + final PsiType type = variable.getType(); + if (!TypeUtils.typeEquals(CommonClassNames.JAVA_LANG_STRING, type)) { + return; + } + if (!variableIsAppendedTo(variable, codeBlock)) { + return; + } + registerVariableError(variable); + } + + public boolean variableIsAppendedTo(PsiVariable variable, PsiElement context) { + final StringVariableIsAppendedToVisitor visitor = new StringVariableIsAppendedToVisitor(variable, onlyWarnOnLoop); + context.accept(visitor); + return visitor.isAppendedTo(); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringToStringInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringToStringInspection.java index 258d7e1fb..e2c32b802 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringToStringInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/StringToStringInspection.java @@ -24,92 +24,92 @@ import consulo.annotation.component.ExtensionImpl; import consulo.language.editor.inspection.ProblemDescriptor; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; @ExtensionImpl public class StringToStringInspection extends BaseInspection { + @Override + @Nonnull + public String getID() { + return "RedundantStringToString"; + } - @Override - @Nonnull - public String getID() { - return "RedundantStringToString"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.stringToStringDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.stringToStringProblemDescriptor().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new StringToStringVisitor(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new StringToStringFix(); - } - - private static class StringToStringFix extends InspectionGadgetsFix { + @Override + @Nonnull + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.stringToStringDisplayName(); + } + @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix().get(); + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.stringToStringProblemDescriptor().get(); + } + + @Override + public boolean isEnabledByDefault() { + return true; } @Override - public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiMethodCallExpression call = (PsiMethodCallExpression)descriptor.getPsiElement(); - final PsiReferenceExpression expression = call.getMethodExpression(); - final PsiExpression qualifier = expression.getQualifierExpression(); - if (qualifier == null) { - return; - } - final String qualifierText = qualifier.getText(); - replaceExpression(call, qualifierText); + public BaseInspectionVisitor buildVisitor() { + return new StringToStringVisitor(); } - } - private static class StringToStringVisitor extends BaseInspectionVisitor { @Override - public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - if (!HardcodedMethodConstants.TO_STRING.equals(methodName)) { - return; - } + public InspectionGadgetsFix buildFix(Object... infos) { + return new StringToStringFix(); + } + + private static class StringToStringFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix(); + } + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiMethodCallExpression call = (PsiMethodCallExpression) descriptor.getPsiElement(); + final PsiReferenceExpression expression = call.getMethodExpression(); + final PsiExpression qualifier = expression.getQualifierExpression(); + if (qualifier == null) { + return; + } + final String qualifierText = qualifier.getText(); + replaceExpression(call, qualifierText); + } + } + + private static class StringToStringVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!HardcodedMethodConstants.TO_STRING.equals(methodName)) { + return; + } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return; - } - final PsiParameterList parameterList = method.getParameterList(); - if (parameterList.getParametersCount() != 0) { - return; - } - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return; - } - final String className = aClass.getQualifiedName(); - if (!CommonClassNames.JAVA_LANG_STRING.equals(className)) { - return; - } - registerError(expression); + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return; + } + final PsiParameterList parameterList = method.getParameterList(); + if (parameterList.getParametersCount() != 0) { + return; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return; + } + final String className = aClass.getQualifiedName(); + if (!CommonClassNames.JAVA_LANG_STRING.equals(className)) { + return; + } + registerError(expression); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/SubstringZeroInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/SubstringZeroInspection.java index 441980a81..a2ee2f5f0 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/SubstringZeroInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/SubstringZeroInspection.java @@ -24,90 +24,87 @@ 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 SubstringZeroInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.substringZeroDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.substringZeroDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.substringZeroProblemDescriptor().get(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new SubstringZeroFix(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new SubstringZeroVisitor(); - } - - private static class SubstringZeroFix extends InspectionGadgetsFix { - + @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix().get(); + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.substringZeroProblemDescriptor().get(); } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiMethodCallExpression call = (PsiMethodCallExpression)descriptor.getPsiElement(); - final PsiReferenceExpression expression = call.getMethodExpression(); - final PsiExpression qualifier = expression.getQualifierExpression(); - if (qualifier == null) { - return; - } - final String qualifierText = qualifier.getText(); - replaceExpression(call, qualifierText); + public InspectionGadgetsFix buildFix(Object... infos) { + return new SubstringZeroFix(); } - } - private static class SubstringZeroVisitor extends BaseInspectionVisitor { @Override - public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - @NonNls final String methodName = methodExpression.getReferenceName(); - if (!"substring".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; - } - if (!ExpressionUtils.isZero(argument)) { - return; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return; - } - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return; - } - final String className = aClass.getQualifiedName(); - if (!CommonClassNames.JAVA_LANG_STRING.equals(className)) { - return; - } - registerError(expression); + public BaseInspectionVisitor buildVisitor() { + return new SubstringZeroVisitor(); + } + + private static class SubstringZeroFix extends InspectionGadgetsFix { + @Nonnull + public LocalizeValue getName() { + return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix(); + } + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiMethodCallExpression call = (PsiMethodCallExpression) descriptor.getPsiElement(); + final PsiReferenceExpression expression = call.getMethodExpression(); + final PsiExpression qualifier = expression.getQualifierExpression(); + if (qualifier == null) { + return; + } + final String qualifierText = qualifier.getText(); + replaceExpression(call, qualifierText); + } + } + + private static class SubstringZeroVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!"substring".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; + } + if (!ExpressionUtils.isZero(argument)) { + return; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return; + } + final String className = aClass.getQualifiedName(); + if (!CommonClassNames.JAVA_LANG_STRING.equals(className)) { + return; + } + registerError(expression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/ToArrayCallWithZeroLengthArrayArgumentInspectionBase.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/ToArrayCallWithZeroLengthArrayArgumentInspectionBase.java index 7333979a7..c2af70e50 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/ToArrayCallWithZeroLengthArrayArgumentInspectionBase.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/ToArrayCallWithZeroLengthArrayArgumentInspectionBase.java @@ -24,93 +24,75 @@ 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.Nls; import org.jetbrains.annotations.NonNls; @ExtensionImpl -public class ToArrayCallWithZeroLengthArrayArgumentInspectionBase extends BaseInspection -{ - @Override - @Nls - @Nonnull - public String getDisplayName() - { - return InspectionGadgetsLocalize.toArrayCallWithZeroLengthArrayArgumentDisplayName().get(); - } +public class ToArrayCallWithZeroLengthArrayArgumentInspectionBase extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.toArrayCallWithZeroLengthArrayArgumentDisplayName(); + } - @Override - @Nonnull - protected String buildErrorString(Object... infos) - { - final PsiExpression argument = (PsiExpression) infos[1]; - return InspectionGadgetsLocalize.toArrayCallWithZeroLengthArrayArgumentProblemDescriptor(argument.getText()).get(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + final PsiExpression argument = (PsiExpression) infos[1]; + return InspectionGadgetsLocalize.toArrayCallWithZeroLengthArrayArgumentProblemDescriptor(argument.getText()).get(); + } - @Override - public BaseInspectionVisitor buildVisitor() - { - return new ToArrayCallWithZeroLengthArrayArgument(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new ToArrayCallWithZeroLengthArrayArgument(); + } - private static class ToArrayCallWithZeroLengthArrayArgument extends BaseInspectionVisitor - { - - @Override - public void visitMethodCallExpression(PsiMethodCallExpression expression) - { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - @NonNls final String methodName = methodExpression.getReferenceName(); - if(!"toArray".equals(methodName)) - { - return; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if(arguments.length != 1) - { - return; - } - final PsiExpression argument = arguments[0]; - final PsiType type = argument.getType(); - if(!(type instanceof PsiArrayType)) - { - return; - } - if(type.getArrayDimensions() != 1) - { - return; - } - if(argument instanceof PsiReferenceExpression) - { - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) argument; - final PsiElement element = referenceExpression.resolve(); - if(!(element instanceof PsiField)) - { - return; - } - final PsiField field = (PsiField) element; - if(!CollectionUtils.isConstantEmptyArray(field)) - { - return; - } - } - else if(!ConstructionUtils.isEmptyArrayInitializer(argument)) - { - return; - } - final PsiMethod method = expression.resolveMethod(); - if(method == null) - { - return; - } - final PsiClass containingClass = method.getContainingClass(); - if(!InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_UTIL_COLLECTION)) - { - return; - } - registerMethodCallError(expression, expression, argument); - } - } + private static class ToArrayCallWithZeroLengthArrayArgument extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + @NonNls final String methodName = methodExpression.getReferenceName(); + if (!"toArray".equals(methodName)) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 1) { + return; + } + final PsiExpression argument = arguments[0]; + final PsiType type = argument.getType(); + if (!(type instanceof PsiArrayType)) { + return; + } + if (type.getArrayDimensions() != 1) { + return; + } + if (argument instanceof PsiReferenceExpression) { + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) argument; + final PsiElement element = referenceExpression.resolve(); + if (!(element instanceof PsiField)) { + return; + } + final PsiField field = (PsiField) element; + if (!CollectionUtils.isConstantEmptyArray(field)) { + return; + } + } + else if (!ConstructionUtils.isEmptyArrayInitializer(argument)) { + return; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return; + } + final PsiClass containingClass = method.getContainingClass(); + if (!InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_UTIL_COLLECTION)) { + return; + } + registerMethodCallError(expression, expression, argument); + } + } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/TrivialStringConcatenationInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/TrivialStringConcatenationInspection.java index c680fd4d7..f17b5f511 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/TrivialStringConcatenationInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/TrivialStringConcatenationInspection.java @@ -28,167 +28,166 @@ 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 TrivialStringConcatenationInspection extends BaseInspection { + @Override + @Nonnull + public String getID() { + return "ConcatenationWithEmptyString"; + } - @Override - @Nonnull - public String getID() { - return "ConcatenationWithEmptyString"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.trivialStringConcatenationDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.trivialStringConcatenationProblemDescriptor().get(); - } - - @NonNls - static String calculateReplacementExpression(PsiLiteralExpression expression) { - final PsiElement parent = ParenthesesUtils.getParentSkipParentheses(expression); - if (!(parent instanceof PsiPolyadicExpression)) { - return null; + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.trivialStringConcatenationDisplayName(); } - if (parent instanceof PsiBinaryExpression) { - final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)parent; - final PsiExpression lOperand = ParenthesesUtils.stripParentheses(binaryExpression.getLOperand()); - final PsiExpression rOperand = ParenthesesUtils.stripParentheses(binaryExpression.getROperand()); - final PsiExpression replacement; - if (ExpressionUtils.isEmptyStringLiteral(lOperand)) { - replacement = rOperand; - } - else { - replacement = lOperand; - } - return replacement == null ? "" : buildReplacement(replacement, false); + + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.trivialStringConcatenationProblemDescriptor().get(); } - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)parent; - final PsiExpression[] operands = polyadicExpression.getOperands(); - final PsiClassType stringType = TypeUtils.getStringType(expression); - boolean seenString = false; - boolean seenEmpty = false; - boolean replaced = false; - PsiExpression operandToReplace = null; - final StringBuilder text = new StringBuilder(); - for (PsiExpression operand : operands) { - if (operandToReplace != null && !replaced) { - if (ExpressionUtils.hasStringType(operand)) { - seenString = true; + + @NonNls + static String calculateReplacementExpression(PsiLiteralExpression expression) { + final PsiElement parent = ParenthesesUtils.getParentSkipParentheses(expression); + if (!(parent instanceof PsiPolyadicExpression)) { + return null; } - if (text.length() > 0) { - text.append(" + "); + if (parent instanceof PsiBinaryExpression) { + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression) parent; + final PsiExpression lOperand = ParenthesesUtils.stripParentheses(binaryExpression.getLOperand()); + final PsiExpression rOperand = ParenthesesUtils.stripParentheses(binaryExpression.getROperand()); + final PsiExpression replacement; + if (ExpressionUtils.isEmptyStringLiteral(lOperand)) { + replacement = rOperand; + } + else { + replacement = lOperand; + } + return replacement == null ? "" : buildReplacement(replacement, false); } - text.append(buildReplacement(operandToReplace, seenString)); - text.append(" + "); - text.append(operand.getText()); - replaced = true; - continue; - } - if (operand == expression) { - seenEmpty = true; - continue; - } - if (seenEmpty && !replaced) { - operandToReplace = operand; - continue; - } - if (stringType.equals(operand.getType())) { - seenString = true; - } - if (text.length() > 0) { - text.append(" + "); - } - text.append(operand.getText()); - } - if (!replaced && operandToReplace != null) { - text.append(" + "); - text.append(buildReplacement(operandToReplace, seenString)); + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) parent; + final PsiExpression[] operands = polyadicExpression.getOperands(); + final PsiClassType stringType = TypeUtils.getStringType(expression); + boolean seenString = false; + boolean seenEmpty = false; + boolean replaced = false; + PsiExpression operandToReplace = null; + final StringBuilder text = new StringBuilder(); + for (PsiExpression operand : operands) { + if (operandToReplace != null && !replaced) { + if (ExpressionUtils.hasStringType(operand)) { + seenString = true; + } + if (text.length() > 0) { + text.append(" + "); + } + text.append(buildReplacement(operandToReplace, seenString)); + text.append(" + "); + text.append(operand.getText()); + replaced = true; + continue; + } + if (operand == expression) { + seenEmpty = true; + continue; + } + if (seenEmpty && !replaced) { + operandToReplace = operand; + continue; + } + if (stringType.equals(operand.getType())) { + seenString = true; + } + if (text.length() > 0) { + text.append(" + "); + } + text.append(operand.getText()); + } + if (!replaced && operandToReplace != null) { + text.append(" + "); + text.append(buildReplacement(operandToReplace, seenString)); + } + return text.toString(); } - return text.toString(); - } - static String buildReplacement(@Nonnull PsiExpression operandToReplace, boolean seenString) { - if (ExpressionUtils.isNullLiteral(operandToReplace)) { - if (seenString) { - return "null"; - } - else { - return "String.valueOf((Object)null)"; - } - } - if (seenString || ExpressionUtils.hasStringType(operandToReplace)) { - return operandToReplace.getText(); + static String buildReplacement(@Nonnull PsiExpression operandToReplace, boolean seenString) { + if (ExpressionUtils.isNullLiteral(operandToReplace)) { + if (seenString) { + return "null"; + } + else { + return "String.valueOf((Object)null)"; + } + } + if (seenString || ExpressionUtils.hasStringType(operandToReplace)) { + return operandToReplace.getText(); + } + return "String.valueOf(" + operandToReplace.getText() + ')'; } - return "String.valueOf(" + operandToReplace.getText() + ')'; - } - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new UnnecessaryTemporaryObjectFix((PsiLiteralExpression)infos[0]); - } + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + return new UnnecessaryTemporaryObjectFix((PsiLiteralExpression) infos[0]); + } - private static class UnnecessaryTemporaryObjectFix extends InspectionGadgetsFix { + private static class UnnecessaryTemporaryObjectFix extends InspectionGadgetsFix { + private final LocalizeValue myName; - private final String m_name; + private UnnecessaryTemporaryObjectFix(PsiLiteralExpression expression) { + myName = InspectionGadgetsLocalize.stringReplaceQuickfix(calculateReplacementExpression(expression)); + } - private UnnecessaryTemporaryObjectFix(PsiLiteralExpression expression) { - m_name = InspectionGadgetsLocalize.stringReplaceQuickfix(calculateReplacementExpression(expression)).get(); - } + @Nonnull + @Override + public LocalizeValue getName() { + return myName; + } - @Nonnull - public String getName() { - return m_name; + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiLiteralExpression expression = (PsiLiteralExpression) descriptor.getPsiElement(); + final PsiElement parent = ParenthesesUtils.getParentSkipParentheses(expression); + if (!(parent instanceof PsiExpression)) { + return; + } + final String newExpression = calculateReplacementExpression(expression); + replaceExpression((PsiExpression) parent, newExpression); + } } @Override - public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiLiteralExpression expression = (PsiLiteralExpression)descriptor.getPsiElement(); - final PsiElement parent = ParenthesesUtils.getParentSkipParentheses(expression); - if (!(parent instanceof PsiExpression)) { - return; - } - final String newExpression = calculateReplacementExpression(expression); - replaceExpression((PsiExpression)parent, newExpression); + public BaseInspectionVisitor buildVisitor() { + return new TrivialStringConcatenationVisitor(); } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new TrivialStringConcatenationVisitor(); - } - - private static class TrivialStringConcatenationVisitor extends BaseInspectionVisitor { - @Override - public void visitPolyadicExpression(PsiPolyadicExpression expression) { - super.visitPolyadicExpression(expression); - if (!ExpressionUtils.hasStringType(expression)) { - return; - } - final PsiExpression[] operands = expression.getOperands(); - for (PsiExpression operand : operands) { - operand = ParenthesesUtils.stripParentheses(operand); - if (operand == null) { - return; - } - if (!ExpressionUtils.isEmptyStringLiteral(operand)) { - continue; - } - if (PsiUtil.isConstantExpression(expression)) { - return; + private static class TrivialStringConcatenationVisitor extends BaseInspectionVisitor { + @Override + public void visitPolyadicExpression(PsiPolyadicExpression expression) { + super.visitPolyadicExpression(expression); + if (!ExpressionUtils.hasStringType(expression)) { + return; + } + final PsiExpression[] operands = expression.getOperands(); + for (PsiExpression operand : operands) { + operand = ParenthesesUtils.stripParentheses(operand); + if (operand == null) { + return; + } + if (!ExpressionUtils.isEmptyStringLiteral(operand)) { + continue; + } + if (PsiUtil.isConstantExpression(expression)) { + return; + } + registerError(operand, operand); + } } - registerError(operand, operand); - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/UnnecessaryTemporaryOnConversionFromStringInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/UnnecessaryTemporaryOnConversionFromStringInspection.java index da807e2a9..744a1858e 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/UnnecessaryTemporaryOnConversionFromStringInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/UnnecessaryTemporaryOnConversionFromStringInspection.java @@ -35,194 +35,169 @@ import java.util.Map; @ExtensionImpl -public class UnnecessaryTemporaryOnConversionFromStringInspection - extends BaseInspection { - - /** - * @noinspection StaticCollection - */ - @NonNls private static final Map s_conversionMap = - new HashMap(7); - - static { - s_conversionMap.put(CommonClassNames.JAVA_LANG_BOOLEAN, "valueOf"); - s_conversionMap.put(CommonClassNames.JAVA_LANG_BYTE, "parseByte"); - s_conversionMap.put(CommonClassNames.JAVA_LANG_DOUBLE, "parseDouble"); - s_conversionMap.put(CommonClassNames.JAVA_LANG_FLOAT, "parseFloat"); - s_conversionMap.put(CommonClassNames.JAVA_LANG_INTEGER, "parseInt"); - s_conversionMap.put(CommonClassNames.JAVA_LANG_LONG, "parseLong"); - s_conversionMap.put(CommonClassNames.JAVA_LANG_SHORT, "parseShort"); - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.unnecessaryTemporaryOnConversionFromStringDisplayName().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final String replacementString = calculateReplacementExpression((PsiMethodCallExpression)infos[0]); - return InspectionGadgetsLocalize.unnecessaryTemporaryOnConversionFromStringProblemDescriptor(replacementString).get(); - } - - @Nullable - @NonNls - static String calculateReplacementExpression( - PsiMethodCallExpression expression) { - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - final PsiExpression qualifierExpression = - methodExpression.getQualifierExpression(); - if (!(qualifierExpression instanceof PsiNewExpression)) { - return null; - } - final PsiNewExpression qualifier = - (PsiNewExpression)qualifierExpression; - final PsiExpressionList argumentList = - qualifier.getArgumentList(); - if (argumentList == null) { - return null; - } - final PsiExpression arg = argumentList.getExpressions()[0]; - final PsiType type = qualifier.getType(); - if (type == null) { - return null; - } - final String qualifierType = type.getPresentableText(); - final String canonicalType = type.getCanonicalText(); - final String conversionName = s_conversionMap.get(canonicalType); - if (TypeUtils.typeEquals(CommonClassNames.JAVA_LANG_BOOLEAN, type)) { - if (!PsiUtil.isLanguageLevel5OrHigher(expression)) { - return qualifierType + '.' + conversionName + '(' + - arg.getText() + ").booleanValue()"; - } - else { - return qualifierType + ".parseBoolean(" + - arg.getText() + ')'; - } - } - else { - return qualifierType + '.' + conversionName + '(' + - arg.getText() + ')'; - } - } - - @Override - @Nullable - public InspectionGadgetsFix buildFix(Object... infos) { - final String replacementExpression = - calculateReplacementExpression( - (PsiMethodCallExpression)infos[0]); - if (replacementExpression == null) { - return null; - } - final LocalizeValue name = InspectionGadgetsLocalize.unnecessaryTemporaryOnConversionFromStringFixName(replacementExpression); - return new UnnecessaryTemporaryObjectFix(name.get()); - } - - private static class UnnecessaryTemporaryObjectFix - extends InspectionGadgetsFix { - - private final String m_name; +public class UnnecessaryTemporaryOnConversionFromStringInspection extends BaseInspection { + /** + * @noinspection StaticCollection + */ + private static final Map s_conversionMap = new HashMap(7); - private UnnecessaryTemporaryObjectFix( - String name) { - m_name = name; + static { + s_conversionMap.put(CommonClassNames.JAVA_LANG_BOOLEAN, "valueOf"); + s_conversionMap.put(CommonClassNames.JAVA_LANG_BYTE, "parseByte"); + s_conversionMap.put(CommonClassNames.JAVA_LANG_DOUBLE, "parseDouble"); + s_conversionMap.put(CommonClassNames.JAVA_LANG_FLOAT, "parseFloat"); + s_conversionMap.put(CommonClassNames.JAVA_LANG_INTEGER, "parseInt"); + s_conversionMap.put(CommonClassNames.JAVA_LANG_LONG, "parseLong"); + s_conversionMap.put(CommonClassNames.JAVA_LANG_SHORT, "parseShort"); } @Nonnull - public String getName() { - return m_name; + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.unnecessaryTemporaryOnConversionFromStringDisplayName(); } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiMethodCallExpression expression = - (PsiMethodCallExpression)descriptor.getPsiElement(); - final String newExpression = - calculateReplacementExpression(expression); - if (newExpression == null) { - return; - } - replaceExpression(expression, newExpression); + public boolean isEnabledByDefault() { + return true; } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new UnnecessaryTemporaryObjectVisitor(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final String replacementString = calculateReplacementExpression((PsiMethodCallExpression) infos[0]); + return InspectionGadgetsLocalize.unnecessaryTemporaryOnConversionFromStringProblemDescriptor(replacementString).get(); + } - private static class UnnecessaryTemporaryObjectVisitor - extends BaseInspectionVisitor { + @Nullable + @NonNls + static String calculateReplacementExpression(PsiMethodCallExpression expression) { + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final PsiExpression qualifierExpression = methodExpression.getQualifierExpression(); + if (!(qualifierExpression instanceof PsiNewExpression)) { + return null; + } + final PsiNewExpression qualifier = (PsiNewExpression) qualifierExpression; + final PsiExpressionList argumentList = qualifier.getArgumentList(); + if (argumentList == null) { + return null; + } + final PsiExpression arg = argumentList.getExpressions()[0]; + final PsiType type = qualifier.getType(); + if (type == null) { + return null; + } + final String qualifierType = type.getPresentableText(); + final String canonicalType = type.getCanonicalText(); + final String conversionName = s_conversionMap.get(canonicalType); + if (TypeUtils.typeEquals(CommonClassNames.JAVA_LANG_BOOLEAN, type)) { + if (!PsiUtil.isLanguageLevel5OrHigher(expression)) { + return qualifierType + '.' + conversionName + '(' + arg.getText() + ").booleanValue()"; + } + else { + return qualifierType + ".parseBoolean(" + arg.getText() + ')'; + } + } + else { + return qualifierType + '.' + conversionName + '(' + arg.getText() + ')'; + } + } - /** - * @noinspection StaticCollection - */ - @NonNls private static final Map s_basicTypeMap = - new HashMap(7); + @Override + @Nullable + public InspectionGadgetsFix buildFix(Object... infos) { + final String replacementExpression = calculateReplacementExpression((PsiMethodCallExpression) infos[0]); + if (replacementExpression == null) { + return null; + } + final LocalizeValue name = InspectionGadgetsLocalize.unnecessaryTemporaryOnConversionFromStringFixName(replacementExpression); + return new UnnecessaryTemporaryObjectFix(name); + } - static { - s_basicTypeMap.put(CommonClassNames.JAVA_LANG_BOOLEAN, "booleanValue"); - s_basicTypeMap.put(CommonClassNames.JAVA_LANG_BYTE, "byteValue"); - s_basicTypeMap.put(CommonClassNames.JAVA_LANG_DOUBLE, "doubleValue"); - s_basicTypeMap.put(CommonClassNames.JAVA_LANG_FLOAT, "floatValue"); - s_basicTypeMap.put(CommonClassNames.JAVA_LANG_INTEGER, "intValue"); - s_basicTypeMap.put(CommonClassNames.JAVA_LANG_LONG, "longValue"); - s_basicTypeMap.put(CommonClassNames.JAVA_LANG_SHORT, "shortValue"); + private static class UnnecessaryTemporaryObjectFix extends InspectionGadgetsFix { + private final LocalizeValue myName; + + private UnnecessaryTemporaryObjectFix(LocalizeValue name) { + myName = name; + } + + @Nonnull + @Override + public LocalizeValue getName() { + return myName; + } + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiMethodCallExpression expression = (PsiMethodCallExpression) descriptor.getPsiElement(); + final String newExpression = calculateReplacementExpression(expression); + if (newExpression == null) { + return; + } + replaceExpression(expression, newExpression); + } } @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - final Map basicTypeMap = s_basicTypeMap; - if (!basicTypeMap.containsValue(methodName)) { - return; - } - final PsiExpression qualifier = - methodExpression.getQualifierExpression(); - if (!(qualifier instanceof PsiNewExpression)) { - return; - } - final PsiNewExpression newExpression = (PsiNewExpression)qualifier; - final PsiExpressionList argumentList = - newExpression.getArgumentList(); - if (argumentList == null) { - return; - } - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 1) { - return; - } - final PsiType argumentType = arguments[0].getType(); - if (!TypeUtils.isJavaLangString(argumentType)) { - return; - } - final PsiType type = qualifier.getType(); - if (type == null) { - return; - } - final String typeText = type.getCanonicalText(); - if (!basicTypeMap.containsKey(typeText)) { - return; - } - final String mappingMethod = basicTypeMap.get(typeText); - if (!mappingMethod.equals(methodName)) { - return; - } - registerError(expression, expression); + public BaseInspectionVisitor buildVisitor() { + return new UnnecessaryTemporaryObjectVisitor(); + } + + private static class UnnecessaryTemporaryObjectVisitor extends BaseInspectionVisitor { + /** + * @noinspection StaticCollection + */ + private static final Map s_basicTypeMap = new HashMap(7); + + static { + s_basicTypeMap.put(CommonClassNames.JAVA_LANG_BOOLEAN, "booleanValue"); + s_basicTypeMap.put(CommonClassNames.JAVA_LANG_BYTE, "byteValue"); + s_basicTypeMap.put(CommonClassNames.JAVA_LANG_DOUBLE, "doubleValue"); + s_basicTypeMap.put(CommonClassNames.JAVA_LANG_FLOAT, "floatValue"); + s_basicTypeMap.put(CommonClassNames.JAVA_LANG_INTEGER, "intValue"); + s_basicTypeMap.put(CommonClassNames.JAVA_LANG_LONG, "longValue"); + s_basicTypeMap.put(CommonClassNames.JAVA_LANG_SHORT, "shortValue"); + } + + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + final Map basicTypeMap = s_basicTypeMap; + if (!basicTypeMap.containsValue(methodName)) { + return; + } + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (!(qualifier instanceof PsiNewExpression)) { + return; + } + final PsiNewExpression newExpression = (PsiNewExpression) qualifier; + final PsiExpressionList argumentList = newExpression.getArgumentList(); + if (argumentList == null) { + return; + } + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 1) { + return; + } + final PsiType argumentType = arguments[0].getType(); + if (!TypeUtils.isJavaLangString(argumentType)) { + return; + } + final PsiType type = qualifier.getType(); + if (type == null) { + return; + } + final String typeText = type.getCanonicalText(); + if (!basicTypeMap.containsKey(typeText)) { + return; + } + final String mappingMethod = basicTypeMap.get(typeText); + if (!mappingMethod.equals(methodName)) { + return; + } + registerError(expression, expression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/performance/UnnecessaryTemporaryOnConversionToStringInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/performance/UnnecessaryTemporaryOnConversionToStringInspection.java index 21f26bea8..927bea1c9 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/performance/UnnecessaryTemporaryOnConversionToStringInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/performance/UnnecessaryTemporaryOnConversionToStringInspection.java @@ -28,163 +28,145 @@ import consulo.project.Project; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; -import org.jetbrains.annotations.NonNls; import java.util.HashSet; import java.util.Set; @ExtensionImpl -public class UnnecessaryTemporaryOnConversionToStringInspection - extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.unnecessaryTemporaryOnConversionToStringDisplayName().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final String replacementString = calculateReplacementExpression((PsiMethodCallExpression)infos[0]); - return InspectionGadgetsLocalize.unnecessaryTemporaryOnConversionFromStringProblemDescriptor(replacementString).get(); - } - - @Nullable - @NonNls - static String calculateReplacementExpression( - PsiMethodCallExpression expression) { - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - final PsiExpression qualifier = - methodExpression.getQualifierExpression(); - if (!(qualifier instanceof PsiNewExpression)) { - return null; - } - final PsiNewExpression newExpression = (PsiNewExpression)qualifier; - final PsiExpressionList argumentList = newExpression.getArgumentList(); - if (argumentList == null) { - return null; - } - final PsiExpression[] expressions = argumentList.getExpressions(); - if (expressions.length < 1) { - return null; - } - final PsiType type = newExpression.getType(); - if (type == null) { - return null; +public class UnnecessaryTemporaryOnConversionToStringInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.unnecessaryTemporaryOnConversionToStringDisplayName(); } - final PsiExpression argument = expressions[0]; - final String argumentText = argument.getText(); - final String qualifierType = type.getPresentableText(); - return qualifierType + ".toString(" + argumentText + ')'; - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - final String replacement = calculateReplacementExpression((PsiMethodCallExpression)infos[0]); - final LocalizeValue name = InspectionGadgetsLocalize.unnecessaryTemporaryOnConversionFromStringFixName(replacement); - return new UnnecessaryTemporaryObjectFix(name.get()); - } - - private static class UnnecessaryTemporaryObjectFix - extends InspectionGadgetsFix { - private final String m_name; - - private UnnecessaryTemporaryObjectFix( - String name) { - m_name = name; + @Override + public boolean isEnabledByDefault() { + return true; } + @Override @Nonnull - public String getName() { - return m_name; + public String buildErrorString(Object... infos) { + final String replacementString = calculateReplacementExpression((PsiMethodCallExpression) infos[0]); + return InspectionGadgetsLocalize.unnecessaryTemporaryOnConversionFromStringProblemDescriptor(replacementString).get(); } - @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiMethodCallExpression expression = - (PsiMethodCallExpression)descriptor.getPsiElement(); - final String newExpression = - calculateReplacementExpression(expression); - if (newExpression == null) { - return; - } - replaceExpression(expression, newExpression); + @Nullable + static String calculateReplacementExpression(PsiMethodCallExpression expression) { + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (!(qualifier instanceof PsiNewExpression)) { + return null; + } + final PsiNewExpression newExpression = (PsiNewExpression) qualifier; + final PsiExpressionList argumentList = newExpression.getArgumentList(); + if (argumentList == null) { + return null; + } + final PsiExpression[] expressions = argumentList.getExpressions(); + if (expressions.length < 1) { + return null; + } + final PsiType type = newExpression.getType(); + if (type == null) { + return null; + } + final PsiExpression argument = expressions[0]; + final String argumentText = argument.getText(); + final String qualifierType = type.getPresentableText(); + return qualifierType + ".toString(" + argumentText + ')'; } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new UnnecessaryTemporaryObjectVisitor(); - } - private static class UnnecessaryTemporaryObjectVisitor - extends BaseInspectionVisitor { - - /** - * @noinspection StaticCollection - */ - private static final Set s_basicTypes = new HashSet(8); + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + final String replacement = calculateReplacementExpression((PsiMethodCallExpression) infos[0]); + final LocalizeValue name = InspectionGadgetsLocalize.unnecessaryTemporaryOnConversionFromStringFixName(replacement); + return new UnnecessaryTemporaryObjectFix(name); + } - static { - s_basicTypes.add(CommonClassNames.JAVA_LANG_BOOLEAN); - s_basicTypes.add(CommonClassNames.JAVA_LANG_BYTE); - s_basicTypes.add(CommonClassNames.JAVA_LANG_CHARACTER); - s_basicTypes.add(CommonClassNames.JAVA_LANG_DOUBLE); - s_basicTypes.add(CommonClassNames.JAVA_LANG_FLOAT); - s_basicTypes.add(CommonClassNames.JAVA_LANG_INTEGER); - s_basicTypes.add(CommonClassNames.JAVA_LANG_LONG); - s_basicTypes.add(CommonClassNames.JAVA_LANG_SHORT); + private static class UnnecessaryTemporaryObjectFix extends InspectionGadgetsFix { + @Nonnull + private final LocalizeValue myName; + + private UnnecessaryTemporaryObjectFix(@Nonnull LocalizeValue name) { + myName = name; + } + + @Nonnull + @Override + public LocalizeValue getName() { + return myName; + } + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiMethodCallExpression expression = (PsiMethodCallExpression) descriptor.getPsiElement(); + final String newExpression = calculateReplacementExpression(expression); + if (newExpression == null) { + return; + } + replaceExpression(expression, newExpression); + } } @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - @NonNls final String methodName = - methodExpression.getReferenceName(); - if (!HardcodedMethodConstants.TO_STRING.equals(methodName)) { - return; - } - final PsiExpression qualifier = - methodExpression.getQualifierExpression(); - if (!(qualifier instanceof PsiNewExpression)) { - return; - } - final PsiNewExpression newExpression = (PsiNewExpression)qualifier; - final PsiExpressionList argumentList = - newExpression.getArgumentList(); - if (argumentList == null) { - return; - } - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length < 1) { - return; - } - final PsiExpression argument = arguments[0]; - final PsiType argumentType = argument.getType(); - if (argumentType != null && argumentType.equalsToText(CommonClassNames.JAVA_LANG_STRING)) { - return; - } - final PsiType type = qualifier.getType(); - if (type == null) { - return; - } - final String typeName = type.getCanonicalText(); - if (!s_basicTypes.contains(typeName)) { - return; - } - registerError(expression, expression); + public BaseInspectionVisitor buildVisitor() { + return new UnnecessaryTemporaryObjectVisitor(); + } + + private static class UnnecessaryTemporaryObjectVisitor extends BaseInspectionVisitor { + /** + * @noinspection StaticCollection + */ + private static final Set s_basicTypes = new HashSet(8); + + static { + s_basicTypes.add(CommonClassNames.JAVA_LANG_BOOLEAN); + s_basicTypes.add(CommonClassNames.JAVA_LANG_BYTE); + s_basicTypes.add(CommonClassNames.JAVA_LANG_CHARACTER); + s_basicTypes.add(CommonClassNames.JAVA_LANG_DOUBLE); + s_basicTypes.add(CommonClassNames.JAVA_LANG_FLOAT); + s_basicTypes.add(CommonClassNames.JAVA_LANG_INTEGER); + s_basicTypes.add(CommonClassNames.JAVA_LANG_LONG); + s_basicTypes.add(CommonClassNames.JAVA_LANG_SHORT); + } + + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!HardcodedMethodConstants.TO_STRING.equals(methodName)) { + return; + } + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (!(qualifier instanceof PsiNewExpression)) { + return; + } + final PsiNewExpression newExpression = (PsiNewExpression) qualifier; + final PsiExpressionList argumentList = newExpression.getArgumentList(); + if (argumentList == null) { + return; + } + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length < 1) { + return; + } + final PsiExpression argument = arguments[0]; + final PsiType argumentType = argument.getType(); + if (argumentType != null && argumentType.equalsToText(CommonClassNames.JAVA_LANG_STRING)) { + return; + } + final PsiType type = qualifier.getType(); + if (type == null) { + return; + } + final String typeName = type.getCanonicalText(); + if (!s_basicTypes.contains(typeName)) { + return; + } + registerError(expression, expression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/portability/RuntimeExecInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/portability/RuntimeExecInspection.java index b7435bdf0..2e485ea3b 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/portability/RuntimeExecInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/portability/RuntimeExecInspection.java @@ -23,57 +23,54 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.NonNls; @ExtensionImpl public class RuntimeExecInspection extends BaseInspection { + @Nonnull + public String getID() { + return "CallToRuntimeExec"; + } - @Nonnull - public String getID() { - return "CallToRuntimeExec"; - } - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.runtimeExecCallDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.runtimeExecCallProblemDescriptor().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.runtimeExecCallDisplayName(); + } - public BaseInspectionVisitor buildVisitor() { - return new RuntimeExecVisitor(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.runtimeExecCallProblemDescriptor().get(); + } - private static class RuntimeExecVisitor extends BaseInspectionVisitor { + public BaseInspectionVisitor buildVisitor() { + return new RuntimeExecVisitor(); + } - @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - @NonNls final String exec = "exec"; - if (!exec.equals(methodName)) { - return; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return; - } - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return; - } - final String className = aClass.getQualifiedName(); - if (!"java.lang.Runtime".equals(className)) { - return; - } - registerMethodCallError(expression); + private static class RuntimeExecVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + final String exec = "exec"; + if (!exec.equals(methodName)) { + return; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return; + } + final String className = aClass.getQualifiedName(); + if (!"java.lang.Runtime".equals(className)) { + return; + } + registerMethodCallError(expression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/portability/SystemExitInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/portability/SystemExitInspection.java index f18072f1c..7fd8c4fe5 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/portability/SystemExitInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/portability/SystemExitInspection.java @@ -20,74 +20,71 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.NonNls; @ExtensionImpl public class SystemExitInspection extends BaseInspection { + @Nonnull + public String getID() { + return "CallToSystemExit"; + } - @Nonnull - public String getID() { - return "CallToSystemExit"; - } - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.systemExitCallDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - final String className = (String)infos[0]; - return InspectionGadgetsLocalize.systemExitCallProblemDescriptor(className).get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.systemExitCallDisplayName(); + } - public BaseInspectionVisitor buildVisitor() { - return new SystemExitVisitor(); - } + @Nonnull + public String buildErrorString(Object... infos) { + final String className = (String) infos[0]; + return InspectionGadgetsLocalize.systemExitCallProblemDescriptor(className).get(); + } - private static class SystemExitVisitor extends BaseInspectionVisitor { + public BaseInspectionVisitor buildVisitor() { + return new SystemExitVisitor(); + } - @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - @NonNls final String exit = "exit"; - @NonNls final String halt = "halt"; - if (!exit.equals(methodName) && !halt.equals(methodName)) { - return; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return; - } + private static class SystemExitVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + final String exit = "exit"; + final String halt = "halt"; + if (!exit.equals(methodName) && !halt.equals(methodName)) { + return; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return; + } - final PsiParameterList parameterList = method.getParameterList(); - if (parameterList.getParametersCount() != 1) { - return; - } - final PsiParameter[] parameters = parameterList.getParameters(); - final PsiType parameterType = parameters[0].getType(); - if (!parameterType.equals(PsiType.INT)) { - return; - } - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return; - } - final String className = aClass.getQualifiedName(); - if (className == null) { - return; - } - if ("java.lang.System".equals(className)) { - registerMethodCallError(expression, "System"); - } - else if ("java.lang.Runtime".equals(className)) { - registerMethodCallError(expression, "Runtime"); - } + final PsiParameterList parameterList = method.getParameterList(); + if (parameterList.getParametersCount() != 1) { + return; + } + final PsiParameter[] parameters = parameterList.getParameters(); + final PsiType parameterType = parameters[0].getType(); + if (!parameterType.equals(PsiType.INT)) { + return; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return; + } + final String className = aClass.getQualifiedName(); + if (className == null) { + return; + } + if ("java.lang.System".equals(className)) { + registerMethodCallError(expression, "System"); + } + else if ("java.lang.Runtime".equals(className)) { + registerMethodCallError(expression, "Runtime"); + } + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/portability/SystemGetenvInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/portability/SystemGetenvInspection.java index 4292fa838..f55f9b5d6 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/portability/SystemGetenvInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/portability/SystemGetenvInspection.java @@ -21,66 +21,64 @@ import com.siyeh.ig.psiutils.TypeUtils; 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 SystemGetenvInspection extends BaseInspection { + @Nonnull + public String getID() { + return "CallToSystemGetenv"; + } - @Nonnull - public String getID() { - return "CallToSystemGetenv"; - } - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.systemGetenvCallDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.systemGetenvCallProblemDescriptor().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.systemGetenvCallDisplayName(); + } - public BaseInspectionVisitor buildVisitor() { - return new SystemGetenvVisitor(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.systemGetenvCallProblemDescriptor().get(); + } - private static class SystemGetenvVisitor extends BaseInspectionVisitor { + public BaseInspectionVisitor buildVisitor() { + return new SystemGetenvVisitor(); + } - @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - @NonNls final String getenv = "getenv"; - if (!getenv.equals(methodName)) { - return; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return; - } - final PsiParameterList parameterList = method.getParameterList(); - if (parameterList.getParametersCount() != 1) { - return; - } - final PsiParameter[] parameters = parameterList.getParameters(); - final PsiType parameterType = parameters[0].getType(); - if (!TypeUtils.isJavaLangString(parameterType)) { - return; - } - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return; - } - final String className = aClass.getQualifiedName(); - if (!"java.lang.System".equals(className)) { - return; - } - registerMethodCallError(expression); + private static class SystemGetenvVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + final String getenv = "getenv"; + if (!getenv.equals(methodName)) { + return; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return; + } + final PsiParameterList parameterList = method.getParameterList(); + if (parameterList.getParametersCount() != 1) { + return; + } + final PsiParameter[] parameters = parameterList.getParameters(); + final PsiType parameterType = parameters[0].getType(); + if (!TypeUtils.isJavaLangString(parameterType)) { + return; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return; + } + final String className = aClass.getQualifiedName(); + if (!"java.lang.System".equals(className)) { + return; + } + registerMethodCallError(expression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/resources/SocketResourceInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/resources/SocketResourceInspection.java index dda4c7e9e..3c88992cf 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/resources/SocketResourceInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/resources/SocketResourceInspection.java @@ -24,119 +24,108 @@ import consulo.language.psi.PsiElement; import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.NonNls; import javax.swing.*; @ExtensionImpl public class SocketResourceInspection extends ResourceInspection { + @SuppressWarnings({"PublicField"}) + public boolean insideTryAllowed = false; - @SuppressWarnings({"PublicField"}) - public boolean insideTryAllowed = false; - - @Override - @Nonnull - public String getID() { - return "SocketOpenedButNotSafelyClosed"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.socketOpenedNotClosedDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final PsiExpression expression = (PsiExpression)infos[0]; - final PsiType type = expression.getType(); - assert type != null; - final String text = type.getPresentableText(); - return InspectionGadgetsLocalize.resourceOpenedNotClosedProblemDescriptor(text).get(); - } - - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.allowResourceToBeOpenedInsideATryBlock(); - return new SingleCheckboxOptionsPanel(message.get(), this, "insideTryAllowed"); - } - - - @Override - public BaseInspectionVisitor buildVisitor() { - return new SocketResourceVisitor(); - } + @Override + @Nonnull + public String getID() { + return "SocketOpenedButNotSafelyClosed"; + } - private class SocketResourceVisitor extends BaseInspectionVisitor { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.socketOpenedNotClosedDisplayName(); + } @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - if (!isSocketFactoryMethod(expression)) { - return; - } - final PsiElement parent = getExpressionParent(expression); - if (parent instanceof PsiReturnStatement || - parent instanceof PsiResourceVariable) { - return; - } - final PsiVariable boundVariable = getVariable(parent); - if (isSafelyClosed(boundVariable, expression, insideTryAllowed)) { - return; - } - if (isResourceEscapedFromMethod(boundVariable, expression)) { - return; - } - registerError(expression, expression); + @Nonnull + public String buildErrorString(Object... infos) { + final PsiExpression expression = (PsiExpression) infos[0]; + final PsiType type = expression.getType(); + assert type != null; + final String text = type.getPresentableText(); + return InspectionGadgetsLocalize.resourceOpenedNotClosedProblemDescriptor(text).get(); } @Override - public void visitNewExpression( - @Nonnull PsiNewExpression expression) { - super.visitNewExpression(expression); - if (!isSocketResource(expression)) { - return; - } - final PsiElement parent = getExpressionParent(expression); - if (parent instanceof PsiReturnStatement || - parent instanceof PsiResourceVariable) { - return; - } - final PsiVariable boundVariable = getVariable(parent); - if (isSafelyClosed(boundVariable, expression, insideTryAllowed)) { - return; - } - if (isResourceEscapedFromMethod(boundVariable, expression)) { - return; - } - registerError(expression, expression); + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.allowResourceToBeOpenedInsideATryBlock(); + return new SingleCheckboxOptionsPanel(message.get(), this, "insideTryAllowed"); } - private boolean isSocketResource(PsiNewExpression expression) { - return TypeUtils.expressionHasTypeOrSubtype(expression, - "java.net.Socket", - "java.net.DatagramSocket", - "java.net.ServerSocket") != null; + @Override + public BaseInspectionVisitor buildVisitor() { + return new SocketResourceVisitor(); } - private boolean isSocketFactoryMethod( - PsiMethodCallExpression expression) { - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - @NonNls final String methodName = - methodExpression.getReferenceName(); - if (!"accept".equals(methodName)) { - return false; - } - final PsiExpression qualifier = - methodExpression.getQualifierExpression(); - if (qualifier == null) { - return false; - } - return TypeUtils.expressionHasTypeOrSubtype(qualifier, - "java.net.ServerSocket"); + private class SocketResourceVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + if (!isSocketFactoryMethod(expression)) { + return; + } + final PsiElement parent = getExpressionParent(expression); + if (parent instanceof PsiReturnStatement || parent instanceof PsiResourceVariable) { + return; + } + final PsiVariable boundVariable = getVariable(parent); + if (isSafelyClosed(boundVariable, expression, insideTryAllowed)) { + return; + } + if (isResourceEscapedFromMethod(boundVariable, expression)) { + return; + } + registerError(expression, expression); + } + + @Override + public void visitNewExpression(@Nonnull PsiNewExpression expression) { + super.visitNewExpression(expression); + if (!isSocketResource(expression)) { + return; + } + final PsiElement parent = getExpressionParent(expression); + if (parent instanceof PsiReturnStatement || parent instanceof PsiResourceVariable) { + return; + } + final PsiVariable boundVariable = getVariable(parent); + if (isSafelyClosed(boundVariable, expression, insideTryAllowed)) { + return; + } + if (isResourceEscapedFromMethod(boundVariable, expression)) { + return; + } + registerError(expression, expression); + } + + private boolean isSocketResource(PsiNewExpression expression) { + return TypeUtils.expressionHasTypeOrSubtype( + expression, + "java.net.Socket", + "java.net.DatagramSocket", + "java.net.ServerSocket" + ) != null; + } + + private boolean isSocketFactoryMethod(PsiMethodCallExpression expression) { + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!"accept".equals(methodName)) { + return false; + } + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (qualifier == null) { + return false; + } + return TypeUtils.expressionHasTypeOrSubtype(qualifier, "java.net.ServerSocket"); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/security/NonFinalCloneInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/security/NonFinalCloneInspection.java index 96d6ffa21..e7f8ce5c4 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/security/NonFinalCloneInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/security/NonFinalCloneInspection.java @@ -24,51 +24,51 @@ 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 NonFinalCloneInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nonFinalCloneDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.nonFinalCloneDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.nonFinalCloneProblemDescriptor().get(); - } - - public BaseInspectionVisitor buildVisitor() { - return new NonFinalCloneVisitor(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.nonFinalCloneProblemDescriptor().get(); + } - private static class NonFinalCloneVisitor extends BaseInspectionVisitor { + public BaseInspectionVisitor buildVisitor() { + return new NonFinalCloneVisitor(); + } - @Override - public void visitMethod(@Nonnull PsiMethod method) { - super.visitMethod(method); - final String name = method.getName(); - if (!HardcodedMethodConstants.CLONE.equals(name)) { - return; - } - final PsiParameterList parameterList = method.getParameterList(); - if (parameterList.getParametersCount() != 0) { - return; - } - if (method.hasModifierProperty(PsiModifier.FINAL) - || method.hasModifierProperty(PsiModifier.ABSTRACT)) { - return; - } - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null) { - return; - } - if (containingClass.hasModifierProperty(PsiModifier.FINAL) - || containingClass.isInterface()) { - return; - } - registerMethodError(method); + private static class NonFinalCloneVisitor extends BaseInspectionVisitor { + @Override + public void visitMethod(@Nonnull PsiMethod method) { + super.visitMethod(method); + final String name = method.getName(); + if (!HardcodedMethodConstants.CLONE.equals(name)) { + return; + } + final PsiParameterList parameterList = method.getParameterList(); + if (parameterList.getParametersCount() != 0) { + return; + } + if (method.hasModifierProperty(PsiModifier.FINAL) + || method.hasModifierProperty(PsiModifier.ABSTRACT)) { + return; + } + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) { + return; + } + if (containingClass.hasModifierProperty(PsiModifier.FINAL) + || containingClass.isInterface()) { + return; + } + registerMethodError(method); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/security/NonStaticInnerClassInSecureContextInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/security/NonStaticInnerClassInSecureContextInspection.java index f660b607a..5bf9384aa 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/security/NonStaticInnerClassInSecureContextInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/security/NonStaticInnerClassInSecureContextInspection.java @@ -21,39 +21,37 @@ 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 NonStaticInnerClassInSecureContextInspection - extends BaseInspection { - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.nonStaticInnerClassInSecureContextDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.nonStaticInnerClassInSecureContextProblemDescriptor().get(); - } +public class NonStaticInnerClassInSecureContextInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nonStaticInnerClassInSecureContextDisplayName(); + } - public BaseInspectionVisitor buildVisitor() { - return new NonStaticInnerClassInSecureContextVisitor(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.nonStaticInnerClassInSecureContextProblemDescriptor().get(); + } - private static class NonStaticInnerClassInSecureContextVisitor - extends BaseInspectionVisitor { + public BaseInspectionVisitor buildVisitor() { + return new NonStaticInnerClassInSecureContextVisitor(); + } - @Override - public void visitClass(@Nonnull PsiClass aClass) { - // no call to super, so it doesn't drill down - if (aClass.isInterface() || aClass.isAnnotationType()) { - return; - } - if (!PsiUtil.isInnerClass(aClass)) { - return; - } - registerClassError(aClass); + private static class NonStaticInnerClassInSecureContextVisitor extends BaseInspectionVisitor { + @Override + public void visitClass(@Nonnull PsiClass aClass) { + // no call to super, so it doesn't drill down + if (aClass.isInterface() || aClass.isAnnotationType()) { + return; + } + if (!PsiUtil.isInnerClass(aClass)) { + return; + } + registerClassError(aClass); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/security/PublicStaticArrayFieldInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/security/PublicStaticArrayFieldInspection.java index e63a2b231..a0c6b49c9 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/security/PublicStaticArrayFieldInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/security/PublicStaticArrayFieldInspection.java @@ -24,45 +24,43 @@ import com.siyeh.ig.psiutils.CollectionUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class PublicStaticArrayFieldInspection extends BaseInspection { + @Nonnull + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.publicStaticArrayFieldDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.publicStaticArrayFieldDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.publicStaticArrayFieldProblemDescriptor().get(); - } - - public BaseInspectionVisitor buildVisitor() { - return new PublicStaticArrayFieldVisitor(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.publicStaticArrayFieldProblemDescriptor().get(); + } - private static class PublicStaticArrayFieldVisitor - extends BaseInspectionVisitor { + public BaseInspectionVisitor buildVisitor() { + return new PublicStaticArrayFieldVisitor(); + } - @Override - public void visitField(@Nonnull PsiField field) { - super.visitField(field); - if (!field.hasModifierProperty(PsiModifier.PUBLIC)) { - return; - } - if (!field.hasModifierProperty(PsiModifier.STATIC)) { - return; - } - final PsiType type = field.getType(); - if (!(type instanceof PsiArrayType)) { - return; - } - if (CollectionUtils.isConstantEmptyArray(field)) { - return; - } - registerFieldError(field); + private static class PublicStaticArrayFieldVisitor extends BaseInspectionVisitor { + @Override + public void visitField(@Nonnull PsiField field) { + super.visitField(field); + if (!field.hasModifierProperty(PsiModifier.PUBLIC)) { + return; + } + if (!field.hasModifierProperty(PsiModifier.STATIC)) { + return; + } + final PsiType type = field.getType(); + if (!(type instanceof PsiArrayType)) { + return; + } + if (CollectionUtils.isConstantEmptyArray(field)) { + return; + } + registerFieldError(field); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/security/PublicStaticCollectionFieldInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/security/PublicStaticCollectionFieldInspection.java index 660858f0b..8a9b1df62 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/security/PublicStaticCollectionFieldInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/security/PublicStaticCollectionFieldInspection.java @@ -23,42 +23,41 @@ import com.siyeh.ig.psiutils.CollectionUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class PublicStaticCollectionFieldInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.publicStaticCollectionFieldDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.publicStaticCollectionFieldDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.publicStaticCollectionFieldProblemDescriptor().get(); - } - - public BaseInspectionVisitor buildVisitor() { - return new PublicStaticCollectionFieldVisitor(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.publicStaticCollectionFieldProblemDescriptor().get(); + } - private static class PublicStaticCollectionFieldVisitor - extends BaseInspectionVisitor { + public BaseInspectionVisitor buildVisitor() { + return new PublicStaticCollectionFieldVisitor(); + } - @Override - public void visitField(@Nonnull PsiField field) { - super.visitField(field); - if (!field.hasModifierProperty(PsiModifier.PUBLIC)) { - return; - } - if (!field.hasModifierProperty(PsiModifier.STATIC)) { - return; - } - final PsiType type = field.getType(); - if (!CollectionUtils.isCollectionClassOrInterface(type)) { - return; - } - registerFieldError(field); + private static class PublicStaticCollectionFieldVisitor extends BaseInspectionVisitor { + @Override + public void visitField(@Nonnull PsiField field) { + super.visitField(field); + if (!field.hasModifierProperty(PsiModifier.PUBLIC)) { + return; + } + if (!field.hasModifierProperty(PsiModifier.STATIC)) { + return; + } + final PsiType type = field.getType(); + if (!CollectionUtils.isCollectionClassOrInterface(type)) { + return; + } + registerFieldError(field); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/security/RuntimeExecWithNonConstantStringInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/security/RuntimeExecWithNonConstantStringInspection.java index 19115b56d..5f50b74e2 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/security/RuntimeExecWithNonConstantStringInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/security/RuntimeExecWithNonConstantStringInspection.java @@ -21,71 +21,69 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.NonNls; @ExtensionImpl public class RuntimeExecWithNonConstantStringInspection extends BaseInspection { + @Override + @Nonnull + public String getID() { + return "CallToRuntimeExecWithNonConstantString"; + } - @Override - @Nonnull - public String getID() { - return "CallToRuntimeExecWithNonConstantString"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.runtimeExecWithNonConstantStringDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.runtimeExecWithNonConstantStringProblemDescriptor().get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new RuntimeExecVisitor(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.runtimeExecWithNonConstantStringDisplayName(); + } - private static class RuntimeExecVisitor extends BaseInspectionVisitor { + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.runtimeExecWithNonConstantStringProblemDescriptor().get(); + } @Override - public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - @NonNls final String methodName = methodExpression.getReferenceName(); - if (!"exec".equals(methodName)) { - return; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return; - } - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return; - } - final String className = aClass.getQualifiedName(); - if (!"java.lang.Runtime".equals(className)) { - return; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length == 0) { - return; - } - final PsiExpression argument = arguments[0]; - final PsiType type = argument.getType(); - if (type == null || !type.equalsToText(CommonClassNames.JAVA_LANG_STRING)) { - return; - } - if (PsiUtil.isConstantExpression(argument)) { - return; - } - registerMethodCallError(expression); + public BaseInspectionVisitor buildVisitor() { + return new RuntimeExecVisitor(); + } + + private static class RuntimeExecVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!"exec".equals(methodName)) { + return; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return; + } + final String className = aClass.getQualifiedName(); + if (!"java.lang.Runtime".equals(className)) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length == 0) { + return; + } + final PsiExpression argument = arguments[0]; + final PsiType type = argument.getType(); + if (type == null || !type.equalsToText(CommonClassNames.JAVA_LANG_STRING)) { + return; + } + if (PsiUtil.isConstantExpression(argument)) { + return; + } + registerMethodCallError(expression); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/security/SerializableClassInSecureContextInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/security/SerializableClassInSecureContextInspection.java index 3b5f3ab08..1fe807ad8 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/security/SerializableClassInSecureContextInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/security/SerializableClassInSecureContextInspection.java @@ -35,65 +35,63 @@ @ExtensionImpl public class SerializableClassInSecureContextInspection extends BaseInspection { + @SuppressWarnings("PublicField") + public boolean ignoreThrowable = false; - @SuppressWarnings("PublicField") - public boolean ignoreThrowable = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.serializableClassInSecureContextDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.serializableClassInSecureContextProblemDescriptor().get(); - } - - @Nullable - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.ignoreClassesExtendingThrowableOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreThrowable"); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.serializableClassInSecureContextDisplayName(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new SerializableClassInSecureContextVisitor(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.serializableClassInSecureContextProblemDescriptor().get(); + } - private class SerializableClassInSecureContextVisitor extends BaseInspectionVisitor { + @Nullable + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.ignoreClassesExtendingThrowableOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreThrowable"); + } @Override - public void visitClass(@Nonnull PsiClass aClass) { - if (aClass.isInterface() || aClass.isAnnotationType() || aClass.isEnum()) { - return; - } - if (aClass instanceof PsiTypeParameter || !SerializationUtils.isSerializable(aClass)) { - return; - } - final PsiMethod[] methods = aClass.findMethodsByName("writeObject", true); - for (final PsiMethod method : methods) { - if (!SerializationUtils.isWriteObject(method)) { - continue; - } - if (ControlFlowUtils.methodAlwaysThrowsException((PsiMethod)method.getNavigationElement())) { - return; - } - else { - break; + public BaseInspectionVisitor buildVisitor() { + return new SerializableClassInSecureContextVisitor(); + } + + private class SerializableClassInSecureContextVisitor extends BaseInspectionVisitor { + @Override + public void visitClass(@Nonnull PsiClass aClass) { + if (aClass.isInterface() || aClass.isAnnotationType() || aClass.isEnum()) { + return; + } + if (aClass instanceof PsiTypeParameter || !SerializationUtils.isSerializable(aClass)) { + return; + } + final PsiMethod[] methods = aClass.findMethodsByName("writeObject", true); + for (final PsiMethod method : methods) { + if (!SerializationUtils.isWriteObject(method)) { + continue; + } + if (ControlFlowUtils.methodAlwaysThrowsException((PsiMethod) method.getNavigationElement())) { + return; + } + else { + break; + } + } + if (ignoreThrowable && InheritanceUtil.isInheritor(aClass, false, CommonClassNames.JAVA_LANG_THROWABLE)) { + return; + } + registerClassError(aClass); } - } - if (ignoreThrowable && InheritanceUtil.isInheritor(aClass, false, CommonClassNames.JAVA_LANG_THROWABLE)) { - return; - } - registerClassError(aClass); } - } - @Override - public String getAlternativeID() { - return "serial"; - } + @Override + public String getAlternativeID() { + return "serial"; + } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/security/SystemPropertiesInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/security/SystemPropertiesInspection.java index 59d7edeb0..1bd936a37 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/security/SystemPropertiesInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/security/SystemPropertiesInspection.java @@ -20,139 +20,123 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.NonNls; @ExtensionImpl public class SystemPropertiesInspection extends BaseInspection { - - @Override - @Nonnull - public String getID() { - return "AccessOfSystemProperties"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.systemPropertiesDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final boolean isGetSystemProperty = (Boolean)infos[0]; - final boolean isIntegerGetInteger = (Boolean)infos[1]; - if (isGetSystemProperty) { - return InspectionGadgetsLocalize.systemSetProblemDescriptor().get(); - } - else if (isIntegerGetInteger) { - return InspectionGadgetsLocalize.systemPropertiesProblemDescriptor().get(); - } - else { - return InspectionGadgetsLocalize.systemPropertiesProblemDescriptor1().get(); + @Override + @Nonnull + public String getID() { + return "AccessOfSystemProperties"; } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new SystemPropertiesVisitor(); - } - - private static class SystemPropertiesVisitor - extends BaseInspectionVisitor { + @Nonnull @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final boolean isGetSystemProperty = isGetSystemProperty(expression); - final boolean isIntegerGetInteger = isIntegerGetInteger(expression); - final boolean isBooleanGetBoolean = isBooleanGetBoolean(expression); - if (!(isGetSystemProperty || isIntegerGetInteger || - isBooleanGetBoolean)) { - return; - } - registerMethodCallError(expression, - Boolean.valueOf(isGetSystemProperty), - Boolean.valueOf(isIntegerGetInteger)); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.systemPropertiesDisplayName(); } - private static boolean isGetSystemProperty( - PsiMethodCallExpression expression) { - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - @NonNls final String methodName = - methodExpression.getReferenceName(); - if (!"getProperty".equals(methodName) - && !"getProperties".equals(methodName) - && !"setProperty".equals(methodName) - && !"setProperties".equals(methodName) - && !"clearProperties".equals(methodName) - ) { - return false; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return false; - } - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return false; - } - final String className = aClass.getQualifiedName(); - if (className == null) { - return false; - } - return "java.lang.System".equals(className); + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final boolean isGetSystemProperty = (Boolean) infos[0]; + final boolean isIntegerGetInteger = (Boolean) infos[1]; + if (isGetSystemProperty) { + return InspectionGadgetsLocalize.systemSetProblemDescriptor().get(); + } + else if (isIntegerGetInteger) { + return InspectionGadgetsLocalize.systemPropertiesProblemDescriptor().get(); + } + else { + return InspectionGadgetsLocalize.systemPropertiesProblemDescriptor1().get(); + } } - private static boolean isIntegerGetInteger( - PsiMethodCallExpression expression) { - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - @NonNls final String methodName = - methodExpression.getReferenceName(); - if (!"getInteger".equals(methodName)) { - return false; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return false; - } - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return false; - } - final String className = aClass.getQualifiedName(); - if (className == null) { - return false; - } - return CommonClassNames.JAVA_LANG_INTEGER.equals(className); + @Override + public BaseInspectionVisitor buildVisitor() { + return new SystemPropertiesVisitor(); } - private static boolean isBooleanGetBoolean( - PsiMethodCallExpression expression) { - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - @NonNls final String methodName = - methodExpression.getReferenceName(); - if (!"getBoolean".equals(methodName)) { - return false; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return false; - } - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return false; - } - final String className = aClass.getQualifiedName(); - if (className == null) { - return false; - } - return CommonClassNames.JAVA_LANG_BOOLEAN.equals(className); + private static class SystemPropertiesVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final boolean isGetSystemProperty = isGetSystemProperty(expression); + final boolean isIntegerGetInteger = isIntegerGetInteger(expression); + final boolean isBooleanGetBoolean = isBooleanGetBoolean(expression); + if (!(isGetSystemProperty || isIntegerGetInteger || isBooleanGetBoolean)) { + return; + } + registerMethodCallError(expression, Boolean.valueOf(isGetSystemProperty), Boolean.valueOf(isIntegerGetInteger)); + } + + private static boolean isGetSystemProperty(PsiMethodCallExpression expression) { + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!"getProperty".equals(methodName) + && !"getProperties".equals(methodName) + && !"setProperty".equals(methodName) + && !"setProperties".equals(methodName) + && !"clearProperties".equals(methodName) + ) { + return false; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return false; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return false; + } + final String className = aClass.getQualifiedName(); + if (className == null) { + return false; + } + return "java.lang.System".equals(className); + } + + private static boolean isIntegerGetInteger(PsiMethodCallExpression expression) { + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!"getInteger".equals(methodName)) { + return false; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return false; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return false; + } + final String className = aClass.getQualifiedName(); + if (className == null) { + return false; + } + return CommonClassNames.JAVA_LANG_INTEGER.equals(className); + } + + private static boolean isBooleanGetBoolean(PsiMethodCallExpression expression) { + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!"getBoolean".equals(methodName)) { + return false; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return false; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return false; + } + final String className = aClass.getQualifiedName(); + if (className == null) { + return false; + } + return CommonClassNames.JAVA_LANG_BOOLEAN.equals(className); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/security/SystemSetSecurityManagerInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/security/SystemSetSecurityManagerInspection.java index 2d234842f..468d789ba 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/security/SystemSetSecurityManagerInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/security/SystemSetSecurityManagerInspection.java @@ -23,66 +23,60 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.NonNls; @ExtensionImpl public class SystemSetSecurityManagerInspection extends BaseInspection { + @Nonnull + public String getID() { + return "CallToSystemSetSecurityManager"; + } - @Nonnull - public String getID() { - return "CallToSystemSetSecurityManager"; - } - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.systemSetSecurityManagerDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.systemSetSecurityManagerProblemDescriptor().get(); - } - - public BaseInspectionVisitor buildVisitor() { - return new SystemSetSecurityManagerVisitor(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.systemSetSecurityManagerDisplayName(); + } - private static class SystemSetSecurityManagerVisitor - extends BaseInspectionVisitor { + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.systemSetSecurityManagerProblemDescriptor().get(); + } - @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - if (!isSetSecurityManager(expression)) { - return; - } - registerMethodCallError(expression); + public BaseInspectionVisitor buildVisitor() { + return new SystemSetSecurityManagerVisitor(); } - private static boolean isSetSecurityManager( - PsiMethodCallExpression expression) { - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - @NonNls final String methodName = - methodExpression.getReferenceName(); - if (!"setSecurityManager".equals(methodName)) { - return false; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return false; - } - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return false; - } - final String className = aClass.getQualifiedName(); - if (className == null) { - return false; - } - return "java.lang.System".equals(className); + private static class SystemSetSecurityManagerVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + if (!isSetSecurityManager(expression)) { + return; + } + registerMethodCallError(expression); + } + + private static boolean isSetSecurityManager(PsiMethodCallExpression expression) { + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!"setSecurityManager".equals(methodName)) { + return false; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return false; + } + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return false; + } + final String className = aClass.getQualifiedName(); + if (className == null) { + return false; + } + return "java.lang.System".equals(className); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/serialization/NonSerializableFieldInSerializableClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/serialization/NonSerializableFieldInSerializableClassInspection.java index 4cf5edfaf..1072b5b80 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/serialization/NonSerializableFieldInSerializableClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/serialization/NonSerializableFieldInSerializableClassInspection.java @@ -35,71 +35,69 @@ @ExtensionImpl public class NonSerializableFieldInSerializableClassInspection extends SerializableInspection { + @SuppressWarnings({"PublicField"}) + public final ExternalizableStringSet ignorableAnnotations = new ExternalizableStringSet(); - @SuppressWarnings({"PublicField"}) - public final ExternalizableStringSet ignorableAnnotations = new ExternalizableStringSet(); - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.nonSerializableFieldInSerializableClassDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.nonSerializableFieldInSerializableClassProblemDescriptor().get(); - } - - @Override - protected JComponent[] createAdditionalOptions() { - LocalizeValue message = InspectionGadgetsLocalize.ignoreIfAnnotatedBy(); - return new JComponent[]{SpecialAnnotationsUtil.createSpecialAnnotationsListControl(ignorableAnnotations, message.get())}; - } + @Override + @Nonnull + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nonSerializableFieldInSerializableClassDisplayName(); + } - @Nonnull - @Override - protected InspectionGadgetsFix[] buildFixes(Object... infos) { - final PsiField field = (PsiField)infos[0]; - return AddToIgnoreIfAnnotatedByListQuickFix.build(field, ignorableAnnotations); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.nonSerializableFieldInSerializableClassProblemDescriptor().get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new NonSerializableFieldInSerializableClassVisitor(); - } + @Override + protected JComponent[] createAdditionalOptions() { + LocalizeValue message = InspectionGadgetsLocalize.ignoreIfAnnotatedBy(); + return new JComponent[]{SpecialAnnotationsUtil.createSpecialAnnotationsListControl(ignorableAnnotations, message.get())}; + } - private class NonSerializableFieldInSerializableClassVisitor extends BaseInspectionVisitor { + @Nonnull + @Override + protected InspectionGadgetsFix[] buildFixes(Object... infos) { + final PsiField field = (PsiField) infos[0]; + return AddToIgnoreIfAnnotatedByListQuickFix.build(field, ignorableAnnotations); + } @Override - public void visitField(@Nonnull PsiField field) { - if (field.hasModifierProperty(PsiModifier.TRANSIENT) || field.hasModifierProperty(PsiModifier.STATIC)) { - return; - } - final PsiClass aClass = field.getContainingClass(); - if (aClass == null) { - return; - } - if (ignoreAnonymousInnerClasses && aClass instanceof PsiAnonymousClass) { - return; - } - if (!SerializationUtils.isSerializable(aClass)) { - return; - } - if (SerializationUtils.isProbablySerializable(field.getType())) { - return; - } - final boolean hasWriteObject = SerializationUtils.hasWriteObject(aClass); - if (hasWriteObject) { - return; - } - if (isIgnoredSubclass(aClass)) { - return; - } - if (AnnotationUtil.isAnnotated(field, ignorableAnnotations)) { - return; - } - registerFieldError(field, field); + public BaseInspectionVisitor buildVisitor() { + return new NonSerializableFieldInSerializableClassVisitor(); + } + + private class NonSerializableFieldInSerializableClassVisitor extends BaseInspectionVisitor { + @Override + public void visitField(@Nonnull PsiField field) { + if (field.hasModifierProperty(PsiModifier.TRANSIENT) || field.hasModifierProperty(PsiModifier.STATIC)) { + return; + } + final PsiClass aClass = field.getContainingClass(); + if (aClass == null) { + return; + } + if (ignoreAnonymousInnerClasses && aClass instanceof PsiAnonymousClass) { + return; + } + if (!SerializationUtils.isSerializable(aClass)) { + return; + } + if (SerializationUtils.isProbablySerializable(field.getType())) { + return; + } + final boolean hasWriteObject = SerializationUtils.hasWriteObject(aClass); + if (hasWriteObject) { + return; + } + if (isIgnoredSubclass(aClass)) { + return; + } + if (AnnotationUtil.isAnnotated(field, ignorableAnnotations)) { + return; + } + registerFieldError(field, field); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/serialization/NonSerializableObjectBoundToHttpSessionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/serialization/NonSerializableObjectBoundToHttpSessionInspection.java index efb4b94d5..4ba4d8d85 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/serialization/NonSerializableObjectBoundToHttpSessionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/serialization/NonSerializableObjectBoundToHttpSessionInspection.java @@ -22,69 +22,64 @@ 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 NonSerializableObjectBoundToHttpSessionInspection - extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.nonSerializableObjectBoundToHttpSessionDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.nonSerializableObjectBoundToHttpSessionProblemDescriptor().get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new NonSerializableObjectBoundToHttpSessionVisitor(); - } +public class NonSerializableObjectBoundToHttpSessionInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nonSerializableObjectBoundToHttpSessionDisplayName(); + } - private static class NonSerializableObjectBoundToHttpSessionVisitor - extends BaseInspectionVisitor { + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.nonSerializableObjectBoundToHttpSessionProblemDescriptor().get(); + } @Override - public void visitMethodCallExpression( - PsiMethodCallExpression methodCallExpression) { - super.visitMethodCallExpression(methodCallExpression); - if (!MethodCallUtils.isSimpleCallToMethod( - methodCallExpression, - "javax.servlet.http.HttpSession", - PsiType.VOID, - "putValue", - CommonClassNames.JAVA_LANG_STRING, - CommonClassNames.JAVA_LANG_OBJECT - ) - && !MethodCallUtils.isSimpleCallToMethod( - methodCallExpression, - "javax.servlet.http.HttpSession", - PsiType.VOID, - "setAttribute", - CommonClassNames.JAVA_LANG_STRING, - CommonClassNames.JAVA_LANG_OBJECT - )) { - return; - } - final PsiExpressionList argumentList = - methodCallExpression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 2) { - return; - } - final PsiExpression argument = arguments[1]; - final PsiType argumentType = argument.getType(); - if (argumentType == null) { - return; - } - if (SerializationUtils.isProbablySerializable(argumentType)) { - return; - } - registerError(argument); + public BaseInspectionVisitor buildVisitor() { + return new NonSerializableObjectBoundToHttpSessionVisitor(); + } + + private static class NonSerializableObjectBoundToHttpSessionVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(PsiMethodCallExpression methodCallExpression) { + super.visitMethodCallExpression(methodCallExpression); + if (!MethodCallUtils.isSimpleCallToMethod( + methodCallExpression, + "javax.servlet.http.HttpSession", + PsiType.VOID, + "putValue", + CommonClassNames.JAVA_LANG_STRING, + CommonClassNames.JAVA_LANG_OBJECT + ) + && !MethodCallUtils.isSimpleCallToMethod( + methodCallExpression, + "javax.servlet.http.HttpSession", + PsiType.VOID, + "setAttribute", + CommonClassNames.JAVA_LANG_STRING, + CommonClassNames.JAVA_LANG_OBJECT + )) { + return; + } + final PsiExpressionList argumentList = methodCallExpression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 2) { + return; + } + final PsiExpression argument = arguments[1]; + final PsiType argumentType = argument.getType(); + if (argumentType == null) { + return; + } + if (SerializationUtils.isProbablySerializable(argumentType)) { + return; + } + registerError(argument); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/serialization/NonSerializableObjectPassedToObjectStreamInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/serialization/NonSerializableObjectPassedToObjectStreamInspection.java index 9945f5866..6e78807fe 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/serialization/NonSerializableObjectPassedToObjectStreamInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/serialization/NonSerializableObjectPassedToObjectStreamInspection.java @@ -22,61 +22,56 @@ 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 NonSerializableObjectPassedToObjectStreamInspection - extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.nonSerializableObjectPassedToObjectStreamDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.nonSerializableObjectPassedToObjectStreamProblemDescriptor().get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new NonSerializableObjectPassedToObjectStreamVisitor(); - } +public class NonSerializableObjectPassedToObjectStreamInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nonSerializableObjectPassedToObjectStreamDisplayName(); + } - private static class NonSerializableObjectPassedToObjectStreamVisitor - extends BaseInspectionVisitor { + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.nonSerializableObjectPassedToObjectStreamProblemDescriptor().get(); + } @Override - public void visitMethodCallExpression( - PsiMethodCallExpression methodCallExpression) { - super.visitMethodCallExpression(methodCallExpression); + public BaseInspectionVisitor buildVisitor() { + return new NonSerializableObjectPassedToObjectStreamVisitor(); + } + + private static class NonSerializableObjectPassedToObjectStreamVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression(PsiMethodCallExpression methodCallExpression) { + super.visitMethodCallExpression(methodCallExpression); - if (!MethodCallUtils.isSimpleCallToMethod( - methodCallExpression, - "java.io.ObjectOutputStream", - PsiType.VOID, - "writeObject", - CommonClassNames.JAVA_LANG_OBJECT - )) { - return; - } - final PsiExpressionList argumentList = - methodCallExpression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 1) { - return; - } - final PsiExpression argument = arguments[0]; - final PsiType argumentType = argument.getType(); - if (argumentType == null) { - return; - } - if (SerializationUtils.isProbablySerializable(argumentType)) { - return; - } - registerError(argument); + if (!MethodCallUtils.isSimpleCallToMethod( + methodCallExpression, + "java.io.ObjectOutputStream", + PsiType.VOID, + "writeObject", + CommonClassNames.JAVA_LANG_OBJECT + )) { + return; + } + final PsiExpressionList argumentList = methodCallExpression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 1) { + return; + } + final PsiExpression argument = arguments[0]; + final PsiType argumentType = argument.getType(); + if (argumentType == null) { + return; + } + if (SerializationUtils.isProbablySerializable(argumentType)) { + return; + } + registerError(argument); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/serialization/NonSerializableWithSerializationMethodsInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/serialization/NonSerializableWithSerializationMethodsInspection.java index 6a6fff1f2..8243ba369 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/serialization/NonSerializableWithSerializationMethodsInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/serialization/NonSerializableWithSerializationMethodsInspection.java @@ -24,88 +24,82 @@ import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl -public class NonSerializableWithSerializationMethodsInspection - extends BaseInspection { - - @Override - @Nonnull - public String getID() { - return "NonSerializableClassWithSerializationMethods"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.nonSerializableClassWithReadwriteobjectDisplayName().get(); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - if (infos[2] instanceof PsiAnonymousClass) { - return null; +public class NonSerializableWithSerializationMethodsInspection extends BaseInspection { + @Override + @Nonnull + public String getID() { + return "NonSerializableClassWithSerializationMethods"; } - return new MakeSerializableFix(); - } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final boolean hasReadObject = (Boolean)infos[0]; - final boolean hasWriteObject = (Boolean)infos[1]; - final PsiClass aClass = (PsiClass)infos[2]; - if (aClass instanceof PsiAnonymousClass) { - if (hasReadObject && hasWriteObject) { - return InspectionGadgetsLocalize.nonSerializableAnonymousWithReadwriteobjectProblemDescriptorBoth().get(); - } - else if (hasWriteObject) { - return InspectionGadgetsLocalize.nonSerializableAnonymousWithReadwriteobjectProblemDescriptorWrite().get(); - } - else { - return InspectionGadgetsLocalize.nonSerializableAnonymousWithReadwriteobjectProblemDescriptorRead().get(); - } - } - else { - if (hasReadObject && hasWriteObject) { - return InspectionGadgetsLocalize.nonSerializableClassWithReadwriteobjectProblemDescriptorBoth().get(); - } - else if (hasWriteObject) { - return InspectionGadgetsLocalize.nonSerializableClassWithReadwriteobjectProblemDescriptorWrite().get(); - } - else { - return InspectionGadgetsLocalize.nonSerializableClassWithReadwriteobjectProblemDescriptorRead().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nonSerializableClassWithReadwriteobjectDisplayName(); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new NonserializableDefinesSerializationMethodsVisitor(); - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + if (infos[2] instanceof PsiAnonymousClass) { + return null; + } + return new MakeSerializableFix(); + } - private static class NonserializableDefinesSerializationMethodsVisitor - extends BaseInspectionVisitor { + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final boolean hasReadObject = (Boolean) infos[0]; + final boolean hasWriteObject = (Boolean) infos[1]; + final PsiClass aClass = (PsiClass) infos[2]; + if (aClass instanceof PsiAnonymousClass) { + if (hasReadObject && hasWriteObject) { + return InspectionGadgetsLocalize.nonSerializableAnonymousWithReadwriteobjectProblemDescriptorBoth().get(); + } + else if (hasWriteObject) { + return InspectionGadgetsLocalize.nonSerializableAnonymousWithReadwriteobjectProblemDescriptorWrite().get(); + } + else { + return InspectionGadgetsLocalize.nonSerializableAnonymousWithReadwriteobjectProblemDescriptorRead().get(); + } + } + else { + if (hasReadObject && hasWriteObject) { + return InspectionGadgetsLocalize.nonSerializableClassWithReadwriteobjectProblemDescriptorBoth().get(); + } + else if (hasWriteObject) { + return InspectionGadgetsLocalize.nonSerializableClassWithReadwriteobjectProblemDescriptorWrite().get(); + } + else { + return InspectionGadgetsLocalize.nonSerializableClassWithReadwriteobjectProblemDescriptorRead().get(); + } + } + } @Override - public void visitClass(@Nonnull PsiClass aClass) { - // no call to super, so it doesn't drill down - if (aClass.isInterface() || aClass.isAnnotationType()) { - return; - } - final boolean hasReadObject = - SerializationUtils.hasReadObject(aClass); - final boolean hasWriteObject = - SerializationUtils.hasWriteObject(aClass); - if (!hasWriteObject && !hasReadObject) { - return; - } - if (SerializationUtils.isSerializable(aClass)) { - return; - } - registerClassError(aClass, Boolean.valueOf(hasReadObject), - Boolean.valueOf(hasWriteObject), aClass); + public BaseInspectionVisitor buildVisitor() { + return new NonserializableDefinesSerializationMethodsVisitor(); + } + + private static class NonserializableDefinesSerializationMethodsVisitor extends BaseInspectionVisitor { + @Override + public void visitClass(@Nonnull PsiClass aClass) { + // no call to super, so it doesn't drill down + if (aClass.isInterface() || aClass.isAnnotationType()) { + return; + } + final boolean hasReadObject = SerializationUtils.hasReadObject(aClass); + final boolean hasWriteObject = SerializationUtils.hasWriteObject(aClass); + if (!hasWriteObject && !hasReadObject) { + return; + } + if (SerializationUtils.isSerializable(aClass)) { + return; + } + registerClassError(aClass, Boolean.valueOf(hasReadObject), Boolean.valueOf(hasWriteObject), aClass); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/serialization/ReadObjectAndWriteObjectPrivateInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/serialization/ReadObjectAndWriteObjectPrivateInspection.java index d8e6d9845..8d38c4f27 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/serialization/ReadObjectAndWriteObjectPrivateInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/serialization/ReadObjectAndWriteObjectPrivateInspection.java @@ -25,59 +25,56 @@ import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl -public class ReadObjectAndWriteObjectPrivateInspection - extends BaseInspection { - - @Nonnull - public String getID() { - return "NonPrivateSerializationMethod"; - } - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.readwriteobjectPrivateDisplayName().get(); - } +public class ReadObjectAndWriteObjectPrivateInspection extends BaseInspection { + @Nonnull + public String getID() { + return "NonPrivateSerializationMethod"; + } - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.readwriteobjectPrivateProblemDescriptor().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.readwriteobjectPrivateDisplayName(); + } - public BaseInspectionVisitor buildVisitor() { - return new ReadObjectWriteObjectPrivateVisitor(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.readwriteobjectPrivateProblemDescriptor().get(); + } - public InspectionGadgetsFix buildFix(Object... infos) { - return new ChangeModifierFix(PsiModifier.PRIVATE); - } + public BaseInspectionVisitor buildVisitor() { + return new ReadObjectWriteObjectPrivateVisitor(); + } - private static class ReadObjectWriteObjectPrivateVisitor - extends BaseInspectionVisitor { + public InspectionGadgetsFix buildFix(Object... infos) { + return new ChangeModifierFix(PsiModifier.PRIVATE); + } - @Override - public void visitMethod(@Nonnull PsiMethod method) { - // no call to super, so it doesn't drill down - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return; - } - if (aClass.isInterface() || aClass.isAnnotationType()) { - return; - } - if (method.hasModifierProperty(PsiModifier.PRIVATE)) { - return; - } - if (!SerializationUtils.isReadObject(method) && - !SerializationUtils.isWriteObject(method)) { - return; - } - if (!SerializationUtils.isSerializable(aClass)) { - return; - } - registerMethodError(method); + private static class ReadObjectWriteObjectPrivateVisitor extends BaseInspectionVisitor { + @Override + public void visitMethod(@Nonnull PsiMethod method) { + // no call to super, so it doesn't drill down + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return; + } + if (aClass.isInterface() || aClass.isAnnotationType()) { + return; + } + if (method.hasModifierProperty(PsiModifier.PRIVATE)) { + return; + } + if (!SerializationUtils.isReadObject(method) && !SerializationUtils.isWriteObject(method)) { + return; + } + if (!SerializationUtils.isSerializable(aClass)) { + return; + } + registerMethodError(method); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/serialization/ReadObjectInitializationInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/serialization/ReadObjectInitializationInspection.java index 464d0db99..d70ddbd95 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/serialization/ReadObjectInitializationInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/serialization/ReadObjectInitializationInspection.java @@ -23,81 +23,75 @@ import com.siyeh.ig.psiutils.ControlFlowUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class ReadObjectInitializationInspection extends BaseInspection { + @Nonnull + public String getID() { + return "InstanceVariableMayNotBeInitializedByReadObject"; + } - @Nonnull - public String getID() { - return "InstanceVariableMayNotBeInitializedByReadObject"; - } - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.readobjectInitializationDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.readobjectInitializationProblemDescriptor().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.readobjectInitializationDisplayName(); + } - public BaseInspectionVisitor buildVisitor() { - return new ReadObjectInitializationVisitor(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.readobjectInitializationProblemDescriptor().get(); + } - private static class ReadObjectInitializationVisitor - extends BaseInspectionVisitor { + public BaseInspectionVisitor buildVisitor() { + return new ReadObjectInitializationVisitor(); + } - @Override - public void visitMethod(@Nonnull PsiMethod method) { - // no call to super, so it doesn't drill down - final PsiClass aClass = method.getContainingClass(); - if (aClass == null) { - return; - } - if (aClass.isInterface() || aClass.isAnnotationType()) { - return; - } - if (!SerializationUtils.isSerializable(aClass)) { - return; - } - if (!SerializationUtils.isReadObject(method)) { - return; - } - final boolean defaultReadObjectCalled = - ControlFlowUtils.elementContainsCallToMethod(method, "java.io.ObjectInputStream", - PsiType.VOID, "defaultReadObject"); - final PsiField[] fields = aClass.getFields(); - if (defaultReadObjectCalled) { - for (final PsiField field : fields) { - if (field.hasModifierProperty(PsiModifier.TRANSIENT) && - !isFieldInitialized(field, method)) { - registerFieldError(field); - } - } - } - else { - for (final PsiField field : fields) { - if (!isFieldInitialized(field, method)) { - registerFieldError(field); - } + private static class ReadObjectInitializationVisitor extends BaseInspectionVisitor { + @Override + public void visitMethod(@Nonnull PsiMethod method) { + // no call to super, so it doesn't drill down + final PsiClass aClass = method.getContainingClass(); + if (aClass == null) { + return; + } + if (aClass.isInterface() || aClass.isAnnotationType()) { + return; + } + if (!SerializationUtils.isSerializable(aClass)) { + return; + } + if (!SerializationUtils.isReadObject(method)) { + return; + } + final boolean defaultReadObjectCalled = + ControlFlowUtils.elementContainsCallToMethod(method, "java.io.ObjectInputStream", PsiType.VOID, "defaultReadObject"); + final PsiField[] fields = aClass.getFields(); + if (defaultReadObjectCalled) { + for (final PsiField field : fields) { + if (field.hasModifierProperty(PsiModifier.TRANSIENT) && !isFieldInitialized(field, method)) { + registerFieldError(field); + } + } + } + else { + for (final PsiField field : fields) { + if (!isFieldInitialized(field, method)) { + registerFieldError(field); + } + } + } } - } - } - public static boolean isFieldInitialized(@Nonnull PsiField field, - @Nonnull PsiMethod method) { - if (field.hasModifierProperty(PsiModifier.STATIC)) { - return true; - } - if (field.hasModifierProperty(PsiModifier.FINAL) && - field.getInitializer() != null) { - return true; - } - return InitializationUtils.methodAssignsVariableOrFails(method, - field); + public static boolean isFieldInitialized(@Nonnull PsiField field, @Nonnull PsiMethod method) { + if (field.hasModifierProperty(PsiModifier.STATIC)) { + return true; + } + if (field.hasModifierProperty(PsiModifier.FINAL) && field.getInitializer() != null) { + return true; + } + return InitializationUtils.methodAssignsVariableOrFails(method, field); + } } - } } \ No newline at end of file