diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml index a9f8456a52c1..4e3f8c6d86ee 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/META-INF/InspectionGadgets.xml @@ -1624,6 +1624,10 @@ bundle="com.siyeh.InspectionGadgetsBundle" key="array.allocation.zero.length.display.name" groupBundle="messages.InspectionsBundle" groupKey="group.names.memory.issues" enabledByDefault="false" level="WARNING" implementationClass="com.siyeh.ig.memory.ZeroLengthArrayInitializationInspection"/> + #ref should not be called in production code #loc array.allocation.zero.length.display.name=Zero-length array allocation array.allocation.zero.length.problem.descriptor=Allocation of zero length array #loc +constant.for.zero.length.array.display.name=Unnecessary zero length array usage +constant.for.zero.length.array.problem.descriptor=Zero length array can be changed to constant #loc +constant.for.zero.length.array.quickfix.family=Replace with constant +replace.with=Replace with ''{0}'' multiple.loggers.display.name=Class with multiple loggers logger.name.option=Logger &class name: multiple.loggers.problem.descriptor=Class #ref declares multiple loggers #loc diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/memory/ReplaceEmptyArrayToConstantFix.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/memory/ReplaceEmptyArrayToConstantFix.java new file mode 100644 index 000000000000..a280e2e5bcb2 --- /dev/null +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/memory/ReplaceEmptyArrayToConstantFix.java @@ -0,0 +1,59 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.siyeh.ig.memory; + +import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import com.intellij.psi.codeStyle.JavaCodeStyleManager; +import com.siyeh.InspectionGadgetsBundle; +import com.siyeh.ig.InspectionGadgetsFix; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; + +/** + * @author Konstantin Bulenkov + */ +public class ReplaceEmptyArrayToConstantFix extends InspectionGadgetsFix { + private final String myText; + private final String myName; + + public ReplaceEmptyArrayToConstantFix(PsiClass aClass, PsiField field) { + myText = aClass.getQualifiedName() + "." + field.getName(); + myName = InspectionGadgetsBundle.message("replace.with", aClass.getName() + "." + field.getName()); + } + + @Nls + @NotNull + @Override + public String getName() { + return myName; + } + + @Nls + @NotNull + @Override + public String getFamilyName() { + return InspectionGadgetsBundle.message("constant.for.zero.length.array.quickfix.family"); + } + + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) { + PsiExpression newExp = JavaPsiFacade.getInstance(project).getElementFactory().createExpressionFromText(myText, descriptor.getPsiElement()); + PsiElement element = descriptor.getPsiElement().replace(newExp); + JavaCodeStyleManager.getInstance(project).shortenClassReferences(element); + } +} diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/memory/UnnecessaryEmptyArrayUsageInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/memory/UnnecessaryEmptyArrayUsageInspection.java new file mode 100644 index 000000000000..5505aa678b0c --- /dev/null +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/memory/UnnecessaryEmptyArrayUsageInspection.java @@ -0,0 +1,82 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.siyeh.ig.memory; + +import com.intellij.psi.*; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiTypesUtil; +import com.siyeh.InspectionGadgetsBundle; +import com.siyeh.ig.BaseInspection; +import com.siyeh.ig.BaseInspectionVisitor; +import com.siyeh.ig.InspectionGadgetsFix; +import com.siyeh.ig.psiutils.ExpressionUtils; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Konstantin Bulenkov + */ +public class UnnecessaryEmptyArrayUsageInspection extends BaseInspection { + @Nls + @NotNull + @Override + public String getDisplayName() { + return InspectionGadgetsBundle.message("constant.for.zero.length.array.display.name"); + } + + @NotNull + @Override + protected String buildErrorString(Object... infos) { + return InspectionGadgetsBundle.message("constant.for.zero.length.array.problem.descriptor"); + } + + @Nullable + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new ReplaceEmptyArrayToConstantFix((PsiClass)infos[0], (PsiField)infos[1]); + } + + @Override + public BaseInspectionVisitor buildVisitor() { + return new BaseInspectionVisitor() { + @Override + public void visitNewExpression(PsiNewExpression expression) { + if (ExpressionUtils.isZeroLengthArrayConstruction(expression)) { + PsiType type = expression.getType(); + if (type instanceof PsiArrayType) { + PsiType arrayType = ((PsiArrayType)type).getComponentType(); + PsiClass typeClass = PsiTypesUtil.getPsiClass(arrayType); + if (typeClass != null) { + for (PsiField field : typeClass.getFields()) { + PsiModifierList modifiers = field.getModifierList(); + if (modifiers != null + && !typeClass.isEquivalentTo(PsiTreeUtil.findFirstParent(expression, (e) -> e instanceof PsiClass)) + && modifiers.hasModifierProperty(PsiModifier.FINAL) + && modifiers.hasModifierProperty(PsiModifier.PUBLIC) + && ExpressionUtils.isZeroLengthArrayConstruction(field.getInitializer())) { + registerError(expression, typeClass, field); + return; + } + } + } + } + } + super.visitNewExpression(expression); + } + }; + } +} diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/UnnecessaryEmptyArrayUsage.html b/plugins/InspectionGadgets/src/inspectionDescriptions/UnnecessaryEmptyArrayUsage.html new file mode 100644 index 000000000000..c1745110e071 --- /dev/null +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/UnnecessaryEmptyArrayUsage.html @@ -0,0 +1,8 @@ + + +Reports on allocations of arrays with known lengths of zero when there is a constant for that in the class of array's type. + +

+ + + \ No newline at end of file