diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/IteratorNextDoesNotThrowNoSuchElementExceptionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/IteratorNextDoesNotThrowNoSuchElementExceptionInspection.java index c05121733..62b26a457 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/IteratorNextDoesNotThrowNoSuchElementExceptionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/IteratorNextDoesNotThrowNoSuchElementExceptionInspection.java @@ -35,7 +35,7 @@ public class IteratorNextDoesNotThrowNoSuchElementExceptionInspection extends BaseInspection { @Nonnull @Override - @Pattern("[a-zA-Z_0-9.]+") + @Pattern(VALID_ID_PATTERN) public String getID() { return "IteratorNextCanNotThrowNoSuchElementException"; } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MalformedFormatStringInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MalformedFormatStringInspection.java index 04b6bbf42..2f83014d4 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MalformedFormatStringInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MalformedFormatStringInspection.java @@ -25,116 +25,116 @@ import com.siyeh.ig.psiutils.ExpressionUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class MalformedFormatStringInspection extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.malformedFormatStringDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final Object value = infos[0]; - if (value instanceof Exception) { - return InspectionGadgetsLocalize.malformedFormatStringProblemDescriptorMalformed().get(); - } - final Validator[] validators = (Validator[])value; - final int argumentCount = ((Integer)infos[1]).intValue(); - if (validators.length < argumentCount) { - return InspectionGadgetsBundle.message("malformed.format.string.problem.descriptor.too.many.arguments"); + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.malformedFormatStringDisplayName(); } - if (validators.length > argumentCount) { - return InspectionGadgetsBundle.message("malformed.format.string.problem.descriptor.too.few.arguments"); + + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final Object value = infos[0]; + if (value instanceof Exception) { + return InspectionGadgetsLocalize.malformedFormatStringProblemDescriptorMalformed().get(); + } + final Validator[] validators = (Validator[]) value; + final int argumentCount = ((Integer) infos[1]).intValue(); + if (validators.length < argumentCount) { + return InspectionGadgetsBundle.message("malformed.format.string.problem.descriptor.too.many.arguments"); + } + if (validators.length > argumentCount) { + return InspectionGadgetsBundle.message("malformed.format.string.problem.descriptor.too.few.arguments"); + } + return InspectionGadgetsBundle.message("malformed.format.string.problem.descriptor.arguments.do.not.match.type"); } - return InspectionGadgetsBundle.message("malformed.format.string.problem.descriptor.arguments.do.not.match.type"); - } - @Override - public boolean isEnabledByDefault() { - return true; - } + @Override + public boolean isEnabledByDefault() { + return true; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new MalformedFormatStringVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new MalformedFormatStringVisitor(); + } - private static class MalformedFormatStringVisitor extends BaseInspectionVisitor { + private static class MalformedFormatStringVisitor extends BaseInspectionVisitor { - @Override - public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - if (!FormatUtils.isFormatCall(expression)) { - return; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length == 0) { - return; - } - final PsiExpression firstArgument = arguments[0]; - final PsiType type = firstArgument.getType(); - if (type == null) { - return; - } - final int formatArgumentIndex; - if ("java.util.Locale".equals(type.getCanonicalText()) && arguments.length > 1) { - formatArgumentIndex = 1; - } - else { - formatArgumentIndex = 0; - } - final PsiExpression formatArgument = arguments[formatArgumentIndex]; - if (!ExpressionUtils.hasStringType(formatArgument)) { - return; - } - if (!PsiUtil.isConstantExpression(formatArgument)) { - return; - } - final PsiType formatType = formatArgument.getType(); - if (formatType == null) { - return; - } - final String value = (String)ConstantExpressionUtil.computeCastTo(formatArgument, formatType); - if (value == null) { - return; - } - final int argumentCount = arguments.length - (formatArgumentIndex + 1); - final Validator[] validators; - try { - validators = FormatDecode.decode(value, argumentCount); - } - catch (Exception e) { - registerError(formatArgument, e); - return; - } - if (validators.length != argumentCount) { - if (argumentCount == 1) { - final PsiExpression argument = arguments[formatArgumentIndex + 1]; - final PsiType argumentType = argument.getType(); - if (argumentType instanceof PsiArrayType) { - return; - } - } - registerError(formatArgument, validators, Integer.valueOf(argumentCount)); - return; - } - for (int i = 0; i < validators.length; i++) { - final Validator validator = validators[i]; - final PsiType argumentType = arguments[i + formatArgumentIndex + 1].getType(); - if (argumentType == null) { - continue; - } - if (!validator.valid(argumentType)) { - registerError(formatArgument, validators, Integer.valueOf(argumentCount)); - return; + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + if (!FormatUtils.isFormatCall(expression)) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length == 0) { + return; + } + final PsiExpression firstArgument = arguments[0]; + final PsiType type = firstArgument.getType(); + if (type == null) { + return; + } + final int formatArgumentIndex; + if ("java.util.Locale".equals(type.getCanonicalText()) && arguments.length > 1) { + formatArgumentIndex = 1; + } + else { + formatArgumentIndex = 0; + } + final PsiExpression formatArgument = arguments[formatArgumentIndex]; + if (!ExpressionUtils.hasStringType(formatArgument)) { + return; + } + if (!PsiUtil.isConstantExpression(formatArgument)) { + return; + } + final PsiType formatType = formatArgument.getType(); + if (formatType == null) { + return; + } + final String value = (String) ConstantExpressionUtil.computeCastTo(formatArgument, formatType); + if (value == null) { + return; + } + final int argumentCount = arguments.length - (formatArgumentIndex + 1); + final Validator[] validators; + try { + validators = FormatDecode.decode(value, argumentCount); + } + catch (Exception e) { + registerError(formatArgument, e); + return; + } + if (validators.length != argumentCount) { + if (argumentCount == 1) { + final PsiExpression argument = arguments[formatArgumentIndex + 1]; + final PsiType argumentType = argument.getType(); + if (argumentType instanceof PsiArrayType) { + return; + } + } + registerError(formatArgument, validators, Integer.valueOf(argumentCount)); + return; + } + for (int i = 0; i < validators.length; i++) { + final Validator validator = validators[i]; + final PsiType argumentType = arguments[i + formatArgumentIndex + 1].getType(); + if (argumentType == null) { + continue; + } + if (!validator.valid(argumentType)) { + registerError(formatArgument, validators, Integer.valueOf(argumentCount)); + return; + } + } } - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MalformedRegexInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MalformedRegexInspection.java index d5d69c415..94160f3ad 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MalformedRegexInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MalformedRegexInspection.java @@ -27,6 +27,7 @@ import com.siyeh.ig.psiutils.MethodCallUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import java.util.regex.Pattern; @@ -34,69 +35,68 @@ @ExtensionImpl public class MalformedRegexInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.malformedRegularExpressionDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.malformedRegularExpressionDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return infos.length == 0 - ? InspectionGadgetsLocalize.malformedRegularExpressionProblemDescriptor1().get() - : InspectionGadgetsLocalize.malformedRegularExpressionProblemDescriptor2(infos[0]).get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return infos.length == 0 + ? InspectionGadgetsLocalize.malformedRegularExpressionProblemDescriptor1().get() + : InspectionGadgetsLocalize.malformedRegularExpressionProblemDescriptor2(infos[0]).get(); + } - @Override - public boolean isEnabledByDefault() { - return true; - } + @Override + public boolean isEnabledByDefault() { + return true; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new MalformedRegexVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new MalformedRegexVisitor(); + } - private static class MalformedRegexVisitor extends BaseInspectionVisitor { + private static class MalformedRegexVisitor extends BaseInspectionVisitor { - @Override - public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiExpressionList argumentList = expression.getArgumentList(); - if (argumentList == null) { - return; - } - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length == 0) { - return; - } - final PsiExpression argument = arguments[0]; - if (!ExpressionUtils.hasStringType(argument)) { - return; - } - if (!PsiUtil.isConstantExpression(argument)) { - return; - } - final PsiType regexType = argument.getType(); - final String value = (String)ConstantExpressionUtil.computeCastTo(argument, regexType); - if (value == null) { - return; - } - if (!MethodCallUtils.isCallToRegexMethod(expression)) { - return; - } - //noinspection UnusedCatchParameter,ProhibitedExceptionCaught - try { - Pattern.compile(value); - } - catch (PatternSyntaxException e) { - registerError(argument, e.getDescription()); - } - catch (NullPointerException e) { - registerError(argument); // due to a bug in the sun regex code - } + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiExpressionList argumentList = expression.getArgumentList(); + if (argumentList == null) { + return; + } + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length == 0) { + return; + } + final PsiExpression argument = arguments[0]; + if (!ExpressionUtils.hasStringType(argument)) { + return; + } + if (!PsiUtil.isConstantExpression(argument)) { + return; + } + final PsiType regexType = argument.getType(); + final String value = (String) ConstantExpressionUtil.computeCastTo(argument, regexType); + if (value == null) { + return; + } + if (!MethodCallUtils.isCallToRegexMethod(expression)) { + return; + } + //noinspection UnusedCatchParameter,ProhibitedExceptionCaught + try { + Pattern.compile(value); + } + catch (PatternSyntaxException e) { + registerError(argument, e.getDescription()); + } + catch (NullPointerException e) { + registerError(argument); // due to a bug in the sun regex code + } + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MalformedXPathInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MalformedXPathInspection.java index e6ae179d9..9652bf10e 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MalformedXPathInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MalformedXPathInspection.java @@ -23,8 +23,8 @@ import com.siyeh.ig.psiutils.ExpressionUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.NonNls; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathExpressionException; @@ -34,95 +34,93 @@ @ExtensionImpl public class MalformedXPathInspection extends BaseInspection { + /** + * @noinspection StaticCollection + */ + private static final Set xpathMethodNames = new HashSet(2); - /** - * @noinspection StaticCollection - */ - @NonNls - private static final Set xpathMethodNames = new HashSet(2); - - static { - xpathMethodNames.add("compile"); - xpathMethodNames.add("evaluate"); - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.malformedXpathExpressionDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.malformedXpathExpressionProblemDescription().get(); - } + static { + xpathMethodNames.add("compile"); + xpathMethodNames.add("evaluate"); + } - @Override - public boolean isEnabledByDefault() { - return true; - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.malformedXpathExpressionDisplayName(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new MalformedXPathVisitor(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.malformedXpathExpressionProblemDescription().get(); + } - private static class MalformedXPathVisitor extends BaseInspectionVisitor { + @Override + public boolean isEnabledByDefault() { + return true; + } @Override - public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length == 0) { - return; - } - final PsiExpression xpathArgument = arguments[0]; - if (!ExpressionUtils.hasStringType(xpathArgument)) { - return; - } - if (!PsiUtil.isConstantExpression(xpathArgument)) { - return; - } - final PsiType type = xpathArgument.getType(); - if (type == null) { - return; - } - final String value = (String)ConstantExpressionUtil.computeCastTo(xpathArgument, type); - if (value == null) { - return; - } - if (!callTakesXPathExpression(expression)) { - return; - } - final XPathFactory xpathFactory = XPathFactory.newInstance(); - final XPath xpath = xpathFactory.newXPath(); - //noinspection UnusedCatchParameter,ProhibitedExceptionCaught - try { - xpath.compile(value); - } - catch (XPathExpressionException ignore) { - registerError(xpathArgument); - } + public BaseInspectionVisitor buildVisitor() { + return new MalformedXPathVisitor(); } - private static boolean callTakesXPathExpression(PsiMethodCallExpression expression) { - final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - final String name = methodExpression.getReferenceName(); - if (!xpathMethodNames.contains(name)) { - return false; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return false; - } - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null) { - return false; - } - final String className = containingClass.getQualifiedName(); - return "javax.xml.xpath.XPath".equals(className); + private static class MalformedXPathVisitor extends BaseInspectionVisitor { + + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length == 0) { + return; + } + final PsiExpression xpathArgument = arguments[0]; + if (!ExpressionUtils.hasStringType(xpathArgument)) { + return; + } + if (!PsiUtil.isConstantExpression(xpathArgument)) { + return; + } + final PsiType type = xpathArgument.getType(); + if (type == null) { + return; + } + final String value = (String) ConstantExpressionUtil.computeCastTo(xpathArgument, type); + if (value == null) { + return; + } + if (!callTakesXPathExpression(expression)) { + return; + } + final XPathFactory xpathFactory = XPathFactory.newInstance(); + final XPath xpath = xpathFactory.newXPath(); + //noinspection UnusedCatchParameter,ProhibitedExceptionCaught + try { + xpath.compile(value); + } + catch (XPathExpressionException ignore) { + registerError(xpathArgument); + } + } + + private static boolean callTakesXPathExpression(PsiMethodCallExpression expression) { + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String name = methodExpression.getReferenceName(); + if (!xpathMethodNames.contains(name)) { + return false; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return false; + } + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) { + return false; + } + final String className = containingClass.getQualifiedName(); + return "javax.xml.xpath.XPath".equals(className); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MathRandomCastToIntInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MathRandomCastToIntInspection.java index 87d4f63ae..1a456bc9c 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MathRandomCastToIntInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MathRandomCastToIntInspection.java @@ -26,131 +26,130 @@ 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 MathRandomCastToIntInspection extends BaseInspection { - @Nls - @Nonnull - @Override - public String getDisplayName() { - return InspectionGadgetsLocalize.mathRandomCastToIntDisplayName().get(); - } - - @Nonnull - @Override - protected String buildErrorString(Object... infos) { - return InspectionGadgetsBundle.message("math.random.cast.to.int.problem.descriptor"); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiTypeCastExpression expression = (PsiTypeCastExpression)infos[0]; - final PsiElement parent = expression.getParent(); - if (!(parent instanceof PsiPolyadicExpression)) { - return null; - } - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)parent; - final IElementType tokenType = polyadicExpression.getOperationTokenType(); - if (JavaTokenType.ASTERISK != tokenType) { - return null; + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.mathRandomCastToIntDisplayName(); } - return new MathRandomCastToIntegerFix(); - } - private static class MathRandomCastToIntegerFix extends InspectionGadgetsFix { @Nonnull - public String getName() { - return InspectionGadgetsLocalize.mathRandomCastToIntQuickfix().get(); + @Override + protected String buildErrorString(Object... infos) { + return InspectionGadgetsBundle.message("math.random.cast.to.int.problem.descriptor"); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiElement parent = element.getParent(); - if (!(parent instanceof PsiTypeCastExpression)) { - return; - } - final PsiTypeCastExpression typeCastExpression = (PsiTypeCastExpression)parent; - final PsiElement grandParent = typeCastExpression.getParent(); - if (!(grandParent instanceof PsiPolyadicExpression)) { - return; - } - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)grandParent; - final PsiExpression operand = typeCastExpression.getOperand(); - if (operand == null) { - return; - } - @NonNls final StringBuilder newExpression = new StringBuilder(); - newExpression.append("(int)("); - final PsiExpression[] operands = polyadicExpression.getOperands(); - for (final PsiExpression expression : operands) { - final PsiJavaToken token = polyadicExpression.getTokenBeforeOperand(expression); - if (token != null) { - newExpression.append(token.getText()); - } - if (typeCastExpression.equals(expression)) { - newExpression.append(operand.getText()); + public boolean isEnabledByDefault() { + return true; + } + + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiTypeCastExpression expression = (PsiTypeCastExpression) infos[0]; + final PsiElement parent = expression.getParent(); + if (!(parent instanceof PsiPolyadicExpression)) { + return null; } - else { - newExpression.append(expression.getText()); + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) parent; + final IElementType tokenType = polyadicExpression.getOperationTokenType(); + if (JavaTokenType.ASTERISK != tokenType) { + return null; } - } - newExpression.append(')'); - replaceExpression(polyadicExpression, newExpression.toString()); + return new MathRandomCastToIntegerFix(); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new MathRandomCastToIntegerVisitor(); - } + private static class MathRandomCastToIntegerFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.mathRandomCastToIntQuickfix(); + } - private static class MathRandomCastToIntegerVisitor extends BaseInspectionVisitor { + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiElement parent = element.getParent(); + if (!(parent instanceof PsiTypeCastExpression)) { + return; + } + final PsiTypeCastExpression typeCastExpression = (PsiTypeCastExpression) parent; + final PsiElement grandParent = typeCastExpression.getParent(); + if (!(grandParent instanceof PsiPolyadicExpression)) { + return; + } + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) grandParent; + final PsiExpression operand = typeCastExpression.getOperand(); + if (operand == null) { + return; + } + @NonNls final StringBuilder newExpression = new StringBuilder(); + newExpression.append("(int)("); + final PsiExpression[] operands = polyadicExpression.getOperands(); + for (final PsiExpression expression : operands) { + final PsiJavaToken token = polyadicExpression.getTokenBeforeOperand(expression); + if (token != null) { + newExpression.append(token.getText()); + } + if (typeCastExpression.equals(expression)) { + newExpression.append(operand.getText()); + } + else { + newExpression.append(expression.getText()); + } + } + newExpression.append(')'); + replaceExpression(polyadicExpression, newExpression.toString()); + } + } @Override - public void visitTypeCastExpression(PsiTypeCastExpression expression) { - super.visitTypeCastExpression(expression); - final PsiExpression operand = expression.getOperand(); - if (!(operand instanceof PsiMethodCallExpression)) { - return; - } - final PsiTypeElement castType = expression.getCastType(); - if (castType == null) { - return; - } - final PsiType type = castType.getType(); - if (!PsiType.INT.equals(type) && !PsiType.LONG.equals(type)) { - return; - } - final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)operand; - final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); - @NonNls - final String referenceName = methodExpression.getReferenceName(); - if (!"random".equals(referenceName)) { - return; - } - final PsiMethod method = methodCallExpression.resolveMethod(); - if (method == null) { - return; - } - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null) { - return; - } - final String qualifiedName = containingClass.getQualifiedName(); - if (!CommonClassNames.JAVA_LANG_MATH.equals(qualifiedName) && !CommonClassNames.JAVA_LANG_STRICT_MATH.equals(qualifiedName)) { - return; - } - registerError(methodCallExpression, expression); + public BaseInspectionVisitor buildVisitor() { + return new MathRandomCastToIntegerVisitor(); + } + + private static class MathRandomCastToIntegerVisitor extends BaseInspectionVisitor { + + @Override + public void visitTypeCastExpression(PsiTypeCastExpression expression) { + super.visitTypeCastExpression(expression); + final PsiExpression operand = expression.getOperand(); + if (!(operand instanceof PsiMethodCallExpression)) { + return; + } + final PsiTypeElement castType = expression.getCastType(); + if (castType == null) { + return; + } + final PsiType type = castType.getType(); + if (!PsiType.INT.equals(type) && !PsiType.LONG.equals(type)) { + return; + } + final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression) operand; + final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); + @NonNls final String referenceName = methodExpression.getReferenceName(); + if (!"random".equals(referenceName)) { + return; + } + final PsiMethod method = methodCallExpression.resolveMethod(); + if (method == null) { + return; + } + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) { + return; + } + final String qualifiedName = containingClass.getQualifiedName(); + if (!CommonClassNames.JAVA_LANG_MATH.equals(qualifiedName) && !CommonClassNames.JAVA_LANG_STRICT_MATH.equals(qualifiedName)) { + return; + } + registerError(methodCallExpression, expression); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MismatchedArrayReadWriteInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MismatchedArrayReadWriteInspection.java index afd4756a5..589b763ad 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MismatchedArrayReadWriteInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MismatchedArrayReadWriteInspection.java @@ -25,282 +25,299 @@ import consulo.language.ast.IElementType; import consulo.language.psi.PsiElement; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import org.jetbrains.annotations.NonNls; @ExtensionImpl public class MismatchedArrayReadWriteInspection extends BaseInspection { - - @Override - @Nonnull - public String getID() { - return "MismatchedReadAndWriteOfArray"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.mismatchedReadWriteArrayDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final boolean written = (Boolean)infos[0]; - return written - ? InspectionGadgetsLocalize.mismatchedReadWriteArrayProblemDescriptorWriteNotRead().get() - : InspectionGadgetsLocalize.mismatchedReadWriteArrayProblemDescriptorReadNotWrite().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - public boolean runForWholeFile() { - return true; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new MismatchedArrayReadWriteVisitor(); - } - - private static class MismatchedArrayReadWriteVisitor - extends BaseInspectionVisitor { - + @Nonnull @Override - public void visitField(@Nonnull PsiField field) { - super.visitField(field); - if (!field.hasModifierProperty(PsiModifier.PRIVATE)) { - return; - } - final PsiClass containingClass = PsiUtil.getTopLevelClass(field); - if (!checkVariable(field, containingClass)) { - return; - } - final boolean written = - arrayContentsAreWritten(field, containingClass); - final boolean read = arrayContentsAreRead(field, containingClass); - if (written == read) { - return; - } - registerFieldError(field, Boolean.valueOf(written)); + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "MismatchedReadAndWriteOfArray"; } + @Nonnull @Override - public void visitLocalVariable( - @Nonnull PsiLocalVariable variable) { - super.visitLocalVariable(variable); - final PsiCodeBlock codeBlock = - PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class); - if (!checkVariable(variable, codeBlock)) { - return; - } - final boolean written = - arrayContentsAreWritten(variable, codeBlock); - final boolean read = arrayContentsAreRead(variable, codeBlock); - if (written == read) { - return; - } - registerVariableError(variable, Boolean.valueOf(written)); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.mismatchedReadWriteArrayDisplayName(); } - private static boolean checkVariable(PsiVariable variable, - PsiElement context) { - if (context == null) { - return false; - } - final PsiType type = variable.getType(); - if (type.getArrayDimensions() == 0) { - return false; - } - if (VariableAccessUtils.variableIsAssigned(variable, context)) { - return false; - } - if (VariableAccessUtils.variableIsAssignedFrom(variable, context)) { - return false; - } - if (VariableAccessUtils.variableIsReturned(variable, context)) { - return false; - } - return !VariableAccessUtils.variableIsUsedInArrayInitializer( - variable, context); + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final boolean written = (Boolean) infos[0]; + return written + ? InspectionGadgetsLocalize.mismatchedReadWriteArrayProblemDescriptorWriteNotRead().get() + : InspectionGadgetsLocalize.mismatchedReadWriteArrayProblemDescriptorReadNotWrite().get(); } - private static boolean arrayContentsAreWritten(PsiVariable variable, - PsiElement context) { - if (VariableAccessUtils.arrayContentsAreAssigned(variable, context)) { - return true; - } - final PsiExpression initializer = variable.getInitializer(); - if (initializer != null && !isDefaultArrayInitializer(initializer)) { + @Override + public boolean isEnabledByDefault() { return true; - } - return variableIsWritten(variable, context); } - private static boolean arrayContentsAreRead(PsiVariable variable, - PsiElement context) { - if (VariableAccessUtils.arrayContentsAreAccessed(variable, context)) { + @Override + public boolean runForWholeFile() { return true; - } - return variableIsRead(variable, context); - } - - private static boolean isDefaultArrayInitializer( - PsiExpression initializer) { - if (initializer instanceof PsiNewExpression) { - final PsiNewExpression newExpression = - (PsiNewExpression)initializer; - final PsiArrayInitializerExpression arrayInitializer = - newExpression.getArrayInitializer(); - return arrayInitializer == null || - isDefaultArrayInitializer(arrayInitializer); - } - else if (initializer instanceof PsiArrayInitializerExpression) { - final PsiArrayInitializerExpression arrayInitializerExpression = - (PsiArrayInitializerExpression)initializer; - final PsiExpression[] initializers = - arrayInitializerExpression.getInitializers(); - return initializers.length == 0; - } - return false; } - public static boolean variableIsWritten(@Nonnull PsiVariable variable, @Nonnull PsiElement context) { - final VariableReadWriteVisitor visitor = - new VariableReadWriteVisitor(variable, true); - context.accept(visitor); - return visitor.isPassed(); - } - - public static boolean variableIsRead(@Nonnull PsiVariable variable, @Nonnull PsiElement context) { - final VariableReadWriteVisitor visitor = - new VariableReadWriteVisitor(variable, false); - context.accept(visitor); - return visitor.isPassed(); + @Override + public BaseInspectionVisitor buildVisitor() { + return new MismatchedArrayReadWriteVisitor(); } - static class VariableReadWriteVisitor extends JavaRecursiveElementVisitor { - - @Nonnull - private final PsiVariable variable; - private final boolean write; - private boolean passed = false; + private static class MismatchedArrayReadWriteVisitor + extends BaseInspectionVisitor { - VariableReadWriteVisitor(@Nonnull PsiVariable variable, boolean write) { - this.variable = variable; - this.write = write; - } - - @Override - public void visitElement(@Nonnull PsiElement element) { - if (!passed) { - super.visitElement(element); + @Override + public void visitField(@Nonnull PsiField field) { + super.visitField(field); + if (!field.hasModifierProperty(PsiModifier.PRIVATE)) { + return; + } + final PsiClass containingClass = PsiUtil.getTopLevelClass(field); + if (!checkVariable(field, containingClass)) { + return; + } + final boolean written = + arrayContentsAreWritten(field, containingClass); + final boolean read = arrayContentsAreRead(field, containingClass); + if (written == read) { + return; + } + registerFieldError(field, Boolean.valueOf(written)); } - } - @Override - public void visitBinaryExpression(PsiBinaryExpression expression) { - super.visitBinaryExpression(expression); - if (write || passed) { - return; - } - final IElementType tokenType = expression.getOperationTokenType(); - if (!JavaTokenType.EQEQ.equals(tokenType) && !JavaTokenType.NE.equals(tokenType)) { - return; - } - final PsiExpression lhs = expression.getLOperand(); - if (!(lhs instanceof PsiBinaryExpression)) { - if (VariableAccessUtils.mayEvaluateToVariable(lhs, variable)) { - passed = true; - } - } - final PsiExpression rhs = expression.getROperand(); - if (!(rhs instanceof PsiBinaryExpression)) { - if (VariableAccessUtils.mayEvaluateToVariable(rhs, variable)) { - passed = true; - } + @Override + public void visitLocalVariable( + @Nonnull PsiLocalVariable variable + ) { + super.visitLocalVariable(variable); + final PsiCodeBlock codeBlock = + PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class); + if (!checkVariable(variable, codeBlock)) { + return; + } + final boolean written = + arrayContentsAreWritten(variable, codeBlock); + final boolean read = arrayContentsAreRead(variable, codeBlock); + if (written == read) { + return; + } + registerVariableError(variable, Boolean.valueOf(written)); } - } - @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression call) { - if (passed) { - return; - } - super.visitMethodCallExpression(call); - final PsiExpressionList argumentList = call.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - for (int i = 0; i < arguments.length; i++) { - final PsiExpression argument = arguments[i]; - if (VariableAccessUtils.mayEvaluateToVariable(argument, - variable)) { - if (write && i == 0 && isCallToSystemArraycopy(call)) { - return; + private static boolean checkVariable( + PsiVariable variable, + PsiElement context + ) { + if (context == null) { + return false; } - if (!write && i == 2 && isCallToSystemArraycopy(call)) { - return; + final PsiType type = variable.getType(); + if (type.getArrayDimensions() == 0) { + return false; } - passed = true; - } + if (VariableAccessUtils.variableIsAssigned(variable, context)) { + return false; + } + if (VariableAccessUtils.variableIsAssignedFrom(variable, context)) { + return false; + } + if (VariableAccessUtils.variableIsReturned(variable, context)) { + return false; + } + return !VariableAccessUtils.variableIsUsedInArrayInitializer( + variable, context); } - } - private static boolean isCallToSystemArraycopy( - PsiMethodCallExpression call) { - final PsiReferenceExpression methodExpression = - call.getMethodExpression(); - @NonNls final String name = - methodExpression.getReferenceName(); - if (!"arraycopy".equals(name)) { - return false; - } - final PsiExpression qualifier = - methodExpression.getQualifierExpression(); - if (!(qualifier instanceof PsiReferenceExpression)) { - return false; + private static boolean arrayContentsAreWritten( + PsiVariable variable, + PsiElement context + ) { + if (VariableAccessUtils.arrayContentsAreAssigned(variable, context)) { + return true; + } + final PsiExpression initializer = variable.getInitializer(); + if (initializer != null && !isDefaultArrayInitializer(initializer)) { + return true; + } + return variableIsWritten(variable, context); } - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)qualifier; - final PsiElement element = - referenceExpression.resolve(); - if (!(element instanceof PsiClass)) { - return false; + + private static boolean arrayContentsAreRead( + PsiVariable variable, + PsiElement context + ) { + if (VariableAccessUtils.arrayContentsAreAccessed(variable, context)) { + return true; + } + return variableIsRead(variable, context); } - final PsiClass aClass = (PsiClass)element; - final String qualifiedName = - aClass.getQualifiedName(); - return "java.lang.System".equals(qualifiedName); - } - @Override - public void visitNewExpression( - @Nonnull PsiNewExpression newExpression) { - if (passed) { - return; + private static boolean isDefaultArrayInitializer( + PsiExpression initializer + ) { + if (initializer instanceof PsiNewExpression) { + final PsiNewExpression newExpression = + (PsiNewExpression) initializer; + final PsiArrayInitializerExpression arrayInitializer = + newExpression.getArrayInitializer(); + return arrayInitializer == null || + isDefaultArrayInitializer(arrayInitializer); + } + else if (initializer instanceof PsiArrayInitializerExpression) { + final PsiArrayInitializerExpression arrayInitializerExpression = + (PsiArrayInitializerExpression) initializer; + final PsiExpression[] initializers = + arrayInitializerExpression.getInitializers(); + return initializers.length == 0; + } + return false; } - super.visitNewExpression(newExpression); - final PsiExpressionList argumentList = - newExpression.getArgumentList(); - if (argumentList == null) { - return; + + public static boolean variableIsWritten(@Nonnull PsiVariable variable, @Nonnull PsiElement context) { + final VariableReadWriteVisitor visitor = + new VariableReadWriteVisitor(variable, true); + context.accept(visitor); + return visitor.isPassed(); } - final PsiExpression[] arguments = argumentList.getExpressions(); - for (final PsiExpression argument : arguments) { - if (VariableAccessUtils.mayEvaluateToVariable(argument, - variable)) { - passed = true; - } + + public static boolean variableIsRead(@Nonnull PsiVariable variable, @Nonnull PsiElement context) { + final VariableReadWriteVisitor visitor = + new VariableReadWriteVisitor(variable, false); + context.accept(visitor); + return visitor.isPassed(); } - } - public boolean isPassed() { - return passed; - } + static class VariableReadWriteVisitor extends JavaRecursiveElementVisitor { + + @Nonnull + private final PsiVariable variable; + private final boolean write; + private boolean passed = false; + + VariableReadWriteVisitor(@Nonnull PsiVariable variable, boolean write) { + this.variable = variable; + this.write = write; + } + + @Override + public void visitElement(@Nonnull PsiElement element) { + if (!passed) { + super.visitElement(element); + } + } + + @Override + public void visitBinaryExpression(PsiBinaryExpression expression) { + super.visitBinaryExpression(expression); + if (write || passed) { + return; + } + final IElementType tokenType = expression.getOperationTokenType(); + if (!JavaTokenType.EQEQ.equals(tokenType) && !JavaTokenType.NE.equals(tokenType)) { + return; + } + final PsiExpression lhs = expression.getLOperand(); + if (!(lhs instanceof PsiBinaryExpression)) { + if (VariableAccessUtils.mayEvaluateToVariable(lhs, variable)) { + passed = true; + } + } + final PsiExpression rhs = expression.getROperand(); + if (!(rhs instanceof PsiBinaryExpression)) { + if (VariableAccessUtils.mayEvaluateToVariable(rhs, variable)) { + passed = true; + } + } + } + + @Override + public void visitMethodCallExpression( + @Nonnull PsiMethodCallExpression call + ) { + if (passed) { + return; + } + super.visitMethodCallExpression(call); + final PsiExpressionList argumentList = call.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + for (int i = 0; i < arguments.length; i++) { + final PsiExpression argument = arguments[i]; + if (VariableAccessUtils.mayEvaluateToVariable( + argument, + variable + )) { + if (write && i == 0 && isCallToSystemArraycopy(call)) { + return; + } + if (!write && i == 2 && isCallToSystemArraycopy(call)) { + return; + } + passed = true; + } + } + } + + private static boolean isCallToSystemArraycopy( + PsiMethodCallExpression call + ) { + final PsiReferenceExpression methodExpression = + call.getMethodExpression(); + @NonNls final String name = + methodExpression.getReferenceName(); + if (!"arraycopy".equals(name)) { + return false; + } + final PsiExpression qualifier = + methodExpression.getQualifierExpression(); + if (!(qualifier instanceof PsiReferenceExpression)) { + return false; + } + final PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) qualifier; + final PsiElement element = + referenceExpression.resolve(); + if (!(element instanceof PsiClass)) { + return false; + } + final PsiClass aClass = (PsiClass) element; + final String qualifiedName = + aClass.getQualifiedName(); + return "java.lang.System".equals(qualifiedName); + } + + @Override + public void visitNewExpression( + @Nonnull PsiNewExpression newExpression + ) { + if (passed) { + return; + } + super.visitNewExpression(newExpression); + final PsiExpressionList argumentList = + newExpression.getArgumentList(); + if (argumentList == null) { + return; + } + final PsiExpression[] arguments = argumentList.getExpressions(); + for (final PsiExpression argument : arguments) { + if (VariableAccessUtils.mayEvaluateToVariable( + argument, + variable + )) { + passed = true; + } + } + } + + public boolean isPassed() { + return passed; + } + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MismatchedCollectionQueryUpdateInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MismatchedCollectionQueryUpdateInspection.java index 169ecf7d9..61adf3077 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MismatchedCollectionQueryUpdateInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MismatchedCollectionQueryUpdateInspection.java @@ -55,9 +55,7 @@ import static com.siyeh.ig.psiutils.ClassUtils.isImmutable; @ExtensionImpl -public class MismatchedCollectionQueryUpdateInspection - extends BaseInspection { - +public class MismatchedCollectionQueryUpdateInspection extends BaseInspection { private static final CallMatcher TRANSFORMED = CallMatcher.staticCall( CommonClassNames.JAVA_UTIL_COLLECTIONS, "asLifoQueue", @@ -166,17 +164,17 @@ public JComponent createOptionsPanel() { return panel; } - @Pattern(VALID_ID_PATTERN) - @Override @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) public String getID() { return "MismatchedQueryAndUpdateOfCollection"; } - @Override @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.mismatchedUpdateCollectionDisplayName().get(); + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.mismatchedUpdateCollectionDisplayName(); } @Override diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MismatchedStringBuilderQueryUpdateInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MismatchedStringBuilderQueryUpdateInspection.java index 3cd1e4744..9c561b850 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MismatchedStringBuilderQueryUpdateInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MismatchedStringBuilderQueryUpdateInspection.java @@ -27,8 +27,9 @@ import consulo.language.ast.IElementType; import consulo.language.psi.PsiElement; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.Nls; +import org.intellij.lang.annotations.Pattern; import org.jetbrains.annotations.NonNls; import java.util.HashSet; @@ -36,373 +37,373 @@ @ExtensionImpl public class MismatchedStringBuilderQueryUpdateInspection extends BaseInspection { + private static final Set returnSelfNames = new HashSet(); - @NonNls - private static final Set returnSelfNames = new HashSet(); - - static { - returnSelfNames.add("append"); - returnSelfNames.add("appendCodePoint"); - returnSelfNames.add("delete"); - returnSelfNames.add("deleteCharAt"); - returnSelfNames.add("insert"); - returnSelfNames.add("replace"); - returnSelfNames.add("reverse"); - } - - @Override - @Nonnull - public String getID() { - return "MismatchedQueryAndUpdateOfStringBuilder"; - } - - @Nls - @Nonnull - @Override - public String getDisplayName() { - return InspectionGadgetsLocalize.mismatchedStringBuilderQueryUpdateDisplayName().get(); - } - - @Nonnull - @Override - protected String buildErrorString(Object... infos) { - final boolean updated = (Boolean)infos[0]; - final PsiType type = (PsiType)infos[1]; //"StringBuilder"; - return updated - ? InspectionGadgetsLocalize.mismatchedStringBuilderUpdatedProblemDescriptor(type.getPresentableText()).get() - : InspectionGadgetsLocalize.mismatchedStringBuilderQueriedProblemDescriptor(type.getPresentableText()).get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - public boolean runForWholeFile() { - return true; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new MismatchedQueryAndUpdateOfStringBuilderVisitor(); - } - - private static class MismatchedQueryAndUpdateOfStringBuilderVisitor extends BaseInspectionVisitor { + static { + returnSelfNames.add("append"); + returnSelfNames.add("appendCodePoint"); + returnSelfNames.add("delete"); + returnSelfNames.add("deleteCharAt"); + returnSelfNames.add("insert"); + returnSelfNames.add("replace"); + returnSelfNames.add("reverse"); + } + @Nonnull @Override - public void visitField(PsiField field) { - super.visitField(field); - if (!field.hasModifierProperty(PsiModifier.PRIVATE)) { - return; - } - final PsiClass containingClass = PsiUtil.getTopLevelClass(field); - if (!checkVariable(field, containingClass)) { - return; - } - final boolean queried = stringBuilderContentsAreQueried(field, containingClass); - final boolean updated = stringBuilderContentsAreUpdated(field, containingClass); - if (queried == updated) { - return; - } - registerFieldError(field, Boolean.valueOf(updated), field.getType()); + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "MismatchedQueryAndUpdateOfStringBuilder"; } + @Nonnull @Override - public void visitLocalVariable(PsiLocalVariable variable) { - super.visitLocalVariable(variable); - final PsiCodeBlock codeBlock = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class); - if (!checkVariable(variable, codeBlock)) { - return; - } - final boolean queried = stringBuilderContentsAreQueried(variable, codeBlock); - final boolean updated = stringBuilderContentsAreUpdated(variable, codeBlock); - if (queried == updated) { - return; - } - registerVariableError(variable, Boolean.valueOf(updated), variable.getType()); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.mismatchedStringBuilderQueryUpdateDisplayName(); } - private static boolean checkVariable(PsiVariable variable, PsiElement context) { - if (context == null) { - return false; - } - if (!TypeUtils.variableHasTypeOrSubtype(variable, CommonClassNames.JAVA_LANG_ABSTRACT_STRING_BUILDER)) { - return false; - } - if (VariableAccessUtils.variableIsAssigned(variable, context)) { - return false; - } - if (VariableAccessUtils.variableIsAssignedFrom(variable, context)) { - return false; - } - if (VariableAccessUtils.variableIsReturned(variable, context)) { - return false; - } - if (VariableAccessUtils.variableIsPassedAsMethodArgument(variable, context)) { - return false; - } - return !VariableAccessUtils.variableIsUsedInArrayInitializer(variable, context); + @Nonnull + @Override + protected String buildErrorString(Object... infos) { + final boolean updated = (Boolean) infos[0]; + final PsiType type = (PsiType) infos[1]; //"StringBuilder"; + return updated + ? InspectionGadgetsLocalize.mismatchedStringBuilderUpdatedProblemDescriptor(type.getPresentableText()).get() + : InspectionGadgetsLocalize.mismatchedStringBuilderQueriedProblemDescriptor(type.getPresentableText()).get(); } - private static boolean stringBuilderContentsAreUpdated( - PsiVariable variable, PsiElement context) { - final PsiExpression initializer = variable.getInitializer(); - if (initializer != null && !isDefaultConstructorCall(initializer)) { + @Override + public boolean isEnabledByDefault() { return true; - } - return isStringBuilderUpdated(variable, context); } - private static boolean stringBuilderContentsAreQueried(PsiVariable variable, PsiElement context) { - return isStringBuilderQueried(variable, context); + @Override + public boolean runForWholeFile() { + return true; } - private static boolean isDefaultConstructorCall(PsiExpression initializer) { - if (!(initializer instanceof PsiNewExpression)) { - return false; - } - final PsiNewExpression newExpression = (PsiNewExpression)initializer; - final PsiJavaCodeReferenceElement classReference = newExpression.getClassReference(); - if (classReference == null) { - return false; - } - final PsiElement target = classReference.resolve(); - if (!(target instanceof PsiClass)) { - return false; - } - final PsiClass aClass = (PsiClass)target; - final String qualifiedName = aClass.getQualifiedName(); - if (!CommonClassNames.JAVA_LANG_STRING_BUILDER.equals(qualifiedName) && - !CommonClassNames.JAVA_LANG_STRING_BUFFER.equals(qualifiedName)) { - return false; - } - final PsiExpressionList argumentList = newExpression.getArgumentList(); - if (argumentList == null) { - return false; - } - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length == 0) { - return true; - } - final PsiExpression argument = arguments[0]; - final PsiType argumentType = argument.getType(); - return PsiType.INT.equals(argumentType); + @Override + public BaseInspectionVisitor buildVisitor() { + return new MismatchedQueryAndUpdateOfStringBuilderVisitor(); } - } - public static boolean isStringBuilderUpdated(PsiVariable variable, PsiElement context) { - final StringBuilderUpdateCalledVisitor visitor = new StringBuilderUpdateCalledVisitor(variable); - context.accept(visitor); - return visitor.isUpdated(); - } + private static class MismatchedQueryAndUpdateOfStringBuilderVisitor extends BaseInspectionVisitor { + + @Override + public void visitField(PsiField field) { + super.visitField(field); + if (!field.hasModifierProperty(PsiModifier.PRIVATE)) { + return; + } + final PsiClass containingClass = PsiUtil.getTopLevelClass(field); + if (!checkVariable(field, containingClass)) { + return; + } + final boolean queried = stringBuilderContentsAreQueried(field, containingClass); + final boolean updated = stringBuilderContentsAreUpdated(field, containingClass); + if (queried == updated) { + return; + } + registerFieldError(field, Boolean.valueOf(updated), field.getType()); + } - private static class StringBuilderUpdateCalledVisitor extends JavaRecursiveElementVisitor { + @Override + public void visitLocalVariable(PsiLocalVariable variable) { + super.visitLocalVariable(variable); + final PsiCodeBlock codeBlock = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class); + if (!checkVariable(variable, codeBlock)) { + return; + } + final boolean queried = stringBuilderContentsAreQueried(variable, codeBlock); + final boolean updated = stringBuilderContentsAreUpdated(variable, codeBlock); + if (queried == updated) { + return; + } + registerVariableError(variable, Boolean.valueOf(updated), variable.getType()); + } - @NonNls - private static final Set updateNames = new HashSet(); + private static boolean checkVariable(PsiVariable variable, PsiElement context) { + if (context == null) { + return false; + } + if (!TypeUtils.variableHasTypeOrSubtype(variable, CommonClassNames.JAVA_LANG_ABSTRACT_STRING_BUILDER)) { + return false; + } + if (VariableAccessUtils.variableIsAssigned(variable, context)) { + return false; + } + if (VariableAccessUtils.variableIsAssignedFrom(variable, context)) { + return false; + } + if (VariableAccessUtils.variableIsReturned(variable, context)) { + return false; + } + if (VariableAccessUtils.variableIsPassedAsMethodArgument(variable, context)) { + return false; + } + return !VariableAccessUtils.variableIsUsedInArrayInitializer(variable, context); + } - static { - updateNames.add("append"); - updateNames.add("appendCodePoint"); - updateNames.add("delete"); - updateNames.add("delete"); - updateNames.add("deleteCharAt"); - updateNames.add("insert"); - updateNames.add("replace"); - updateNames.add("setCharAt"); - } + private static boolean stringBuilderContentsAreUpdated( + PsiVariable variable, PsiElement context + ) { + final PsiExpression initializer = variable.getInitializer(); + if (initializer != null && !isDefaultConstructorCall(initializer)) { + return true; + } + return isStringBuilderUpdated(variable, context); + } - private final PsiVariable variable; - boolean updated = false; + private static boolean stringBuilderContentsAreQueried(PsiVariable variable, PsiElement context) { + return isStringBuilderQueried(variable, context); + } - public StringBuilderUpdateCalledVisitor(PsiVariable variable) { - this.variable = variable; + private static boolean isDefaultConstructorCall(PsiExpression initializer) { + if (!(initializer instanceof PsiNewExpression)) { + return false; + } + final PsiNewExpression newExpression = (PsiNewExpression) initializer; + final PsiJavaCodeReferenceElement classReference = newExpression.getClassReference(); + if (classReference == null) { + return false; + } + final PsiElement target = classReference.resolve(); + if (!(target instanceof PsiClass)) { + return false; + } + final PsiClass aClass = (PsiClass) target; + final String qualifiedName = aClass.getQualifiedName(); + if (!CommonClassNames.JAVA_LANG_STRING_BUILDER.equals(qualifiedName) && + !CommonClassNames.JAVA_LANG_STRING_BUFFER.equals(qualifiedName)) { + return false; + } + final PsiExpressionList argumentList = newExpression.getArgumentList(); + if (argumentList == null) { + return false; + } + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length == 0) { + return true; + } + final PsiExpression argument = arguments[0]; + final PsiType argumentType = argument.getType(); + return PsiType.INT.equals(argumentType); + } } - public boolean isUpdated() { - return updated; + public static boolean isStringBuilderUpdated(PsiVariable variable, PsiElement context) { + final StringBuilderUpdateCalledVisitor visitor = new StringBuilderUpdateCalledVisitor(variable); + context.accept(visitor); + return visitor.isUpdated(); } - @Override - public void visitMethodCallExpression(PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - if (updated) { - return; - } - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - final String name = methodExpression.getReferenceName(); - if (!updateNames.contains(name)) { - return; - } - final PsiExpression qualifierExpression = methodExpression.getQualifierExpression(); - if (hasReferenceToVariable(variable, qualifierExpression)) { - updated = true; - } - } - } + private static class StringBuilderUpdateCalledVisitor extends JavaRecursiveElementVisitor { - public static boolean isStringBuilderQueried(PsiVariable variable, PsiElement context) { - final StringBuilderQueryCalledVisitor visitor = new StringBuilderQueryCalledVisitor(variable); - context.accept(visitor); - return visitor.isQueried(); - } + @NonNls + private static final Set updateNames = new HashSet(); - private static class StringBuilderQueryCalledVisitor extends JavaRecursiveElementVisitor { + static { + updateNames.add("append"); + updateNames.add("appendCodePoint"); + updateNames.add("delete"); + updateNames.add("delete"); + updateNames.add("deleteCharAt"); + updateNames.add("insert"); + updateNames.add("replace"); + updateNames.add("setCharAt"); + } - @NonNls - private static final Set queryNames = new HashSet(); + private final PsiVariable variable; + boolean updated = false; - static { - queryNames.add("toString"); - queryNames.add("indexOf"); - queryNames.add("lastIndexOf"); - queryNames.add("capacity"); - queryNames.add("charAt"); - queryNames.add("codePointAt"); - queryNames.add("codePointBefore"); - queryNames.add("codePointCount"); - queryNames.add("equals"); - queryNames.add("getChars"); - queryNames.add("hashCode"); - queryNames.add("length"); - queryNames.add("offsetByCodePoints"); - queryNames.add("subSequence"); - queryNames.add("substring"); - } + public StringBuilderUpdateCalledVisitor(PsiVariable variable) { + this.variable = variable; + } - private final PsiVariable variable; - private boolean queried = false; + public boolean isUpdated() { + return updated; + } - private StringBuilderQueryCalledVisitor(PsiVariable variable) { - this.variable = variable; + @Override + public void visitMethodCallExpression(PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + if (updated) { + return; + } + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String name = methodExpression.getReferenceName(); + if (!updateNames.contains(name)) { + return; + } + final PsiExpression qualifierExpression = methodExpression.getQualifierExpression(); + if (hasReferenceToVariable(variable, qualifierExpression)) { + updated = true; + } + } } - public boolean isQueried() { - return queried; + public static boolean isStringBuilderQueried(PsiVariable variable, PsiElement context) { + final StringBuilderQueryCalledVisitor visitor = new StringBuilderQueryCalledVisitor(variable); + context.accept(visitor); + return visitor.isQueried(); } - @Override - public void visitElement(@Nonnull PsiElement element) { - if (queried) { - return; - } - super.visitElement(element); - } + private static class StringBuilderQueryCalledVisitor extends JavaRecursiveElementVisitor { + + @NonNls + private static final Set queryNames = new HashSet(); + + static { + queryNames.add("toString"); + queryNames.add("indexOf"); + queryNames.add("lastIndexOf"); + queryNames.add("capacity"); + queryNames.add("charAt"); + queryNames.add("codePointAt"); + queryNames.add("codePointBefore"); + queryNames.add("codePointCount"); + queryNames.add("equals"); + queryNames.add("getChars"); + queryNames.add("hashCode"); + queryNames.add("length"); + queryNames.add("offsetByCodePoints"); + queryNames.add("subSequence"); + queryNames.add("substring"); + } - @Override - public void visitReferenceExpression(PsiReferenceExpression expression) { - if (queried) { - return; - } - super.visitReferenceExpression(expression); - final PsiElement parent = ParenthesesUtils.getParentSkipParentheses(expression); - if (!(parent instanceof PsiPolyadicExpression)) { - return; - } - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)parent; - final IElementType tokenType = polyadicExpression.getOperationTokenType(); - if (!JavaTokenType.PLUS.equals(tokenType)) { - return; - } - final PsiElement target = expression.resolve(); - if (!variable.equals(target)) { - return; - } - final PsiType type = polyadicExpression.getType(); - if (type == null || !type.equalsToText(CommonClassNames.JAVA_LANG_STRING)) { - return; - } - queried = true; - } + private final PsiVariable variable; + private boolean queried = false; - @Override - public void visitMethodCallExpression(PsiMethodCallExpression expression) { - if (queried) { - return; - } - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - final String name = methodExpression.getReferenceName(); - final PsiExpression qualifierExpression = methodExpression.getQualifierExpression(); - if (!queryNames.contains(name)) { - if (returnSelfNames.contains(name) && hasReferenceToVariable(variable, qualifierExpression) && isVariableValueUsed(expression)) { - queried = true; + private StringBuilderQueryCalledVisitor(PsiVariable variable) { + this.variable = variable; } - return; - } - if (hasReferenceToVariable(variable, qualifierExpression)) { - queried = true; - } - } - } - private static boolean isVariableValueUsed(PsiExpression expression) { - final PsiElement parent = expression.getParent(); - if (parent instanceof PsiParenthesizedExpression) { - final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)parent; - return isVariableValueUsed(parenthesizedExpression); - } - else if (parent instanceof PsiTypeCastExpression) { - final PsiTypeCastExpression typeCastExpression = (PsiTypeCastExpression)parent; - return isVariableValueUsed(typeCastExpression); - } - else if (parent instanceof PsiReturnStatement) { - return true; - } - else if (parent instanceof PsiExpressionList) { - final PsiElement grandParent = parent.getParent(); - if (grandParent instanceof PsiMethodCallExpression) { - return true; - } - } - else if (parent instanceof PsiArrayInitializerExpression) { - return true; - } - else if (parent instanceof PsiAssignmentExpression) { - final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)parent; - final PsiExpression rhs = assignmentExpression.getRExpression(); - return expression.equals(rhs); - } - else if (parent instanceof PsiVariable) { - final PsiVariable variable = (PsiVariable)parent; - final PsiExpression initializer = variable.getInitializer(); - return expression.equals(initializer); - } - return false; - } - - private static boolean hasReferenceToVariable(PsiVariable variable, PsiElement element) { - if (element instanceof PsiReferenceExpression) { - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)element; - final PsiElement target = referenceExpression.resolve(); - if (variable.equals(target)) { - return true; - } - } - else if (element instanceof PsiParenthesizedExpression) { - final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)element; - final PsiExpression expression = parenthesizedExpression.getExpression(); - return hasReferenceToVariable(variable, expression); + public boolean isQueried() { + return queried; + } + + @Override + public void visitElement(@Nonnull PsiElement element) { + if (queried) { + return; + } + super.visitElement(element); + } + + @Override + public void visitReferenceExpression(PsiReferenceExpression expression) { + if (queried) { + return; + } + super.visitReferenceExpression(expression); + final PsiElement parent = ParenthesesUtils.getParentSkipParentheses(expression); + if (!(parent instanceof PsiPolyadicExpression)) { + return; + } + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) parent; + final IElementType tokenType = polyadicExpression.getOperationTokenType(); + if (!JavaTokenType.PLUS.equals(tokenType)) { + return; + } + final PsiElement target = expression.resolve(); + if (!variable.equals(target)) { + return; + } + final PsiType type = polyadicExpression.getType(); + if (type == null || !type.equalsToText(CommonClassNames.JAVA_LANG_STRING)) { + return; + } + queried = true; + } + + @Override + public void visitMethodCallExpression(PsiMethodCallExpression expression) { + if (queried) { + return; + } + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final String name = methodExpression.getReferenceName(); + final PsiExpression qualifierExpression = methodExpression.getQualifierExpression(); + if (!queryNames.contains(name)) { + if (returnSelfNames.contains(name) && hasReferenceToVariable(variable, qualifierExpression) && isVariableValueUsed( + expression)) { + queried = true; + } + return; + } + if (hasReferenceToVariable(variable, qualifierExpression)) { + queried = true; + } + } } - else if (element instanceof PsiMethodCallExpression) { - final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)element; - final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); - final String name = methodExpression.getReferenceName(); - if (returnSelfNames.contains(name)) { - return hasReferenceToVariable(variable, methodExpression.getQualifierExpression()); - } + + private static boolean isVariableValueUsed(PsiExpression expression) { + final PsiElement parent = expression.getParent(); + if (parent instanceof PsiParenthesizedExpression) { + final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression) parent; + return isVariableValueUsed(parenthesizedExpression); + } + else if (parent instanceof PsiTypeCastExpression) { + final PsiTypeCastExpression typeCastExpression = (PsiTypeCastExpression) parent; + return isVariableValueUsed(typeCastExpression); + } + else if (parent instanceof PsiReturnStatement) { + return true; + } + else if (parent instanceof PsiExpressionList) { + final PsiElement grandParent = parent.getParent(); + if (grandParent instanceof PsiMethodCallExpression) { + return true; + } + } + else if (parent instanceof PsiArrayInitializerExpression) { + return true; + } + else if (parent instanceof PsiAssignmentExpression) { + final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression) parent; + final PsiExpression rhs = assignmentExpression.getRExpression(); + return expression.equals(rhs); + } + else if (parent instanceof PsiVariable) { + final PsiVariable variable = (PsiVariable) parent; + final PsiExpression initializer = variable.getInitializer(); + return expression.equals(initializer); + } + return false; } - else if (element instanceof PsiConditionalExpression) { - final PsiConditionalExpression conditionalExpression = (PsiConditionalExpression)element; - final PsiExpression thenExpression = conditionalExpression.getThenExpression(); - if (hasReferenceToVariable(variable, thenExpression)) { - return true; - } - final PsiExpression elseExpression = conditionalExpression.getElseExpression(); - return hasReferenceToVariable(variable, elseExpression); + + private static boolean hasReferenceToVariable(PsiVariable variable, PsiElement element) { + if (element instanceof PsiReferenceExpression) { + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) element; + final PsiElement target = referenceExpression.resolve(); + if (variable.equals(target)) { + return true; + } + } + else if (element instanceof PsiParenthesizedExpression) { + final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression) element; + final PsiExpression expression = parenthesizedExpression.getExpression(); + return hasReferenceToVariable(variable, expression); + } + else if (element instanceof PsiMethodCallExpression) { + final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression) element; + final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); + final String name = methodExpression.getReferenceName(); + if (returnSelfNames.contains(name)) { + return hasReferenceToVariable(variable, methodExpression.getQualifierExpression()); + } + } + else if (element instanceof PsiConditionalExpression) { + final PsiConditionalExpression conditionalExpression = (PsiConditionalExpression) element; + final PsiExpression thenExpression = conditionalExpression.getThenExpression(); + if (hasReferenceToVariable(variable, thenExpression)) { + return true; + } + final PsiExpression elseExpression = conditionalExpression.getElseExpression(); + return hasReferenceToVariable(variable, elseExpression); + } + return false; } - return false; - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MisspelledEqualsInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MisspelledEqualsInspection.java index 1a6fab233..6ba6b7381 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MisspelledEqualsInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/MisspelledEqualsInspection.java @@ -24,44 +24,45 @@ 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 MisspelledEqualsInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.misspelledEqualsDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.misspelledEqualsDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.misspelledEqualsProblemDescriptor().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.misspelledEqualsProblemDescriptor().get(); + } - protected InspectionGadgetsFix buildFix(Object... infos) { - return new RenameFix(HardcodedMethodConstants.EQUALS); - } + protected InspectionGadgetsFix buildFix(Object... infos) { + return new RenameFix(HardcodedMethodConstants.EQUALS); + } - public BaseInspectionVisitor buildVisitor() { - return new MisspelledEqualsVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new MisspelledEqualsVisitor(); + } - private static class MisspelledEqualsVisitor extends BaseInspectionVisitor { + private static class MisspelledEqualsVisitor extends BaseInspectionVisitor { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - //note: no call to super - @NonNls final String methodName = method.getName(); - if (!"equal".equals(methodName)) { - return; - } - final PsiParameterList parameterList = method.getParameterList(); - if (parameterList.getParametersCount() != 1) { - return; - } - registerMethodError(method); + @Override + public void visitMethod(@Nonnull PsiMethod method) { + //note: no call to super + @NonNls final String methodName = method.getName(); + if (!"equal".equals(methodName)) { + return; + } + final PsiParameterList parameterList = method.getParameterList(); + if (parameterList.getParametersCount() != 1) { + return; + } + registerMethodError(method); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/NewStringBufferWithCharArgumentInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/NewStringBufferWithCharArgumentInspection.java index 41439e8a1..ba32b9c10 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/NewStringBufferWithCharArgumentInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/NewStringBufferWithCharArgumentInspection.java @@ -25,102 +25,98 @@ 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.Nls; @ExtensionImpl public class NewStringBufferWithCharArgumentInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.newStringBufferWithCharArgumentDisplayName(); + } - @Override - @Nls - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.newStringBufferWithCharArgumentDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.newStringBufferWithCharArgumentProblemDescriptor().get(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.newStringBufferWithCharArgumentProblemDescriptor().get(); + } - @Override - public boolean isEnabledByDefault() { - return true; - } + @Override + public boolean isEnabledByDefault() { + return true; + } - @Override - @Nullable - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiExpression argument = (PsiExpression)infos[0]; - if (!(argument instanceof PsiLiteralExpression)) { - return null; + @Override + @Nullable + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiExpression argument = (PsiExpression) infos[0]; + if (!(argument instanceof PsiLiteralExpression)) { + return null; + } + return new NewStringBufferWithCharArgumentFix(); } - return new NewStringBufferWithCharArgumentFix(); - } - private static class NewStringBufferWithCharArgumentFix - extends InspectionGadgetsFix { + private static class NewStringBufferWithCharArgumentFix extends InspectionGadgetsFix { + @Nonnull + public LocalizeValue getName() { + return InspectionGadgetsLocalize.newStringBufferWithCharArgumentQuickfix(); + } - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.newStringBufferWithCharArgumentQuickfix().get(); + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiNewExpression newExpression = (PsiNewExpression) element.getParent(); + 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 String text = argument.getText(); + final String newArgument = '"' + text.substring(1, text.length() - 1) + '"'; + replaceExpression(argument, newArgument); + } } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiNewExpression newExpression = (PsiNewExpression)element.getParent(); - 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 String text = argument.getText(); - final String newArgument = '"' + text.substring(1, text.length() - 1) + '"'; - replaceExpression(argument, newArgument); + public BaseInspectionVisitor buildVisitor() { + return new StringBufferWithCharArgumentVisitor(); } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new StringBufferWithCharArgumentVisitor(); - } - private static class StringBufferWithCharArgumentVisitor - extends BaseInspectionVisitor { + private static class StringBufferWithCharArgumentVisitor + extends BaseInspectionVisitor { - @Override - public void visitNewExpression(PsiNewExpression expression) { - super.visitNewExpression(expression); - final PsiExpressionList argumentList = expression.getArgumentList(); - if (argumentList == null) { - return; - } - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 1) { - return; - } - final PsiExpression argument = arguments[0]; - final PsiType type = argument.getType(); - if (!PsiType.CHAR.equals(type)) { - return; - } - final PsiMethod constructor = expression.resolveConstructor(); - if (constructor == null) { - return; - } - final PsiClass aClass = constructor.getContainingClass(); - if (!InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_ABSTRACT_STRING_BUILDER)) { - return; - } - registerNewExpressionError(expression, argument); + @Override + public void visitNewExpression(PsiNewExpression expression) { + super.visitNewExpression(expression); + final PsiExpressionList argumentList = expression.getArgumentList(); + if (argumentList == null) { + return; + } + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 1) { + return; + } + final PsiExpression argument = arguments[0]; + final PsiType type = argument.getType(); + if (!PsiType.CHAR.equals(type)) { + return; + } + final PsiMethod constructor = expression.resolveConstructor(); + if (constructor == null) { + return; + } + final PsiClass aClass = constructor.getContainingClass(); + if (!InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_ABSTRACT_STRING_BUILDER)) { + return; + } + registerNewExpressionError(expression, argument); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/NonShortCircuitBooleanInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/NonShortCircuitBooleanInspection.java index 71bdafaa0..31ff1ae19 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/NonShortCircuitBooleanInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/NonShortCircuitBooleanInspection.java @@ -27,85 +27,88 @@ import consulo.language.ast.IElementType; import consulo.language.editor.inspection.ProblemDescriptor; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl public class NonShortCircuitBooleanInspection extends BaseInspection { + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "NonShortCircuitBooleanExpression"; + } - @Nonnull - public String getID() { - return "NonShortCircuitBooleanExpression"; - } - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.nonShortCircuitBooleanExpressionDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nonShortCircuitBooleanExpressionDisplayName(); + } - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.nonShortCircuitBooleanExpressionProblemDescriptor().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.nonShortCircuitBooleanExpressionProblemDescriptor().get(); + } - public InspectionGadgetsFix buildFix(Object... infos) { - return new NonShortCircuitBooleanFix(); - } + public InspectionGadgetsFix buildFix(Object... infos) { + return new NonShortCircuitBooleanFix(); + } - private static class NonShortCircuitBooleanFix - extends InspectionGadgetsFix { + private static class NonShortCircuitBooleanFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.nonShortCircuitBooleanExpressionReplaceQuickfix(); + } - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.nonShortCircuitBooleanExpressionReplaceQuickfix().get(); - } + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiPolyadicExpression expression = (PsiPolyadicExpression) descriptor.getPsiElement(); + final IElementType tokenType = expression.getOperationTokenType(); + final String operandText = getShortCircuitOperand(tokenType); + final PsiExpression[] operands = expression.getOperands(); + final StringBuilder newExpression = new StringBuilder(); + for (PsiExpression operand : operands) { + if (newExpression.length() != 0) { + newExpression.append(operandText); + } + newExpression.append(operand.getText()); + } + replaceExpression(expression, newExpression.toString()); + } - public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiPolyadicExpression expression = (PsiPolyadicExpression)descriptor.getPsiElement(); - final IElementType tokenType = expression.getOperationTokenType(); - final String operandText = getShortCircuitOperand(tokenType); - final PsiExpression[] operands = expression.getOperands(); - final StringBuilder newExpression = new StringBuilder(); - for (PsiExpression operand : operands) { - if (newExpression.length() != 0) { - newExpression.append(operandText); + private static String getShortCircuitOperand(IElementType tokenType) { + if (tokenType.equals(JavaTokenType.AND)) { + return "&&"; + } + else { + return "||"; + } } - newExpression.append(operand.getText()); - } - replaceExpression(expression, newExpression.toString()); } - private static String getShortCircuitOperand(IElementType tokenType) { - if (tokenType.equals(JavaTokenType.AND)) { - return "&&"; - } - else { - return "||"; - } + public BaseInspectionVisitor buildVisitor() { + return new NonShortCircuitBooleanVisitor(); } - } - - public BaseInspectionVisitor buildVisitor() { - return new NonShortCircuitBooleanVisitor(); - } - private static class NonShortCircuitBooleanVisitor extends BaseInspectionVisitor { + private static class NonShortCircuitBooleanVisitor extends BaseInspectionVisitor { - @Override - public void visitPolyadicExpression(PsiPolyadicExpression expression) { - super.visitPolyadicExpression(expression); - final IElementType tokenType = expression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.AND) && !tokenType.equals(JavaTokenType.OR)) { - return; - } - final PsiType type = expression.getType(); - if (type == null) { - return; - } - if (!type.equals(PsiType.BOOLEAN)) { - return; - } - registerError(expression); + @Override + public void visitPolyadicExpression(PsiPolyadicExpression expression) { + super.visitPolyadicExpression(expression); + final IElementType tokenType = expression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.AND) && !tokenType.equals(JavaTokenType.OR)) { + return; + } + final PsiType type = expression.getType(); + if (type == null) { + return; + } + if (!type.equals(PsiType.BOOLEAN)) { + return; + } + registerError(expression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/NullArgumentToVariableArgMethodInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/NullArgumentToVariableArgMethodInspection.java index 1cc483649..7206d3f3c 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/NullArgumentToVariableArgMethodInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/NullArgumentToVariableArgMethodInspection.java @@ -22,65 +22,66 @@ import com.siyeh.ig.psiutils.ExpressionUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl -public class NullArgumentToVariableArgMethodInspection - extends BaseInspection { - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.nullArgumentToVarArgMethodDisplayName().get(); - } +public class NullArgumentToVariableArgMethodInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nullArgumentToVarArgMethodDisplayName(); + } - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.nullArgumentToVarArgMethodProblemDescriptor().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.nullArgumentToVarArgMethodProblemDescriptor().get(); + } - public boolean isEnabledByDefault() { - return true; - } + public boolean isEnabledByDefault() { + return true; + } - public BaseInspectionVisitor buildVisitor() { - return new NullArgumentToVariableArgVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new NullArgumentToVariableArgVisitor(); + } - private static class NullArgumentToVariableArgVisitor - extends BaseInspectionVisitor { + private static class NullArgumentToVariableArgVisitor + extends BaseInspectionVisitor { - @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression call) { - super.visitMethodCallExpression(call); + @Override + public void visitMethodCallExpression( + @Nonnull PsiMethodCallExpression call + ) { + super.visitMethodCallExpression(call); - if (!PsiUtil.isLanguageLevel5OrHigher(call)) { - return; - } - final PsiExpressionList argumentList = call.getArgumentList(); - final PsiExpression[] args = argumentList.getExpressions(); - if (args.length == 0) { - return; - } - final PsiExpression lastArg = args[args.length - 1]; - if (!ExpressionUtils.isNullLiteral(lastArg)) { - return; - } - final PsiMethod method = call.resolveMethod(); - if (method == null) { - return; - } - final PsiParameterList parameterList = method.getParameterList(); - if (parameterList.getParametersCount() != args.length) { - return; - } - final PsiParameter[] parameters = parameterList.getParameters(); - final PsiParameter lastParameter = - parameters[parameters.length - 1]; - if (!lastParameter.isVarArgs()) { - return; - } - registerError(lastArg); + if (!PsiUtil.isLanguageLevel5OrHigher(call)) { + return; + } + final PsiExpressionList argumentList = call.getArgumentList(); + final PsiExpression[] args = argumentList.getExpressions(); + if (args.length == 0) { + return; + } + final PsiExpression lastArg = args[args.length - 1]; + if (!ExpressionUtils.isNullLiteral(lastArg)) { + return; + } + final PsiMethod method = call.resolveMethod(); + if (method == null) { + return; + } + final PsiParameterList parameterList = method.getParameterList(); + if (parameterList.getParametersCount() != args.length) { + return; + } + final PsiParameter[] parameters = parameterList.getParameters(); + final PsiParameter lastParameter = + parameters[parameters.length - 1]; + if (!lastParameter.isVarArgs()) { + return; + } + registerError(lastArg); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/NumberEqualityInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/NumberEqualityInspection.java index fa61533db..635af19cb 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/NumberEqualityInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/NumberEqualityInspection.java @@ -24,69 +24,70 @@ 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 NumberEqualityInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.numberComparisonDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.numberComparisonDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.numberComparisonProblemDescriptor().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new NumberEqualityVisitor(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.numberComparisonProblemDescriptor().get(); + } - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new EqualityToEqualsFix(); - } + @Override + public boolean isEnabledByDefault() { + return true; + } - private static class NumberEqualityVisitor extends BaseInspectionVisitor { + @Override + public BaseInspectionVisitor buildVisitor() { + return new NumberEqualityVisitor(); + } @Override - public void visitBinaryExpression( - @Nonnull PsiBinaryExpression expression) { - super.visitBinaryExpression(expression); - final PsiExpression rhs = expression.getROperand(); - if (rhs == null) { - return; - } - if (!ComparisonUtils.isEqualityComparison(expression)) { - return; - } - final PsiExpression lhs = expression.getLOperand(); - if (!hasNumberType(lhs) || !hasNumberType(rhs)) { - return; - } - final String lhsText = lhs.getText(); - if (PsiKeyword.NULL.equals(lhsText)) { - return; - } - final String rhsText = rhs.getText(); - if (PsiKeyword.NULL.equals(rhsText)) { - return; - } - final PsiJavaToken sign = expression.getOperationSign(); - registerError(sign); + public InspectionGadgetsFix buildFix(Object... infos) { + return new EqualityToEqualsFix(); } - private static boolean hasNumberType(PsiExpression expression) { - return TypeUtils.expressionHasTypeOrSubtype(expression, CommonClassNames.JAVA_LANG_NUMBER); + private static class NumberEqualityVisitor extends BaseInspectionVisitor { + + @Override + public void visitBinaryExpression( + @Nonnull PsiBinaryExpression expression + ) { + super.visitBinaryExpression(expression); + final PsiExpression rhs = expression.getROperand(); + if (rhs == null) { + return; + } + if (!ComparisonUtils.isEqualityComparison(expression)) { + return; + } + final PsiExpression lhs = expression.getLOperand(); + if (!hasNumberType(lhs) || !hasNumberType(rhs)) { + return; + } + final String lhsText = lhs.getText(); + if (PsiKeyword.NULL.equals(lhsText)) { + return; + } + final String rhsText = rhs.getText(); + if (PsiKeyword.NULL.equals(rhsText)) { + return; + } + final PsiJavaToken sign = expression.getOperationSign(); + registerError(sign); + } + + private static boolean hasNumberType(PsiExpression expression) { + return TypeUtils.expressionHasTypeOrSubtype(expression, CommonClassNames.JAVA_LANG_NUMBER); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ObjectEqualityInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ObjectEqualityInspection.java index 3f6b66268..84ccb1deb 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ObjectEqualityInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ObjectEqualityInspection.java @@ -32,6 +32,7 @@ import consulo.language.psi.resolve.PsiElementProcessorAdapter; import consulo.language.psi.scope.GlobalSearchScope; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @@ -40,176 +41,175 @@ @ExtensionImpl public class ObjectEqualityInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean m_ignoreEnums = true; + + /** + * @noinspection PublicField + */ + public boolean m_ignoreClassObjects = false; + + /** + * @noinspection PublicField + */ + public boolean m_ignorePrivateConstructors = false; + + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.objectComparisonDisplayName(); + } - /** - * @noinspection PublicField - */ - public boolean m_ignoreEnums = true; - - /** - * @noinspection PublicField - */ - public boolean m_ignoreClassObjects = false; - - /** - * @noinspection PublicField - */ - public boolean m_ignorePrivateConstructors = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.objectComparisonDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.objectComparisonProblemDescription().get(); - } - - @Override - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this); - optionsPanel.addCheckbox(InspectionGadgetsLocalize.objectComparisonEnumeratedIgnoreOption().get(), "m_ignoreEnums"); - optionsPanel.addCheckbox(InspectionGadgetsLocalize.objectComparisonKlassIgnoreOption().get(), "m_ignoreClassObjects"); - optionsPanel.addCheckbox( - InspectionGadgetsLocalize.objectEqualityIgnoreBetweenObjectsOfATypeWithOnlyPrivateConstructorsOption().get(), - "m_ignorePrivateConstructors" - ); - return optionsPanel; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ObjectEqualityVisitor(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new EqualityToEqualsFix(); - } - - private class ObjectEqualityVisitor extends BaseInspectionVisitor { + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.objectComparisonProblemDescription().get(); + } @Override - public void visitBinaryExpression(@Nonnull PsiBinaryExpression expression) { - super.visitBinaryExpression(expression); - if (!ComparisonUtils.isEqualityComparison(expression)) { - return; - } - final PsiExpression rhs = expression.getROperand(); - if (!isObjectType(rhs)) { - return; - } - final PsiExpression lhs = expression.getLOperand(); - if (!isObjectType(lhs)) { - return; - } - if (m_ignoreEnums && (isEnumType(rhs) || isEnumType(lhs))) { - return; - } - if (m_ignoreClassObjects && (isClass(rhs) || isClass(lhs))) { - return; - } - if (m_ignorePrivateConstructors && (typeHasPrivateConstructor(lhs) || typeHasPrivateConstructor(rhs))) { - return; - } - final PsiMethod method = PsiTreeUtil.getParentOfType(expression, PsiMethod.class); - if (method != null && MethodUtils.isEquals(method)) { - return; - } - final PsiJavaToken sign = expression.getOperationSign(); - registerError(sign); + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this); + optionsPanel.addCheckbox(InspectionGadgetsLocalize.objectComparisonEnumeratedIgnoreOption().get(), "m_ignoreEnums"); + optionsPanel.addCheckbox(InspectionGadgetsLocalize.objectComparisonKlassIgnoreOption().get(), "m_ignoreClassObjects"); + optionsPanel.addCheckbox( + InspectionGadgetsLocalize.objectEqualityIgnoreBetweenObjectsOfATypeWithOnlyPrivateConstructorsOption().get(), + "m_ignorePrivateConstructors" + ); + return optionsPanel; } - private boolean typeHasPrivateConstructor(@Nullable PsiExpression expression) { - if (expression == null) { - return false; - } - final PsiType type = expression.getType(); - if (!(type instanceof PsiClassType)) { - return false; - } - final PsiClassType classType = (PsiClassType)type; - final PsiClass aClass = classType.resolve(); - if (aClass != null && aClass.isInterface()) { - return implementersHaveOnlyPrivateConstructors(aClass); - } - else { - return hasOnlyPrivateConstructors(aClass); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new ObjectEqualityVisitor(); } - private boolean implementersHaveOnlyPrivateConstructors(final PsiClass aClass) { - final GlobalSearchScope scope = GlobalSearchScope.allScope(aClass.getProject()); - final PsiElementProcessor.CollectElementsWithLimit processor = new PsiElementProcessor.CollectElementsWithLimit(6); - final ProgressManager progressManager = ProgressManager.getInstance(); - progressManager.runProcess(new Runnable() { - public void run() { - ClassInheritorsSearch.search(aClass, scope, true, true).forEach(new PsiElementProcessorAdapter(processor)); + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + return new EqualityToEqualsFix(); + } + + private class ObjectEqualityVisitor extends BaseInspectionVisitor { + + @Override + public void visitBinaryExpression(@Nonnull PsiBinaryExpression expression) { + super.visitBinaryExpression(expression); + if (!ComparisonUtils.isEqualityComparison(expression)) { + return; + } + final PsiExpression rhs = expression.getROperand(); + if (!isObjectType(rhs)) { + return; + } + final PsiExpression lhs = expression.getLOperand(); + if (!isObjectType(lhs)) { + return; + } + if (m_ignoreEnums && (isEnumType(rhs) || isEnumType(lhs))) { + return; + } + if (m_ignoreClassObjects && (isClass(rhs) || isClass(lhs))) { + return; + } + if (m_ignorePrivateConstructors && (typeHasPrivateConstructor(lhs) || typeHasPrivateConstructor(rhs))) { + return; + } + final PsiMethod method = PsiTreeUtil.getParentOfType(expression, PsiMethod.class); + if (method != null && MethodUtils.isEquals(method)) { + return; + } + final PsiJavaToken sign = expression.getOperationSign(); + registerError(sign); + } + + private boolean typeHasPrivateConstructor(@Nullable PsiExpression expression) { + if (expression == null) { + return false; + } + final PsiType type = expression.getType(); + if (!(type instanceof PsiClassType)) { + return false; + } + final PsiClassType classType = (PsiClassType) type; + final PsiClass aClass = classType.resolve(); + if (aClass != null && aClass.isInterface()) { + return implementersHaveOnlyPrivateConstructors(aClass); + } + else { + return hasOnlyPrivateConstructors(aClass); + } } - }, null); - if (processor.isOverflow()) { - return false; - } - final Collection implementers = processor.getCollection(); - for (PsiClass implementer : implementers) { - if (!implementer.isInterface() && !implementer.hasModifierProperty(PsiModifier.ABSTRACT)) { - if (!hasOnlyPrivateConstructors(implementer)) { - return false; - } + + private boolean implementersHaveOnlyPrivateConstructors(final PsiClass aClass) { + final GlobalSearchScope scope = GlobalSearchScope.allScope(aClass.getProject()); + final PsiElementProcessor.CollectElementsWithLimit processor = new PsiElementProcessor.CollectElementsWithLimit(6); + final ProgressManager progressManager = ProgressManager.getInstance(); + progressManager.runProcess(new Runnable() { + public void run() { + ClassInheritorsSearch.search(aClass, scope, true, true).forEach(new PsiElementProcessorAdapter(processor)); + } + }, null); + if (processor.isOverflow()) { + return false; + } + final Collection implementers = processor.getCollection(); + for (PsiClass implementer : implementers) { + if (!implementer.isInterface() && !implementer.hasModifierProperty(PsiModifier.ABSTRACT)) { + if (!hasOnlyPrivateConstructors(implementer)) { + return false; + } + } + } + return true; } - } - return true; - } - private boolean hasOnlyPrivateConstructors(PsiClass aClass) { - if (aClass == null) { - return false; - } - final PsiMethod[] constructors = aClass.getConstructors(); - if (constructors.length == 0) { - return false; - } - for (PsiMethod constructor : constructors) { - if (!constructor.hasModifierProperty(PsiModifier.PRIVATE)) { - return false; + private boolean hasOnlyPrivateConstructors(PsiClass aClass) { + if (aClass == null) { + return false; + } + final PsiMethod[] constructors = aClass.getConstructors(); + if (constructors.length == 0) { + return false; + } + for (PsiMethod constructor : constructors) { + if (!constructor.hasModifierProperty(PsiModifier.PRIVATE)) { + return false; + } + } + return true; } - } - return true; - } - private boolean isClass(@Nullable PsiExpression expression) { - if (expression == null) { - return false; - } - if (expression instanceof PsiClassObjectAccessExpression) { - return true; - } - final PsiType type = expression.getType(); - if (!(type instanceof PsiClassType)) { - return false; - } - final PsiClassType classType = (PsiClassType)type; - final PsiClassType rawType = classType.rawType(); - return rawType.equalsToText(CommonClassNames.JAVA_LANG_CLASS); - } + private boolean isClass(@Nullable PsiExpression expression) { + if (expression == null) { + return false; + } + if (expression instanceof PsiClassObjectAccessExpression) { + return true; + } + final PsiType type = expression.getType(); + if (!(type instanceof PsiClassType)) { + return false; + } + final PsiClassType classType = (PsiClassType) type; + final PsiClassType rawType = classType.rawType(); + return rawType.equalsToText(CommonClassNames.JAVA_LANG_CLASS); + } - private boolean isEnumType(@Nullable PsiExpression expression) { - return expression != null && TypeUtils.expressionHasTypeOrSubtype(expression, CommonClassNames.JAVA_LANG_ENUM); - } + private boolean isEnumType(@Nullable PsiExpression expression) { + return expression != null && TypeUtils.expressionHasTypeOrSubtype(expression, CommonClassNames.JAVA_LANG_ENUM); + } - private boolean isObjectType(PsiExpression expression) { - if (expression == null) { - return false; - } - final PsiType type = expression.getType(); - return type != null && - !(type instanceof PsiArrayType) && - !(type instanceof PsiPrimitiveType) && - !TypeUtils.isJavaLangString(type) && - !TypeUtils.expressionHasTypeOrSubtype(expression, CommonClassNames.JAVA_LANG_NUMBER); + private boolean isObjectType(PsiExpression expression) { + if (expression == null) { + return false; + } + final PsiType type = expression.getType(); + return type != null && + !(type instanceof PsiArrayType) && + !(type instanceof PsiPrimitiveType) && + !TypeUtils.isJavaLangString(type) && + !TypeUtils.expressionHasTypeOrSubtype(expression, CommonClassNames.JAVA_LANG_NUMBER); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ObjectEqualsNullInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ObjectEqualsNullInspection.java index 4e0cdd720..c66cd2805 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ObjectEqualsNullInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ObjectEqualsNullInspection.java @@ -24,44 +24,46 @@ 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 ObjectEqualsNullInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.objectEqualsNullDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.objectEqualsNullDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.objectEqualsNullProblemDescriptor().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.objectEqualsNullProblemDescriptor().get(); + } - public boolean isEnabledByDefault() { - return true; - } + public boolean isEnabledByDefault() { + return true; + } - public BaseInspectionVisitor buildVisitor() { - return new ObjectEqualsNullVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new ObjectEqualsNullVisitor(); + } - private static class ObjectEqualsNullVisitor extends BaseInspectionVisitor { + private static class ObjectEqualsNullVisitor extends BaseInspectionVisitor { - @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression call) { - super.visitMethodCallExpression(call); - if (!MethodCallUtils.isEqualsCall(call)) { - return; - } - final PsiExpressionList argumentList = call.getArgumentList(); - final PsiExpression[] args = argumentList.getExpressions(); - if (args.length == 0 || !ExpressionUtils.isNullLiteral(args[0])) { - return; - } - registerError(args[0]); + @Override + public void visitMethodCallExpression( + @Nonnull PsiMethodCallExpression call + ) { + super.visitMethodCallExpression(call); + if (!MethodCallUtils.isEqualsCall(call)) { + return; + } + final PsiExpressionList argumentList = call.getArgumentList(); + final PsiExpression[] args = argumentList.getExpressions(); + if (args.length == 0 || !ExpressionUtils.isNullLiteral(args[0])) { + return; + } + registerError(args[0]); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ObjectToStringInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ObjectToStringInspection.java index f9b5fce6a..569fbff04 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ObjectToStringInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ObjectToStringInspection.java @@ -24,147 +24,147 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.language.ast.IElementType; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import org.jetbrains.annotations.NonNls; @ExtensionImpl public class ObjectToStringInspection extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.defaultTostringCallDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.defaultTostringCallProblemDescriptor().get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ObjectToStringVisitor(); - } - - private static class ObjectToStringVisitor extends BaseInspectionVisitor { - + @Nonnull @Override - public void visitPolyadicExpression(PsiPolyadicExpression expression) { - super.visitPolyadicExpression(expression); - if (!ExpressionUtils.hasStringType(expression)) { - return; - } - final PsiExpression[] operands = expression.getOperands(); - for (PsiExpression operand : operands) { - checkExpression(operand); - } + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.defaultTostringCallDisplayName(); } @Override - public void visitAssignmentExpression(@Nonnull PsiAssignmentExpression expression) { - super.visitAssignmentExpression(expression); - final IElementType tokenType = expression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.PLUSEQ)) { - return; - } - final PsiExpression lhs = expression.getLExpression(); - if (!ExpressionUtils.hasStringType(lhs)) { - return; - } - final PsiExpression rhs = expression.getRExpression(); - checkExpression(rhs); + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.defaultTostringCallProblemDescriptor().get(); } @Override - public void visitMethodCallExpression(PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - @NonNls final String name = methodExpression.getReferenceName(); - if (HardcodedMethodConstants.TO_STRING.equals(name)) { - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 0) { - return; - } - final PsiExpression qualifier = methodExpression.getQualifierExpression(); - checkExpression(qualifier); - } - else if ("append".equals(name)) { - final PsiExpression qualifier = methodExpression.getQualifierExpression(); - if (!TypeUtils.expressionHasTypeOrSubtype(qualifier, CommonClassNames.JAVA_LANG_ABSTRACT_STRING_BUILDER)) { - return; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 1) { - return; - } - final PsiExpression argument = arguments[0]; - checkExpression(argument); - } - else if ("valueOf".equals(name)) { - final PsiExpression qualifierExpression = methodExpression.getQualifierExpression(); - if (!(qualifierExpression instanceof PsiReferenceExpression)) { - return; - } - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)qualifierExpression; - final String canonicalText = referenceExpression.getCanonicalText(); - if (!CommonClassNames.JAVA_LANG_STRING.equals(canonicalText)) { - return; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 1) { - return; - } - final PsiExpression argument = arguments[0]; - checkExpression(argument); - } + public BaseInspectionVisitor buildVisitor() { + return new ObjectToStringVisitor(); } - private void checkExpression(PsiExpression expression) { - if (expression == null) { - return; - } - final PsiType type = expression.getType(); - if (!(type instanceof PsiClassType)) { - return; - } - final PsiClassType classType = (PsiClassType)type; - if (type.equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) { - return; - } - final PsiClass referencedClass = classType.resolve(); - if (referencedClass == null || referencedClass instanceof PsiTypeParameter) { - return; - } - if (referencedClass.isEnum() || referencedClass.isInterface()) { - return; - } - if (hasGoodToString(referencedClass)) { - return; - } - registerError(expression); - } + private static class ObjectToStringVisitor extends BaseInspectionVisitor { - private static boolean hasGoodToString(PsiClass aClass) { - final PsiMethod[] methods = aClass.findMethodsByName(HardcodedMethodConstants.TO_STRING, true); - for (PsiMethod method : methods) { - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null) { - continue; + @Override + public void visitPolyadicExpression(PsiPolyadicExpression expression) { + super.visitPolyadicExpression(expression); + if (!ExpressionUtils.hasStringType(expression)) { + return; + } + final PsiExpression[] operands = expression.getOperands(); + for (PsiExpression operand : operands) { + checkExpression(operand); + } } - final String name = containingClass.getQualifiedName(); - if (CommonClassNames.JAVA_LANG_OBJECT.equals(name)) { - continue; + + @Override + public void visitAssignmentExpression(@Nonnull PsiAssignmentExpression expression) { + super.visitAssignmentExpression(expression); + final IElementType tokenType = expression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.PLUSEQ)) { + return; + } + final PsiExpression lhs = expression.getLExpression(); + if (!ExpressionUtils.hasStringType(lhs)) { + return; + } + final PsiExpression rhs = expression.getRExpression(); + checkExpression(rhs); } - final PsiParameterList parameterList = method.getParameterList(); - if (parameterList.getParametersCount() == 0) { - return true; + + @Override + public void visitMethodCallExpression(PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + @NonNls final String name = methodExpression.getReferenceName(); + if (HardcodedMethodConstants.TO_STRING.equals(name)) { + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 0) { + return; + } + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + checkExpression(qualifier); + } + else if ("append".equals(name)) { + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (!TypeUtils.expressionHasTypeOrSubtype(qualifier, CommonClassNames.JAVA_LANG_ABSTRACT_STRING_BUILDER)) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 1) { + return; + } + final PsiExpression argument = arguments[0]; + checkExpression(argument); + } + else if ("valueOf".equals(name)) { + final PsiExpression qualifierExpression = methodExpression.getQualifierExpression(); + if (!(qualifierExpression instanceof PsiReferenceExpression)) { + return; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) qualifierExpression; + final String canonicalText = referenceExpression.getCanonicalText(); + if (!CommonClassNames.JAVA_LANG_STRING.equals(canonicalText)) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 1) { + return; + } + final PsiExpression argument = arguments[0]; + checkExpression(argument); + } + } + + private void checkExpression(PsiExpression expression) { + if (expression == null) { + return; + } + final PsiType type = expression.getType(); + if (!(type instanceof PsiClassType)) { + return; + } + final PsiClassType classType = (PsiClassType) type; + if (type.equalsToText(CommonClassNames.JAVA_LANG_OBJECT)) { + return; + } + final PsiClass referencedClass = classType.resolve(); + if (referencedClass == null || referencedClass instanceof PsiTypeParameter) { + return; + } + if (referencedClass.isEnum() || referencedClass.isInterface()) { + return; + } + if (hasGoodToString(referencedClass)) { + return; + } + registerError(expression); + } + + private static boolean hasGoodToString(PsiClass aClass) { + final PsiMethod[] methods = aClass.findMethodsByName(HardcodedMethodConstants.TO_STRING, true); + for (PsiMethod method : methods) { + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) { + continue; + } + final String name = containingClass.getQualifiedName(); + if (CommonClassNames.JAVA_LANG_OBJECT.equals(name)) { + continue; + } + final PsiParameterList parameterList = method.getParameterList(); + if (parameterList.getParametersCount() == 0) { + return true; + } + } + return false; } - } - return false; } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/PrimitiveArrayArgumentToVariableArgMethodInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/PrimitiveArrayArgumentToVariableArgMethodInspection.java index 7cc92c6c7..9292b8e26 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/PrimitiveArrayArgumentToVariableArgMethodInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/PrimitiveArrayArgumentToVariableArgMethodInspection.java @@ -22,87 +22,87 @@ 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 PrimitiveArrayArgumentToVariableArgMethodInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.primitiveArrayArgumentToVarArgMethodDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.primitiveArrayArgumentToVarArgMethodDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.primitiveArrayArgumentToVarArgMethodProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.primitiveArrayArgumentToVarArgMethodProblemDescriptor().get(); + } - @Override - public boolean isEnabledByDefault() { - return true; - } + @Override + public boolean isEnabledByDefault() { + return true; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new PrimitiveArrayArgumentToVariableArgVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new PrimitiveArrayArgumentToVariableArgVisitor(); + } - private static class PrimitiveArrayArgumentToVariableArgVisitor extends BaseInspectionVisitor { + private static class PrimitiveArrayArgumentToVariableArgVisitor extends BaseInspectionVisitor { - @Override - public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression call) { - super.visitMethodCallExpression(call); - if (!PsiUtil.isLanguageLevel5OrHigher(call)) { - return; - } - final PsiExpressionList argumentList = call.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length == 0) { - return; - } - final PsiExpression lastArgument = arguments[arguments.length - 1]; - final PsiType argumentType = lastArgument.getType(); - if (!isPrimitiveArrayType(argumentType)) { - return; - } - final JavaResolveResult result = call.resolveMethodGenerics(); - final PsiMethod method = (PsiMethod)result.getElement(); - if (method == null) { - return; - } - final PsiParameterList parameterList = method.getParameterList(); - if (parameterList.getParametersCount() != arguments.length) { - return; - } - final PsiParameter[] parameters = parameterList.getParameters(); - final PsiParameter lastParameter = parameters[parameters.length - 1]; - if (!lastParameter.isVarArgs()) { - return; - } - final PsiType parameterType = lastParameter.getType(); - if (isDeepPrimitiveArrayType(parameterType, result.getSubstitutor())) { - return; - } - registerError(lastArgument); + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression call) { + super.visitMethodCallExpression(call); + if (!PsiUtil.isLanguageLevel5OrHigher(call)) { + return; + } + final PsiExpressionList argumentList = call.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length == 0) { + return; + } + final PsiExpression lastArgument = arguments[arguments.length - 1]; + final PsiType argumentType = lastArgument.getType(); + if (!isPrimitiveArrayType(argumentType)) { + return; + } + final JavaResolveResult result = call.resolveMethodGenerics(); + final PsiMethod method = (PsiMethod) result.getElement(); + if (method == null) { + return; + } + final PsiParameterList parameterList = method.getParameterList(); + if (parameterList.getParametersCount() != arguments.length) { + return; + } + final PsiParameter[] parameters = parameterList.getParameters(); + final PsiParameter lastParameter = parameters[parameters.length - 1]; + if (!lastParameter.isVarArgs()) { + return; + } + final PsiType parameterType = lastParameter.getType(); + if (isDeepPrimitiveArrayType(parameterType, result.getSubstitutor())) { + return; + } + registerError(lastArgument); + } } - } - private static boolean isPrimitiveArrayType(PsiType type) { - if (!(type instanceof PsiArrayType)) { - return false; + private static boolean isPrimitiveArrayType(PsiType type) { + if (!(type instanceof PsiArrayType)) { + return false; + } + final PsiType componentType = ((PsiArrayType) type).getComponentType(); + return TypeConversionUtil.isPrimitiveAndNotNull(componentType); } - final PsiType componentType = ((PsiArrayType)type).getComponentType(); - return TypeConversionUtil.isPrimitiveAndNotNull(componentType); - } - private static boolean isDeepPrimitiveArrayType(PsiType type, PsiSubstitutor substitutor) { - if (!(type instanceof PsiEllipsisType)) { - return false; + private static boolean isDeepPrimitiveArrayType(PsiType type, PsiSubstitutor substitutor) { + if (!(type instanceof PsiEllipsisType)) { + return false; + } + final PsiType componentType = type.getDeepComponentType(); + final PsiType substitute = substitutor.substitute(componentType); + return TypeConversionUtil.isPrimitiveAndNotNull(substitute.getDeepComponentType()); } - final PsiType componentType = type.getDeepComponentType(); - final PsiType substitute = substitutor.substitute(componentType); - return TypeConversionUtil.isPrimitiveAndNotNull(substitute.getDeepComponentType()); - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ReflectionForUnavailableAnnotationInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ReflectionForUnavailableAnnotationInspection.java index 262ae8552..779f58392 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ReflectionForUnavailableAnnotationInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ReflectionForUnavailableAnnotationInspection.java @@ -21,94 +21,94 @@ 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 ReflectionForUnavailableAnnotationInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.reflectionForUnavailableAnnotationDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.reflectionForUnavailableAnnotationDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.reflectionForUnavailableAnnotationProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.reflectionForUnavailableAnnotationProblemDescriptor().get(); + } - @Override - public boolean isEnabledByDefault() { - return true; - } + @Override + public boolean isEnabledByDefault() { + return true; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new ReflectionForUnavailableAnnotationVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new ReflectionForUnavailableAnnotationVisitor(); + } - private static class ReflectionForUnavailableAnnotationVisitor extends BaseInspectionVisitor { + private static class ReflectionForUnavailableAnnotationVisitor extends BaseInspectionVisitor { - @Override - public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - @NonNls final String methodName = methodExpression.getReferenceName(); - if (!"isAnnotationPresent".equals(methodName) && !"getAnnotation".equals(methodName)) { - return; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] args = argumentList.getExpressions(); - if (args.length != 1) { - return; - } - final PsiExpression arg = args[0]; - if (arg == null) { - return; - } - if (!(arg instanceof PsiClassObjectAccessExpression)) { - return; - } - final PsiExpression qualifier = methodExpression.getQualifierExpression(); - if (!TypeUtils.expressionHasTypeOrSubtype(qualifier, "java.lang.reflect.AnnotatedElement")) { - return; - } - final PsiClassObjectAccessExpression classObjectAccessExpression = (PsiClassObjectAccessExpression)arg; - final PsiTypeElement operand = classObjectAccessExpression.getOperand(); + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + @NonNls final String methodName = methodExpression.getReferenceName(); + if (!"isAnnotationPresent".equals(methodName) && !"getAnnotation".equals(methodName)) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] args = argumentList.getExpressions(); + if (args.length != 1) { + return; + } + final PsiExpression arg = args[0]; + if (arg == null) { + return; + } + if (!(arg instanceof PsiClassObjectAccessExpression)) { + return; + } + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (!TypeUtils.expressionHasTypeOrSubtype(qualifier, "java.lang.reflect.AnnotatedElement")) { + return; + } + final PsiClassObjectAccessExpression classObjectAccessExpression = (PsiClassObjectAccessExpression) arg; + final PsiTypeElement operand = classObjectAccessExpression.getOperand(); - final PsiClassType annotationClassType = (PsiClassType)operand.getType(); - final PsiClass annotationClass = annotationClassType.resolve(); - if (annotationClass == null) { - return; - } - final PsiModifierList modifierList = annotationClass.getModifierList(); - if (modifierList == null) { - return; - } - final PsiAnnotation retentionAnnotation = modifierList.findAnnotation(CommonClassNames.JAVA_LANG_ANNOTATION_RETENTION); - if (retentionAnnotation == null) { - registerError(arg); - return; - } - final PsiAnnotationParameterList parameters = retentionAnnotation.getParameterList(); - final PsiNameValuePair[] attributes = parameters.getAttributes(); - for (PsiNameValuePair attribute : attributes) { - @NonNls final String name = attribute.getName(); - if (name != null && !"value".equals(name)) { - continue; - } - final PsiAnnotationMemberValue value = attribute.getValue(); - if (value == null) { - continue; - } - @NonNls final String text = value.getText(); - if (!text.contains("RUNTIME")) { - registerError(arg); - return; + final PsiClassType annotationClassType = (PsiClassType) operand.getType(); + final PsiClass annotationClass = annotationClassType.resolve(); + if (annotationClass == null) { + return; + } + final PsiModifierList modifierList = annotationClass.getModifierList(); + if (modifierList == null) { + return; + } + final PsiAnnotation retentionAnnotation = modifierList.findAnnotation(CommonClassNames.JAVA_LANG_ANNOTATION_RETENTION); + if (retentionAnnotation == null) { + registerError(arg); + return; + } + final PsiAnnotationParameterList parameters = retentionAnnotation.getParameterList(); + final PsiNameValuePair[] attributes = parameters.getAttributes(); + for (PsiNameValuePair attribute : attributes) { + @NonNls final String name = attribute.getName(); + if (name != null && !"value".equals(name)) { + continue; + } + final PsiAnnotationMemberValue value = attribute.getValue(); + if (value == null) { + continue; + } + @NonNls final String text = value.getText(); + if (!text.contains("RUNTIME")) { + registerError(arg); + return; + } + } } - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ReplaceAllDotInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ReplaceAllDotInspection.java index df0292bff..309b53e01 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ReplaceAllDotInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ReplaceAllDotInspection.java @@ -22,77 +22,78 @@ 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 ReplaceAllDotInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.replaceAllDotDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.replaceAllDotDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.replaceAllDotProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.replaceAllDotProblemDescriptor().get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new ReplaceAllDotVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new ReplaceAllDotVisitor(); + } - private static class ReplaceAllDotVisitor - extends BaseInspectionVisitor { + private static class ReplaceAllDotVisitor + extends BaseInspectionVisitor { - @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - @NonNls final String methodName = - methodExpression.getReferenceName(); - if (!"replaceAll".equals(methodName)) { - return; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 2) { - return; - } - final PsiExpression argument = arguments[0]; - if (!PsiUtil.isConstantExpression(argument)) { - return; - } - final PsiType argumentType = argument.getType(); - if (argumentType == null) { - return; - } - final String canonicalText = argumentType.getCanonicalText(); - if (!CommonClassNames.JAVA_LANG_STRING.equals(canonicalText)) { - return; - } - final String argValue = (String)ConstantExpressionUtil.computeCastTo(argument, argumentType); - if (!".".equals(argValue)) { - return; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return; - } - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null) { - return; - } - final String qualifiedName = containingClass.getQualifiedName(); - if (!CommonClassNames.JAVA_LANG_STRING.equals(qualifiedName)) { - return; - } - registerMethodCallError(expression); + @Override + public void visitMethodCallExpression( + @Nonnull PsiMethodCallExpression expression + ) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = + expression.getMethodExpression(); + @NonNls final String methodName = + methodExpression.getReferenceName(); + if (!"replaceAll".equals(methodName)) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 2) { + return; + } + final PsiExpression argument = arguments[0]; + if (!PsiUtil.isConstantExpression(argument)) { + return; + } + final PsiType argumentType = argument.getType(); + if (argumentType == null) { + return; + } + final String canonicalText = argumentType.getCanonicalText(); + if (!CommonClassNames.JAVA_LANG_STRING.equals(canonicalText)) { + return; + } + final String argValue = (String) ConstantExpressionUtil.computeCastTo(argument, argumentType); + if (!".".equals(argValue)) { + return; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return; + } + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) { + return; + } + final String qualifiedName = containingClass.getQualifiedName(); + if (!CommonClassNames.JAVA_LANG_STRING.equals(qualifiedName)) { + return; + } + registerMethodCallError(expression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ResultOfObjectAllocationIgnoredInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ResultOfObjectAllocationIgnoredInspection.java index 5369551a4..b13d86ee3 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ResultOfObjectAllocationIgnoredInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ResultOfObjectAllocationIgnoredInspection.java @@ -22,43 +22,44 @@ 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 ResultOfObjectAllocationIgnoredInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.resultOfObjectAllocationIgnoredDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.resultOfObjectAllocationIgnoredDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.resultOfObjectAllocationIgnoredProblemDescriptor().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.resultOfObjectAllocationIgnoredProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new ResultOfObjectAllocationIgnoredVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new ResultOfObjectAllocationIgnoredVisitor(); + } - private static class ResultOfObjectAllocationIgnoredVisitor extends BaseInspectionVisitor { + private static class ResultOfObjectAllocationIgnoredVisitor extends BaseInspectionVisitor { - @Override - public void visitExpressionStatement(@Nonnull PsiExpressionStatement statement) { - super.visitExpressionStatement(statement); - final PsiExpression expression = statement.getExpression(); - if (!(expression instanceof PsiNewExpression)) { - return; - } - final PsiNewExpression newExpression = (PsiNewExpression)expression; - final PsiExpression[] arrayDimensions = newExpression.getArrayDimensions(); - if (arrayDimensions.length != 0) { - return; - } - if (newExpression.getArrayInitializer() != null) { - return; - } - registerNewExpressionError(newExpression); + @Override + public void visitExpressionStatement(@Nonnull PsiExpressionStatement statement) { + super.visitExpressionStatement(statement); + final PsiExpression expression = statement.getExpression(); + if (!(expression instanceof PsiNewExpression)) { + return; + } + final PsiNewExpression newExpression = (PsiNewExpression) expression; + final PsiExpression[] arrayDimensions = newExpression.getArrayDimensions(); + if (arrayDimensions.length != 0) { + return; + } + if (newExpression.getArrayInitializer() != null) { + return; + } + registerNewExpressionError(newExpression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ResultSetIndexZeroInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ResultSetIndexZeroInspection.java index b18c83fc5..6e22267df 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ResultSetIndexZeroInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ResultSetIndexZeroInspection.java @@ -25,75 +25,80 @@ 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.intellij.lang.annotations.Pattern; import org.jetbrains.annotations.NonNls; @ExtensionImpl public class ResultSetIndexZeroInspection extends BaseInspection { + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "UseOfIndexZeroInJDBCResultSet"; + } - @Override - @Nonnull - public String getID() { - return "UseOfIndexZeroInJDBCResultSet"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.use0indexInJdbcResultsetDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.use0indexInJdbcResultsetDisplayName(); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return (Boolean)infos[0] - ? InspectionGadgetsLocalize.use0indexInJdbcResultsetProblemDescriptor().get() - : InspectionGadgetsLocalize.use0indexInJdbcPreparedStatementProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return (Boolean) infos[0] + ? InspectionGadgetsLocalize.use0indexInJdbcResultsetProblemDescriptor().get() + : InspectionGadgetsLocalize.use0indexInJdbcPreparedStatementProblemDescriptor().get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new ResultSetIndexZeroVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new ResultSetIndexZeroVisitor(); + } - private static class ResultSetIndexZeroVisitor extends BaseInspectionVisitor { + private static class ResultSetIndexZeroVisitor extends BaseInspectionVisitor { - @Override - public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - @NonNls final String methodName = methodExpression.getReferenceName(); - if (methodName == null) { - return; - } - final boolean resultSet; - if (methodName.startsWith("get") || methodName.startsWith("update")) { - resultSet = true; - } else if (methodName.startsWith("set")) { - resultSet = false; - } else { - return; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length == 0) { - return; - } - final PsiExpression argument = arguments[0]; - final Object val = ExpressionUtils.computeConstantExpression(argument); - if (!(val instanceof Integer) || ((Integer)val).intValue() != 0) { - return; - } - final PsiExpression qualifier = methodExpression.getQualifierExpression(); - if (resultSet) { - if (TypeUtils.expressionHasTypeOrSubtype(qualifier, "java.sql.ResultSet")) { - registerError(argument, Boolean.valueOf(resultSet)); - } - } else { - if (TypeUtils.expressionHasTypeOrSubtype(qualifier, "java.sql.PreparedStatement")) { - registerError(argument, Boolean.valueOf(resultSet)); + @Override + public void visitMethodCallExpression(@Nonnull PsiMethodCallExpression expression) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + @NonNls final String methodName = methodExpression.getReferenceName(); + if (methodName == null) { + return; + } + final boolean resultSet; + if (methodName.startsWith("get") || methodName.startsWith("update")) { + resultSet = true; + } + else if (methodName.startsWith("set")) { + resultSet = false; + } + else { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length == 0) { + return; + } + final PsiExpression argument = arguments[0]; + final Object val = ExpressionUtils.computeConstantExpression(argument); + if (!(val instanceof Integer) || ((Integer) val).intValue() != 0) { + return; + } + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (resultSet) { + if (TypeUtils.expressionHasTypeOrSubtype(qualifier, "java.sql.ResultSet")) { + registerError(argument, Boolean.valueOf(resultSet)); + } + } + else { + if (TypeUtils.expressionHasTypeOrSubtype(qualifier, "java.sql.PreparedStatement")) { + registerError(argument, Boolean.valueOf(resultSet)); + } + } } - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ReturnNullInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ReturnNullInspection.java index 8cb16744b..246aec744 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ReturnNullInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/ReturnNullInspection.java @@ -29,6 +29,7 @@ import consulo.deadCodeNotWorking.impl.MultipleCheckboxOptionsPanel; import consulo.language.psi.PsiElement; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import consulo.util.collection.ArrayUtil; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @@ -38,117 +39,118 @@ @ExtensionImpl public class ReturnNullInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean m_reportObjectMethods = true; + @SuppressWarnings({"PublicField"}) + public boolean m_reportArrayMethods = true; + @SuppressWarnings({"PublicField"}) + public boolean m_reportCollectionMethods = true; + @SuppressWarnings({"PublicField"}) + public boolean m_ignorePrivateMethods = false; - @SuppressWarnings({"PublicField"}) - public boolean m_reportObjectMethods = true; - @SuppressWarnings({"PublicField"}) - public boolean m_reportArrayMethods = true; - @SuppressWarnings({"PublicField"}) - public boolean m_reportCollectionMethods = true; - @SuppressWarnings({"PublicField"}) - public boolean m_ignorePrivateMethods = false; - - @Override - @Pattern("[a-zA-Z_0-9.-]+") - @Nonnull - public String getID() { - return "ReturnOfNull"; - } + @Override + @Nonnull + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "ReturnOfNull"; + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.returnOfNullDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.returnOfNullDisplayName(); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.returnOfNullProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.returnOfNullProblemDescriptor().get(); + } - @Override - @Nullable - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiElement elt = (PsiElement)infos[0]; - if (!AnnotationUtil.isAnnotatingApplicable(elt)) { - return null; + @Override + @Nullable + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiElement elt = (PsiElement) infos[0]; + if (!AnnotationUtil.isAnnotatingApplicable(elt)) { + return null; + } + final NullableNotNullManager manager = + NullableNotNullManager.getInstance(elt.getProject()); + return new DelegatingFix(new AnnotateMethodFix( + manager.getDefaultNullable(), + ArrayUtil.toStringArray(manager.getNotNulls()) + )); } - final NullableNotNullManager manager = - NullableNotNullManager.getInstance(elt.getProject()); - return new DelegatingFix(new AnnotateMethodFix( - manager.getDefaultNullable(), - ArrayUtil.toStringArray(manager.getNotNulls()))); - } - @Override - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this); - optionsPanel.addCheckbox(InspectionGadgetsLocalize.returnOfNullIgnorePrivateOption().get(), "m_ignorePrivateMethods"); - optionsPanel.addCheckbox(InspectionGadgetsLocalize.returnOfNullArraysOption().get(), "m_reportArrayMethods"); - optionsPanel.addCheckbox(InspectionGadgetsLocalize.returnOfNullCollectionsOption().get(), "m_reportCollectionMethods"); - optionsPanel.addCheckbox(InspectionGadgetsLocalize.returnOfNullObjectsOption().get(), "m_reportObjectMethods"); - return optionsPanel; - } + @Override + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this); + optionsPanel.addCheckbox(InspectionGadgetsLocalize.returnOfNullIgnorePrivateOption().get(), "m_ignorePrivateMethods"); + optionsPanel.addCheckbox(InspectionGadgetsLocalize.returnOfNullArraysOption().get(), "m_reportArrayMethods"); + optionsPanel.addCheckbox(InspectionGadgetsLocalize.returnOfNullCollectionsOption().get(), "m_reportCollectionMethods"); + optionsPanel.addCheckbox(InspectionGadgetsLocalize.returnOfNullObjectsOption().get(), "m_reportObjectMethods"); + return optionsPanel; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new ReturnNullVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new ReturnNullVisitor(); + } - private class ReturnNullVisitor extends BaseInspectionVisitor { + private class ReturnNullVisitor extends BaseInspectionVisitor { - @Override - public void visitLiteralExpression( - @Nonnull PsiLiteralExpression value) { - super.visitLiteralExpression(value); - final String text = value.getText(); - if (!PsiKeyword.NULL.equals(text)) { - return; - } - PsiElement parent = value.getParent(); - while (parent instanceof PsiParenthesizedExpression || - parent instanceof PsiConditionalExpression || - parent instanceof PsiTypeCastExpression) { - parent = parent.getParent(); - } - if (!(parent instanceof PsiReturnStatement)) { - return; - } - final PsiMethod method = - PsiTreeUtil.getParentOfType(value, PsiMethod.class); - if (method == null) { - return; - } - if (m_ignorePrivateMethods && - method.hasModifierProperty(PsiModifier.PRIVATE)) { - return; - } - final PsiType returnType = method.getReturnType(); - if (returnType == null) { - return; - } - final boolean isArray = returnType.getArrayDimensions() > 0; - final NullableNotNullManager nullableNotNullManager = - NullableNotNullManager.getInstance(method.getProject()); - if (nullableNotNullManager.isNullable(method, false)) { - return; - } - if (CollectionUtils.isCollectionClassOrInterface(returnType)) { - if (m_reportCollectionMethods) { - registerError(value, value); - } - } - else if (isArray) { - if (m_reportArrayMethods) { - registerError(value, value); - } - } - else { - if (m_reportObjectMethods) { - registerError(value, value); + @Override + public void visitLiteralExpression( + @Nonnull PsiLiteralExpression value + ) { + super.visitLiteralExpression(value); + final String text = value.getText(); + if (!PsiKeyword.NULL.equals(text)) { + return; + } + PsiElement parent = value.getParent(); + while (parent instanceof PsiParenthesizedExpression || + parent instanceof PsiConditionalExpression || + parent instanceof PsiTypeCastExpression) { + parent = parent.getParent(); + } + if (!(parent instanceof PsiReturnStatement)) { + return; + } + final PsiMethod method = + PsiTreeUtil.getParentOfType(value, PsiMethod.class); + if (method == null) { + return; + } + if (m_ignorePrivateMethods && + method.hasModifierProperty(PsiModifier.PRIVATE)) { + return; + } + final PsiType returnType = method.getReturnType(); + if (returnType == null) { + return; + } + final boolean isArray = returnType.getArrayDimensions() > 0; + final NullableNotNullManager nullableNotNullManager = + NullableNotNullManager.getInstance(method.getProject()); + if (nullableNotNullManager.isNullable(method, false)) { + return; + } + if (CollectionUtils.isCollectionClassOrInterface(returnType)) { + if (m_reportCollectionMethods) { + registerError(value, value); + } + } + else if (isArray) { + if (m_reportArrayMethods) { + registerError(value, value); + } + } + else { + if (m_reportObjectMethods) { + registerError(value, value); + } + } } - } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/StaticCallOnSubclassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/StaticCallOnSubclassInspection.java index c5e54cd7e..0dc15cee2 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/StaticCallOnSubclassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/StaticCallOnSubclassInspection.java @@ -26,111 +26,118 @@ import consulo.language.psi.PsiElement; import consulo.language.psi.PsiReference; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl public class StaticCallOnSubclassInspection extends BaseInspection { + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "StaticMethodReferencedViaSubclass"; + } - @Nonnull - public String getID() { - return "StaticMethodReferencedViaSubclass"; - } - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.staticMethodViaSubclassDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.staticMethodViaSubclassDisplayName(); + } - @Nonnull - public String buildErrorString(Object... infos) { - final PsiClass declaringClass = (PsiClass)infos[0]; - final PsiClass referencedClass = (PsiClass)infos[1]; - return InspectionGadgetsLocalize.staticMethodViaSubclassProblemDescriptor( - declaringClass.getQualifiedName(), - referencedClass.getQualifiedName() - ).get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + final PsiClass declaringClass = (PsiClass) infos[0]; + final PsiClass referencedClass = (PsiClass) infos[1]; + return InspectionGadgetsLocalize.staticMethodViaSubclassProblemDescriptor( + declaringClass.getQualifiedName(), + referencedClass.getQualifiedName() + ).get(); + } - protected InspectionGadgetsFix buildFix(Object... infos) { - return new StaticCallOnSubclassFix(); - } + protected InspectionGadgetsFix buildFix(Object... infos) { + return new StaticCallOnSubclassFix(); + } - private static class StaticCallOnSubclassFix extends InspectionGadgetsFix { + private static class StaticCallOnSubclassFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.staticMethodViaSubclassRationalizeQuickfix(); + } - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.staticMethodViaSubclassRationalizeQuickfix().get(); + 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 String methodName = expression.getReferenceName(); + if (call == null) { + return; + } + final PsiMethod method = call.resolveMethod(); + if (method == null) { + return; + } + final PsiClass containingClass = method.getContainingClass(); + final PsiExpressionList argumentList = call.getArgumentList(); + if (containingClass == null) { + return; + } + final String containingClassName = containingClass.getQualifiedName(); + final String argText = argumentList.getText(); + replaceExpressionAndShorten(call, containingClassName + '.' + methodName + argText); + } } - 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 String methodName = expression.getReferenceName(); - if (call == null) { - return; - } - final PsiMethod method = call.resolveMethod(); - if (method == null) { - return; - } - final PsiClass containingClass = method.getContainingClass(); - final PsiExpressionList argumentList = call.getArgumentList(); - if (containingClass == null) { - return; - } - final String containingClassName = containingClass.getQualifiedName(); - final String argText = argumentList.getText(); - replaceExpressionAndShorten(call, containingClassName + '.' + methodName + argText); + public BaseInspectionVisitor buildVisitor() { + return new StaticCallOnSubclassVisitor(); } - } - - public BaseInspectionVisitor buildVisitor() { - return new StaticCallOnSubclassVisitor(); - } - private static class StaticCallOnSubclassVisitor extends BaseInspectionVisitor { - @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression call) { - super.visitMethodCallExpression(call); - final PsiReferenceExpression methodExpression = - call.getMethodExpression(); - final PsiElement qualifier = methodExpression.getQualifier(); - if (!(qualifier instanceof PsiReferenceExpression)) { - return; - } - final PsiMethod method = call.resolveMethod(); - if (method == null) { - return; - } - if (!method.hasModifierProperty(PsiModifier.STATIC)) { - return; - } - final PsiElement referent = ((PsiReference)qualifier).resolve(); - if (!(referent instanceof PsiClass)) { - return; - } - final PsiClass referencedClass = (PsiClass)referent; - final PsiClass declaringClass = method.getContainingClass(); - if (declaringClass == null) { - return; - } - if (declaringClass.equals(referencedClass)) { - return; - } - final PsiClass containingClass = - ClassUtils.getContainingClass(call); - if (!ClassUtils.isClassVisibleFromClass(containingClass, - declaringClass)) { - return; - } - registerMethodCallError(call, declaringClass, referencedClass); + private static class StaticCallOnSubclassVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression( + @Nonnull PsiMethodCallExpression call + ) { + super.visitMethodCallExpression(call); + final PsiReferenceExpression methodExpression = + call.getMethodExpression(); + final PsiElement qualifier = methodExpression.getQualifier(); + if (!(qualifier instanceof PsiReferenceExpression)) { + return; + } + final PsiMethod method = call.resolveMethod(); + if (method == null) { + return; + } + if (!method.hasModifierProperty(PsiModifier.STATIC)) { + return; + } + final PsiElement referent = ((PsiReference) qualifier).resolve(); + if (!(referent instanceof PsiClass)) { + return; + } + final PsiClass referencedClass = (PsiClass) referent; + final PsiClass declaringClass = method.getContainingClass(); + if (declaringClass == null) { + return; + } + if (declaringClass.equals(referencedClass)) { + return; + } + final PsiClass containingClass = + ClassUtils.getContainingClass(call); + if (!ClassUtils.isClassVisibleFromClass( + containingClass, + declaringClass + )) { + return; + } + registerMethodCallError(call, declaringClass, referencedClass); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/StaticFieldReferenceOnSubclassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/StaticFieldReferenceOnSubclassInspection.java index 70d6a3a2a..4d8373fe2 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/StaticFieldReferenceOnSubclassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/StaticFieldReferenceOnSubclassInspection.java @@ -26,98 +26,104 @@ import consulo.language.psi.PsiElement; import consulo.language.psi.PsiReference; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl -public class StaticFieldReferenceOnSubclassInspection - extends BaseInspection { - - @Nonnull - public String getID() { - return "StaticFieldReferencedViaSubclass"; - } +public class StaticFieldReferenceOnSubclassInspection extends BaseInspection { + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "StaticFieldReferencedViaSubclass"; + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.staticFieldViaSubclassDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.staticFieldViaSubclassDisplayName(); + } - @Nonnull - public String buildErrorString(Object... infos) { - final PsiClass declaringClass = (PsiClass)infos[0]; - final PsiClass referencedClass = (PsiClass)infos[1]; - return InspectionGadgetsLocalize.staticFieldViaSubclassProblemDescriptor( - declaringClass.getQualifiedName(), - referencedClass.getQualifiedName() - ).get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + final PsiClass declaringClass = (PsiClass) infos[0]; + final PsiClass referencedClass = (PsiClass) infos[1]; + return InspectionGadgetsLocalize.staticFieldViaSubclassProblemDescriptor( + declaringClass.getQualifiedName(), + referencedClass.getQualifiedName() + ).get(); + } - protected InspectionGadgetsFix buildFix(Object... infos) { - return new StaticFieldOnSubclassFix(); - } + protected InspectionGadgetsFix buildFix(Object... infos) { + return new StaticFieldOnSubclassFix(); + } - private static class StaticFieldOnSubclassFix extends InspectionGadgetsFix { + private static class StaticFieldOnSubclassFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.staticFieldViaSubclassRationalizeQuickfix(); + } - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.staticFieldViaSubclassRationalizeQuickfix().get(); + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiIdentifier name = (PsiIdentifier) descriptor.getPsiElement(); + final PsiReferenceExpression expression = (PsiReferenceExpression) name.getParent(); + assert expression != null; + final PsiField field = (PsiField) expression.resolve(); + assert field != null; + replaceExpressionWithReferenceTo(expression, field); + } } - public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiIdentifier name = (PsiIdentifier)descriptor.getPsiElement(); - final PsiReferenceExpression expression = (PsiReferenceExpression)name.getParent(); - assert expression != null; - final PsiField field = (PsiField)expression.resolve(); - assert field != null; - replaceExpressionWithReferenceTo(expression, field); + public BaseInspectionVisitor buildVisitor() { + return new StaticFieldOnSubclassVisitor(); } - } - - public BaseInspectionVisitor buildVisitor() { - return new StaticFieldOnSubclassVisitor(); - } - private static class StaticFieldOnSubclassVisitor - extends BaseInspectionVisitor { + private static class StaticFieldOnSubclassVisitor + extends BaseInspectionVisitor { - @Override - public void visitReferenceExpression( - PsiReferenceExpression expression) { - super.visitReferenceExpression(expression); - final PsiElement qualifier = expression.getQualifier(); - if (!(qualifier instanceof PsiReferenceExpression)) { - return; - } - final PsiElement referent = expression.resolve(); - if (!(referent instanceof PsiField)) { - return; - } - final PsiField field = (PsiField)referent; - if (!field.hasModifierProperty(PsiModifier.STATIC)) { - return; - } - final PsiElement qualifierReferent = - ((PsiReference)qualifier).resolve(); - if (!(qualifierReferent instanceof PsiClass)) { - return; - } - final PsiClass referencedClass = (PsiClass)qualifierReferent; - final PsiClass declaringClass = field.getContainingClass(); - if (declaringClass == null) { - return; - } - if (declaringClass.equals(referencedClass)) { - return; - } - final PsiClass containingClass = - ClassUtils.getContainingClass(expression); - if (!ClassUtils.isClassVisibleFromClass(containingClass, - declaringClass)) { - return; - } - final PsiElement identifier = expression.getReferenceNameElement(); - registerError(identifier, declaringClass, referencedClass); + @Override + public void visitReferenceExpression( + PsiReferenceExpression expression + ) { + super.visitReferenceExpression(expression); + final PsiElement qualifier = expression.getQualifier(); + if (!(qualifier instanceof PsiReferenceExpression)) { + return; + } + final PsiElement referent = expression.resolve(); + if (!(referent instanceof PsiField)) { + return; + } + final PsiField field = (PsiField) referent; + if (!field.hasModifierProperty(PsiModifier.STATIC)) { + return; + } + final PsiElement qualifierReferent = + ((PsiReference) qualifier).resolve(); + if (!(qualifierReferent instanceof PsiClass)) { + return; + } + final PsiClass referencedClass = (PsiClass) qualifierReferent; + final PsiClass declaringClass = field.getContainingClass(); + if (declaringClass == null) { + return; + } + if (declaringClass.equals(referencedClass)) { + return; + } + final PsiClass containingClass = + ClassUtils.getContainingClass(expression); + if (!ClassUtils.isClassVisibleFromClass( + containingClass, + declaringClass + )) { + return; + } + final PsiElement identifier = expression.getReferenceNameElement(); + registerError(identifier, declaringClass, referencedClass); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/StringConcatenationMissingWhitespaceInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/StringConcatenationMissingWhitespaceInspection.java index c335b5dfc..890abda37 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/StringConcatenationMissingWhitespaceInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/StringConcatenationMissingWhitespaceInspection.java @@ -29,7 +29,6 @@ import consulo.language.ast.IElementType; import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; import javax.swing.*; @@ -40,92 +39,91 @@ @ExtensionImpl public class StringConcatenationMissingWhitespaceInspection extends BaseInspection { - @SuppressWarnings("PublicField") - public boolean ignoreNonStringLiterals = false; + @SuppressWarnings("PublicField") + public boolean ignoreNonStringLiterals = false; - @Nls - @Nonnull - @Override - public String getDisplayName() { - return InspectionGadgetsLocalize.stringConcatenationMissingWhitespaceDisplayName().get(); - } - - @Nonnull - @Override - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.stringConcatenationMissingWhitespaceProblemDescriptor().get(); - } - - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.stringConcatenationMissingWhitespaceOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreNonStringLiterals"); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.stringConcatenationMissingWhitespaceDisplayName(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new StringConcatenationMissingWhitespaceVisitor(); - } + @Nonnull + @Override + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.stringConcatenationMissingWhitespaceProblemDescriptor().get(); + } - private class StringConcatenationMissingWhitespaceVisitor extends BaseInspectionVisitor { + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.stringConcatenationMissingWhitespaceOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreNonStringLiterals"); + } @Override - public void visitPolyadicExpression(PsiPolyadicExpression expression) { - super.visitPolyadicExpression(expression); - final IElementType tokenType = expression.getOperationTokenType(); - if (!JavaTokenType.PLUS.equals(tokenType) || !ExpressionUtils.hasStringType(expression)) { - return; - } - final boolean formatCall = FormatUtils.isFormatCallArgument(expression); - final PsiExpression[] operands = expression.getOperands(); - PsiExpression lhs = operands[0]; - for (int i = 1; i < operands.length; i++) { - final PsiExpression rhs = operands[i]; - if (isMissingWhitespace(lhs, rhs, formatCall)) { - final PsiJavaToken token = expression.getTokenBeforeOperand(rhs); - if (token != null) { - registerError(token); - } - } - lhs = rhs; - } + public BaseInspectionVisitor buildVisitor() { + return new StringConcatenationMissingWhitespaceVisitor(); } - private boolean isMissingWhitespace(PsiExpression lhs, PsiExpression rhs, boolean formatCall) { - @NonNls final String lhsLiteral = ExpressionUtils.getLiteralString(lhs); - if (lhsLiteral != null) { - final int length = lhsLiteral.length(); - if (length == 0) { - return false; - } - if (formatCall && lhsLiteral.endsWith("%n")) { - return false; - } - final char c = lhsLiteral.charAt(length - 1); - if (Character.isWhitespace(c) || !Character.isLetterOrDigit(c)) { - return false; - } - } - else if (ignoreNonStringLiterals) { - return false; - } - @NonNls final String rhsLiteral = ExpressionUtils.getLiteralString(rhs); - if (rhsLiteral != null) { - if (rhsLiteral.isEmpty()) { - return false; - } - if (formatCall && rhsLiteral.startsWith("%n")) { - return false; + private class StringConcatenationMissingWhitespaceVisitor extends BaseInspectionVisitor { + + @Override + public void visitPolyadicExpression(PsiPolyadicExpression expression) { + super.visitPolyadicExpression(expression); + final IElementType tokenType = expression.getOperationTokenType(); + if (!JavaTokenType.PLUS.equals(tokenType) || !ExpressionUtils.hasStringType(expression)) { + return; + } + final boolean formatCall = FormatUtils.isFormatCallArgument(expression); + final PsiExpression[] operands = expression.getOperands(); + PsiExpression lhs = operands[0]; + for (int i = 1; i < operands.length; i++) { + final PsiExpression rhs = operands[i]; + if (isMissingWhitespace(lhs, rhs, formatCall)) { + final PsiJavaToken token = expression.getTokenBeforeOperand(rhs); + if (token != null) { + registerError(token); + } + } + lhs = rhs; + } } - final char c = rhsLiteral.charAt(0); - if (Character.isWhitespace(c) || !Character.isLetterOrDigit(c)) { - return false; + + private boolean isMissingWhitespace(PsiExpression lhs, PsiExpression rhs, boolean formatCall) { + @NonNls final String lhsLiteral = ExpressionUtils.getLiteralString(lhs); + if (lhsLiteral != null) { + final int length = lhsLiteral.length(); + if (length == 0) { + return false; + } + if (formatCall && lhsLiteral.endsWith("%n")) { + return false; + } + final char c = lhsLiteral.charAt(length - 1); + if (Character.isWhitespace(c) || !Character.isLetterOrDigit(c)) { + return false; + } + } + else if (ignoreNonStringLiterals) { + return false; + } + @NonNls final String rhsLiteral = ExpressionUtils.getLiteralString(rhs); + if (rhsLiteral != null) { + if (rhsLiteral.isEmpty()) { + return false; + } + if (formatCall && rhsLiteral.startsWith("%n")) { + return false; + } + final char c = rhsLiteral.charAt(0); + if (Character.isWhitespace(c) || !Character.isLetterOrDigit(c)) { + return false; + } + } + else if (ignoreNonStringLiterals) { + return false; + } + return true; } - } - else if (ignoreNonStringLiterals) { - return false; - } - return true; } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/StringEqualityInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/StringEqualityInspection.java index af24aa815..16023b848 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/StringEqualityInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/StringEqualityInspection.java @@ -27,59 +27,60 @@ import com.siyeh.ig.psiutils.ExpressionUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class StringEqualityInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.stringComparisonDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.stringComparisonDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.stringComparisonProblemDescriptor().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.stringComparisonProblemDescriptor().get(); + } - public boolean isEnabledByDefault() { - return true; - } + public boolean isEnabledByDefault() { + return true; + } - public BaseInspectionVisitor buildVisitor() { - return new ObjectEqualityVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new ObjectEqualityVisitor(); + } - public InspectionGadgetsFix buildFix(Object... infos) { - return new EqualityToEqualsFix(); - } + public InspectionGadgetsFix buildFix(Object... infos) { + return new EqualityToEqualsFix(); + } - private static class ObjectEqualityVisitor extends BaseInspectionVisitor { + private static class ObjectEqualityVisitor extends BaseInspectionVisitor { - @Override - public void visitBinaryExpression(@Nonnull PsiBinaryExpression expression) { - super.visitBinaryExpression(expression); - if (!ComparisonUtils.isEqualityComparison(expression)) { - return; - } - final PsiExpression lhs = expression.getLOperand(); - if (!ExpressionUtils.hasStringType(lhs)) { - return; - } - final PsiExpression rhs = expression.getROperand(); - if (rhs == null || !ExpressionUtils.hasStringType(rhs)) { - return; - } - final String lhsText = lhs.getText(); - if (PsiKeyword.NULL.equals(lhsText)) { - return; - } - final String rhsText = rhs.getText(); - if (PsiKeyword.NULL.equals(rhsText)) { - return; - } - final PsiJavaToken sign = expression.getOperationSign(); - registerError(sign); + @Override + public void visitBinaryExpression(@Nonnull PsiBinaryExpression expression) { + super.visitBinaryExpression(expression); + if (!ComparisonUtils.isEqualityComparison(expression)) { + return; + } + final PsiExpression lhs = expression.getLOperand(); + if (!ExpressionUtils.hasStringType(lhs)) { + return; + } + final PsiExpression rhs = expression.getROperand(); + if (rhs == null || !ExpressionUtils.hasStringType(rhs)) { + return; + } + final String lhsText = lhs.getText(); + if (PsiKeyword.NULL.equals(lhsText)) { + return; + } + final String rhsText = rhs.getText(); + if (PsiKeyword.NULL.equals(rhsText)) { + return; + } + final PsiJavaToken sign = expression.getOperationSign(); + registerError(sign); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SubtractionInCompareToInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SubtractionInCompareToInspection.java index 7f2ef9132..7e1b248e6 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SubtractionInCompareToInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SubtractionInCompareToInspection.java @@ -26,39 +26,40 @@ import consulo.annotation.component.ExtensionImpl; import consulo.language.ast.IElementType; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class SubtractionInCompareToInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.subtractionInComparetoDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.subtractionInComparetoDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.subtractionInComparetoProblemDescriptor().get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.subtractionInComparetoProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new SubtractionInCompareToVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new SubtractionInCompareToVisitor(); + } - private static class SubtractionInCompareToVisitor extends BaseInspectionVisitor { + private static class SubtractionInCompareToVisitor extends BaseInspectionVisitor { - @Override - public void visitPolyadicExpression(PsiPolyadicExpression expression) { - super.visitPolyadicExpression(expression); - final IElementType tokenType = expression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.MINUS)) { - return; - } - final PsiMethod method = PsiTreeUtil.getParentOfType(expression, PsiMethod.class, true, PsiClass.class); - if (!MethodUtils.isCompareTo(method)) { - return; - } - registerError(expression); + @Override + public void visitPolyadicExpression(PsiPolyadicExpression expression) { + super.visitPolyadicExpression(expression); + final IElementType tokenType = expression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.MINUS)) { + return; + } + final PsiMethod method = PsiTreeUtil.getParentOfType(expression, PsiMethod.class, true, PsiClass.class); + if (!MethodUtils.isCompareTo(method)) { + return; + } + registerError(expression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SuspiciousArrayCastInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SuspiciousArrayCastInspection.java index 4cbf8accf..ff5773c2a 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SuspiciousArrayCastInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SuspiciousArrayCastInspection.java @@ -20,76 +20,74 @@ 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.Nls; /** * @author Bas Leijdekkers */ @ExtensionImpl public class SuspiciousArrayCastInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.suspiciousArrayCastDisplayName(); + } - @Nls - @Nonnull - @Override - public String getDisplayName() { - return InspectionGadgetsLocalize.suspiciousArrayCastDisplayName().get(); - } - - @Nonnull - @Override - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.suspiciousArrayCastProblemDescriptor().get(); - } + @Nonnull + @Override + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.suspiciousArrayCastProblemDescriptor().get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new SuspiciousArrayCastVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new SuspiciousArrayCastVisitor(); + } - private static class SuspiciousArrayCastVisitor extends BaseInspectionVisitor { + private static class SuspiciousArrayCastVisitor extends BaseInspectionVisitor { - @Override - public void visitTypeCastExpression(PsiTypeCastExpression expression) { - super.visitTypeCastExpression(expression); - final PsiTypeElement typeElement = expression.getCastType(); - if (typeElement == null) { - return; - } - final PsiType castType = typeElement.getType(); - if (!(castType instanceof PsiArrayType)) { - return; - } - final PsiExpression operand = expression.getOperand(); - if (operand == null) { - return; - } - final PsiType type = operand.getType(); - if (!(type instanceof PsiArrayType)) { - return; - } - final PsiType castComponentType = castType.getDeepComponentType(); - if (!(castComponentType instanceof PsiClassType)) { - return; - } - final PsiClassType castClassType = (PsiClassType)castComponentType; - final PsiClass castClass = castClassType.resolve(); - if (castClass == null) { - return; - } - final PsiType componentType = type.getDeepComponentType(); - if (!(componentType instanceof PsiClassType)) { - return; - } - final PsiClassType classType = (PsiClassType)componentType; - final PsiClass aClass = classType.resolve(); - if (aClass == null) { - return; - } - if (!castClass.isInheritor(aClass, true)) { - return; - } - registerError(typeElement); + @Override + public void visitTypeCastExpression(PsiTypeCastExpression expression) { + super.visitTypeCastExpression(expression); + final PsiTypeElement typeElement = expression.getCastType(); + if (typeElement == null) { + return; + } + final PsiType castType = typeElement.getType(); + if (!(castType instanceof PsiArrayType)) { + return; + } + final PsiExpression operand = expression.getOperand(); + if (operand == null) { + return; + } + final PsiType type = operand.getType(); + if (!(type instanceof PsiArrayType)) { + return; + } + final PsiType castComponentType = castType.getDeepComponentType(); + if (!(castComponentType instanceof PsiClassType)) { + return; + } + final PsiClassType castClassType = (PsiClassType) castComponentType; + final PsiClass castClass = castClassType.resolve(); + if (castClass == null) { + return; + } + final PsiType componentType = type.getDeepComponentType(); + if (!(componentType instanceof PsiClassType)) { + return; + } + final PsiClassType classType = (PsiClassType) componentType; + final PsiClass aClass = classType.resolve(); + if (aClass == null) { + return; + } + if (!castClass.isInheritor(aClass, true)) { + return; + } + registerError(typeElement); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SuspiciousIndentAfterControlStatementInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SuspiciousIndentAfterControlStatementInspection.java index f358d0164..43a04dfe7 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SuspiciousIndentAfterControlStatementInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SuspiciousIndentAfterControlStatementInspection.java @@ -23,166 +23,175 @@ import consulo.language.psi.PsiElement; import consulo.language.psi.PsiWhiteSpace; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl -public class SuspiciousIndentAfterControlStatementInspection - extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.suspiciousIndentAfterControlStatementDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.suspiciousIndentAfterControlStatementProblemDescriptor().get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new SuspiciousIndentAfterControlStatementVisitor(); - } - - private static class SuspiciousIndentAfterControlStatementVisitor - extends BaseInspectionVisitor { - +public class SuspiciousIndentAfterControlStatementInspection extends BaseInspection { + @Nonnull @Override - public void visitWhileStatement(PsiWhileStatement statement) { - super.visitWhileStatement(statement); - checkLoopStatement(statement); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.suspiciousIndentAfterControlStatementDisplayName(); } @Override - public void visitDoWhileStatement( - PsiDoWhileStatement statement) { - super.visitDoWhileStatement(statement); - checkLoopStatement(statement); + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.suspiciousIndentAfterControlStatementProblemDescriptor().get(); } @Override - public void visitForeachStatement( - PsiForeachStatement statement) { - super.visitForeachStatement(statement); - checkLoopStatement(statement); + public BaseInspectionVisitor buildVisitor() { + return new SuspiciousIndentAfterControlStatementVisitor(); } - @Override - public void visitForStatement(PsiForStatement statement) { - super.visitForStatement(statement); - checkLoopStatement(statement); - } + private static class SuspiciousIndentAfterControlStatementVisitor + extends BaseInspectionVisitor { - @Override - public void visitIfStatement(PsiIfStatement statement) { - super.visitIfStatement(statement); - final PsiStatement elseStatement = statement.getElseBranch(); - if (elseStatement instanceof PsiBlockStatement) { - return; - } - else if (elseStatement == null) { - final PsiStatement thenStatement = statement.getThenBranch(); - if (thenStatement instanceof PsiBlockStatement) { - return; + @Override + public void visitWhileStatement(PsiWhileStatement statement) { + super.visitWhileStatement(statement); + checkLoopStatement(statement); } - else if (thenStatement != null) { - if (!isWhitespaceSuspicious(statement, thenStatement)) { - return; - } + + @Override + public void visitDoWhileStatement( + PsiDoWhileStatement statement + ) { + super.visitDoWhileStatement(statement); + checkLoopStatement(statement); } - } - else { - if (!isWhitespaceSuspicious(statement, elseStatement)) { - return; + + @Override + public void visitForeachStatement( + PsiForeachStatement statement + ) { + super.visitForeachStatement(statement); + checkLoopStatement(statement); } - } - final PsiStatement nextStatement = - PsiTreeUtil.getNextSiblingOfType(statement, - PsiStatement.class); - if (nextStatement == null) { - return; - } - registerStatementError(nextStatement); - } - private void checkLoopStatement(PsiLoopStatement statement) { - final PsiStatement body = statement.getBody(); - if (body instanceof PsiBlockStatement || body == null) { - return; - } - if (!isWhitespaceSuspicious(statement, body)) { - return; - } - final PsiStatement nextStatement = - PsiTreeUtil.getNextSiblingOfType(statement, - PsiStatement.class); - if (nextStatement == null) { - return; - } - registerStatementError(nextStatement); - } + @Override + public void visitForStatement(PsiForStatement statement) { + super.visitForStatement(statement); + checkLoopStatement(statement); + } - private static boolean isWhitespaceSuspicious(PsiStatement statement, - PsiStatement body) { - final boolean lineBreakBeforeBody; - PsiElement prevSibling = body.getPrevSibling(); - if (!(prevSibling instanceof PsiWhiteSpace)) { - lineBreakBeforeBody = false; - prevSibling = statement.getPrevSibling(); - if (!(prevSibling instanceof PsiWhiteSpace)) { - return false; + @Override + public void visitIfStatement(PsiIfStatement statement) { + super.visitIfStatement(statement); + final PsiStatement elseStatement = statement.getElseBranch(); + if (elseStatement instanceof PsiBlockStatement) { + return; + } + else if (elseStatement == null) { + final PsiStatement thenStatement = statement.getThenBranch(); + if (thenStatement instanceof PsiBlockStatement) { + return; + } + else if (thenStatement != null) { + if (!isWhitespaceSuspicious(statement, thenStatement)) { + return; + } + } + } + else { + if (!isWhitespaceSuspicious(statement, elseStatement)) { + return; + } + } + final PsiStatement nextStatement = + PsiTreeUtil.getNextSiblingOfType( + statement, + PsiStatement.class + ); + if (nextStatement == null) { + return; + } + registerStatementError(nextStatement); } - } - else { - final String text = prevSibling.getText(); - final int lineBreakIndex = getLineBreakIndex(text); - if (lineBreakIndex < 0) { - lineBreakBeforeBody = false; - prevSibling = statement.getPrevSibling(); - if (!(prevSibling instanceof PsiWhiteSpace)) { - return false; - } + + private void checkLoopStatement(PsiLoopStatement statement) { + final PsiStatement body = statement.getBody(); + if (body instanceof PsiBlockStatement || body == null) { + return; + } + if (!isWhitespaceSuspicious(statement, body)) { + return; + } + final PsiStatement nextStatement = + PsiTreeUtil.getNextSiblingOfType( + statement, + PsiStatement.class + ); + if (nextStatement == null) { + return; + } + registerStatementError(nextStatement); } - else { - lineBreakBeforeBody = true; + + private static boolean isWhitespaceSuspicious( + PsiStatement statement, + PsiStatement body + ) { + final boolean lineBreakBeforeBody; + PsiElement prevSibling = body.getPrevSibling(); + if (!(prevSibling instanceof PsiWhiteSpace)) { + lineBreakBeforeBody = false; + prevSibling = statement.getPrevSibling(); + if (!(prevSibling instanceof PsiWhiteSpace)) { + return false; + } + } + else { + final String text = prevSibling.getText(); + final int lineBreakIndex = getLineBreakIndex(text); + if (lineBreakIndex < 0) { + lineBreakBeforeBody = false; + prevSibling = statement.getPrevSibling(); + if (!(prevSibling instanceof PsiWhiteSpace)) { + return false; + } + } + else { + lineBreakBeforeBody = true; + } + } + final PsiStatement nextStatement = + PsiTreeUtil.getNextSiblingOfType( + statement, + PsiStatement.class + ); + if (nextStatement == null) { + return false; + } + final String text = prevSibling.getText(); + final int index = getLineBreakIndex(text); + if (index < 0) { + return false; + } + final String indent = text.substring(index + 1); + final PsiElement nextSibling = nextStatement.getPrevSibling(); + if (!(nextSibling instanceof PsiWhiteSpace)) { + return false; + } + final String nextText = nextSibling.getText(); + final int nextIndex = getLineBreakIndex(nextText); + if (nextIndex < 0) { + return false; + } + final String nextIndent = nextText.substring(nextIndex + 1); + if (lineBreakBeforeBody) { + return indent.equals(nextIndent); + } + else { + return !indent.equals(nextIndent); + } } - } - final PsiStatement nextStatement = - PsiTreeUtil.getNextSiblingOfType(statement, - PsiStatement.class); - if (nextStatement == null) { - return false; - } - final String text = prevSibling.getText(); - final int index = getLineBreakIndex(text); - if (index < 0) { - return false; - } - final String indent = text.substring(index + 1); - final PsiElement nextSibling = nextStatement.getPrevSibling(); - if (!(nextSibling instanceof PsiWhiteSpace)) { - return false; - } - final String nextText = nextSibling.getText(); - final int nextIndex = getLineBreakIndex(nextText); - if (nextIndex < 0) { - return false; - } - final String nextIndent = nextText.substring(nextIndex + 1); - if (lineBreakBeforeBody) { - return indent.equals(nextIndent); - } - else { - return !indent.equals(nextIndent); - } - } - private static int getLineBreakIndex(String text) { - final int newLineIndex1 = text.lastIndexOf('\n'); - final int carriageReturnIndex1 = text.lastIndexOf('\r'); - return Math.max(newLineIndex1, carriageReturnIndex1); + private static int getLineBreakIndex(String text) { + final int newLineIndex1 = text.lastIndexOf('\n'); + final int carriageReturnIndex1 = text.lastIndexOf('\r'); + return Math.max(newLineIndex1, carriageReturnIndex1); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SuspiciousSystemArraycopyInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SuspiciousSystemArraycopyInspection.java index e64075295..25ba99f1e 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SuspiciousSystemArraycopyInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SuspiciousSystemArraycopyInspection.java @@ -27,122 +27,123 @@ @ExtensionImpl public class SuspiciousSystemArraycopyInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.suspiciousSystemArraycopyDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.suspiciousSystemArraycopyDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return (String)infos[0]; - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return (String) infos[0]; + } - @Override - public boolean isEnabledByDefault() { - return true; - } + @Override + public boolean isEnabledByDefault() { + return true; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new SuspiciousSystemArraycopyVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new SuspiciousSystemArraycopyVisitor(); + } - private static class SuspiciousSystemArraycopyVisitor - extends BaseInspectionVisitor { + private static class SuspiciousSystemArraycopyVisitor + extends BaseInspectionVisitor { - @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - @NonNls final String name = methodExpression.getReferenceName(); - if (!"arraycopy".equals(name)) { - return; - } - final PsiExpression qualifierExpression = - methodExpression.getQualifierExpression(); - if (!(qualifierExpression instanceof PsiReferenceExpression)) { - return; - } - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)qualifierExpression; - final String canonicalText = referenceExpression.getCanonicalText(); - if (!canonicalText.equals("java.lang.System")) { - return; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 5) { - return; - } - final PsiExpression src = arguments[0]; - final PsiType srcType = src.getType(); - final PsiExpression srcPos = arguments[1]; - if (isNegativeArgument(srcPos)) { - final LocalizeValue errorString = InspectionGadgetsLocalize.suspiciousSystemArraycopyProblemDescriptor1(); - registerError(srcPos, errorString.get()); - } - final PsiExpression destPos = arguments[3]; - if (isNegativeArgument(destPos)) { - final LocalizeValue errorString = InspectionGadgetsLocalize.suspiciousSystemArraycopyProblemDescriptor2(); - registerError(destPos, errorString.get()); - } - final PsiExpression length = arguments[4]; - if (isNegativeArgument(length)) { - final LocalizeValue errorString = InspectionGadgetsLocalize.suspiciousSystemArraycopyProblemDescriptor3(); - registerError(length, errorString.get()); - } - boolean notArrayReported = false; - if (!(srcType instanceof PsiArrayType)) { - final LocalizeValue errorString = InspectionGadgetsLocalize.suspiciousSystemArraycopyProblemDescriptor4(); - registerError(src, errorString.get()); - notArrayReported = true; - } - final PsiExpression dest = arguments[2]; - final PsiType destType = dest.getType(); - if (!(destType instanceof PsiArrayType)) { - final LocalizeValue errorString = InspectionGadgetsLocalize.suspiciousSystemArraycopyProblemDescriptor5(); - registerError(dest, errorString.get()); - notArrayReported = true; - } - if (notArrayReported) { - return; - } - final PsiArrayType srcArrayType = (PsiArrayType)srcType; - final PsiArrayType destArrayType = (PsiArrayType)destType; - final PsiType srcComponentType = srcArrayType.getComponentType(); - final PsiType destComponentType = destArrayType.getComponentType(); - if (!(srcComponentType instanceof PsiPrimitiveType)) { - if (!destComponentType.isAssignableFrom(srcComponentType)) { - final LocalizeValue errorString = InspectionGadgetsLocalize.suspiciousSystemArraycopyProblemDescriptor6( - srcType.getCanonicalText(), - destType.getCanonicalText() - ); - registerError(dest, errorString.get()); + @Override + public void visitMethodCallExpression( + @Nonnull PsiMethodCallExpression expression + ) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = + expression.getMethodExpression(); + @NonNls final String name = methodExpression.getReferenceName(); + if (!"arraycopy".equals(name)) { + return; + } + final PsiExpression qualifierExpression = + methodExpression.getQualifierExpression(); + if (!(qualifierExpression instanceof PsiReferenceExpression)) { + return; + } + final PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) qualifierExpression; + final String canonicalText = referenceExpression.getCanonicalText(); + if (!canonicalText.equals("java.lang.System")) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 5) { + return; + } + final PsiExpression src = arguments[0]; + final PsiType srcType = src.getType(); + final PsiExpression srcPos = arguments[1]; + if (isNegativeArgument(srcPos)) { + final LocalizeValue errorString = InspectionGadgetsLocalize.suspiciousSystemArraycopyProblemDescriptor1(); + registerError(srcPos, errorString.get()); + } + final PsiExpression destPos = arguments[3]; + if (isNegativeArgument(destPos)) { + final LocalizeValue errorString = InspectionGadgetsLocalize.suspiciousSystemArraycopyProblemDescriptor2(); + registerError(destPos, errorString.get()); + } + final PsiExpression length = arguments[4]; + if (isNegativeArgument(length)) { + final LocalizeValue errorString = InspectionGadgetsLocalize.suspiciousSystemArraycopyProblemDescriptor3(); + registerError(length, errorString.get()); + } + boolean notArrayReported = false; + if (!(srcType instanceof PsiArrayType)) { + final LocalizeValue errorString = InspectionGadgetsLocalize.suspiciousSystemArraycopyProblemDescriptor4(); + registerError(src, errorString.get()); + notArrayReported = true; + } + final PsiExpression dest = arguments[2]; + final PsiType destType = dest.getType(); + if (!(destType instanceof PsiArrayType)) { + final LocalizeValue errorString = InspectionGadgetsLocalize.suspiciousSystemArraycopyProblemDescriptor5(); + registerError(dest, errorString.get()); + notArrayReported = true; + } + if (notArrayReported) { + return; + } + final PsiArrayType srcArrayType = (PsiArrayType) srcType; + final PsiArrayType destArrayType = (PsiArrayType) destType; + final PsiType srcComponentType = srcArrayType.getComponentType(); + final PsiType destComponentType = destArrayType.getComponentType(); + if (!(srcComponentType instanceof PsiPrimitiveType)) { + if (!destComponentType.isAssignableFrom(srcComponentType)) { + final LocalizeValue errorString = InspectionGadgetsLocalize.suspiciousSystemArraycopyProblemDescriptor6( + srcType.getCanonicalText(), + destType.getCanonicalText() + ); + registerError(dest, errorString.get()); + } + } + else if (!destComponentType.equals(srcComponentType)) { + final LocalizeValue errorString = InspectionGadgetsLocalize.suspiciousSystemArraycopyProblemDescriptor6( + srcType.getCanonicalText(), + destType.getCanonicalText() + ); + registerError(dest, errorString.get()); + } } - } - else if (!destComponentType.equals(srcComponentType)) { - final LocalizeValue errorString = InspectionGadgetsLocalize.suspiciousSystemArraycopyProblemDescriptor6( - srcType.getCanonicalText(), - destType.getCanonicalText() - ); - registerError(dest, errorString.get()); - } - } - private static boolean isNegativeArgument( - @Nonnull PsiExpression argument) { - final Object constant = - ExpressionUtils.computeConstantExpression(argument); - if (!(constant instanceof Integer)) { - return false; - } - final Integer integer = (Integer)constant; - return integer.intValue() < 0; + private static boolean isNegativeArgument( + @Nonnull PsiExpression argument + ) { + final Object constant = + ExpressionUtils.computeConstantExpression(argument); + if (!(constant instanceof Integer)) { + return false; + } + final Integer integer = (Integer) constant; + return integer.intValue() < 0; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SuspiciousToArrayCallInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SuspiciousToArrayCallInspection.java index 423d5afab..023167654 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SuspiciousToArrayCallInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/SuspiciousToArrayCallInspection.java @@ -22,108 +22,110 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.PsiElement; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import org.jetbrains.annotations.NonNls; @ExtensionImpl public class SuspiciousToArrayCallInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.suspiciousToArrayCallDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.suspiciousToArrayCallDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - final PsiType type = (PsiType)infos[0]; - return InspectionGadgetsLocalize.suspiciousToArrayCallProblemDescriptor(type.getPresentableText()).get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + final PsiType type = (PsiType) infos[0]; + return InspectionGadgetsLocalize.suspiciousToArrayCallProblemDescriptor(type.getPresentableText()).get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new SuspiciousToArrayCallVisitor(); - } + @Override + public boolean isEnabledByDefault() { + return true; + } - private static class SuspiciousToArrayCallVisitor extends BaseInspectionVisitor { @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - @NonNls final String methodName = - methodExpression.getReferenceName(); - if (!"toArray".equals(methodName)) { - return; - } - final PsiExpression qualifierExpression = - methodExpression.getQualifierExpression(); - if (qualifierExpression == null) { - return; - } - final PsiType type = qualifierExpression.getType(); - if (!(type instanceof PsiClassType)) { - return; - } - final PsiClassType classType = (PsiClassType)type; - final PsiClass aClass = classType.resolve(); - if (aClass == null || - !InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_UTIL_COLLECTION)) { - return; - } - final PsiExpressionList argumentList = expression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 1) { - return; - } - final PsiExpression argument = arguments[0]; - checkCollectionAndArrayTypes(classType, argument, expression); + public BaseInspectionVisitor buildVisitor() { + return new SuspiciousToArrayCallVisitor(); } - private void checkCollectionAndArrayTypes( - @Nonnull PsiClassType collectionType, - @Nonnull PsiExpression argument, - @Nonnull PsiMethodCallExpression expression) { - final PsiType argumentType = argument.getType(); - if (!(argumentType instanceof PsiArrayType)) { - return; - } - final PsiArrayType arrayType = (PsiArrayType)argumentType; - final PsiType componentType = arrayType.getComponentType(); - final PsiElement parent = expression.getParent(); - if (parent instanceof PsiTypeCastExpression) { - final PsiTypeCastExpression castExpression = - (PsiTypeCastExpression)parent; - final PsiTypeElement castTypeElement = - castExpression.getCastType(); - if (castTypeElement == null) { - return; - } - final PsiType castType = castTypeElement.getType(); - if (!castType.equals(arrayType)) { - registerError(argument, arrayType.getComponentType()); + private static class SuspiciousToArrayCallVisitor extends BaseInspectionVisitor { + @Override + public void visitMethodCallExpression( + @Nonnull PsiMethodCallExpression expression + ) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = + expression.getMethodExpression(); + @NonNls final String methodName = + methodExpression.getReferenceName(); + if (!"toArray".equals(methodName)) { + return; + } + final PsiExpression qualifierExpression = + methodExpression.getQualifierExpression(); + if (qualifierExpression == null) { + return; + } + final PsiType type = qualifierExpression.getType(); + if (!(type instanceof PsiClassType)) { + return; + } + final PsiClassType classType = (PsiClassType) type; + final PsiClass aClass = classType.resolve(); + if (aClass == null || + !InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_UTIL_COLLECTION)) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 1) { + return; + } + final PsiExpression argument = arguments[0]; + checkCollectionAndArrayTypes(classType, argument, expression); } - } - else { - if (!collectionType.hasParameters()) { - return; - } - final PsiType[] parameters = collectionType.getParameters(); - if (parameters.length != 1) { - return; - } - final PsiType parameter = parameters[0]; - if (!componentType.isAssignableFrom(parameter)) { - registerError(argument, parameter); + + private void checkCollectionAndArrayTypes( + @Nonnull PsiClassType collectionType, + @Nonnull PsiExpression argument, + @Nonnull PsiMethodCallExpression expression + ) { + final PsiType argumentType = argument.getType(); + if (!(argumentType instanceof PsiArrayType)) { + return; + } + final PsiArrayType arrayType = (PsiArrayType) argumentType; + final PsiType componentType = arrayType.getComponentType(); + final PsiElement parent = expression.getParent(); + if (parent instanceof PsiTypeCastExpression) { + final PsiTypeCastExpression castExpression = + (PsiTypeCastExpression) parent; + final PsiTypeElement castTypeElement = + castExpression.getCastType(); + if (castTypeElement == null) { + return; + } + final PsiType castType = castTypeElement.getType(); + if (!castType.equals(arrayType)) { + registerError(argument, arrayType.getComponentType()); + } + } + else { + if (!collectionType.hasParameters()) { + return; + } + final PsiType[] parameters = collectionType.getParameters(); + if (parameters.length != 1) { + return; + } + final PsiType parameter = parameters[0]; + if (!componentType.isAssignableFrom(parameter)) { + registerError(argument, parameter); + } + } } - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/TextLabelInSwitchStatementInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/TextLabelInSwitchStatementInspection.java index a740e7f20..201cd9b9e 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/TextLabelInSwitchStatementInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/TextLabelInSwitchStatementInspection.java @@ -20,48 +20,49 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class TextLabelInSwitchStatementInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.textLabelInSwitchStatementDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.textLabelInSwitchStatementDisplayName().get(); - } - - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.textLabelInSwitchStatementProblemDescriptor().get(); - } - - public BaseInspectionVisitor buildVisitor() { - return new TextLabelInSwitchStatementVisitor(); - } + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.textLabelInSwitchStatementProblemDescriptor().get(); + } - private static class TextLabelInSwitchStatementVisitor extends BaseInspectionVisitor { - @Override - public void visitSwitchStatement( - @Nonnull PsiSwitchStatement statement) { - super.visitSwitchStatement(statement); - final PsiCodeBlock body = statement.getBody(); - if (body == null) { - return; - } - final PsiStatement[] statements = body.getStatements(); - for (PsiStatement statement1 : statements) { - checkForLabel(statement1); - } + public BaseInspectionVisitor buildVisitor() { + return new TextLabelInSwitchStatementVisitor(); } - private void checkForLabel(PsiStatement statement) { - if (!(statement instanceof PsiLabeledStatement)) { - return; - } - final PsiLabeledStatement labeledStatement = - (PsiLabeledStatement)statement; - final PsiIdentifier label = labeledStatement.getLabelIdentifier(); - registerError(label); + private static class TextLabelInSwitchStatementVisitor extends BaseInspectionVisitor { + @Override + public void visitSwitchStatement( + @Nonnull PsiSwitchStatement statement + ) { + super.visitSwitchStatement(statement); + final PsiCodeBlock body = statement.getBody(); + if (body == null) { + return; + } + final PsiStatement[] statements = body.getStatements(); + for (PsiStatement statement1 : statements) { + checkForLabel(statement1); + } + } + + private void checkForLabel(PsiStatement statement) { + if (!(statement instanceof PsiLabeledStatement)) { + return; + } + final PsiLabeledStatement labeledStatement = (PsiLabeledStatement) statement; + final PsiIdentifier label = labeledStatement.getLabelIdentifier(); + registerError(label); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/UseOfPropertiesAsHashtableInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/UseOfPropertiesAsHashtableInspection.java index ece9dd512..0d461c061 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/UseOfPropertiesAsHashtableInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/UseOfPropertiesAsHashtableInspection.java @@ -27,149 +27,150 @@ 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 UseOfPropertiesAsHashtableInspection extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.propertiesObjectAsHashtableDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.propertiesObjectAsHashtableProblemDescriptor().get(); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiMethodCallExpression methodCallExpression = - (PsiMethodCallExpression)infos[0]; - final String methodName = - methodCallExpression.getMethodExpression().getReferenceName(); - final boolean put = HardcodedMethodConstants.PUT.equals(methodName); - if (!(put || HardcodedMethodConstants.GET.equals(methodName))) { - return null; - } - final PsiExpressionList argumentList = - methodCallExpression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - for (PsiExpression argument : arguments) { - final PsiType type = argument.getType(); - if (type == null || !type.equalsToText(CommonClassNames.JAVA_LANG_STRING)) { - return null; - } - } - return new UseOfPropertiesAsHashtableFix(put); - } - - private static class UseOfPropertiesAsHashtableFix - extends InspectionGadgetsFix { - - private final boolean put; - - public UseOfPropertiesAsHashtableFix(boolean put) { - this.put = put; + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.propertiesObjectAsHashtableDisplayName(); } - @Nonnull @Override - public String getName() { - return put - ? InspectionGadgetsLocalize.propertiesObjectAsHashtableSetQuickfix().get() - : InspectionGadgetsLocalize.propertiesObjectAsHashtableGetQuickfix().get(); + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.propertiesObjectAsHashtableProblemDescriptor().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 PsiReferenceExpression methodExpression = - methodCallExpression.getMethodExpression(); - @NonNls final StringBuilder newExpression = new StringBuilder(); - final PsiExpression qualifierExpression = - methodExpression.getQualifierExpression(); - if (qualifierExpression != null) { - newExpression.append(qualifierExpression.getText()); - newExpression.append('.'); - } - if (put) { - newExpression.append("setProperty("); - } - else { - newExpression.append("getProperty("); - } - final PsiExpressionList argumentList = - methodCallExpression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - boolean first = true; - for (PsiExpression argument : arguments) { - if (!first) { - newExpression.append(','); + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiMethodCallExpression methodCallExpression = + (PsiMethodCallExpression) infos[0]; + final String methodName = + methodCallExpression.getMethodExpression().getReferenceName(); + final boolean put = HardcodedMethodConstants.PUT.equals(methodName); + if (!(put || HardcodedMethodConstants.GET.equals(methodName))) { + return null; } - else { - first = false; + final PsiExpressionList argumentList = + methodCallExpression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + for (PsiExpression argument : arguments) { + final PsiType type = argument.getType(); + if (type == null || !type.equalsToText(CommonClassNames.JAVA_LANG_STRING)) { + return null; + } } - newExpression.append(argument.getText()); - } - newExpression.append(')'); - replaceExpression(methodCallExpression, newExpression.toString()); + return new UseOfPropertiesAsHashtableFix(put); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new UseOfPropertiesAsHashtableVisitor(); - } + private static class UseOfPropertiesAsHashtableFix extends InspectionGadgetsFix { + private final boolean put; + + public UseOfPropertiesAsHashtableFix(boolean put) { + this.put = put; + } - private static class UseOfPropertiesAsHashtableVisitor - extends BaseInspectionVisitor { + @Nonnull + @Override + public LocalizeValue getName() { + return put + ? InspectionGadgetsLocalize.propertiesObjectAsHashtableSetQuickfix() + : InspectionGadgetsLocalize.propertiesObjectAsHashtableGetQuickfix(); + } + + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiElement parent = element.getParent(); + final PsiElement grandParent = parent.getParent(); + if (!(grandParent instanceof PsiMethodCallExpression)) { + return; + } + final PsiMethodCallExpression methodCallExpression = + (PsiMethodCallExpression) grandParent; + final PsiReferenceExpression methodExpression = + methodCallExpression.getMethodExpression(); + @NonNls final StringBuilder newExpression = new StringBuilder(); + final PsiExpression qualifierExpression = + methodExpression.getQualifierExpression(); + if (qualifierExpression != null) { + newExpression.append(qualifierExpression.getText()); + newExpression.append('.'); + } + if (put) { + newExpression.append("setProperty("); + } + else { + newExpression.append("getProperty("); + } + final PsiExpressionList argumentList = + methodCallExpression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + boolean first = true; + for (PsiExpression argument : arguments) { + if (!first) { + newExpression.append(','); + } + else { + first = false; + } + newExpression.append(argument.getText()); + } + newExpression.append(')'); + replaceExpression(methodCallExpression, newExpression.toString()); + } + } @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - if (!(HardcodedMethodConstants.PUT.equals(methodName) || - HardcodedMethodConstants.PUTALL.equals(methodName) || - HardcodedMethodConstants.GET.equals(methodName))) { - return; - } - final PsiMethod method = expression.resolveMethod(); - if (method == null) { - return; - } - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null) { - return; - } - if (!InheritanceUtil.isInheritor(containingClass, - "java.util.Hashtable")) { - return; - } - final PsiExpression qualifier = - methodExpression.getQualifierExpression(); - if (qualifier == null) { - return; - } - if (!TypeUtils.expressionHasTypeOrSubtype(qualifier, CommonClassNames.JAVA_UTIL_PROPERTIES)) { - return; - } - registerMethodCallError(expression, expression); + public BaseInspectionVisitor buildVisitor() { + return new UseOfPropertiesAsHashtableVisitor(); + } + + private static class UseOfPropertiesAsHashtableVisitor + extends BaseInspectionVisitor { + + @Override + public void visitMethodCallExpression( + @Nonnull PsiMethodCallExpression expression + ) { + super.visitMethodCallExpression(expression); + final PsiReferenceExpression methodExpression = + expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!(HardcodedMethodConstants.PUT.equals(methodName) || + HardcodedMethodConstants.PUTALL.equals(methodName) || + HardcodedMethodConstants.GET.equals(methodName))) { + return; + } + final PsiMethod method = expression.resolveMethod(); + if (method == null) { + return; + } + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) { + return; + } + if (!InheritanceUtil.isInheritor( + containingClass, + "java.util.Hashtable" + )) { + return; + } + final PsiExpression qualifier = + methodExpression.getQualifierExpression(); + if (qualifier == null) { + return; + } + if (!TypeUtils.expressionHasTypeOrSubtype(qualifier, CommonClassNames.JAVA_UTIL_PROPERTIES)) { + return; + } + registerMethodCallError(expression, expression); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/VariableNotUsedInsideIfInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/VariableNotUsedInsideIfInspection.java index dd37123b3..be3cdca94 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/bugs/VariableNotUsedInsideIfInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/bugs/VariableNotUsedInsideIfInspection.java @@ -24,140 +24,140 @@ import consulo.annotation.component.ExtensionImpl; import consulo.language.ast.IElementType; import consulo.language.psi.PsiElement; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.Nls; @ExtensionImpl public class VariableNotUsedInsideIfInspection extends BaseInspection { - - @Override - @Nls - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.variableNotUsedInsideIfDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.variableNotUsedInsideIfProblemDescriptor().get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new VariableNotUsedInsideIfVisitor(); - } - - private static class VariableNotUsedInsideIfVisitor - extends BaseInspectionVisitor { - + @Nonnull @Override - public void visitConditionalExpression(PsiConditionalExpression expression) { - super.visitConditionalExpression(expression); - final PsiExpression condition = expression.getCondition(); - if (!(condition instanceof PsiBinaryExpression)) { - return; - } - final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)condition; - final PsiReferenceExpression referenceExpression = extractVariableReference(binaryExpression); - if (referenceExpression == null) { - return; - } - final IElementType tokenType = binaryExpression.getOperationTokenType(); - if (tokenType == JavaTokenType.EQEQ) { - checkVariableUsage(referenceExpression, expression.getThenExpression(), expression.getElseExpression()); - } - else if (tokenType == JavaTokenType.NE) { - checkVariableUsage(referenceExpression, expression.getElseExpression(), expression.getThenExpression()); - } + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.variableNotUsedInsideIfDisplayName(); } @Override - public void visitIfStatement(PsiIfStatement statement) { - super.visitIfStatement(statement); - final PsiExpression condition = statement.getCondition(); - if (!(condition instanceof PsiBinaryExpression)) { - return; - } - final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)condition; - final PsiReferenceExpression referenceExpression = extractVariableReference(binaryExpression); - if (referenceExpression == null) { - return; - } - final IElementType tokenType = binaryExpression.getOperationTokenType(); - if (tokenType == JavaTokenType.EQEQ) { - checkVariableUsage(referenceExpression, statement.getThenBranch(), statement.getElseBranch()); - } - else if (tokenType == JavaTokenType.NE) { - checkVariableUsage(referenceExpression, statement.getElseBranch(), statement.getThenBranch()); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.variableNotUsedInsideIfProblemDescriptor().get(); } - private void checkVariableUsage(PsiReferenceExpression referenceExpression, - PsiElement thenContext, PsiElement elseContext) { - if (thenContext == null) { - return; - } - final PsiElement target = referenceExpression.resolve(); - if (!(target instanceof PsiVariable)) { - return; - } - final PsiVariable variable = (PsiVariable)target; - if (contextExits(thenContext) || VariableAccessUtils.variableIsAssigned(variable, thenContext)) { - return; - } - if (elseContext != null && - (contextExits(elseContext) || VariableAccessUtils.variableIsUsed(variable, elseContext))) { - return; - } - registerError(referenceExpression); + @Override + public BaseInspectionVisitor buildVisitor() { + return new VariableNotUsedInsideIfVisitor(); } - private static PsiReferenceExpression extractVariableReference(PsiBinaryExpression expression) { - final PsiExpression lhs = ParenthesesUtils.stripParentheses(expression.getLOperand()); - if (lhs == null) { - return null; - } - final PsiExpression rhs = ParenthesesUtils.stripParentheses(expression.getROperand()); - if (rhs == null) { - return null; - } - if (PsiType.NULL.equals(rhs.getType())) { - if (!(lhs instanceof PsiReferenceExpression)) { - return null; + private static class VariableNotUsedInsideIfVisitor + extends BaseInspectionVisitor { + + @Override + public void visitConditionalExpression(PsiConditionalExpression expression) { + super.visitConditionalExpression(expression); + final PsiExpression condition = expression.getCondition(); + if (!(condition instanceof PsiBinaryExpression)) { + return; + } + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression) condition; + final PsiReferenceExpression referenceExpression = extractVariableReference(binaryExpression); + if (referenceExpression == null) { + return; + } + final IElementType tokenType = binaryExpression.getOperationTokenType(); + if (tokenType == JavaTokenType.EQEQ) { + checkVariableUsage(referenceExpression, expression.getThenExpression(), expression.getElseExpression()); + } + else if (tokenType == JavaTokenType.NE) { + checkVariableUsage(referenceExpression, expression.getElseExpression(), expression.getThenExpression()); + } } - return (PsiReferenceExpression)lhs; - } - if (PsiType.NULL.equals(lhs.getType())) { - if (!(rhs instanceof PsiReferenceExpression)) { - return null; + + @Override + public void visitIfStatement(PsiIfStatement statement) { + super.visitIfStatement(statement); + final PsiExpression condition = statement.getCondition(); + if (!(condition instanceof PsiBinaryExpression)) { + return; + } + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression) condition; + final PsiReferenceExpression referenceExpression = extractVariableReference(binaryExpression); + if (referenceExpression == null) { + return; + } + final IElementType tokenType = binaryExpression.getOperationTokenType(); + if (tokenType == JavaTokenType.EQEQ) { + checkVariableUsage(referenceExpression, statement.getThenBranch(), statement.getElseBranch()); + } + else if (tokenType == JavaTokenType.NE) { + checkVariableUsage(referenceExpression, statement.getElseBranch(), statement.getThenBranch()); + } } - return (PsiReferenceExpression)rhs; - } - return null; - } - private static boolean contextExits(PsiElement context) { - if (context instanceof PsiBlockStatement) { - final PsiBlockStatement blockStatement = (PsiBlockStatement)context; - final PsiCodeBlock codeBlock = blockStatement.getCodeBlock(); - final PsiStatement[] statements = codeBlock.getStatements(); - if (statements.length == 0) { - return false; + private void checkVariableUsage( + PsiReferenceExpression referenceExpression, + PsiElement thenContext, PsiElement elseContext + ) { + if (thenContext == null) { + return; + } + final PsiElement target = referenceExpression.resolve(); + if (!(target instanceof PsiVariable)) { + return; + } + final PsiVariable variable = (PsiVariable) target; + if (contextExits(thenContext) || VariableAccessUtils.variableIsAssigned(variable, thenContext)) { + return; + } + if (elseContext != null && + (contextExits(elseContext) || VariableAccessUtils.variableIsUsed(variable, elseContext))) { + return; + } + registerError(referenceExpression); + } + + private static PsiReferenceExpression extractVariableReference(PsiBinaryExpression expression) { + final PsiExpression lhs = ParenthesesUtils.stripParentheses(expression.getLOperand()); + if (lhs == null) { + return null; + } + final PsiExpression rhs = ParenthesesUtils.stripParentheses(expression.getROperand()); + if (rhs == null) { + return null; + } + if (PsiType.NULL.equals(rhs.getType())) { + if (!(lhs instanceof PsiReferenceExpression)) { + return null; + } + return (PsiReferenceExpression) lhs; + } + if (PsiType.NULL.equals(lhs.getType())) { + if (!(rhs instanceof PsiReferenceExpression)) { + return null; + } + return (PsiReferenceExpression) rhs; + } + return null; } - final PsiStatement lastStatement = statements[statements.length - 1]; - return statementExits(lastStatement); - } - else { - return statementExits(context); - } - } - private static boolean statementExits(PsiElement context) { - return context instanceof PsiReturnStatement || - context instanceof PsiThrowStatement || - context instanceof PsiBreakStatement || - context instanceof PsiContinueStatement; + private static boolean contextExits(PsiElement context) { + if (context instanceof PsiBlockStatement) { + final PsiBlockStatement blockStatement = (PsiBlockStatement) context; + final PsiCodeBlock codeBlock = blockStatement.getCodeBlock(); + final PsiStatement[] statements = codeBlock.getStatements(); + if (statements.length == 0) { + return false; + } + final PsiStatement lastStatement = statements[statements.length - 1]; + return statementExits(lastStatement); + } + else { + return statementExits(context); + } + } + + private static boolean statementExits(PsiElement context) { + return context instanceof PsiReturnStatement || + context instanceof PsiThrowStatement || + context instanceof PsiBreakStatement || + context instanceof PsiContinueStatement; + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/AnonymousInnerClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/AnonymousInnerClassInspection.java index f195d38ef..49010bb3b 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/AnonymousInnerClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/AnonymousInnerClassInspection.java @@ -24,48 +24,49 @@ 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 AnonymousInnerClassInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.anonymousInnerClassDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.anonymousInnerClassDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.anonymousInnerClassProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.anonymousInnerClassProblemDescriptor().get(); + } - protected InspectionGadgetsFix buildFix(Object... infos) { - return new MoveAnonymousToInnerClassFix(); - } + protected InspectionGadgetsFix buildFix(Object... infos) { + return new MoveAnonymousToInnerClassFix(); + } - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } - public BaseInspectionVisitor buildVisitor() { - return new AnonymousInnerClassVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new AnonymousInnerClassVisitor(); + } - private static class AnonymousInnerClassVisitor - extends BaseInspectionVisitor { + private static class AnonymousInnerClassVisitor + extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - //no call to super here, to avoid double counting - } + @Override + public void visitClass(@Nonnull PsiClass aClass) { + //no call to super here, to avoid double counting + } - @Override - public void visitAnonymousClass(@Nonnull PsiAnonymousClass aClass) { - super.visitAnonymousClass(aClass); - if (aClass instanceof PsiEnumConstantInitializer) { - return; - } - registerClassError(aClass); + @Override + public void visitAnonymousClass(@Nonnull PsiAnonymousClass aClass) { + super.visitAnonymousClass(aClass); + if (aClass instanceof PsiEnumConstantInitializer) { + return; + } + registerClassError(aClass); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ClassInitializerInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ClassInitializerInspection.java index cbf9fac4e..3e28234d6 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ClassInitializerInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ClassInitializerInspection.java @@ -23,46 +23,50 @@ import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl public class ClassInitializerInspection extends BaseInspection { + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "NonStaticInitializer"; + } - @Nonnull - public String getID() { - return "NonStaticInitializer"; - } - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.classInitializerDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.classInitializerDisplayName(); + } - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.classInitializerProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.classInitializerProblemDescriptor().get(); + } - @Override - @Nullable - protected InspectionGadgetsFix buildFix(Object... infos) { - return new ChangeModifierFix(PsiModifier.STATIC); - } + @Override + @Nullable + protected InspectionGadgetsFix buildFix(Object... infos) { + return new ChangeModifierFix(PsiModifier.STATIC); + } - public BaseInspectionVisitor buildVisitor() { - return new ClassInitializerVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new ClassInitializerVisitor(); + } - private static class ClassInitializerVisitor extends BaseInspectionVisitor { + private static class ClassInitializerVisitor extends BaseInspectionVisitor { - @Override - public void visitClassInitializer(PsiClassInitializer initializer) { - super.visitClassInitializer(initializer); - if (initializer.hasModifierProperty(PsiModifier.STATIC)) { - return; - } - registerClassInitializerError(initializer); + @Override + public void visitClassInitializer(PsiClassInitializer initializer) { + super.visitClassInitializer(initializer); + if (initializer.hasModifierProperty(PsiModifier.STATIC)) { + return; + } + registerClassInitializerError(initializer); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ClassMayBeInterfaceInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ClassMayBeInterfaceInspection.java index a9d0e7854..2a156a191 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ClassMayBeInterfaceInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ClassMayBeInterfaceInspection.java @@ -28,6 +28,7 @@ import consulo.language.psi.PsiManager; import consulo.language.psi.util.PsiTreeUtil; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @@ -36,8 +37,8 @@ public class ClassMayBeInterfaceInspection extends BaseInspection { @Nonnull @Override - public String getDisplayName() { - return InspectionGadgetsLocalize.classMayBeInterfaceDisplayName().get(); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.classMayBeInterfaceDisplayName(); } @Nonnull @@ -54,15 +55,15 @@ protected InspectionGadgetsFix buildFix(Object... infos) { private static class ClassMayBeInterfaceFix extends InspectionGadgetsFix { @Nonnull @Override - public String getName() { - return InspectionGadgetsLocalize.classMayBeInterfaceConvertQuickfix().get(); + public LocalizeValue getName() { + return InspectionGadgetsLocalize.classMayBeInterfaceConvertQuickfix(); } @Override @RequiredReadAction public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiIdentifier classNameIdentifier = (PsiIdentifier)descriptor.getPsiElement(); - final PsiClass interfaceClass = (PsiClass)classNameIdentifier.getParent(); + final PsiIdentifier classNameIdentifier = (PsiIdentifier) descriptor.getPsiElement(); + final PsiClass interfaceClass = (PsiClass) classNameIdentifier.getParent(); moveSubClassExtendsToImplements(interfaceClass); changeClassToInterface(interfaceClass); moveImplementsToExtends(interfaceClass); diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ClassNameDiffersFromFileNameInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ClassNameDiffersFromFileNameInspection.java index 46157622a..61899cfdf 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ClassNameDiffersFromFileNameInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ClassNameDiffersFromFileNameInspection.java @@ -26,88 +26,74 @@ import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.PsiElement; import consulo.language.psi.PsiFile; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @ExtensionImpl -public class ClassNameDiffersFromFileNameInspection extends BaseInspection -{ +public class ClassNameDiffersFromFileNameInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.classNameDiffersFromFileNameDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() - { - return InspectionGadgetsLocalize.classNameDiffersFromFileNameDisplayName().get(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.classNameDiffersFromFileNameProblemDescriptor().get(); + } - @Override - @Nonnull - protected String buildErrorString(Object... infos) - { - return InspectionGadgetsLocalize.classNameDiffersFromFileNameProblemDescriptor().get(); - } + @Override + @Nullable + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiJavaFile file = (PsiJavaFile) infos[0]; + final String fileName = file.getName(); + final int prefixIndex = fileName.indexOf((int) '.'); + final String filenameWithoutPrefix = fileName.substring(0, prefixIndex); + final PsiClass[] classes = file.getClasses(); + for (PsiClass psiClass : classes) { + final String className = psiClass.getName(); + if (filenameWithoutPrefix.equals(className)) { + return null; + } + } + return new RenameFix(filenameWithoutPrefix); + } - @Override - @Nullable - protected InspectionGadgetsFix buildFix(Object... infos) - { - final PsiJavaFile file = (PsiJavaFile) infos[0]; - final String fileName = file.getName(); - final int prefixIndex = fileName.indexOf((int) '.'); - final String filenameWithoutPrefix = fileName.substring(0, prefixIndex); - final PsiClass[] classes = file.getClasses(); - for(PsiClass psiClass : classes) - { - final String className = psiClass.getName(); - if(filenameWithoutPrefix.equals(className)) - { - return null; - } - } - return new RenameFix(filenameWithoutPrefix); - } + @Override + public boolean shouldInspect(PsiFile file) { + return !FileTypeUtils.isInServerPageFile(file); + } - @Override - public boolean shouldInspect(PsiFile file) - { - return !FileTypeUtils.isInServerPageFile(file); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new ClassNameDiffersFromFileNameVisitor(); + } - @Override - public BaseInspectionVisitor buildVisitor() - { - return new ClassNameDiffersFromFileNameVisitor(); - } + private static class ClassNameDiffersFromFileNameVisitor extends BaseInspectionVisitor { - private static class ClassNameDiffersFromFileNameVisitor extends BaseInspectionVisitor - { - - @Override - public void visitClass(@Nonnull PsiClass aClass) - { - final PsiElement parent = aClass.getParent(); - if(!(parent instanceof PsiJavaFile)) - { - return; - } - final PsiJavaFile file = (PsiJavaFile) parent; - final String className = aClass.getName(); - if(className == null) - { - return; - } - final String fileName = file.getName(); - final int prefixIndex = fileName.indexOf((int) '.'); - if(prefixIndex < 0) - { - return; - } - final String filenameWithoutPrefix = fileName.substring(0, prefixIndex); - if(className.equals(filenameWithoutPrefix)) - { - return; - } - registerClassError(aClass, file); - } - } + @Override + public void visitClass(@Nonnull PsiClass aClass) { + final PsiElement parent = aClass.getParent(); + if (!(parent instanceof PsiJavaFile)) { + return; + } + final PsiJavaFile file = (PsiJavaFile) parent; + final String className = aClass.getName(); + if (className == null) { + return; + } + final String fileName = file.getName(); + final int prefixIndex = fileName.indexOf((int) '.'); + if (prefixIndex < 0) { + return; + } + final String filenameWithoutPrefix = fileName.substring(0, prefixIndex); + if (className.equals(filenameWithoutPrefix)) { + return; + } + registerClassError(aClass, file); + } + } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ConstantDeclaredInAbstractClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ConstantDeclaredInAbstractClassInspection.java index 81ddb234d..0ed0ff50c 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ConstantDeclaredInAbstractClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ConstantDeclaredInAbstractClassInspection.java @@ -15,58 +15,57 @@ */ package com.intellij.java.impl.ig.classlayout; -import com.siyeh.localize.InspectionGadgetsLocalize; -import jakarta.annotation.Nonnull; - import com.intellij.java.language.psi.PsiClass; import com.intellij.java.language.psi.PsiField; import com.intellij.java.language.psi.PsiModifier; -import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; +import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; +import jakarta.annotation.Nonnull; @ExtensionImpl public class ConstantDeclaredInAbstractClassInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.constantDeclaredInAbstractClassDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.constantDeclaredInAbstractClassDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.constantDeclaredInAbstractClassProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.constantDeclaredInAbstractClassProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new ConstantDeclaredInAbstractClassVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new ConstantDeclaredInAbstractClassVisitor(); + } - private static class ConstantDeclaredInAbstractClassVisitor - extends BaseInspectionVisitor { + private static class ConstantDeclaredInAbstractClassVisitor + extends BaseInspectionVisitor { - @Override - public void visitField(@Nonnull PsiField field) { - //no call to super, so we don't drill into anonymous classes - if (!field.hasModifierProperty(PsiModifier.STATIC) || - !field.hasModifierProperty(PsiModifier.PUBLIC) || - !field.hasModifierProperty(PsiModifier.FINAL)) { - return; - } - final PsiClass containingClass = field.getContainingClass(); - if (containingClass == null) { - return; - } - if (containingClass.isInterface() || - containingClass.isAnnotationType() || - containingClass.isEnum()) { - return; - } - if (!containingClass.hasModifierProperty(PsiModifier.ABSTRACT)) { - return; - } - registerFieldError(field); + @Override + public void visitField(@Nonnull PsiField field) { + //no call to super, so we don't drill into anonymous classes + if (!field.hasModifierProperty(PsiModifier.STATIC) || + !field.hasModifierProperty(PsiModifier.PUBLIC) || + !field.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + final PsiClass containingClass = field.getContainingClass(); + if (containingClass == null) { + return; + } + if (containingClass.isInterface() || + containingClass.isAnnotationType() || + containingClass.isEnum()) { + return; + } + if (!containingClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + return; + } + registerFieldError(field); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ConstantDeclaredInInterfaceInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ConstantDeclaredInInterfaceInspection.java index 4fd2dffe8..db0c4b530 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ConstantDeclaredInInterfaceInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ConstantDeclaredInInterfaceInspection.java @@ -21,40 +21,41 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class ConstantDeclaredInInterfaceInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.constantDeclaredInInterfaceDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.constantDeclaredInInterfaceDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.constantDeclaredInInterfaceProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.constantDeclaredInInterfaceProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new ConstantDeclaredInInterfaceVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new ConstantDeclaredInInterfaceVisitor(); + } - private static class ConstantDeclaredInInterfaceVisitor - extends BaseInspectionVisitor { + private static class ConstantDeclaredInInterfaceVisitor + extends BaseInspectionVisitor { - @Override - public void visitField(@Nonnull PsiField field) { - //no call to super, so we don't drill into anonymous classes - final PsiClass containingClass = field.getContainingClass(); - if (containingClass == null) { - return; - } - if (!containingClass.isInterface() && - !containingClass.isAnnotationType()) { - return; - } - registerFieldError(field); + @Override + public void visitField(@Nonnull PsiField field) { + //no call to super, so we don't drill into anonymous classes + final PsiClass containingClass = field.getContainingClass(); + if (containingClass == null) { + return; + } + if (!containingClass.isInterface() && + !containingClass.isAnnotationType()) { + return; + } + registerFieldError(field); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/EmptyClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/EmptyClassInspection.java index 6f4767f6f..bdc5b3b69 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/EmptyClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/EmptyClassInspection.java @@ -28,6 +28,7 @@ import consulo.annotation.component.ExtensionImpl; import consulo.deadCodeNotWorking.impl.CheckBox; import consulo.language.psi.PsiFile; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import org.jetbrains.annotations.NonNls; @@ -36,175 +37,176 @@ @ExtensionImpl public class EmptyClassInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public final ExternalizableStringSet ignorableAnnotations = new ExternalizableStringSet(); - @SuppressWarnings({"PublicField"}) - public final ExternalizableStringSet ignorableAnnotations = new ExternalizableStringSet(); + @SuppressWarnings({"PublicField"}) + public boolean ignoreClassWithParameterization = false; - @SuppressWarnings({"PublicField"}) - public boolean ignoreClassWithParameterization = false; + @SuppressWarnings({"PublicField"}) + public boolean ignoreThrowables = true; - @SuppressWarnings({"PublicField"}) - public boolean ignoreThrowables = true; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.emptyClassDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - final Object element = infos[0]; - if (element instanceof PsiAnonymousClass) { - return InspectionGadgetsLocalize.emptyAnonymousClassProblemDescriptor().get(); - } else if (element instanceof PsiClass) { - return InspectionGadgetsLocalize.emptyClassProblemDescriptor().get(); - } else { - return InspectionGadgetsLocalize.emptyClassFileWithoutClassProblemDescriptor().get(); + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.emptyClassDisplayName(); } - } - - @Override - public JComponent createOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final JPanel annotationsListControl = SpecialAnnotationsUtil.createSpecialAnnotationsListControl( - ignorableAnnotations, - InspectionGadgetsLocalize.ignoreIfAnnotatedBy().get() - ); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.weightx = 1.0; - constraints.weighty = 1.0; - constraints.anchor = GridBagConstraints.WEST; - constraints.fill = GridBagConstraints.BOTH; - panel.add(annotationsListControl, constraints); - constraints.gridy++; - constraints.weighty = 0.0; - constraints.fill = GridBagConstraints.HORIZONTAL; - final CheckBox checkBox1 = new CheckBox( - InspectionGadgetsLocalize.emptyClassIgnoreParameterizationOption().get(), - this, - "ignoreClassWithParameterization" - ); - panel.add(checkBox1, constraints); - constraints.gridy++; - final CheckBox checkBox2 = new CheckBox("Ignore subclasses of java.lang.Throwable", this, "ignoreThrowables"); - panel.add(checkBox2, constraints); - return panel; - } - @Nonnull - @Override - protected InspectionGadgetsFix[] buildFixes(Object... infos) { - final Object info = infos[0]; - if (!(info instanceof PsiModifierListOwner)) { - return InspectionGadgetsFix.EMPTY_ARRAY; + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + final Object element = infos[0]; + if (element instanceof PsiAnonymousClass) { + return InspectionGadgetsLocalize.emptyAnonymousClassProblemDescriptor().get(); + } + else if (element instanceof PsiClass) { + return InspectionGadgetsLocalize.emptyClassProblemDescriptor().get(); + } + else { + return InspectionGadgetsLocalize.emptyClassFileWithoutClassProblemDescriptor().get(); + } } - return AddToIgnoreIfAnnotatedByListQuickFix.build((PsiModifierListOwner) info, ignorableAnnotations); - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new EmptyClassVisitor(); - } - - private class EmptyClassVisitor extends BaseInspectionVisitor { + @Override + public JComponent createOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final JPanel annotationsListControl = SpecialAnnotationsUtil.createSpecialAnnotationsListControl( + ignorableAnnotations, + InspectionGadgetsLocalize.ignoreIfAnnotatedBy().get() + ); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.weightx = 1.0; + constraints.weighty = 1.0; + constraints.anchor = GridBagConstraints.WEST; + constraints.fill = GridBagConstraints.BOTH; + panel.add(annotationsListControl, constraints); + constraints.gridy++; + constraints.weighty = 0.0; + constraints.fill = GridBagConstraints.HORIZONTAL; + final CheckBox checkBox1 = new CheckBox( + InspectionGadgetsLocalize.emptyClassIgnoreParameterizationOption().get(), + this, + "ignoreClassWithParameterization" + ); + panel.add(checkBox1, constraints); + constraints.gridy++; + final CheckBox checkBox2 = new CheckBox("Ignore subclasses of java.lang.Throwable", this, "ignoreThrowables"); + panel.add(checkBox2, constraints); + return panel; + } + @Nonnull @Override - public void visitFile(PsiFile file) { - if (!(file instanceof PsiJavaFile)) { - return; - } - final PsiJavaFile javaFile = (PsiJavaFile) file; - if (javaFile.getClasses().length != 0) { - return; - } - @NonNls final String fileName = javaFile.getName(); - if ("package-info.java".equals(fileName)) { - return; - } - registerError(file, file); + protected InspectionGadgetsFix[] buildFixes(Object... infos) { + final Object info = infos[0]; + if (!(info instanceof PsiModifierListOwner)) { + return InspectionGadgetsFix.EMPTY_ARRAY; + } + return AddToIgnoreIfAnnotatedByListQuickFix.build((PsiModifierListOwner) info, ignorableAnnotations); } @Override - public void visitClass(@Nonnull PsiClass aClass) { - //don't call super, to prevent drilldown + public BaseInspectionVisitor buildVisitor() { + return new EmptyClassVisitor(); + } + + private class EmptyClassVisitor extends BaseInspectionVisitor { + + @Override + public void visitFile(PsiFile file) { + if (!(file instanceof PsiJavaFile)) { + return; + } + final PsiJavaFile javaFile = (PsiJavaFile) file; + if (javaFile.getClasses().length != 0) { + return; + } + @NonNls final String fileName = javaFile.getName(); + if ("package-info.java".equals(fileName)) { + return; + } + registerError(file, file); + } + + @Override + public void visitClass(@Nonnull PsiClass aClass) { + //don't call super, to prevent drilldown /* if (JspPsiUtil.isInJspFile(aClass.getContainingFile())) { return; } */ - if (aClass.isInterface() || aClass.isEnum() || aClass.isAnnotationType()) { - return; - } - if (aClass instanceof PsiTypeParameter) { - return; - } - final PsiMethod[] constructors = aClass.getConstructors(); - if (constructors.length > 0) { - return; - } - final PsiMethod[] methods = aClass.getMethods(); - if (methods.length > 0) { - return; - } - final PsiField[] fields = aClass.getFields(); - if (fields.length > 0) { - return; - } - final PsiClassInitializer[] initializers = aClass.getInitializers(); - if (initializers.length > 0) { - return; - } - if (ignoreClassWithParameterization && isSuperParametrization(aClass)) { - return; - } - if (AnnotationUtil.isAnnotated(aClass, ignorableAnnotations)) { - return; - } - if (ignoreThrowables && InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_THROWABLE)) { - return; - } - registerClassError(aClass, aClass); - } - - private boolean hasTypeArguments(PsiReferenceList extendsList) { - if (extendsList == null) { - return false; - } - final PsiJavaCodeReferenceElement[] referenceElements = extendsList.getReferenceElements(); - for (PsiJavaCodeReferenceElement referenceElement : referenceElements) { - final PsiReferenceParameterList parameterList = referenceElement.getParameterList(); - if (parameterList == null) { - continue; + if (aClass.isInterface() || aClass.isEnum() || aClass.isAnnotationType()) { + return; + } + if (aClass instanceof PsiTypeParameter) { + return; + } + final PsiMethod[] constructors = aClass.getConstructors(); + if (constructors.length > 0) { + return; + } + final PsiMethod[] methods = aClass.getMethods(); + if (methods.length > 0) { + return; + } + final PsiField[] fields = aClass.getFields(); + if (fields.length > 0) { + return; + } + final PsiClassInitializer[] initializers = aClass.getInitializers(); + if (initializers.length > 0) { + return; + } + if (ignoreClassWithParameterization && isSuperParametrization(aClass)) { + return; + } + if (AnnotationUtil.isAnnotated(aClass, ignorableAnnotations)) { + return; + } + if (ignoreThrowables && InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_THROWABLE)) { + return; + } + registerClassError(aClass, aClass); } - final PsiType[] typeArguments = parameterList.getTypeArguments(); - if (typeArguments.length != 0) { - return true; + + private boolean hasTypeArguments(PsiReferenceList extendsList) { + if (extendsList == null) { + return false; + } + final PsiJavaCodeReferenceElement[] referenceElements = extendsList.getReferenceElements(); + for (PsiJavaCodeReferenceElement referenceElement : referenceElements) { + final PsiReferenceParameterList parameterList = referenceElement.getParameterList(); + if (parameterList == null) { + continue; + } + final PsiType[] typeArguments = parameterList.getTypeArguments(); + if (typeArguments.length != 0) { + return true; + } + } + return false; } - } - return false; - } - private boolean isSuperParametrization(PsiClass aClass) { - if (!(aClass instanceof PsiAnonymousClass)) { - final PsiReferenceList extendsList = aClass.getExtendsList(); - final PsiReferenceList implementsList = aClass.getImplementsList(); - return hasTypeArguments(extendsList) || hasTypeArguments(implementsList); - } - final PsiAnonymousClass anonymousClass = (PsiAnonymousClass) aClass; - final PsiJavaCodeReferenceElement reference = anonymousClass.getBaseClassReference(); - final PsiReferenceParameterList parameterList = reference.getParameterList(); - if (parameterList == null) { - return false; - } - final PsiTypeElement[] elements = parameterList.getTypeParameterElements(); - for (PsiTypeElement element : elements) { - if (element != null) { - return true; + private boolean isSuperParametrization(PsiClass aClass) { + if (!(aClass instanceof PsiAnonymousClass)) { + final PsiReferenceList extendsList = aClass.getExtendsList(); + final PsiReferenceList implementsList = aClass.getImplementsList(); + return hasTypeArguments(extendsList) || hasTypeArguments(implementsList); + } + final PsiAnonymousClass anonymousClass = (PsiAnonymousClass) aClass; + final PsiJavaCodeReferenceElement reference = anonymousClass.getBaseClassReference(); + final PsiReferenceParameterList parameterList = reference.getParameterList(); + if (parameterList == null) { + return false; + } + final PsiTypeElement[] elements = parameterList.getTypeParameterElements(); + for (PsiTypeElement element : elements) { + if (element != null) { + return true; + } + } + return false; } - } - return false; } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalClassInspection.java index 36f89769f..2d9b433b8 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalClassInspection.java @@ -23,43 +23,43 @@ import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class FinalClassInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.finalClassDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.finalClassDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.finalClassProblemDescriptor().get(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.finalClassProblemDescriptor().get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new FinalStaticClassVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new FinalStaticClassVisitor(); + } - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new RemoveModifierFix((String)infos[0]); - } + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + return new RemoveModifierFix((String) infos[0]); + } - private static class FinalStaticClassVisitor - extends BaseInspectionVisitor { + private static class FinalStaticClassVisitor + extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - //no call to super, so we don't drill into inner classes - if (!aClass.hasModifierProperty(PsiModifier.FINAL)) { - return; - } - registerModifierError(PsiModifier.FINAL, aClass, PsiModifier.FINAL); + @Override + public void visitClass(@Nonnull PsiClass aClass) { + //no call to super, so we don't drill into inner classes + if (!aClass.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + registerModifierError(PsiModifier.FINAL, aClass, PsiModifier.FINAL); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalMethodInFinalClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalMethodInFinalClassInspection.java index 30c336ea7..a36bcdf73 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalMethodInFinalClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalMethodInFinalClassInspection.java @@ -24,49 +24,49 @@ 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 FinalMethodInFinalClassInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.finalMethodInFinalClassDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.finalMethodInFinalClassDisplayName().get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new FinalMethodInFinalClassVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new FinalMethodInFinalClassVisitor(); + } - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.finalMethodInFinalClassProblemDescriptor().get(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.finalMethodInFinalClassProblemDescriptor().get(); + } - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new RemoveModifierFix((String)infos[0]); - } + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + return new RemoveModifierFix((String) infos[0]); + } - private static class FinalMethodInFinalClassVisitor - extends BaseInspectionVisitor { + private static class FinalMethodInFinalClassVisitor + extends BaseInspectionVisitor { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - if (!method.hasModifierProperty(PsiModifier.FINAL)) { - return; - } - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null || containingClass.isEnum()) { - return; - } - if (!containingClass.hasModifierProperty(PsiModifier.FINAL)) { - return; - } - registerModifierError(PsiModifier.FINAL, method, PsiModifier.FINAL); + @Override + public void visitMethod(@Nonnull PsiMethod method) { + if (!method.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null || containingClass.isEnum()) { + return; + } + if (!containingClass.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + registerModifierError(PsiModifier.FINAL, method, PsiModifier.FINAL); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalMethodInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalMethodInspection.java index 9d1459b58..e25b76799 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalMethodInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalMethodInspection.java @@ -23,37 +23,38 @@ 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 FinalMethodInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.finalMethodDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.finalMethodDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.finalMethodProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.finalMethodProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new FinalMethodVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new FinalMethodVisitor(); + } - public InspectionGadgetsFix buildFix(Object... infos) { - return new RemoveModifierFix((String)infos[0]); - } + public InspectionGadgetsFix buildFix(Object... infos) { + return new RemoveModifierFix((String) infos[0]); + } - private static class FinalMethodVisitor extends BaseInspectionVisitor { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - //no call to super, so we don't drill into anonymous classes - if (!method.hasModifierProperty(PsiModifier.FINAL)) { - return; - } - registerModifierError(PsiModifier.FINAL, method, PsiModifier.FINAL); + private static class FinalMethodVisitor extends BaseInspectionVisitor { + @Override + public void visitMethod(@Nonnull PsiMethod method) { + //no call to super, so we don't drill into anonymous classes + if (!method.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + registerModifierError(PsiModifier.FINAL, method, PsiModifier.FINAL); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalPrivateMethodInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalPrivateMethodInspection.java index 3c74598af..5d70ec68c 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalPrivateMethodInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalPrivateMethodInspection.java @@ -25,52 +25,52 @@ 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 FinalPrivateMethodInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.finalPrivateMethodDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.finalPrivateMethodDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.finalPrivateMethodProblemDescriptor().get(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.finalPrivateMethodProblemDescriptor().get(); + } - @Override - public boolean isEnabledByDefault() { - return true; - } + @Override + public boolean isEnabledByDefault() { + return true; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new FinalPrivateMethodVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new FinalPrivateMethodVisitor(); + } - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new RemoveModifierFix((String)infos[0]); - } + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + return new RemoveModifierFix((String) infos[0]); + } - private static class FinalPrivateMethodVisitor - extends BaseInspectionVisitor { + private static class FinalPrivateMethodVisitor + extends BaseInspectionVisitor { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - //no call to super, so we don't drill into anonymous classes - if (!method.hasModifierProperty(PsiModifier.FINAL) - || !method.hasModifierProperty(PsiModifier.PRIVATE)) { - return; - } - if (AnnotationUtil.isAnnotated(method, CommonClassNames.JAVA_LANG_SAFE_VARARGS, false) && method.isVarArgs()) { - return; - } - registerModifierError(PsiModifier.FINAL, method, PsiModifier.FINAL); + @Override + public void visitMethod(@Nonnull PsiMethod method) { + //no call to super, so we don't drill into anonymous classes + if (!method.hasModifierProperty(PsiModifier.FINAL) + || !method.hasModifierProperty(PsiModifier.PRIVATE)) { + return; + } + if (AnnotationUtil.isAnnotated(method, CommonClassNames.JAVA_LANG_SAFE_VARARGS, false) && method.isVarArgs()) { + return; + } + registerModifierError(PsiModifier.FINAL, method, PsiModifier.FINAL); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalStaticMethodInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalStaticMethodInspection.java index fa2fba526..66e70ef01 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalStaticMethodInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/FinalStaticMethodInspection.java @@ -23,44 +23,45 @@ 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 FinalStaticMethodInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.finalStaticMethodDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.finalStaticMethodDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.finalStaticMethodProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.finalStaticMethodProblemDescriptor().get(); + } - public boolean isEnabledByDefault() { - return true; - } + public boolean isEnabledByDefault() { + return true; + } - public BaseInspectionVisitor buildVisitor() { - return new FinalStaticMethodVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new FinalStaticMethodVisitor(); + } - public InspectionGadgetsFix buildFix(Object... infos) { - return new RemoveModifierFix((String)infos[0]); - } + public InspectionGadgetsFix buildFix(Object... infos) { + return new RemoveModifierFix((String) infos[0]); + } - private static class FinalStaticMethodVisitor - extends BaseInspectionVisitor { + private static class FinalStaticMethodVisitor + extends BaseInspectionVisitor { - @Override - public void visitMethod(@Nonnull PsiMethod method) { - //no call to super, so we don't drill into anonymous classes - if (!method.hasModifierProperty(PsiModifier.FINAL) - || !method.hasModifierProperty(PsiModifier.STATIC)) { - return; - } - registerModifierError(PsiModifier.FINAL, method, PsiModifier.FINAL); + @Override + public void visitMethod(@Nonnull PsiMethod method) { + //no call to super, so we don't drill into anonymous classes + if (!method.hasModifierProperty(PsiModifier.FINAL) + || !method.hasModifierProperty(PsiModifier.STATIC)) { + return; + } + registerModifierError(PsiModifier.FINAL, method, PsiModifier.FINAL); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/InnerClassOnInterfaceInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/InnerClassOnInterfaceInspection.java index 5c0682ca2..3e46ddf15 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/InnerClassOnInterfaceInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/InnerClassOnInterfaceInspection.java @@ -15,92 +15,94 @@ */ package com.intellij.java.impl.ig.classlayout; +import com.intellij.java.impl.ig.fixes.MoveClassFix; import com.intellij.java.language.psi.PsiAnonymousClass; import com.intellij.java.language.psi.PsiClass; import com.intellij.java.language.psi.PsiTypeParameter; -import com.siyeh.localize.InspectionGadgetsLocalize; -import consulo.annotation.component.ExtensionImpl; -import consulo.deadCodeNotWorking.impl.SingleCheckboxOptionsPanel; -import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; -import com.intellij.java.impl.ig.fixes.MoveClassFix; +import com.siyeh.localize.InspectionGadgetsLocalize; +import consulo.annotation.component.ExtensionImpl; +import consulo.deadCodeNotWorking.impl.SingleCheckboxOptionsPanel; import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; @ExtensionImpl public class InnerClassOnInterfaceInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean m_ignoreInnerInterfaces = false; - /** - * @noinspection PublicField - */ - public boolean m_ignoreInnerInterfaces = false; - - @Nonnull - public String getID() { - return "InnerClassOfInterface"; - } + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "InnerClassOfInterface"; + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.innerClassOnInterfaceDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.innerClassOnInterfaceDisplayName(); + } - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.innerClassOnInterfaceIgnoreOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "m_ignoreInnerInterfaces"); - } + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.innerClassOnInterfaceIgnoreOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "m_ignoreInnerInterfaces"); + } - @Nonnull - public String buildErrorString(Object... infos) { - final PsiClass parentInterface = (PsiClass)infos[0]; - final String interfaceName = parentInterface.getName(); - return InspectionGadgetsLocalize.innerClassOnInterfaceProblemDescriptor(interfaceName).get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + final PsiClass parentInterface = (PsiClass) infos[0]; + final String interfaceName = parentInterface.getName(); + return InspectionGadgetsLocalize.innerClassOnInterfaceProblemDescriptor(interfaceName).get(); + } - protected InspectionGadgetsFix buildFix(Object... infos) { - return new MoveClassFix(); - } + protected InspectionGadgetsFix buildFix(Object... infos) { + return new MoveClassFix(); + } - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } - public BaseInspectionVisitor buildVisitor() { - return new InnerClassOnInterfaceVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new InnerClassOnInterfaceVisitor(); + } - private class InnerClassOnInterfaceVisitor extends BaseInspectionVisitor { + private class InnerClassOnInterfaceVisitor extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - // no call to super, so that it doesn't drill down to inner classes - if (!aClass.isInterface() || aClass.isAnnotationType()) { - return; - } - final PsiClass[] innerClasses = aClass.getInnerClasses(); - for (final PsiClass innerClass : innerClasses) { - if (isInnerClass(innerClass)) { - registerClassError(innerClass, aClass); + @Override + public void visitClass(@Nonnull PsiClass aClass) { + // no call to super, so that it doesn't drill down to inner classes + if (!aClass.isInterface() || aClass.isAnnotationType()) { + return; + } + final PsiClass[] innerClasses = aClass.getInnerClasses(); + for (final PsiClass innerClass : innerClasses) { + if (isInnerClass(innerClass)) { + registerClassError(innerClass, aClass); + } + } } - } - } - private boolean isInnerClass(PsiClass innerClass) { - if (innerClass.isEnum()) { - return false; - } - if (innerClass.isAnnotationType()) { - return false; - } - if (innerClass instanceof PsiTypeParameter || - innerClass instanceof PsiAnonymousClass) { - return false; - } - return !(innerClass.isInterface() && m_ignoreInnerInterfaces); + private boolean isInnerClass(PsiClass innerClass) { + if (innerClass.isEnum()) { + return false; + } + if (innerClass.isAnnotationType()) { + return false; + } + if (innerClass instanceof PsiTypeParameter || + innerClass instanceof PsiAnonymousClass) { + return false; + } + return !(innerClass.isInterface() && m_ignoreInnerInterfaces); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/LimitedScopeInnerClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/LimitedScopeInnerClassInspection.java index b90c44aac..0b3e8db66 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/LimitedScopeInnerClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/LimitedScopeInnerClassInspection.java @@ -23,41 +23,42 @@ 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 LimitedScopeInnerClassInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.limitedScopeInnerClassDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.limitedScopeInnerClassDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.limitedScopeInnerClassProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.limitedScopeInnerClassProblemDescriptor().get(); + } - protected InspectionGadgetsFix buildFix(Object... infos) { - return new MoveClassFix(); - } + protected InspectionGadgetsFix buildFix(Object... infos) { + return new MoveClassFix(); + } - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } - public BaseInspectionVisitor buildVisitor() { - return new LimitedScopeInnerClassVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new LimitedScopeInnerClassVisitor(); + } - private static class LimitedScopeInnerClassVisitor - extends BaseInspectionVisitor { + private static class LimitedScopeInnerClassVisitor + extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - if (aClass.getParent() instanceof PsiDeclarationStatement) { - registerClassError(aClass); - } + @Override + public void visitClass(@Nonnull PsiClass aClass) { + if (aClass.getParent() instanceof PsiDeclarationStatement) { + registerClassError(aClass); + } + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ListenerMayUseAdapterInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ListenerMayUseAdapterInspection.java index af0143437..157281e47 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ListenerMayUseAdapterInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/ListenerMayUseAdapterInspection.java @@ -31,206 +31,207 @@ import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; -import org.jetbrains.annotations.Nls; import javax.swing.*; @ExtensionImpl public class ListenerMayUseAdapterInspection extends BaseInspection { + public boolean checkForEmptyMethods = true; - public boolean checkForEmptyMethods = true; - - @Override - @Nls - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.listenerMayUseAdapterDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - final PsiClass aClass = (PsiClass)infos[0]; - final String className = aClass.getName(); - final PsiClass adapterClass = (PsiClass)infos[1]; - final String adapterName = adapterClass.getName(); - return InspectionGadgetsLocalize.listenerMayUseAdapterProblemDescriptor(className, adapterName).get(); - } - - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.listenerMayUseAdapterEmtpyMethodsOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "checkForEmptyMethods"); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiClass adapterClass = (PsiClass)infos[1]; - return new ListenerMayUseAdapterFix(adapterClass); - } - - private static class ListenerMayUseAdapterFix extends InspectionGadgetsFix { - - private final PsiClass adapterClass; - - ListenerMayUseAdapterFix(@Nonnull PsiClass adapterClass) { - this.adapterClass = adapterClass; + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.listenerMayUseAdapterDisplayName(); } + @Override @Nonnull - @RequiredReadAction - public String getName() { - return InspectionGadgetsLocalize.listenerMayUseAdapterQuickfix(adapterClass.getName()).get(); + protected String buildErrorString(Object... infos) { + final PsiClass aClass = (PsiClass) infos[0]; + final String className = aClass.getName(); + final PsiClass adapterClass = (PsiClass) infos[1]; + final String adapterName = adapterClass.getName(); + return InspectionGadgetsLocalize.listenerMayUseAdapterProblemDescriptor(className, adapterName).get(); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiJavaCodeReferenceElement element = (PsiJavaCodeReferenceElement)descriptor.getPsiElement(); - final PsiClass aClass = PsiTreeUtil.getParentOfType(element, PsiClass.class); - if (aClass == null) { - return; - } - final PsiReferenceList extendsList = aClass.getExtendsList(); - if (extendsList == null) { - return; - } - final PsiMethod[] methods = aClass.getMethods(); - if (methods.length > 0) { - final PsiElement target = element.resolve(); - if (!(target instanceof PsiClass)) { - return; - } - final PsiClass interfaceClass = (PsiClass)target; - for (PsiMethod method : methods) { - final PsiCodeBlock body = method.getBody(); - if (body == null) { - continue; - } - final PsiStatement[] statements = body.getStatements(); - if (statements.length != 0) { - continue; - } - final PsiMethod[] superMethods = method.findSuperMethods( - interfaceClass); - if (superMethods.length > 0) { - method.delete(); - } - } - } - element.delete(); - final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); - final PsiElementFactory elementFactory = - psiFacade.getElementFactory(); - final PsiJavaCodeReferenceElement referenceElement = - elementFactory.createClassReferenceElement(adapterClass); - extendsList.add(referenceElement); + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.listenerMayUseAdapterEmtpyMethodsOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "checkForEmptyMethods"); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new ListenerMayUseAdapterVisitor(); - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiClass adapterClass = (PsiClass) infos[1]; + return new ListenerMayUseAdapterFix(adapterClass); + } + + private static class ListenerMayUseAdapterFix extends InspectionGadgetsFix { + private final PsiClass adapterClass; - private class ListenerMayUseAdapterVisitor extends BaseInspectionVisitor { + ListenerMayUseAdapterFix(@Nonnull PsiClass adapterClass) { + this.adapterClass = adapterClass; + } + + @Nonnull + @RequiredReadAction + public LocalizeValue getName() { + return InspectionGadgetsLocalize.listenerMayUseAdapterQuickfix(adapterClass.getName()); + } + + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiJavaCodeReferenceElement element = (PsiJavaCodeReferenceElement) descriptor.getPsiElement(); + final PsiClass aClass = PsiTreeUtil.getParentOfType(element, PsiClass.class); + if (aClass == null) { + return; + } + final PsiReferenceList extendsList = aClass.getExtendsList(); + if (extendsList == null) { + return; + } + final PsiMethod[] methods = aClass.getMethods(); + if (methods.length > 0) { + final PsiElement target = element.resolve(); + if (!(target instanceof PsiClass)) { + return; + } + final PsiClass interfaceClass = (PsiClass) target; + for (PsiMethod method : methods) { + final PsiCodeBlock body = method.getBody(); + if (body == null) { + continue; + } + final PsiStatement[] statements = body.getStatements(); + if (statements.length != 0) { + continue; + } + final PsiMethod[] superMethods = method.findSuperMethods( + interfaceClass); + if (superMethods.length > 0) { + method.delete(); + } + } + } + element.delete(); + final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); + final PsiElementFactory elementFactory = + psiFacade.getElementFactory(); + final PsiJavaCodeReferenceElement referenceElement = + elementFactory.createClassReferenceElement(adapterClass); + extendsList.add(referenceElement); + } + } @Override - public void visitClass(PsiClass aClass) { - final PsiReferenceList extendsList = aClass.getExtendsList(); - if (extendsList == null) { - return; - } - final PsiJavaCodeReferenceElement[] extendsReferences = - extendsList.getReferenceElements(); - if (extendsReferences.length > 0) { - return; - } - final PsiReferenceList implementsList = aClass.getImplementsList(); - if (implementsList == null) { - return; - } - final PsiJavaCodeReferenceElement[] implementsReferences = - implementsList.getReferenceElements(); - for (PsiJavaCodeReferenceElement implementsReference : - implementsReferences) { - checkReference(aClass, implementsReference); - } + public BaseInspectionVisitor buildVisitor() { + return new ListenerMayUseAdapterVisitor(); } - private void checkReference( - @Nonnull PsiClass aClass, - @Nonnull PsiJavaCodeReferenceElement implementsReference) { - final PsiElement target = implementsReference.resolve(); - if (!(target instanceof PsiClass)) { - return; - } - final PsiClass implementsClass = (PsiClass)target; - final String className = implementsClass.getQualifiedName(); - if (className == null || !className.endsWith("Listener")) { - return; - } - final String adapterName = className.substring(0, - className.length() - 8) + "Adapter"; - final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance( - aClass.getProject()); - final GlobalSearchScope scope = - implementsClass.getResolveScope(); - final PsiClass adapterClass = psiFacade.findClass(adapterName, - scope); - if (adapterClass == null) { - return; - } - if (aClass.equals(adapterClass)) { - return; - } - if (!adapterClass.hasModifierProperty(PsiModifier.ABSTRACT)) { - return; - } - final PsiReferenceList implementsList = - adapterClass.getImplementsList(); - if (implementsList == null) { - return; - } - final PsiJavaCodeReferenceElement[] referenceElements = - implementsList.getReferenceElements(); - boolean adapterImplementsListener = false; - for (PsiJavaCodeReferenceElement referenceElement : - referenceElements) { - final PsiElement implementsTarget = referenceElement.resolve(); - if (!implementsClass.equals(implementsTarget)) { - continue; + private class ListenerMayUseAdapterVisitor extends BaseInspectionVisitor { + + @Override + public void visitClass(PsiClass aClass) { + final PsiReferenceList extendsList = aClass.getExtendsList(); + if (extendsList == null) { + return; + } + final PsiJavaCodeReferenceElement[] extendsReferences = + extendsList.getReferenceElements(); + if (extendsReferences.length > 0) { + return; + } + final PsiReferenceList implementsList = aClass.getImplementsList(); + if (implementsList == null) { + return; + } + final PsiJavaCodeReferenceElement[] implementsReferences = + implementsList.getReferenceElements(); + for (PsiJavaCodeReferenceElement implementsReference : + implementsReferences) { + checkReference(aClass, implementsReference); + } } - adapterImplementsListener = true; - } - if (!adapterImplementsListener) { - return; - } - if (checkForEmptyMethods) { - boolean emptyMethodFound = false; - final PsiMethod[] methods = aClass.getMethods(); - for (PsiMethod method : methods) { - final PsiCodeBlock body = method.getBody(); - if (body == null) { - continue; - } - final PsiStatement[] statements = body.getStatements(); - if (statements.length != 0) { - continue; - } - final PsiMethod[] superMethods = - method.findSuperMethods(implementsClass); - if (superMethods.length == 0) { - continue; - } - emptyMethodFound = true; - break; - } - if (!emptyMethodFound) { - return; + + private void checkReference( + @Nonnull PsiClass aClass, + @Nonnull PsiJavaCodeReferenceElement implementsReference + ) { + final PsiElement target = implementsReference.resolve(); + if (!(target instanceof PsiClass)) { + return; + } + final PsiClass implementsClass = (PsiClass) target; + final String className = implementsClass.getQualifiedName(); + if (className == null || !className.endsWith("Listener")) { + return; + } + final String adapterName = className.substring( + 0, + className.length() - 8 + ) + "Adapter"; + final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance( + aClass.getProject()); + final GlobalSearchScope scope = + implementsClass.getResolveScope(); + final PsiClass adapterClass = psiFacade.findClass( + adapterName, + scope + ); + if (adapterClass == null) { + return; + } + if (aClass.equals(adapterClass)) { + return; + } + if (!adapterClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + return; + } + final PsiReferenceList implementsList = + adapterClass.getImplementsList(); + if (implementsList == null) { + return; + } + final PsiJavaCodeReferenceElement[] referenceElements = + implementsList.getReferenceElements(); + boolean adapterImplementsListener = false; + for (PsiJavaCodeReferenceElement referenceElement : + referenceElements) { + final PsiElement implementsTarget = referenceElement.resolve(); + if (!implementsClass.equals(implementsTarget)) { + continue; + } + adapterImplementsListener = true; + } + if (!adapterImplementsListener) { + return; + } + if (checkForEmptyMethods) { + boolean emptyMethodFound = false; + final PsiMethod[] methods = aClass.getMethods(); + for (PsiMethod method : methods) { + final PsiCodeBlock body = method.getBody(); + if (body == null) { + continue; + } + final PsiStatement[] statements = body.getStatements(); + if (statements.length != 0) { + continue; + } + final PsiMethod[] superMethods = + method.findSuperMethods(implementsClass); + if (superMethods.length == 0) { + continue; + } + emptyMethodFound = true; + break; + } + if (!emptyMethodFound) { + return; + } + } + registerError(implementsReference, aClass, adapterClass); } - } - registerError(implementsReference, aClass, adapterClass); } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/MarkerInterfaceInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/MarkerInterfaceInspection.java index 7910ee3f6..bbb4aabd2 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/MarkerInterfaceInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/MarkerInterfaceInspection.java @@ -20,61 +20,61 @@ 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 MarkerInterfaceInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.markerInterfaceDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.markerInterfaceDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.markerInterfaceProblemDescriptor().get(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.markerInterfaceProblemDescriptor().get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new MarkerInterfaceVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new MarkerInterfaceVisitor(); + } - private static class MarkerInterfaceVisitor extends BaseInspectionVisitor { + private static class MarkerInterfaceVisitor extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - if (!aClass.isInterface() || aClass.isAnnotationType()) { - return; - } - final PsiField[] fields = aClass.getFields(); - if (fields.length != 0) { - return; - } - final PsiMethod[] methods = aClass.getMethods(); - if (methods.length != 0) { - return; - } - final PsiReferenceList extendsList = aClass.getExtendsList(); - if (extendsList != null) { - final PsiJavaCodeReferenceElement[] referenceElements = extendsList.getReferenceElements(); - if (referenceElements.length > 0) { - if (referenceElements.length > 1) { - return; - } - final PsiReferenceParameterList parameterList = referenceElements[0].getParameterList(); - if (parameterList == null) { - return; - } - final PsiTypeElement[] typeParameterElements = parameterList.getTypeParameterElements(); - if (typeParameterElements.length != 0) { - return; - } + @Override + public void visitClass(@Nonnull PsiClass aClass) { + if (!aClass.isInterface() || aClass.isAnnotationType()) { + return; + } + final PsiField[] fields = aClass.getFields(); + if (fields.length != 0) { + return; + } + final PsiMethod[] methods = aClass.getMethods(); + if (methods.length != 0) { + return; + } + final PsiReferenceList extendsList = aClass.getExtendsList(); + if (extendsList != null) { + final PsiJavaCodeReferenceElement[] referenceElements = extendsList.getReferenceElements(); + if (referenceElements.length > 0) { + if (referenceElements.length > 1) { + return; + } + final PsiReferenceParameterList parameterList = referenceElements[0].getParameterList(); + if (parameterList == null) { + return; + } + final PsiTypeElement[] typeParameterElements = parameterList.getTypeParameterElements(); + if (typeParameterElements.length != 0) { + return; + } + } + } + registerClassError(aClass); } - } - registerClassError(aClass); } - } } \ No newline at end of file