diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/LoopWithImplicitTerminationConditionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/LoopWithImplicitTerminationConditionInspection.java index bffeab72d3..dd17974892 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/LoopWithImplicitTerminationConditionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/LoopWithImplicitTerminationConditionInspection.java @@ -26,262 +26,264 @@ import consulo.language.psi.PsiElement; import consulo.language.psi.PsiWhiteSpace; 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 LoopWithImplicitTerminationConditionInspection - extends BaseInspection { - - @Nls - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.loopWithImplicitTerminationConditionDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return Boolean.TRUE.equals(infos[0]) - ? InspectionGadgetsLocalize.loopWithImplicitTerminationConditionDowhileProblemDescriptor().get() - : InspectionGadgetsLocalize.loopWithImplicitTerminationConditionProblemDescriptor().get(); - } - - @Nullable - protected InspectionGadgetsFix buildFix(Object... infos) { - return new LoopWithImplicitTerminationConditionFix(); - } - - private static class LoopWithImplicitTerminationConditionFix - extends InspectionGadgetsFix { - +public class LoopWithImplicitTerminationConditionInspection extends BaseInspection { @Nonnull - public String getName() { - return InspectionGadgetsLocalize.loopWithImplicitTerminationConditionQuickfix().get(); + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.loopWithImplicitTerminationConditionDisplayName(); } - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiElement parent = element.getParent(); - final PsiExpression loopCondition; - final PsiStatement body; - final boolean firstStatement; - if (parent instanceof PsiWhileStatement) { - final PsiWhileStatement whileStatement = - (PsiWhileStatement)parent; - loopCondition = whileStatement.getCondition(); - body = whileStatement.getBody(); - firstStatement = true; - } - else if (parent instanceof PsiDoWhileStatement) { - final PsiDoWhileStatement doWhileStatement = - (PsiDoWhileStatement)parent; - loopCondition = doWhileStatement.getCondition(); - body = doWhileStatement.getBody(); - firstStatement = false; - } - else if (parent instanceof PsiForStatement) { - final PsiForStatement forStatement = (PsiForStatement)parent; - loopCondition = forStatement.getCondition(); - body = forStatement.getBody(); - firstStatement = true; - } - else { - return; - } - if (loopCondition == null) { - return; - } - final PsiStatement statement; - if (body instanceof PsiBlockStatement) { - final PsiBlockStatement blockStatement = (PsiBlockStatement)body; - final PsiCodeBlock codeBlock = blockStatement.getCodeBlock(); - final PsiStatement[] statements = codeBlock.getStatements(); - if (statements.length == 0) { - return; - } - if (firstStatement) { - statement = statements[0]; - } - else { - statement = statements[statements.length - 1]; - } - } - else { - statement = body; - } - if (!(statement instanceof PsiIfStatement)) { - return; - } - final PsiIfStatement ifStatement = (PsiIfStatement)statement; - final PsiExpression ifCondition = ifStatement.getCondition(); - if (ifCondition == null) { - return; - } - final PsiStatement thenBranch = ifStatement.getThenBranch(); - final PsiStatement elseBranch = ifStatement.getElseBranch(); - if (containsUnlabeledBreakStatement(thenBranch)) { - final String negatedExpressionText = - BoolUtils.getNegatedExpressionText(ifCondition); - replaceExpression(loopCondition, negatedExpressionText); - replaceStatement(ifStatement, elseBranch); - } - else if (containsUnlabeledBreakStatement(elseBranch)) { - loopCondition.replace(ifCondition); - if (thenBranch == null) { - ifStatement.delete(); - } - else { - replaceStatement(ifStatement, thenBranch); - } - } + @Nonnull + protected String buildErrorString(Object... infos) { + return Boolean.TRUE.equals(infos[0]) + ? InspectionGadgetsLocalize.loopWithImplicitTerminationConditionDowhileProblemDescriptor().get() + : InspectionGadgetsLocalize.loopWithImplicitTerminationConditionProblemDescriptor().get(); } - private static void replaceStatement( - @Nonnull PsiStatement replacedStatement, - @Nullable PsiStatement replacingStatement) - throws IncorrectOperationException { - if (replacingStatement == null) { - replacedStatement.delete(); - return; - } - if (!(replacingStatement instanceof PsiBlockStatement)) { - replacedStatement.replace(replacingStatement); - return; - } - final PsiBlockStatement blockStatement = - (PsiBlockStatement)replacingStatement; - final PsiCodeBlock codeBlock = - blockStatement.getCodeBlock(); - final PsiElement[] children = codeBlock.getChildren(); - if (children.length > 2) { - final PsiElement receiver = replacedStatement.getParent(); - for (int i = children.length - 2; i > 0; i--) { - final PsiElement child = children[i]; - if (child instanceof PsiWhiteSpace) { - continue; - } - receiver.addAfter(child, replacedStatement); - } - replacedStatement.delete(); - } + @Nullable + protected InspectionGadgetsFix buildFix(Object... infos) { + return new LoopWithImplicitTerminationConditionFix(); } - } - public BaseInspectionVisitor buildVisitor() { - return new LoopWithImplicitTerminationConditionVisitor(); - } + private static class LoopWithImplicitTerminationConditionFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.loopWithImplicitTerminationConditionQuickfix(); + } - private static class LoopWithImplicitTerminationConditionVisitor - extends BaseInspectionVisitor { + protected void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiElement parent = element.getParent(); + final PsiExpression loopCondition; + final PsiStatement body; + final boolean firstStatement; + if (parent instanceof PsiWhileStatement) { + final PsiWhileStatement whileStatement = + (PsiWhileStatement) parent; + loopCondition = whileStatement.getCondition(); + body = whileStatement.getBody(); + firstStatement = true; + } + else if (parent instanceof PsiDoWhileStatement) { + final PsiDoWhileStatement doWhileStatement = + (PsiDoWhileStatement) parent; + loopCondition = doWhileStatement.getCondition(); + body = doWhileStatement.getBody(); + firstStatement = false; + } + else if (parent instanceof PsiForStatement) { + final PsiForStatement forStatement = (PsiForStatement) parent; + loopCondition = forStatement.getCondition(); + body = forStatement.getBody(); + firstStatement = true; + } + else { + return; + } + if (loopCondition == null) { + return; + } + final PsiStatement statement; + if (body instanceof PsiBlockStatement) { + final PsiBlockStatement blockStatement = (PsiBlockStatement) body; + final PsiCodeBlock codeBlock = blockStatement.getCodeBlock(); + final PsiStatement[] statements = codeBlock.getStatements(); + if (statements.length == 0) { + return; + } + if (firstStatement) { + statement = statements[0]; + } + else { + statement = statements[statements.length - 1]; + } + } + else { + statement = body; + } + if (!(statement instanceof PsiIfStatement)) { + return; + } + final PsiIfStatement ifStatement = (PsiIfStatement) statement; + final PsiExpression ifCondition = ifStatement.getCondition(); + if (ifCondition == null) { + return; + } + final PsiStatement thenBranch = ifStatement.getThenBranch(); + final PsiStatement elseBranch = ifStatement.getElseBranch(); + if (containsUnlabeledBreakStatement(thenBranch)) { + final String negatedExpressionText = + BoolUtils.getNegatedExpressionText(ifCondition); + replaceExpression(loopCondition, negatedExpressionText); + replaceStatement(ifStatement, elseBranch); + } + else if (containsUnlabeledBreakStatement(elseBranch)) { + loopCondition.replace(ifCondition); + if (thenBranch == null) { + ifStatement.delete(); + } + else { + replaceStatement(ifStatement, thenBranch); + } + } + } - @Override - public void visitWhileStatement(PsiWhileStatement statement) { - super.visitWhileStatement(statement); - final PsiExpression condition = statement.getCondition(); - if (!BoolUtils.isTrue(condition)) { - return; - } - if (isLoopWithImplicitTerminationCondition(statement, true)) { - return; - } - registerStatementError(statement, Boolean.FALSE); + private static void replaceStatement( + @Nonnull PsiStatement replacedStatement, + @Nullable PsiStatement replacingStatement + ) + throws IncorrectOperationException { + if (replacingStatement == null) { + replacedStatement.delete(); + return; + } + if (!(replacingStatement instanceof PsiBlockStatement)) { + replacedStatement.replace(replacingStatement); + return; + } + final PsiBlockStatement blockStatement = + (PsiBlockStatement) replacingStatement; + final PsiCodeBlock codeBlock = + blockStatement.getCodeBlock(); + final PsiElement[] children = codeBlock.getChildren(); + if (children.length > 2) { + final PsiElement receiver = replacedStatement.getParent(); + for (int i = children.length - 2; i > 0; i--) { + final PsiElement child = children[i]; + if (child instanceof PsiWhiteSpace) { + continue; + } + receiver.addAfter(child, replacedStatement); + } + replacedStatement.delete(); + } + } } - @Override - public void visitDoWhileStatement(PsiDoWhileStatement statement) { - super.visitDoWhileStatement(statement); - final PsiExpression condition = statement.getCondition(); - if (!BoolUtils.isTrue(condition)) { - return; - } - if (isLoopWithImplicitTerminationCondition(statement, false)) { - return; - } - registerStatementError(statement, Boolean.TRUE); + public BaseInspectionVisitor buildVisitor() { + return new LoopWithImplicitTerminationConditionVisitor(); } - @Override - public void visitForStatement(PsiForStatement statement) { - super.visitForStatement(statement); - final PsiExpression condition = statement.getCondition(); - if (!BoolUtils.isTrue(condition)) { - return; - } - if (isLoopWithImplicitTerminationCondition(statement, true)) { - return; - } - registerStatementError(statement, Boolean.FALSE); - } + private static class LoopWithImplicitTerminationConditionVisitor + extends BaseInspectionVisitor { - private static boolean isLoopWithImplicitTerminationCondition( - PsiLoopStatement statement, boolean firstStatement) { - final PsiStatement body = statement.getBody(); - final PsiStatement bodyStatement; - if (body instanceof PsiBlockStatement) { - final PsiBlockStatement blockStatement = - (PsiBlockStatement)body; - final PsiCodeBlock codeBlock = blockStatement.getCodeBlock(); - final PsiStatement[] statements = codeBlock.getStatements(); - if (statements.length == 0) { - return true; + @Override + public void visitWhileStatement(PsiWhileStatement statement) { + super.visitWhileStatement(statement); + final PsiExpression condition = statement.getCondition(); + if (!BoolUtils.isTrue(condition)) { + return; + } + if (isLoopWithImplicitTerminationCondition(statement, true)) { + return; + } + registerStatementError(statement, Boolean.FALSE); } - if (firstStatement) { - bodyStatement = statements[0]; + + @Override + public void visitDoWhileStatement(PsiDoWhileStatement statement) { + super.visitDoWhileStatement(statement); + final PsiExpression condition = statement.getCondition(); + if (!BoolUtils.isTrue(condition)) { + return; + } + if (isLoopWithImplicitTerminationCondition(statement, false)) { + return; + } + registerStatementError(statement, Boolean.TRUE); } - else { - bodyStatement = statements[statements.length - 1]; + + @Override + public void visitForStatement(PsiForStatement statement) { + super.visitForStatement(statement); + final PsiExpression condition = statement.getCondition(); + if (!BoolUtils.isTrue(condition)) { + return; + } + if (isLoopWithImplicitTerminationCondition(statement, true)) { + return; + } + registerStatementError(statement, Boolean.FALSE); } - } - else { - bodyStatement = body; - } - return !isImplicitTerminationCondition(bodyStatement); - } - private static boolean isImplicitTerminationCondition( - @Nullable PsiStatement statement) { - if (!(statement instanceof PsiIfStatement)) { - return false; - } - final PsiIfStatement ifStatement = (PsiIfStatement)statement; - final PsiStatement thenBranch = ifStatement.getThenBranch(); - if (containsUnlabeledBreakStatement(thenBranch)) { - return true; - } - final PsiStatement elseBranch = ifStatement.getElseBranch(); - return containsUnlabeledBreakStatement(elseBranch); - } - } + private static boolean isLoopWithImplicitTerminationCondition( + PsiLoopStatement statement, boolean firstStatement + ) { + final PsiStatement body = statement.getBody(); + final PsiStatement bodyStatement; + if (body instanceof PsiBlockStatement) { + final PsiBlockStatement blockStatement = + (PsiBlockStatement) body; + final PsiCodeBlock codeBlock = blockStatement.getCodeBlock(); + final PsiStatement[] statements = codeBlock.getStatements(); + if (statements.length == 0) { + return true; + } + if (firstStatement) { + bodyStatement = statements[0]; + } + else { + bodyStatement = statements[statements.length - 1]; + } + } + else { + bodyStatement = body; + } + return !isImplicitTerminationCondition(bodyStatement); + } - static boolean containsUnlabeledBreakStatement( - @Nullable PsiStatement statement) { - if (!(statement instanceof PsiBlockStatement)) { - return isUnlabeledBreakStatement(statement); + private static boolean isImplicitTerminationCondition( + @Nullable PsiStatement statement + ) { + if (!(statement instanceof PsiIfStatement)) { + return false; + } + final PsiIfStatement ifStatement = (PsiIfStatement) statement; + final PsiStatement thenBranch = ifStatement.getThenBranch(); + if (containsUnlabeledBreakStatement(thenBranch)) { + return true; + } + final PsiStatement elseBranch = ifStatement.getElseBranch(); + return containsUnlabeledBreakStatement(elseBranch); + } } - final PsiBlockStatement blockStatement = - (PsiBlockStatement)statement; - final PsiCodeBlock codeBlock = - blockStatement.getCodeBlock(); - final PsiStatement[] statements = codeBlock.getStatements(); - if (statements.length != 1) { - return false; + + static boolean containsUnlabeledBreakStatement( + @Nullable PsiStatement statement + ) { + if (!(statement instanceof PsiBlockStatement)) { + return isUnlabeledBreakStatement(statement); + } + final PsiBlockStatement blockStatement = + (PsiBlockStatement) statement; + final PsiCodeBlock codeBlock = + blockStatement.getCodeBlock(); + final PsiStatement[] statements = codeBlock.getStatements(); + if (statements.length != 1) { + return false; + } + final PsiStatement firstStatement = statements[0]; + return isUnlabeledBreakStatement(firstStatement); } - final PsiStatement firstStatement = statements[0]; - return isUnlabeledBreakStatement(firstStatement); - } - private static boolean isUnlabeledBreakStatement( - @Nullable PsiStatement statement) { - if (!(statement instanceof PsiBreakStatement)) { - return false; + private static boolean isUnlabeledBreakStatement( + @Nullable PsiStatement statement + ) { + if (!(statement instanceof PsiBreakStatement)) { + return false; + } + final PsiBreakStatement breakStatement = + (PsiBreakStatement) statement; + final PsiIdentifier identifier = + breakStatement.getLabelIdentifier(); + return identifier == null; } - final PsiBreakStatement breakStatement = - (PsiBreakStatement)statement; - final PsiIdentifier identifier = - breakStatement.getLabelIdentifier(); - return identifier == null; - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NegatedConditionalInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NegatedConditionalInspection.java index a5bb78a860..d98af42a91 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NegatedConditionalInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NegatedConditionalInspection.java @@ -31,94 +31,94 @@ import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; @ExtensionImpl public class NegatedConditionalInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean m_ignoreNegatedNullComparison = true; - /** - * @noinspection PublicField - */ - public boolean m_ignoreNegatedNullComparison = true; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.negatedConditionalDisplayName().get(); - } - - @Override - @Nonnull - public String getID() { - return "ConditionalExpressionWithNegatedCondition"; - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.negatedConditionalProblemDescriptor().get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new NegatedConditionalVisitor(); - } - - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.negatedConditionalIgnoreOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "m_ignoreNegatedNullComparison"); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new NegatedConditionalFix(); - } + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "ConditionalExpressionWithNegatedCondition"; + } - private static class NegatedConditionalFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.negatedConditionalDisplayName(); + } @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.negatedConditionalInvertQuickfix().get(); + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.negatedConditionalProblemDescriptor().get(); } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiConditionalExpression conditionalExpression = (PsiConditionalExpression)element.getParent(); - assert conditionalExpression != null; - final PsiExpression elseBranch = conditionalExpression.getElseExpression(); - final PsiExpression thenBranch = conditionalExpression.getThenExpression(); - final PsiExpression condition = conditionalExpression.getCondition(); - final String negatedCondition = BoolUtils.getNegatedExpressionText(condition); - assert elseBranch != null; - assert thenBranch != null; - final String newStatement = negatedCondition + '?' + elseBranch.getText() + ':' + thenBranch.getText(); - replaceExpression(conditionalExpression, newStatement); + public BaseInspectionVisitor buildVisitor() { + return new NegatedConditionalVisitor(); } - } - private class NegatedConditionalVisitor extends BaseInspectionVisitor { + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.negatedConditionalIgnoreOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "m_ignoreNegatedNullComparison"); + } @Override - public void visitConditionalExpression(PsiConditionalExpression expression) { - super.visitConditionalExpression(expression); - final PsiExpression thenBranch = expression.getThenExpression(); - if (thenBranch == null) { - return; - } - final PsiExpression elseBranch = expression.getElseExpression(); - if (elseBranch == null) { - return; - } - final PsiExpression condition = expression.getCondition(); - if (!ExpressionUtils.isNegation(condition, m_ignoreNegatedNullComparison, false)) { - return; - } - registerError(condition); + protected InspectionGadgetsFix buildFix(Object... infos) { + return new NegatedConditionalFix(); + } + + private static class NegatedConditionalFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.negatedConditionalInvertQuickfix(); + } + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiConditionalExpression conditionalExpression = (PsiConditionalExpression) element.getParent(); + assert conditionalExpression != null; + final PsiExpression elseBranch = conditionalExpression.getElseExpression(); + final PsiExpression thenBranch = conditionalExpression.getThenExpression(); + final PsiExpression condition = conditionalExpression.getCondition(); + final String negatedCondition = BoolUtils.getNegatedExpressionText(condition); + assert elseBranch != null; + assert thenBranch != null; + final String newStatement = negatedCondition + '?' + elseBranch.getText() + ':' + thenBranch.getText(); + replaceExpression(conditionalExpression, newStatement); + } + } + + private class NegatedConditionalVisitor extends BaseInspectionVisitor { + + @Override + public void visitConditionalExpression(PsiConditionalExpression expression) { + super.visitConditionalExpression(expression); + final PsiExpression thenBranch = expression.getThenExpression(); + if (thenBranch == null) { + return; + } + final PsiExpression elseBranch = expression.getElseExpression(); + if (elseBranch == null) { + return; + } + final PsiExpression condition = expression.getCondition(); + if (!ExpressionUtils.isNegation(condition, m_ignoreNegatedNullComparison, false)) { + return; + } + registerError(condition); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NegatedEqualityExpressionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NegatedEqualityExpressionInspection.java index b11d804036..d1b6df21d6 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NegatedEqualityExpressionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NegatedEqualityExpressionInspection.java @@ -29,6 +29,7 @@ import consulo.language.editor.inspection.ProblemDescriptor; import consulo.language.psi.PsiElement; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; @@ -37,92 +38,90 @@ */ @ExtensionImpl public class NegatedEqualityExpressionInspection extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.negatedEqualityExpressionDisplayName().get(); - } - - @Nonnull - @Override - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.negatedEqualityExpressionProblemDescriptor(infos[0]).get(); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new NegatedEqualityExpressionFix(); - } - - private static class NegatedEqualityExpressionFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.negatedEqualityExpressionDisplayName(); + } @Nonnull @Override - public String getName() { - return InspectionGadgetsLocalize.negatedEqualityExpressionQuickfix().get(); + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.negatedEqualityExpressionProblemDescriptor(infos[0]).get(); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiElement parent = element.getParent(); - if (!(parent instanceof PsiPrefixExpression)) { - return; - } - final PsiPrefixExpression prefixExpression = (PsiPrefixExpression)parent; - if (!JavaTokenType.EXCL.equals(prefixExpression.getOperationTokenType())) { - return; - } - final PsiExpression operand = ParenthesesUtils.stripParentheses(prefixExpression.getOperand()); - if (!(operand instanceof PsiBinaryExpression)) { - return; - } - final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)operand; - final IElementType tokenType = binaryExpression.getOperationTokenType(); - StringBuilder text = new StringBuilder(binaryExpression.getLOperand().getText()); - if (JavaTokenType.EQEQ.equals(tokenType)) { - text.append("!="); - } - else if (JavaTokenType.NE.equals(tokenType)) { - text.append("=="); - } - else { - return; - } - final PsiExpression rhs = binaryExpression.getROperand(); - if (rhs != null) { - text.append(rhs.getText()); - } - replaceExpression(prefixExpression, text.toString()); + protected InspectionGadgetsFix buildFix(Object... infos) { + return new NegatedEqualityExpressionFix(); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new NegatedEqualsVisitor(); - } + private static class NegatedEqualityExpressionFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.negatedEqualityExpressionQuickfix(); + } - private static class NegatedEqualsVisitor 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 PsiPrefixExpression)) { + return; + } + final PsiPrefixExpression prefixExpression = (PsiPrefixExpression) parent; + if (!JavaTokenType.EXCL.equals(prefixExpression.getOperationTokenType())) { + return; + } + final PsiExpression operand = ParenthesesUtils.stripParentheses(prefixExpression.getOperand()); + if (!(operand instanceof PsiBinaryExpression)) { + return; + } + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression) operand; + final IElementType tokenType = binaryExpression.getOperationTokenType(); + StringBuilder text = new StringBuilder(binaryExpression.getLOperand().getText()); + if (JavaTokenType.EQEQ.equals(tokenType)) { + text.append("!="); + } + else if (JavaTokenType.NE.equals(tokenType)) { + text.append("=="); + } + else { + return; + } + final PsiExpression rhs = binaryExpression.getROperand(); + if (rhs != null) { + text.append(rhs.getText()); + } + replaceExpression(prefixExpression, text.toString()); + } + } @Override - public void visitPrefixExpression(PsiPrefixExpression expression) { - super.visitPrefixExpression(expression); - if (!JavaTokenType.EXCL.equals(expression.getOperationTokenType())) { - return; - } - final PsiExpression operand = ParenthesesUtils.stripParentheses(expression.getOperand()); - if (!(operand instanceof PsiBinaryExpression)) { - return; - } - final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)operand; - final IElementType tokenType = binaryExpression.getOperationTokenType(); - if (JavaTokenType.EQEQ.equals(tokenType)) { - registerError(expression.getOperationSign(), "=="); - } - else if (JavaTokenType.NE.equals(tokenType)) { - registerError(expression.getOperationSign(), "!="); - } + public BaseInspectionVisitor buildVisitor() { + return new NegatedEqualsVisitor(); + } + + private static class NegatedEqualsVisitor extends BaseInspectionVisitor { + + @Override + public void visitPrefixExpression(PsiPrefixExpression expression) { + super.visitPrefixExpression(expression); + if (!JavaTokenType.EXCL.equals(expression.getOperationTokenType())) { + return; + } + final PsiExpression operand = ParenthesesUtils.stripParentheses(expression.getOperand()); + if (!(operand instanceof PsiBinaryExpression)) { + return; + } + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression) operand; + final IElementType tokenType = binaryExpression.getOperationTokenType(); + if (JavaTokenType.EQEQ.equals(tokenType)) { + registerError(expression.getOperationSign(), "=="); + } + else if (JavaTokenType.NE.equals(tokenType)) { + registerError(expression.getOperationSign(), "!="); + } + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NegatedIfElseInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NegatedIfElseInspection.java index 5a3c3807e4..49457a864d 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NegatedIfElseInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NegatedIfElseInspection.java @@ -32,122 +32,125 @@ import consulo.language.psi.PsiComment; import consulo.language.psi.PsiElement; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import org.jetbrains.annotations.NonNls; import javax.swing.*; @ExtensionImpl public class NegatedIfElseInspection extends BaseInspection { + @SuppressWarnings("PublicField") + public boolean m_ignoreNegatedNullComparison = true; + @SuppressWarnings("PublicField") + public boolean m_ignoreNegatedZeroComparison = false; - @SuppressWarnings("PublicField") public boolean m_ignoreNegatedNullComparison = true; - @SuppressWarnings("PublicField") public boolean m_ignoreNegatedZeroComparison = false; - - @Override - @Nonnull - public String getID() { - return "IfStatementWithNegatedCondition"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.negatedIfElseDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.negatedIfElseProblemDescriptor().get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new NegatedIfElseVisitor(); - } + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "IfStatementWithNegatedCondition"; + } - @Override - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); - panel.addCheckbox(InspectionGadgetsLocalize.negatedIfElseIgnoreNegatedNullOption().get(), "m_ignoreNegatedNullComparison"); - panel.addCheckbox(InspectionGadgetsLocalize.negatedIfElseIgnoreNegatedZeroOption().get(), "m_ignoreNegatedZeroComparison"); - return panel; - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.negatedIfElseDisplayName(); + } - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new NegatedIfElseFix(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.negatedIfElseProblemDescriptor().get(); + } - private static class NegatedIfElseFix extends InspectionGadgetsFix { + @Override + public BaseInspectionVisitor buildVisitor() { + return new NegatedIfElseVisitor(); + } @Override - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.negatedIfElseInvertQuickfix().get(); + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); + panel.addCheckbox(InspectionGadgetsLocalize.negatedIfElseIgnoreNegatedNullOption().get(), "m_ignoreNegatedNullComparison"); + panel.addCheckbox(InspectionGadgetsLocalize.negatedIfElseIgnoreNegatedZeroOption().get(), "m_ignoreNegatedZeroComparison"); + return panel; } @Override - public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement ifToken = descriptor.getPsiElement(); - final PsiIfStatement ifStatement = (PsiIfStatement)ifToken.getParent(); - assert ifStatement != null; - final PsiStatement elseBranch = ifStatement.getElseBranch(); - if (elseBranch == null) { - return; - } - final PsiStatement thenBranch = ifStatement.getThenBranch(); - if (thenBranch == null) { - return; - } - final PsiExpression condition = ifStatement.getCondition(); - if (condition == null) { - return; - } - final String negatedCondition = BoolUtils.getNegatedExpressionText(condition); - String elseText = elseBranch.getText(); - final PsiElement lastChild = elseBranch.getLastChild(); - if (lastChild instanceof PsiComment) { - final PsiComment comment = (PsiComment)lastChild; - final IElementType tokenType = comment.getTokenType(); - if (JavaTokenType.END_OF_LINE_COMMENT.equals(tokenType)) { - elseText += '\n'; + protected InspectionGadgetsFix buildFix(Object... infos) { + return new NegatedIfElseFix(); + } + + private static class NegatedIfElseFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.negatedIfElseInvertQuickfix(); + } + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement ifToken = descriptor.getPsiElement(); + final PsiIfStatement ifStatement = (PsiIfStatement) ifToken.getParent(); + assert ifStatement != null; + final PsiStatement elseBranch = ifStatement.getElseBranch(); + if (elseBranch == null) { + return; + } + final PsiStatement thenBranch = ifStatement.getThenBranch(); + if (thenBranch == null) { + return; + } + final PsiExpression condition = ifStatement.getCondition(); + if (condition == null) { + return; + } + final String negatedCondition = BoolUtils.getNegatedExpressionText(condition); + String elseText = elseBranch.getText(); + final PsiElement lastChild = elseBranch.getLastChild(); + if (lastChild instanceof PsiComment) { + final PsiComment comment = (PsiComment) lastChild; + final IElementType tokenType = comment.getTokenType(); + if (JavaTokenType.END_OF_LINE_COMMENT.equals(tokenType)) { + elseText += '\n'; + } + } + @NonNls final String newStatement = "if(" + negatedCondition + ')' + elseText + " else " + thenBranch.getText(); + replaceStatement(ifStatement, newStatement); } - } - @NonNls final String newStatement = "if(" + negatedCondition + ')' + elseText + " else " + thenBranch.getText(); - replaceStatement(ifStatement, newStatement); } - } - private class NegatedIfElseVisitor extends BaseInspectionVisitor { + private class NegatedIfElseVisitor extends BaseInspectionVisitor { - @Override - public void visitIfStatement(@Nonnull PsiIfStatement statement) { - super.visitIfStatement(statement); - final PsiStatement thenBranch = statement.getThenBranch(); - if (thenBranch == null) { - return; - } - final PsiStatement elseBranch = statement.getElseBranch(); - if (elseBranch == null) { - return; - } - if (elseBranch instanceof PsiIfStatement) { - return; - } - final PsiExpression condition = statement.getCondition(); - if (condition == null) { - return; - } - if (!ExpressionUtils.isNegation(condition, m_ignoreNegatedNullComparison, m_ignoreNegatedZeroComparison)) { - return; - } - final PsiElement parent = statement.getParent(); - if (parent instanceof PsiIfStatement) { - return; - } - registerStatementError(statement); + @Override + public void visitIfStatement(@Nonnull PsiIfStatement statement) { + super.visitIfStatement(statement); + final PsiStatement thenBranch = statement.getThenBranch(); + if (thenBranch == null) { + return; + } + final PsiStatement elseBranch = statement.getElseBranch(); + if (elseBranch == null) { + return; + } + if (elseBranch instanceof PsiIfStatement) { + return; + } + final PsiExpression condition = statement.getCondition(); + if (condition == null) { + return; + } + if (!ExpressionUtils.isNegation(condition, m_ignoreNegatedNullComparison, m_ignoreNegatedZeroComparison)) { + return; + } + final PsiElement parent = statement.getParent(); + if (parent instanceof PsiIfStatement) { + return; + } + registerStatementError(statement); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NestedConditionalExpressionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NestedConditionalExpressionInspection.java index f788580dae..f7cc38e9ac 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NestedConditionalExpressionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NestedConditionalExpressionInspection.java @@ -21,34 +21,34 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl -public class NestedConditionalExpressionInspection - extends BaseInspection { - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.nestedConditionalExpressionDisplayName().get(); - } +public class NestedConditionalExpressionInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nestedConditionalExpressionDisplayName(); + } - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.nestedConditionalExpressionProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.nestedConditionalExpressionProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new NestedConditionalExpressionVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new NestedConditionalExpressionVisitor(); + } - private static class NestedConditionalExpressionVisitor extends BaseInspectionVisitor { - @Override - public void visitConditionalExpression(@Nonnull PsiConditionalExpression expression) { - super.visitConditionalExpression(expression); - if (PsiTreeUtil.getParentOfType(expression, PsiConditionalExpression.class) == null) { - return; - } - registerError(expression); + private static class NestedConditionalExpressionVisitor extends BaseInspectionVisitor { + @Override + public void visitConditionalExpression(@Nonnull PsiConditionalExpression expression) { + super.visitConditionalExpression(expression); + if (PsiTreeUtil.getParentOfType(expression, PsiConditionalExpression.class) == null) { + return; + } + registerError(expression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NestedSwitchStatementInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NestedSwitchStatementInspection.java index 3f75481245..7f3a048e5a 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NestedSwitchStatementInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/NestedSwitchStatementInspection.java @@ -23,47 +23,53 @@ import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.PsiElement; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class NestedSwitchStatementInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.nestedSwitchStatementDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.nestedSwitchStatementDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.nestedSwitchStatementProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.nestedSwitchStatementProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new NestedSwitchStatementVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new NestedSwitchStatementVisitor(); + } - private static class NestedSwitchStatementVisitor extends BaseInspectionVisitor { - @Override - public void visitSwitchStatement( - @Nonnull PsiSwitchStatement statement) { - super.visitSwitchStatement(statement); - final PsiElement containingSwitchStatement = - PsiTreeUtil.getParentOfType(statement, - PsiSwitchStatement.class); - if (containingSwitchStatement == null) { - return; - } - final PsiMethod containingMethod = - PsiTreeUtil.getParentOfType(statement, PsiMethod.class); - final PsiMethod containingContainingMethod = - PsiTreeUtil.getParentOfType(containingSwitchStatement, - PsiMethod.class); - if (containingMethod == null || - containingContainingMethod == null || - !containingMethod.equals(containingContainingMethod)) { - return; - } - registerStatementError(statement); + private static class NestedSwitchStatementVisitor extends BaseInspectionVisitor { + @Override + public void visitSwitchStatement( + @Nonnull PsiSwitchStatement statement + ) { + super.visitSwitchStatement(statement); + final PsiElement containingSwitchStatement = + PsiTreeUtil.getParentOfType( + statement, + PsiSwitchStatement.class + ); + if (containingSwitchStatement == null) { + return; + } + final PsiMethod containingMethod = + PsiTreeUtil.getParentOfType(statement, PsiMethod.class); + final PsiMethod containingContainingMethod = + PsiTreeUtil.getParentOfType( + containingSwitchStatement, + PsiMethod.class + ); + if (containingMethod == null || + containingContainingMethod == null || + !containingMethod.equals(containingContainingMethod)) { + return; + } + registerStatementError(statement); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/OverlyComplexBooleanExpressionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/OverlyComplexBooleanExpressionInspection.java index 95246a52ca..f1e8475122 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/OverlyComplexBooleanExpressionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/OverlyComplexBooleanExpressionInspection.java @@ -25,6 +25,7 @@ import consulo.deadCodeNotWorking.impl.CheckBox; import consulo.language.ast.IElementType; import consulo.language.psi.PsiElement; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import javax.swing.*; @@ -35,183 +36,182 @@ @ExtensionImpl public class OverlyComplexBooleanExpressionInspection extends BaseInspection { + private static final Set s_booleanOperators = new HashSet(5); + + static { + s_booleanOperators.add(JavaTokenType.ANDAND); + s_booleanOperators.add(JavaTokenType.OROR); + s_booleanOperators.add(JavaTokenType.XOR); + s_booleanOperators.add(JavaTokenType.AND); + s_booleanOperators.add(JavaTokenType.OR); + } + + /** + * @noinspection PublicField + */ + public int m_limit = 3; - private static final Set s_booleanOperators = new HashSet(5); - - static { - s_booleanOperators.add(JavaTokenType.ANDAND); - s_booleanOperators.add(JavaTokenType.OROR); - s_booleanOperators.add(JavaTokenType.XOR); - s_booleanOperators.add(JavaTokenType.AND); - s_booleanOperators.add(JavaTokenType.OR); - } - - /** - * @noinspection PublicField - */ - public int m_limit = 3; - - /** - * @noinspection PublicField - */ - public boolean m_ignorePureConjunctionsDisjunctions = true; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.overlyComplexBooleanExpressionDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - final Integer termCount = (Integer)infos[0]; - return InspectionGadgetsLocalize.overlyComplexBooleanExpressionProblemDescriptor(termCount).get(); - } - - @Override - public JComponent createOptionsPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - final CheckBox ignoreConjunctionsDisjunctionsCheckBox = new CheckBox( - InspectionGadgetsLocalize.overlyComplexBooleanExpressionIgnoreOption().get(), - this, - "m_ignorePureConjunctionsDisjunctions" - ); - final NumberFormat formatter = NumberFormat.getIntegerInstance(); - formatter.setParseIntegerOnly(true); - final JFormattedTextField termLimitTextField = prepareNumberEditor(() -> m_limit, i -> m_limit = i); - - final GridBagConstraints constraints = new GridBagConstraints(); - final JLabel label = new JLabel(InspectionGadgetsLocalize.overlyComplexBooleanExpressionMaxTermsOption().get()); - - constraints.anchor = GridBagConstraints.BASELINE_LEADING; - constraints.fill = GridBagConstraints.HORIZONTAL; - panel.add(label, constraints); - - constraints.fill = GridBagConstraints.NONE; - constraints.gridx = 1; - panel.add(termLimitTextField, constraints); - - constraints.gridx = 0; - constraints.gridy = 1; - constraints.gridwidth = 2; - constraints.weightx = 1.0; - constraints.weighty = 1.0; - panel.add(ignoreConjunctionsDisjunctionsCheckBox, constraints); - return panel; - } - - @Override - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new ExtractMethodFix(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new OverlyComplexBooleanExpressionVisitor(); - } - - private class OverlyComplexBooleanExpressionVisitor extends BaseInspectionVisitor { + /** + * @noinspection PublicField + */ + public boolean m_ignorePureConjunctionsDisjunctions = true; + @Nonnull @Override - public void visitPolyadicExpression(@Nonnull PsiPolyadicExpression expression) { - super.visitPolyadicExpression(expression); - checkExpression(expression); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.overlyComplexBooleanExpressionDisplayName(); } @Override - public void visitPrefixExpression(@Nonnull PsiPrefixExpression expression) { - super.visitPrefixExpression(expression); - checkExpression(expression); + @Nonnull + protected String buildErrorString(Object... infos) { + final Integer termCount = (Integer) infos[0]; + return InspectionGadgetsLocalize.overlyComplexBooleanExpressionProblemDescriptor(termCount).get(); } @Override - public void visitParenthesizedExpression(@Nonnull PsiParenthesizedExpression expression) { - super.visitParenthesizedExpression(expression); - checkExpression(expression); + public JComponent createOptionsPanel() { + final JPanel panel = new JPanel(new GridBagLayout()); + final CheckBox ignoreConjunctionsDisjunctionsCheckBox = new CheckBox( + InspectionGadgetsLocalize.overlyComplexBooleanExpressionIgnoreOption().get(), + this, + "m_ignorePureConjunctionsDisjunctions" + ); + final NumberFormat formatter = NumberFormat.getIntegerInstance(); + formatter.setParseIntegerOnly(true); + final JFormattedTextField termLimitTextField = prepareNumberEditor(() -> m_limit, i -> m_limit = i); + + final GridBagConstraints constraints = new GridBagConstraints(); + final JLabel label = new JLabel(InspectionGadgetsLocalize.overlyComplexBooleanExpressionMaxTermsOption().get()); + + constraints.anchor = GridBagConstraints.BASELINE_LEADING; + constraints.fill = GridBagConstraints.HORIZONTAL; + panel.add(label, constraints); + + constraints.fill = GridBagConstraints.NONE; + constraints.gridx = 1; + panel.add(termLimitTextField, constraints); + + constraints.gridx = 0; + constraints.gridy = 1; + constraints.gridwidth = 2; + constraints.weightx = 1.0; + constraints.weighty = 1.0; + panel.add(ignoreConjunctionsDisjunctionsCheckBox, constraints); + return panel; } - private void checkExpression(PsiExpression expression) { - if (!isBoolean(expression)) { - return; - } - final PsiElement parent = expression.getParent(); - if (parent instanceof PsiExpression && isBoolean((PsiExpression)parent)) { - return; - } - final int numTerms = countTerms(expression); - if (numTerms <= m_limit) { - return; - } - if (m_ignorePureConjunctionsDisjunctions && isPureConjunctionDisjunction(expression)) { - return; - } - registerError(expression, Integer.valueOf(numTerms)); + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; } - private int countTerms(PsiExpression expression) { - if (!isBoolean(expression)) { - return 1; - } - if (expression instanceof PsiPolyadicExpression) { - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)expression; - final PsiExpression[] operands = polyadicExpression.getOperands(); - int count = 0; - for (PsiExpression operand : operands) { - count += countTerms(operand); - } - return count; - } - else if (expression instanceof PsiPrefixExpression) { - final PsiPrefixExpression prefixExpression = (PsiPrefixExpression)expression; - return countTerms(prefixExpression.getOperand()); - } - else if (expression instanceof PsiParenthesizedExpression) { - final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)expression; - return countTerms(parenthesizedExpression.getExpression()); - } - return 1; + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new ExtractMethodFix(); } - private boolean isBoolean(PsiExpression expression) { - if (expression instanceof PsiPolyadicExpression) { - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)expression; - return s_booleanOperators.contains(polyadicExpression.getOperationTokenType()); - } - else if (expression instanceof PsiPrefixExpression) { - final PsiPrefixExpression prefixExpression = (PsiPrefixExpression)expression; - return JavaTokenType.EXCL.equals(prefixExpression.getOperationTokenType()); - } - else if (expression instanceof PsiParenthesizedExpression) { - final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)expression; - return isBoolean(parenthesizedExpression.getExpression()); - } - return false; + @Override + public BaseInspectionVisitor buildVisitor() { + return new OverlyComplexBooleanExpressionVisitor(); } - private boolean isPureConjunctionDisjunction(PsiExpression expression) { - if (!(expression instanceof PsiPolyadicExpression)) { - return false; - } - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)expression; - final IElementType sign = polyadicExpression.getOperationTokenType(); - if (!s_booleanOperators.contains(sign)) { - return false; - } - final PsiExpression[] operands = polyadicExpression.getOperands(); - for (PsiExpression operand : operands) { - if (!(operand instanceof PsiReferenceExpression) && - !(operand instanceof PsiMethodCallExpression) && - !(operand instanceof PsiLiteralExpression)) { - return false; + private class OverlyComplexBooleanExpressionVisitor extends BaseInspectionVisitor { + + @Override + public void visitPolyadicExpression(@Nonnull PsiPolyadicExpression expression) { + super.visitPolyadicExpression(expression); + checkExpression(expression); + } + + @Override + public void visitPrefixExpression(@Nonnull PsiPrefixExpression expression) { + super.visitPrefixExpression(expression); + checkExpression(expression); + } + + @Override + public void visitParenthesizedExpression(@Nonnull PsiParenthesizedExpression expression) { + super.visitParenthesizedExpression(expression); + checkExpression(expression); + } + + private void checkExpression(PsiExpression expression) { + if (!isBoolean(expression)) { + return; + } + final PsiElement parent = expression.getParent(); + if (parent instanceof PsiExpression && isBoolean((PsiExpression) parent)) { + return; + } + final int numTerms = countTerms(expression); + if (numTerms <= m_limit) { + return; + } + if (m_ignorePureConjunctionsDisjunctions && isPureConjunctionDisjunction(expression)) { + return; + } + registerError(expression, Integer.valueOf(numTerms)); + } + + private int countTerms(PsiExpression expression) { + if (!isBoolean(expression)) { + return 1; + } + if (expression instanceof PsiPolyadicExpression) { + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) expression; + final PsiExpression[] operands = polyadicExpression.getOperands(); + int count = 0; + for (PsiExpression operand : operands) { + count += countTerms(operand); + } + return count; + } + else if (expression instanceof PsiPrefixExpression) { + final PsiPrefixExpression prefixExpression = (PsiPrefixExpression) expression; + return countTerms(prefixExpression.getOperand()); + } + else if (expression instanceof PsiParenthesizedExpression) { + final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression) expression; + return countTerms(parenthesizedExpression.getExpression()); + } + return 1; + } + + private boolean isBoolean(PsiExpression expression) { + if (expression instanceof PsiPolyadicExpression) { + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) expression; + return s_booleanOperators.contains(polyadicExpression.getOperationTokenType()); + } + else if (expression instanceof PsiPrefixExpression) { + final PsiPrefixExpression prefixExpression = (PsiPrefixExpression) expression; + return JavaTokenType.EXCL.equals(prefixExpression.getOperationTokenType()); + } + else if (expression instanceof PsiParenthesizedExpression) { + final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression) expression; + return isBoolean(parenthesizedExpression.getExpression()); + } + return false; + } + + private boolean isPureConjunctionDisjunction(PsiExpression expression) { + if (!(expression instanceof PsiPolyadicExpression)) { + return false; + } + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) expression; + final IElementType sign = polyadicExpression.getOperationTokenType(); + if (!s_booleanOperators.contains(sign)) { + return false; + } + final PsiExpression[] operands = polyadicExpression.getOperands(); + for (PsiExpression operand : operands) { + if (!(operand instanceof PsiReferenceExpression) && + !(operand instanceof PsiMethodCallExpression) && + !(operand instanceof PsiLiteralExpression)) { + return false; + } + } + return true; } - } - return true; } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/PointlessBooleanExpressionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/PointlessBooleanExpressionInspection.java index be0bbe6c40..57550943b7 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/PointlessBooleanExpressionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/PointlessBooleanExpressionInspection.java @@ -44,396 +44,398 @@ @ExtensionImpl public class PointlessBooleanExpressionInspection extends BaseInspection { + private static final Set booleanTokens = new HashSet(); - private static final Set booleanTokens = new HashSet(); - static { - booleanTokens.add(JavaTokenType.ANDAND); - booleanTokens.add(JavaTokenType.AND); - booleanTokens.add(JavaTokenType.OROR); - booleanTokens.add(JavaTokenType.OR); - booleanTokens.add(JavaTokenType.XOR); - booleanTokens.add(JavaTokenType.EQEQ); - booleanTokens.add(JavaTokenType.NE); - } - - @SuppressWarnings("PublicField") - public boolean m_ignoreExpressionsContainingConstants = false; - - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.pointlessBooleanExpressionIgnoreOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "m_ignoreExpressionsContainingConstants"); - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.pointlessBooleanExpressionDisplayName().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } + static { + booleanTokens.add(JavaTokenType.ANDAND); + booleanTokens.add(JavaTokenType.AND); + booleanTokens.add(JavaTokenType.OROR); + booleanTokens.add(JavaTokenType.OR); + booleanTokens.add(JavaTokenType.XOR); + booleanTokens.add(JavaTokenType.EQEQ); + booleanTokens.add(JavaTokenType.NE); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final PsiExpression expression = (PsiExpression)infos[0]; - return InspectionGadgetsLocalize.booleanExpressionCanBeSimplifiedProblemDescriptor( - buildSimplifiedExpression(expression, new StringBuilder()) - ).get(); - } + @SuppressWarnings("PublicField") + public boolean m_ignoreExpressionsContainingConstants = false; - private StringBuilder buildSimplifiedExpression(@Nullable PsiExpression expression, StringBuilder out) { - if (expression instanceof PsiPolyadicExpression) { - buildSimplifiedPolyadicExpression((PsiPolyadicExpression)expression, out); + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.pointlessBooleanExpressionIgnoreOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "m_ignoreExpressionsContainingConstants"); } - else if (expression instanceof PsiPrefixExpression) { - buildSimplifiedPrefixExpression((PsiPrefixExpression)expression, out); + + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.pointlessBooleanExpressionDisplayName(); } - else if (expression instanceof PsiParenthesizedExpression) { - final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)expression; - final PsiExpression expression1 = parenthesizedExpression.getExpression(); - out.append('('); - buildSimplifiedExpression(expression1, out); - out.append(')'); + + @Override + public boolean isEnabledByDefault() { + return true; } - else if (expression != null) { - out.append(expression.getText()); + + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final PsiExpression expression = (PsiExpression) infos[0]; + return InspectionGadgetsLocalize.booleanExpressionCanBeSimplifiedProblemDescriptor( + buildSimplifiedExpression(expression, new StringBuilder()) + ).get(); } - return out; - } - private void buildSimplifiedPolyadicExpression(PsiPolyadicExpression expression, StringBuilder out) { - final IElementType tokenType = expression.getOperationTokenType(); - final PsiExpression[] operands = expression.getOperands(); - final List expressions = new ArrayList(); - if (tokenType.equals(JavaTokenType.ANDAND) || tokenType.equals(JavaTokenType.AND)) { - for (PsiExpression operand : operands) { - if (evaluate(operand) == Boolean.TRUE) { - continue; + private StringBuilder buildSimplifiedExpression(@Nullable PsiExpression expression, StringBuilder out) { + if (expression instanceof PsiPolyadicExpression) { + buildSimplifiedPolyadicExpression((PsiPolyadicExpression) expression, out); } - else if (evaluate(operand) == Boolean.FALSE) { - out.append(PsiKeyword.FALSE); - return; + else if (expression instanceof PsiPrefixExpression) { + buildSimplifiedPrefixExpression((PsiPrefixExpression) expression, out); } - expressions.add(operand); - } - if (expressions.isEmpty()) { - out.append(PsiKeyword.TRUE); - return; - } - buildSimplifiedExpression(expressions, tokenType.equals(JavaTokenType.ANDAND) ? "&&" : "&", false, out); - } else if (tokenType.equals(JavaTokenType.OROR) || tokenType.equals(JavaTokenType.OR)) { - for (PsiExpression operand : operands) { - if (evaluate(operand) == Boolean.FALSE) { - continue; + else if (expression instanceof PsiParenthesizedExpression) { + final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression) expression; + final PsiExpression expression1 = parenthesizedExpression.getExpression(); + out.append('('); + buildSimplifiedExpression(expression1, out); + out.append(')'); } - else if (evaluate(operand) == Boolean.TRUE) { - out.append(PsiKeyword.TRUE); - return; + else if (expression != null) { + out.append(expression.getText()); } - expressions.add(operand); - } - if (expressions.isEmpty()) { - out.append(PsiKeyword.FALSE); - return; - } - buildSimplifiedExpression(expressions, tokenType.equals(JavaTokenType.OROR) ? "||" : "|", false, out); + return out; } - else if (tokenType.equals(JavaTokenType.XOR) || tokenType.equals(JavaTokenType.NE)) { - boolean negate = false; - for (PsiExpression operand : operands) { - if (evaluate(operand) == Boolean.FALSE) { - continue; - } - else if (evaluate(operand) == Boolean.TRUE) { - negate = !negate; - continue; - } - expressions.add(operand); - } - if (expressions.isEmpty()) { - if (negate) { - out.append(PsiKeyword.TRUE); - } - else { - out.append(PsiKeyword.FALSE); + + private void buildSimplifiedPolyadicExpression(PsiPolyadicExpression expression, StringBuilder out) { + final IElementType tokenType = expression.getOperationTokenType(); + final PsiExpression[] operands = expression.getOperands(); + final List expressions = new ArrayList(); + if (tokenType.equals(JavaTokenType.ANDAND) || tokenType.equals(JavaTokenType.AND)) { + for (PsiExpression operand : operands) { + if (evaluate(operand) == Boolean.TRUE) { + continue; + } + else if (evaluate(operand) == Boolean.FALSE) { + out.append(PsiKeyword.FALSE); + return; + } + expressions.add(operand); + } + if (expressions.isEmpty()) { + out.append(PsiKeyword.TRUE); + return; + } + buildSimplifiedExpression(expressions, tokenType.equals(JavaTokenType.ANDAND) ? "&&" : "&", false, out); } - return; - } - buildSimplifiedExpression(expressions, tokenType.equals(JavaTokenType.XOR) ? "^" : "!=", negate, out); - } - else if (tokenType.equals(JavaTokenType.EQEQ)) { - boolean negate = false; - for (PsiExpression operand : operands) { - if (evaluate(operand) == Boolean.TRUE) { - continue; + else if (tokenType.equals(JavaTokenType.OROR) || tokenType.equals(JavaTokenType.OR)) { + for (PsiExpression operand : operands) { + if (evaluate(operand) == Boolean.FALSE) { + continue; + } + else if (evaluate(operand) == Boolean.TRUE) { + out.append(PsiKeyword.TRUE); + return; + } + expressions.add(operand); + } + if (expressions.isEmpty()) { + out.append(PsiKeyword.FALSE); + return; + } + buildSimplifiedExpression(expressions, tokenType.equals(JavaTokenType.OROR) ? "||" : "|", false, out); } - else if (evaluate(operand) == Boolean.FALSE) { - negate = !negate; - continue; + else if (tokenType.equals(JavaTokenType.XOR) || tokenType.equals(JavaTokenType.NE)) { + boolean negate = false; + for (PsiExpression operand : operands) { + if (evaluate(operand) == Boolean.FALSE) { + continue; + } + else if (evaluate(operand) == Boolean.TRUE) { + negate = !negate; + continue; + } + expressions.add(operand); + } + if (expressions.isEmpty()) { + if (negate) { + out.append(PsiKeyword.TRUE); + } + else { + out.append(PsiKeyword.FALSE); + } + return; + } + buildSimplifiedExpression(expressions, tokenType.equals(JavaTokenType.XOR) ? "^" : "!=", negate, out); } - expressions.add(operand); - } - if (expressions.isEmpty()) { - if (negate) { - out.append(PsiKeyword.FALSE); + else if (tokenType.equals(JavaTokenType.EQEQ)) { + boolean negate = false; + for (PsiExpression operand : operands) { + if (evaluate(operand) == Boolean.TRUE) { + continue; + } + else if (evaluate(operand) == Boolean.FALSE) { + negate = !negate; + continue; + } + expressions.add(operand); + } + if (expressions.isEmpty()) { + if (negate) { + out.append(PsiKeyword.FALSE); + } + else { + out.append(PsiKeyword.TRUE); + } + return; + } + buildSimplifiedExpression(expressions, "==", negate, out); } else { - out.append(PsiKeyword.TRUE); + out.append(expression.getText()); } - return; - } - buildSimplifiedExpression(expressions, "==", negate, out); - } - else { - out.append(expression.getText()); } - } - private void buildSimplifiedExpression(List expressions, String token, boolean negate, StringBuilder out) { - if (expressions.size() == 1) { - final PsiExpression expression = expressions.get(0); - if (isBoxedTypeComparison(token, expression)) { - out.append(expression.getText()).append(" != null && "); - } - if (!negate) { - out.append(expression.getText()); - return; - } - if (ComparisonUtils.isComparison(expression)) { - final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)expression; - final String negatedComparison = ComparisonUtils.getNegatedComparison(binaryExpression.getOperationTokenType()); - final PsiExpression lhs = binaryExpression.getLOperand(); - final PsiExpression rhs = binaryExpression.getROperand(); - assert rhs != null; - out.append(lhs.getText()).append(negatedComparison).append(rhs.getText()); - } - else { - if (ParenthesesUtils.getPrecedence(expression) > ParenthesesUtils.PREFIX_PRECEDENCE) { - out.append("!(").append(expression.getText()).append(')'); + private void buildSimplifiedExpression(List expressions, String token, boolean negate, StringBuilder out) { + if (expressions.size() == 1) { + final PsiExpression expression = expressions.get(0); + if (isBoxedTypeComparison(token, expression)) { + out.append(expression.getText()).append(" != null && "); + } + if (!negate) { + out.append(expression.getText()); + return; + } + if (ComparisonUtils.isComparison(expression)) { + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression) expression; + final String negatedComparison = ComparisonUtils.getNegatedComparison(binaryExpression.getOperationTokenType()); + final PsiExpression lhs = binaryExpression.getLOperand(); + final PsiExpression rhs = binaryExpression.getROperand(); + assert rhs != null; + out.append(lhs.getText()).append(negatedComparison).append(rhs.getText()); + } + else { + if (ParenthesesUtils.getPrecedence(expression) > ParenthesesUtils.PREFIX_PRECEDENCE) { + out.append("!(").append(expression.getText()).append(')'); + } + else { + out.append('!').append(expression.getText()); + } + } } else { - out.append('!').append(expression.getText()); + if (negate) { + out.append("!("); + } + boolean useToken = false; + for (PsiExpression expression : expressions) { + if (useToken) { + out.append(token); + final PsiElement previousSibling = expression.getPrevSibling(); + if (previousSibling instanceof PsiWhiteSpace) { + out.append(previousSibling.getText()); + } + } + else { + useToken = true; + } + buildSimplifiedExpression(expression, out); + final PsiElement nextSibling = expression.getNextSibling(); + if (nextSibling instanceof PsiWhiteSpace) { + out.append(nextSibling.getText()); + } + } + if (negate) { + out.append(')'); + } } - } } - else { - if (negate) { - out.append("!("); - } - boolean useToken = false; - for (PsiExpression expression : expressions) { - if (useToken) { - out.append(token); - final PsiElement previousSibling = expression.getPrevSibling(); - if (previousSibling instanceof PsiWhiteSpace) { - out.append(previousSibling.getText()); - } - } - else { - useToken = true; - } - buildSimplifiedExpression(expression, out); - final PsiElement nextSibling = expression.getNextSibling(); - if (nextSibling instanceof PsiWhiteSpace) { - out.append(nextSibling.getText()); - } - } - if (negate) { - out.append(')'); - } - } - } - - private static boolean isBoxedTypeComparison(String token, PsiExpression expression) { - return ("==".equals(token) || "!=".equals(token)) && expression instanceof PsiReferenceExpression && expression.getType() instanceof PsiClassType; - } - private void buildSimplifiedPrefixExpression(PsiPrefixExpression expression, StringBuilder out) { - final PsiJavaToken sign = expression.getOperationSign(); - final IElementType tokenType = sign.getTokenType(); - final PsiExpression operand = expression.getOperand(); - if (JavaTokenType.EXCL.equals(tokenType)) { - final Boolean value = evaluate(operand); - if (value == Boolean.TRUE) { - out.append(PsiKeyword.FALSE); - return; - } - else if (value == Boolean.FALSE) { - out.append(PsiKeyword.TRUE); - return; - } + private static boolean isBoxedTypeComparison(String token, PsiExpression expression) { + return ("==".equals(token) || "!=".equals(token)) && expression instanceof PsiReferenceExpression && expression.getType() instanceof PsiClassType; } - buildSimplifiedExpression(operand, out.append(sign.getText())); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new PointlessBooleanExpressionFix(); - } - private class PointlessBooleanExpressionFix extends InspectionGadgetsFix { - - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix().get(); + private void buildSimplifiedPrefixExpression(PsiPrefixExpression expression, StringBuilder out) { + final PsiJavaToken sign = expression.getOperationSign(); + final IElementType tokenType = sign.getTokenType(); + final PsiExpression operand = expression.getOperand(); + if (JavaTokenType.EXCL.equals(tokenType)) { + final Boolean value = evaluate(operand); + if (value == Boolean.TRUE) { + out.append(PsiKeyword.FALSE); + return; + } + else if (value == Boolean.FALSE) { + out.append(PsiKeyword.TRUE); + return; + } + } + buildSimplifiedExpression(operand, out.append(sign.getText())); } @Override - public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - if (!(element instanceof PsiExpression)) { - return; - } - final PsiExpression expression = (PsiExpression)element; - replaceExpression(expression, buildSimplifiedExpression(expression, new StringBuilder()).toString()); + public InspectionGadgetsFix buildFix(Object... infos) { + return new PointlessBooleanExpressionFix(); } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new PointlessBooleanExpressionVisitor(); - } - private class PointlessBooleanExpressionVisitor extends BaseInspectionVisitor { + private class PointlessBooleanExpressionFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix(); + } - @Override - public void visitPolyadicExpression(PsiPolyadicExpression expression) { - super.visitPolyadicExpression(expression); - checkExpression(expression); + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + if (!(element instanceof PsiExpression)) { + return; + } + final PsiExpression expression = (PsiExpression) element; + replaceExpression(expression, buildSimplifiedExpression(expression, new StringBuilder()).toString()); + } } @Override - public void visitPrefixExpression(PsiPrefixExpression expression) { - super.visitPrefixExpression(expression); - checkExpression(expression); + public BaseInspectionVisitor buildVisitor() { + return new PointlessBooleanExpressionVisitor(); } - private void checkExpression(PsiExpression expression) { - if (!isPointlessBooleanExpression(expression)) { - return; - } - final PsiElement parent = ParenthesesUtils.getParentSkipParentheses(expression); - if (parent instanceof PsiExpression && isPointlessBooleanExpression((PsiExpression)parent)) { - return; - } - registerError(expression, expression); - } + private class PointlessBooleanExpressionVisitor extends BaseInspectionVisitor { - private boolean isPointlessBooleanExpression(PsiExpression expression) { - if (expression instanceof PsiPrefixExpression) { - return evaluate(expression) != null; - } - else if (expression instanceof PsiPolyadicExpression) { - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)expression; - final IElementType sign = polyadicExpression.getOperationTokenType(); - if (!booleanTokens.contains(sign)) { - return false; + @Override + public void visitPolyadicExpression(PsiPolyadicExpression expression) { + super.visitPolyadicExpression(expression); + checkExpression(expression); } - final PsiExpression[] operands = polyadicExpression.getOperands(); - boolean containsConstant = false; - for (PsiExpression operand : operands) { - if (operand == null) { - return false; - } - final PsiType type = operand.getType(); - if (type == null || !type.equals(PsiType.BOOLEAN) && !type.equalsToText(CommonClassNames.JAVA_LANG_BOOLEAN)) { - return false; - } - containsConstant |= (evaluate(operand) != null); + + @Override + public void visitPrefixExpression(PsiPrefixExpression expression) { + super.visitPrefixExpression(expression); + checkExpression(expression); } - if (!containsConstant) { - return false; + + private void checkExpression(PsiExpression expression) { + if (!isPointlessBooleanExpression(expression)) { + return; + } + final PsiElement parent = ParenthesesUtils.getParentSkipParentheses(expression); + if (parent instanceof PsiExpression && isPointlessBooleanExpression((PsiExpression) parent)) { + return; + } + registerError(expression, expression); } - return true; - } - return false; - } - } - @Nullable - private Boolean evaluate(@Nullable PsiExpression expression) { - if (expression == null || m_ignoreExpressionsContainingConstants && containsReference(expression)) { - return null; - } - if (expression instanceof PsiParenthesizedExpression) { - final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)expression; - return evaluate(parenthesizedExpression.getExpression()); + private boolean isPointlessBooleanExpression(PsiExpression expression) { + if (expression instanceof PsiPrefixExpression) { + return evaluate(expression) != null; + } + else if (expression instanceof PsiPolyadicExpression) { + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) expression; + final IElementType sign = polyadicExpression.getOperationTokenType(); + if (!booleanTokens.contains(sign)) { + return false; + } + final PsiExpression[] operands = polyadicExpression.getOperands(); + boolean containsConstant = false; + for (PsiExpression operand : operands) { + if (operand == null) { + return false; + } + final PsiType type = operand.getType(); + if (type == null || !type.equals(PsiType.BOOLEAN) && !type.equalsToText(CommonClassNames.JAVA_LANG_BOOLEAN)) { + return false; + } + containsConstant |= (evaluate(operand) != null); + } + if (!containsConstant) { + return false; + } + return true; + } + return false; + } } - else if (expression instanceof PsiPolyadicExpression) { - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)expression; - final IElementType tokenType = polyadicExpression.getOperationTokenType(); - if (tokenType.equals(JavaTokenType.OROR)) { - final PsiExpression[] operands = polyadicExpression.getOperands(); - for (PsiExpression operand : operands) { - if (evaluate(operand) == Boolean.TRUE) { - return Boolean.TRUE; - } + + @Nullable + private Boolean evaluate(@Nullable PsiExpression expression) { + if (expression == null || m_ignoreExpressionsContainingConstants && containsReference(expression)) { + return null; } - } - else if (tokenType.equals(JavaTokenType.ANDAND)) { - final PsiExpression[] operands = polyadicExpression.getOperands(); - for (PsiExpression operand : operands) { - if (evaluate(operand) == Boolean.FALSE) { - return Boolean.FALSE; - } + if (expression instanceof PsiParenthesizedExpression) { + final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression) expression; + return evaluate(parenthesizedExpression.getExpression()); } - } - } - else if (expression instanceof PsiPrefixExpression) { - final PsiPrefixExpression prefixExpression = (PsiPrefixExpression)expression; - final IElementType tokenType = prefixExpression.getOperationTokenType(); - if (JavaTokenType.EXCL.equals(tokenType)) { - final PsiExpression operand = prefixExpression.getOperand(); - final Boolean b = evaluate(operand); - if (b == Boolean.FALSE) { - return Boolean.TRUE; - } else if (b == Boolean.TRUE) { - return Boolean.FALSE; + else if (expression instanceof PsiPolyadicExpression) { + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) expression; + final IElementType tokenType = polyadicExpression.getOperationTokenType(); + if (tokenType.equals(JavaTokenType.OROR)) { + final PsiExpression[] operands = polyadicExpression.getOperands(); + for (PsiExpression operand : operands) { + if (evaluate(operand) == Boolean.TRUE) { + return Boolean.TRUE; + } + } + } + else if (tokenType.equals(JavaTokenType.ANDAND)) { + final PsiExpression[] operands = polyadicExpression.getOperands(); + for (PsiExpression operand : operands) { + if (evaluate(operand) == Boolean.FALSE) { + return Boolean.FALSE; + } + } + } } - } + else if (expression instanceof PsiPrefixExpression) { + final PsiPrefixExpression prefixExpression = (PsiPrefixExpression) expression; + final IElementType tokenType = prefixExpression.getOperationTokenType(); + if (JavaTokenType.EXCL.equals(tokenType)) { + final PsiExpression operand = prefixExpression.getOperand(); + final Boolean b = evaluate(operand); + if (b == Boolean.FALSE) { + return Boolean.TRUE; + } + else if (b == Boolean.TRUE) { + return Boolean.FALSE; + } + } + } + final Boolean value = (Boolean) ConstantExpressionUtil.computeCastTo(expression, PsiType.BOOLEAN); + return value != null ? value.booleanValue() : null; } - final Boolean value = (Boolean)ConstantExpressionUtil.computeCastTo(expression, PsiType.BOOLEAN); - return value != null ? value.booleanValue() : null; - } - private static boolean containsReference(@Nullable PsiExpression expression) { - if (expression == null) { - return false; + private static boolean containsReference(@Nullable PsiExpression expression) { + if (expression == null) { + return false; + } + final ReferenceVisitor visitor = new ReferenceVisitor(); + expression.accept(visitor); + return visitor.containsReference(); } - final ReferenceVisitor visitor = new ReferenceVisitor(); - expression.accept(visitor); - return visitor.containsReference(); - } - private static class ReferenceVisitor extends JavaRecursiveElementVisitor { + private static class ReferenceVisitor extends JavaRecursiveElementVisitor { - private boolean referenceFound = false; + private boolean referenceFound = false; - @Override - public void visitElement(PsiElement element) { - if (referenceFound) { - return; - } - super.visitElement(element); - } + @Override + public void visitElement(PsiElement element) { + if (referenceFound) { + return; + } + super.visitElement(element); + } - @Override - public void visitReferenceExpression(PsiReferenceExpression expression) { - final PsiElement target = expression.resolve(); - if (target instanceof PsiField && ExpressionUtils.isConstant((PsiField)target)) { - referenceFound = true; - } - else { - super.visitReferenceExpression(expression); - } - } + @Override + public void visitReferenceExpression(PsiReferenceExpression expression) { + final PsiElement target = expression.resolve(); + if (target instanceof PsiField && ExpressionUtils.isConstant((PsiField) target)) { + referenceFound = true; + } + else { + super.visitReferenceExpression(expression); + } + } - public boolean containsReference() { - return referenceFound; + public boolean containsReference() { + return referenceFound; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/PointlessIndexOfComparisonInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/PointlessIndexOfComparisonInspection.java index cb976f2e9b..92adabc712 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/PointlessIndexOfComparisonInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/PointlessIndexOfComparisonInspection.java @@ -24,149 +24,154 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.language.ast.IElementType; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class PointlessIndexOfComparisonInspection extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.pointlessIndexofComparisonDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - final PsiBinaryExpression expression = (PsiBinaryExpression)infos[0]; - final PsiExpression lhs = expression.getLOperand(); - final PsiJavaToken sign = expression.getOperationSign(); - final boolean value; - if (lhs instanceof PsiMethodCallExpression) { - value = createContainsExpressionValue(sign, false); - } - else { - value = createContainsExpressionValue(sign, true); - } - if (value) { - return InspectionGadgetsLocalize.pointlessIndexofComparisonAlwaysTrueProblemDescriptor().get(); - } - else { - return InspectionGadgetsLocalize.pointlessIndexofComparisonAlwaysFalseProblemDescriptor().get(); - } - } - - static boolean createContainsExpressionValue( - @Nonnull PsiJavaToken sign, boolean flipped) { - final IElementType tokenType = sign.getTokenType(); - if (tokenType.equals(JavaTokenType.EQEQ)) { - return false; - } - if (tokenType.equals(JavaTokenType.NE)) { - return true; - } - if (flipped) { - if (tokenType.equals(JavaTokenType.GT) || - tokenType.equals(JavaTokenType.GE)) { - return false; - } - } - else { - if (tokenType.equals(JavaTokenType.LT) || - tokenType.equals(JavaTokenType.LE)) { - return false; - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.pointlessIndexofComparisonDisplayName(); } - return true; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new PointlessIndexOfComparisonVisitor(); - } - - private static class PointlessIndexOfComparisonVisitor - extends BaseInspectionVisitor { @Override - public void visitBinaryExpression( - PsiBinaryExpression expression) { - super.visitBinaryExpression(expression); - final PsiExpression rhs = expression.getROperand(); - if (rhs == null) { - return; - } - if (!ComparisonUtils.isComparison(expression)) { - return; - } - final PsiExpression lhs = expression.getLOperand(); - if (lhs instanceof PsiMethodCallExpression) { + @Nonnull + protected String buildErrorString(Object... infos) { + final PsiBinaryExpression expression = (PsiBinaryExpression) infos[0]; + final PsiExpression lhs = expression.getLOperand(); final PsiJavaToken sign = expression.getOperationSign(); - if (isPointLess(lhs, sign, rhs, false)) { - registerError(expression, expression); + final boolean value; + if (lhs instanceof PsiMethodCallExpression) { + value = createContainsExpressionValue(sign, false); } - } - else if (rhs instanceof PsiMethodCallExpression) { - final PsiJavaToken sign = expression.getOperationSign(); - if (isPointLess(rhs, sign, lhs, true)) { - registerError(expression, expression); + else { + value = createContainsExpressionValue(sign, true); + } + if (value) { + return InspectionGadgetsLocalize.pointlessIndexofComparisonAlwaysTrueProblemDescriptor().get(); + } + else { + return InspectionGadgetsLocalize.pointlessIndexofComparisonAlwaysFalseProblemDescriptor().get(); } - } } - private static boolean isPointLess(PsiExpression lhs, PsiJavaToken sign, - PsiExpression rhs, boolean flipped) { - final PsiMethodCallExpression callExpression = - (PsiMethodCallExpression)lhs; - if (!isIndexOfCall(callExpression)) { - return false; - } - final Object object = - ExpressionUtils.computeConstantExpression(rhs); - if (!(object instanceof Integer)) { - return false; - } - final Integer integer = (Integer)object; - final int constant = integer.intValue(); - final IElementType tokenType = sign.getTokenType(); - if (tokenType == null) { - return false; - } - if (flipped) { - if (constant < 0 && (tokenType.equals(JavaTokenType.GT) || - tokenType.equals(JavaTokenType.LE))) { - return true; + static boolean createContainsExpressionValue( + @Nonnull PsiJavaToken sign, boolean flipped + ) { + final IElementType tokenType = sign.getTokenType(); + if (tokenType.equals(JavaTokenType.EQEQ)) { + return false; } - else if (constant < -1 && - (tokenType.equals(JavaTokenType.GE) || - tokenType.equals(JavaTokenType.LT) || - tokenType.equals(JavaTokenType.NE) || - tokenType.equals(JavaTokenType.EQEQ))) { - return true; + if (tokenType.equals(JavaTokenType.NE)) { + return true; } - } - else { - if (constant < 0 && (tokenType.equals(JavaTokenType.LT) || - tokenType.equals(JavaTokenType.GE))) { - return true; + if (flipped) { + if (tokenType.equals(JavaTokenType.GT) || + tokenType.equals(JavaTokenType.GE)) { + return false; + } } - else if (constant < -1 && - (tokenType.equals(JavaTokenType.LE) || - tokenType.equals(JavaTokenType.GT) || - tokenType.equals(JavaTokenType.NE) || - tokenType.equals(JavaTokenType.EQEQ))) { - return true; + else { + if (tokenType.equals(JavaTokenType.LT) || + tokenType.equals(JavaTokenType.LE)) { + return false; + } } - } - return false; + return true; + } + + @Override + public BaseInspectionVisitor buildVisitor() { + return new PointlessIndexOfComparisonVisitor(); } - private static boolean isIndexOfCall( - @Nonnull PsiMethodCallExpression expression) { - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - return HardcodedMethodConstants.INDEX_OF.equals(methodName); + private static class PointlessIndexOfComparisonVisitor + extends BaseInspectionVisitor { + + @Override + public void visitBinaryExpression( + PsiBinaryExpression expression + ) { + super.visitBinaryExpression(expression); + final PsiExpression rhs = expression.getROperand(); + if (rhs == null) { + return; + } + if (!ComparisonUtils.isComparison(expression)) { + return; + } + final PsiExpression lhs = expression.getLOperand(); + if (lhs instanceof PsiMethodCallExpression) { + final PsiJavaToken sign = expression.getOperationSign(); + if (isPointLess(lhs, sign, rhs, false)) { + registerError(expression, expression); + } + } + else if (rhs instanceof PsiMethodCallExpression) { + final PsiJavaToken sign = expression.getOperationSign(); + if (isPointLess(rhs, sign, lhs, true)) { + registerError(expression, expression); + } + } + } + + private static boolean isPointLess( + PsiExpression lhs, PsiJavaToken sign, + PsiExpression rhs, boolean flipped + ) { + final PsiMethodCallExpression callExpression = + (PsiMethodCallExpression) lhs; + if (!isIndexOfCall(callExpression)) { + return false; + } + final Object object = + ExpressionUtils.computeConstantExpression(rhs); + if (!(object instanceof Integer)) { + return false; + } + final Integer integer = (Integer) object; + final int constant = integer.intValue(); + final IElementType tokenType = sign.getTokenType(); + if (tokenType == null) { + return false; + } + if (flipped) { + if (constant < 0 && (tokenType.equals(JavaTokenType.GT) || + tokenType.equals(JavaTokenType.LE))) { + return true; + } + else if (constant < -1 && + (tokenType.equals(JavaTokenType.GE) || + tokenType.equals(JavaTokenType.LT) || + tokenType.equals(JavaTokenType.NE) || + tokenType.equals(JavaTokenType.EQEQ))) { + return true; + } + } + else { + if (constant < 0 && (tokenType.equals(JavaTokenType.LT) || + tokenType.equals(JavaTokenType.GE))) { + return true; + } + else if (constant < -1 && + (tokenType.equals(JavaTokenType.LE) || + tokenType.equals(JavaTokenType.GT) || + tokenType.equals(JavaTokenType.NE) || + tokenType.equals(JavaTokenType.EQEQ))) { + return true; + } + } + return false; + } + + private static boolean isIndexOfCall( + @Nonnull PsiMethodCallExpression expression + ) { + final PsiReferenceExpression methodExpression = + expression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + return HardcodedMethodConstants.INDEX_OF.equals(methodName); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/PointlessNullCheckInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/PointlessNullCheckInspection.java index ad7eb27790..24b0934fde 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/PointlessNullCheckInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/PointlessNullCheckInspection.java @@ -26,10 +26,10 @@ import consulo.language.editor.inspection.ProblemDescriptor; import consulo.language.psi.PsiElement; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; -import org.jetbrains.annotations.Nls; /** * This inspection finds instances of null checks followed by an instanceof check @@ -45,200 +45,199 @@ */ @ExtensionImpl public class PointlessNullCheckInspection extends BaseInspection { - @Nls - @Nonnull - @Override - public String getDisplayName() { - return InspectionGadgetsLocalize.pointlessNullcheckDisplayName().get(); - } - - @Nonnull - @Override - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.pointlessNullcheckProblemDescriptor().get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new PointlessNullCheckVisitor(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - final PsiExpression expression = (PsiExpression)infos[0]; - return new PointlessNullCheckFix(expression.getText()); - } - - private static class PointlessNullCheckFix extends InspectionGadgetsFix { - - private final String myExpressionText; + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.pointlessNullcheckDisplayName(); + } - public PointlessNullCheckFix(String expressionText) { - myExpressionText = expressionText; + @Nonnull + @Override + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.pointlessNullcheckProblemDescriptor().get(); } @Override - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.pointlessNullcheckSimplifyQuickfix(myExpressionText).get(); + public BaseInspectionVisitor buildVisitor() { + return new PointlessNullCheckVisitor(); } @Override - public void doFix(Project project, ProblemDescriptor descriptor) { - final PsiElement element = descriptor.getPsiElement(); - final PsiBinaryExpression binaryExpression = PsiTreeUtil.getParentOfType(element, PsiBinaryExpression.class); - if (binaryExpression == null) { - return; - } - final PsiExpression lhs = binaryExpression.getLOperand(); - final PsiExpression rhs = binaryExpression.getROperand(); - if (rhs == null) { - return; - } - if (PsiTreeUtil.isAncestor(rhs, element, false)) { - replaceExpression(binaryExpression, lhs.getText()); - } - else if (PsiTreeUtil.isAncestor(lhs, element, false)) { - replaceExpression(binaryExpression, rhs.getText()); - } + public InspectionGadgetsFix buildFix(Object... infos) { + final PsiExpression expression = (PsiExpression) infos[0]; + return new PointlessNullCheckFix(expression.getText()); } - } - private static class PointlessNullCheckVisitor extends BaseInspectionVisitor { + private static class PointlessNullCheckFix extends InspectionGadgetsFix { + private final String myExpressionText; - @Override - public void visitBinaryExpression(PsiBinaryExpression expression) { - super.visitBinaryExpression(expression); - final IElementType operationTokenType = expression.getOperationTokenType(); - final PsiExpression lhs = ParenthesesUtils.stripParentheses(expression.getLOperand()); - final PsiExpression rhs = ParenthesesUtils.stripParentheses(expression.getROperand()); - final PsiBinaryExpression binaryExpression; - final PsiExpression possibleInstanceofExpression; - if (operationTokenType.equals(JavaTokenType.ANDAND)) { - if (lhs instanceof PsiBinaryExpression) { - binaryExpression = (PsiBinaryExpression)lhs; - possibleInstanceofExpression = rhs; - } - else if (rhs instanceof PsiBinaryExpression) { - binaryExpression = (PsiBinaryExpression)rhs; - possibleInstanceofExpression = lhs; - } - else { - return; + public PointlessNullCheckFix(String expressionText) { + myExpressionText = expressionText; } - final IElementType tokenType = binaryExpression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.NE)) { - return; - } - } - else if (operationTokenType.equals(JavaTokenType.OROR)) { - if (lhs instanceof PsiBinaryExpression && rhs instanceof PsiPrefixExpression) { - final PsiPrefixExpression prefixExpression = (PsiPrefixExpression)rhs; - final IElementType prefixTokenType = prefixExpression.getOperationTokenType(); - if (!JavaTokenType.EXCL.equals(prefixTokenType)) { - return; - } - binaryExpression = (PsiBinaryExpression)lhs; - possibleInstanceofExpression = ParenthesesUtils.stripParentheses(prefixExpression.getOperand()); - } - else if (rhs instanceof PsiBinaryExpression && lhs instanceof PsiPrefixExpression) { - final PsiPrefixExpression prefixExpression = (PsiPrefixExpression)lhs; - final IElementType prefixTokenType = prefixExpression.getOperationTokenType(); - if (!JavaTokenType.EXCL.equals(prefixTokenType)) { - return; - } - binaryExpression = (PsiBinaryExpression)rhs; - possibleInstanceofExpression = ParenthesesUtils.stripParentheses(prefixExpression.getOperand()); - } - else { - return; - } - final IElementType tokenType = binaryExpression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.EQEQ)) { - return; - } - } - else { - return; - } - final PsiReferenceExpression referenceExpression1 = getReferenceFromNullCheck(binaryExpression); - if (referenceExpression1 == null) { - return; - } - final PsiReferenceExpression referenceExpression2 = getReferenceFromInstanceofExpression(possibleInstanceofExpression); - if (!referencesEqual(referenceExpression1, referenceExpression2)) { - return; - } - registerError(binaryExpression, binaryExpression); - } - @Nullable - private static PsiReferenceExpression getReferenceFromNullCheck(PsiBinaryExpression expression) { - final PsiExpression lhs = ParenthesesUtils.stripParentheses(expression.getLOperand()); - final PsiExpression rhs = ParenthesesUtils.stripParentheses(expression.getROperand()); - if (lhs instanceof PsiReferenceExpression) { - if (!(rhs instanceof PsiLiteralExpression && PsiType.NULL.equals(rhs.getType()))) { - return null; + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.pointlessNullcheckSimplifyQuickfix(myExpressionText); } - return (PsiReferenceExpression)lhs; - } - else if (rhs instanceof PsiReferenceExpression) { - if (!(lhs instanceof PsiLiteralExpression && PsiType.NULL.equals(lhs.getType()))) { - return null; + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) { + final PsiElement element = descriptor.getPsiElement(); + final PsiBinaryExpression binaryExpression = PsiTreeUtil.getParentOfType(element, PsiBinaryExpression.class); + if (binaryExpression == null) { + return; + } + final PsiExpression lhs = binaryExpression.getLOperand(); + final PsiExpression rhs = binaryExpression.getROperand(); + if (rhs == null) { + return; + } + if (PsiTreeUtil.isAncestor(rhs, element, false)) { + replaceExpression(binaryExpression, lhs.getText()); + } + else if (PsiTreeUtil.isAncestor(lhs, element, false)) { + replaceExpression(binaryExpression, rhs.getText()); + } } - return (PsiReferenceExpression)rhs; - } - else { - return null; - } } - @Nullable - private static PsiReferenceExpression getReferenceFromInstanceofExpression(PsiExpression expression) { - if (expression instanceof PsiParenthesizedExpression) { - final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)expression; - return getReferenceFromInstanceofExpression(parenthesizedExpression.getExpression()); - } - else if (expression instanceof PsiInstanceOfExpression) { - final PsiInstanceOfExpression instanceOfExpression = (PsiInstanceOfExpression)expression; - final PsiExpression operand = ParenthesesUtils.stripParentheses(instanceOfExpression.getOperand()); - if (!(operand instanceof PsiReferenceExpression)) { - return null; - } - return (PsiReferenceExpression)operand; - } - else if (expression instanceof PsiPolyadicExpression) { - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)expression; - final IElementType tokenType = polyadicExpression.getOperationTokenType(); - if (JavaTokenType.OROR != tokenType) { - return null; + private static class PointlessNullCheckVisitor extends BaseInspectionVisitor { + + @Override + public void visitBinaryExpression(PsiBinaryExpression expression) { + super.visitBinaryExpression(expression); + final IElementType operationTokenType = expression.getOperationTokenType(); + final PsiExpression lhs = ParenthesesUtils.stripParentheses(expression.getLOperand()); + final PsiExpression rhs = ParenthesesUtils.stripParentheses(expression.getROperand()); + final PsiBinaryExpression binaryExpression; + final PsiExpression possibleInstanceofExpression; + if (operationTokenType.equals(JavaTokenType.ANDAND)) { + if (lhs instanceof PsiBinaryExpression) { + binaryExpression = (PsiBinaryExpression) lhs; + possibleInstanceofExpression = rhs; + } + else if (rhs instanceof PsiBinaryExpression) { + binaryExpression = (PsiBinaryExpression) rhs; + possibleInstanceofExpression = lhs; + } + else { + return; + } + final IElementType tokenType = binaryExpression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.NE)) { + return; + } + } + else if (operationTokenType.equals(JavaTokenType.OROR)) { + if (lhs instanceof PsiBinaryExpression && rhs instanceof PsiPrefixExpression) { + final PsiPrefixExpression prefixExpression = (PsiPrefixExpression) rhs; + final IElementType prefixTokenType = prefixExpression.getOperationTokenType(); + if (!JavaTokenType.EXCL.equals(prefixTokenType)) { + return; + } + binaryExpression = (PsiBinaryExpression) lhs; + possibleInstanceofExpression = ParenthesesUtils.stripParentheses(prefixExpression.getOperand()); + } + else if (rhs instanceof PsiBinaryExpression && lhs instanceof PsiPrefixExpression) { + final PsiPrefixExpression prefixExpression = (PsiPrefixExpression) lhs; + final IElementType prefixTokenType = prefixExpression.getOperationTokenType(); + if (!JavaTokenType.EXCL.equals(prefixTokenType)) { + return; + } + binaryExpression = (PsiBinaryExpression) rhs; + possibleInstanceofExpression = ParenthesesUtils.stripParentheses(prefixExpression.getOperand()); + } + else { + return; + } + final IElementType tokenType = binaryExpression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.EQEQ)) { + return; + } + } + else { + return; + } + final PsiReferenceExpression referenceExpression1 = getReferenceFromNullCheck(binaryExpression); + if (referenceExpression1 == null) { + return; + } + final PsiReferenceExpression referenceExpression2 = getReferenceFromInstanceofExpression(possibleInstanceofExpression); + if (!referencesEqual(referenceExpression1, referenceExpression2)) { + return; + } + registerError(binaryExpression, binaryExpression); } - final PsiExpression[] operands = polyadicExpression.getOperands(); - final PsiReferenceExpression referenceExpression = getReferenceFromInstanceofExpression(operands[0]); - if (referenceExpression == null) { - return null; + + @Nullable + private static PsiReferenceExpression getReferenceFromNullCheck(PsiBinaryExpression expression) { + final PsiExpression lhs = ParenthesesUtils.stripParentheses(expression.getLOperand()); + final PsiExpression rhs = ParenthesesUtils.stripParentheses(expression.getROperand()); + if (lhs instanceof PsiReferenceExpression) { + if (!(rhs instanceof PsiLiteralExpression && PsiType.NULL.equals(rhs.getType()))) { + return null; + } + return (PsiReferenceExpression) lhs; + } + else if (rhs instanceof PsiReferenceExpression) { + if (!(lhs instanceof PsiLiteralExpression && PsiType.NULL.equals(lhs.getType()))) { + return null; + } + return (PsiReferenceExpression) rhs; + } + else { + return null; + } } - for (int i = 1, operandsLength = operands.length; i < operandsLength; i++) { - if (!referencesEqual(referenceExpression, getReferenceFromInstanceofExpression(operands[i]))) { - return null; - } + + @Nullable + private static PsiReferenceExpression getReferenceFromInstanceofExpression(PsiExpression expression) { + if (expression instanceof PsiParenthesizedExpression) { + final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression) expression; + return getReferenceFromInstanceofExpression(parenthesizedExpression.getExpression()); + } + else if (expression instanceof PsiInstanceOfExpression) { + final PsiInstanceOfExpression instanceOfExpression = (PsiInstanceOfExpression) expression; + final PsiExpression operand = ParenthesesUtils.stripParentheses(instanceOfExpression.getOperand()); + if (!(operand instanceof PsiReferenceExpression)) { + return null; + } + return (PsiReferenceExpression) operand; + } + else if (expression instanceof PsiPolyadicExpression) { + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) expression; + final IElementType tokenType = polyadicExpression.getOperationTokenType(); + if (JavaTokenType.OROR != tokenType) { + return null; + } + final PsiExpression[] operands = polyadicExpression.getOperands(); + final PsiReferenceExpression referenceExpression = getReferenceFromInstanceofExpression(operands[0]); + if (referenceExpression == null) { + return null; + } + for (int i = 1, operandsLength = operands.length; i < operandsLength; i++) { + if (!referencesEqual(referenceExpression, getReferenceFromInstanceofExpression(operands[i]))) { + return null; + } + } + return referenceExpression; + } + else { + return null; + } } - return referenceExpression; - } else { - return null; - } } - } - private static boolean referencesEqual(PsiReferenceExpression reference1, PsiReferenceExpression reference2) { - if (reference1 == null || reference2 == null) { - return false; - } - final PsiElement target1 = reference1.resolve(); - if (target1 == null) { - return false; + private static boolean referencesEqual(PsiReferenceExpression reference1, PsiReferenceExpression reference2) { + if (reference1 == null || reference2 == null) { + return false; + } + final PsiElement target1 = reference1.resolve(); + if (target1 == null) { + return false; + } + final PsiElement target2 = reference2.resolve(); + return target1.equals(target2); } - final PsiElement target2 = reference2.resolve(); - return target1.equals(target2); - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SimplifiableConditionalExpressionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SimplifiableConditionalExpressionInspection.java index 71852cb58b..c7134653aa 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SimplifiableConditionalExpressionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SimplifiableConditionalExpressionInspection.java @@ -27,154 +27,158 @@ import consulo.annotation.component.ExtensionImpl; import consulo.language.editor.inspection.ProblemDescriptor; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; import org.jetbrains.annotations.NonNls; @ExtensionImpl -public class SimplifiableConditionalExpressionInspection - extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.simplifiableConditionalExpressionDisplayName().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final PsiConditionalExpression expression = (PsiConditionalExpression)infos[0]; - return InspectionGadgetsLocalize.simplifiableConditionalExpressionProblemDescriptor(calculateReplacementExpression(expression)).get(); - } +public class SimplifiableConditionalExpressionInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.simplifiableConditionalExpressionDisplayName(); + } - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new SimplifiableConditionalFix(); - } + @Override + public boolean isEnabledByDefault() { + return true; + } - private static class SimplifiableConditionalFix extends InspectionGadgetsFix { + @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix().get(); + public String buildErrorString(Object... infos) { + final PsiConditionalExpression expression = (PsiConditionalExpression) infos[0]; + return InspectionGadgetsLocalize.simplifiableConditionalExpressionProblemDescriptor( + calculateReplacementExpression(expression) + ).get(); } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiConditionalExpression expression = (PsiConditionalExpression)descriptor.getPsiElement(); - final String newExpression = calculateReplacementExpression(expression); - replaceExpression(expression, newExpression); + public InspectionGadgetsFix buildFix(Object... infos) { + return new SimplifiableConditionalFix(); } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new SimplifiableConditionalExpressionVisitor(); - } - @NonNls - static String calculateReplacementExpression( - PsiConditionalExpression expression) { - final PsiExpression thenExpression = expression.getThenExpression(); - final PsiExpression elseExpression = expression.getElseExpression(); - final PsiExpression condition = expression.getCondition(); - assert thenExpression != null; - assert elseExpression != null; + private static class SimplifiableConditionalFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix(); + } - final String elseText = elseExpression.getText(); - String conditionText = condition.getText(); - if (BoolUtils.isTrue(thenExpression)) { - @NonNls final String elseExpressionText; - if (ParenthesesUtils.getPrecedence(elseExpression) > - ParenthesesUtils.OR_PRECEDENCE) { - elseExpressionText = '(' + elseText + ')'; - } - else { - elseExpressionText = elseText; - } - if (ParenthesesUtils.getPrecedence(condition) > ParenthesesUtils.OR_PRECEDENCE) { - conditionText = "(" + conditionText + ")"; - } - return conditionText + " || " + elseExpressionText; + @Override + public void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiConditionalExpression expression = (PsiConditionalExpression) descriptor.getPsiElement(); + final String newExpression = calculateReplacementExpression(expression); + replaceExpression(expression, newExpression); + } } - else if (BoolUtils.isFalse(thenExpression)) { - @NonNls final String elseExpressionText; - if (ParenthesesUtils.getPrecedence(elseExpression) > - ParenthesesUtils.AND_PRECEDENCE) { - elseExpressionText = '(' + elseText + ')'; - } - else { - elseExpressionText = elseText; - } - return BoolUtils.getNegatedExpressionText(condition) + " && " + - elseExpressionText; - } - final String thenText = thenExpression.getText(); - if (BoolUtils.isFalse(elseExpression)) { - @NonNls final String thenExpressionText; - if (ParenthesesUtils.getPrecedence(thenExpression) > - ParenthesesUtils.AND_PRECEDENCE) { - thenExpressionText = '(' + thenText + ')'; - } - else { - thenExpressionText = thenText; - } - if (ParenthesesUtils.getPrecedence(condition) > ParenthesesUtils.AND_PRECEDENCE) { - conditionText = "(" + conditionText + ")"; - } - return conditionText + " && " + thenExpressionText; + + @Override + public BaseInspectionVisitor buildVisitor() { + return new SimplifiableConditionalExpressionVisitor(); } - else { - @NonNls final String thenExpressionText; - if (ParenthesesUtils.getPrecedence(thenExpression) > - ParenthesesUtils.OR_PRECEDENCE) { - thenExpressionText = '(' + thenText + ')'; - } - else { - thenExpressionText = thenText; - } - return BoolUtils.getNegatedExpressionText(condition) + " || " + - thenExpressionText; + + @NonNls + static String calculateReplacementExpression( + PsiConditionalExpression expression + ) { + final PsiExpression thenExpression = expression.getThenExpression(); + final PsiExpression elseExpression = expression.getElseExpression(); + final PsiExpression condition = expression.getCondition(); + assert thenExpression != null; + assert elseExpression != null; + + final String elseText = elseExpression.getText(); + String conditionText = condition.getText(); + if (BoolUtils.isTrue(thenExpression)) { + @NonNls final String elseExpressionText; + if (ParenthesesUtils.getPrecedence(elseExpression) > + ParenthesesUtils.OR_PRECEDENCE) { + elseExpressionText = '(' + elseText + ')'; + } + else { + elseExpressionText = elseText; + } + if (ParenthesesUtils.getPrecedence(condition) > ParenthesesUtils.OR_PRECEDENCE) { + conditionText = "(" + conditionText + ")"; + } + return conditionText + " || " + elseExpressionText; + } + else if (BoolUtils.isFalse(thenExpression)) { + @NonNls final String elseExpressionText; + if (ParenthesesUtils.getPrecedence(elseExpression) > + ParenthesesUtils.AND_PRECEDENCE) { + elseExpressionText = '(' + elseText + ')'; + } + else { + elseExpressionText = elseText; + } + return BoolUtils.getNegatedExpressionText(condition) + " && " + + elseExpressionText; + } + final String thenText = thenExpression.getText(); + if (BoolUtils.isFalse(elseExpression)) { + @NonNls final String thenExpressionText; + if (ParenthesesUtils.getPrecedence(thenExpression) > + ParenthesesUtils.AND_PRECEDENCE) { + thenExpressionText = '(' + thenText + ')'; + } + else { + thenExpressionText = thenText; + } + if (ParenthesesUtils.getPrecedence(condition) > ParenthesesUtils.AND_PRECEDENCE) { + conditionText = "(" + conditionText + ")"; + } + return conditionText + " && " + thenExpressionText; + } + else { + @NonNls final String thenExpressionText; + if (ParenthesesUtils.getPrecedence(thenExpression) > + ParenthesesUtils.OR_PRECEDENCE) { + thenExpressionText = '(' + thenText + ')'; + } + else { + thenExpressionText = thenText; + } + return BoolUtils.getNegatedExpressionText(condition) + " || " + + thenExpressionText; + } } - } - private static class SimplifiableConditionalExpressionVisitor - extends BaseInspectionVisitor { + private static class SimplifiableConditionalExpressionVisitor + extends BaseInspectionVisitor { - @Override - public void visitConditionalExpression( - PsiConditionalExpression expression) { - super.visitConditionalExpression(expression); - final PsiExpression thenExpression = expression.getThenExpression(); - if (thenExpression == null) { - return; - } - final PsiType thenType = thenExpression.getType(); - if (!PsiType.BOOLEAN.equals(thenType)) { - return; - } - final PsiExpression elseExpression = expression.getElseExpression(); - if (elseExpression == null) { - return; - } - final PsiType elseType = elseExpression.getType(); - if (!PsiType.BOOLEAN.equals(elseType)) { - return; - } - final boolean thenConstant = BoolUtils.isFalse(thenExpression) || - BoolUtils.isTrue(thenExpression); - final boolean elseConstant = BoolUtils.isFalse(elseExpression) || - BoolUtils.isTrue(elseExpression); - if (thenConstant == elseConstant) { - return; - } - registerError(expression, expression); + @Override + public void visitConditionalExpression( + PsiConditionalExpression expression + ) { + super.visitConditionalExpression(expression); + final PsiExpression thenExpression = expression.getThenExpression(); + if (thenExpression == null) { + return; + } + final PsiType thenType = thenExpression.getType(); + if (!PsiType.BOOLEAN.equals(thenType)) { + return; + } + final PsiExpression elseExpression = expression.getElseExpression(); + if (elseExpression == null) { + return; + } + final PsiType elseType = elseExpression.getType(); + if (!PsiType.BOOLEAN.equals(elseType)) { + return; + } + final boolean thenConstant = BoolUtils.isFalse(thenExpression) || + BoolUtils.isTrue(thenExpression); + final boolean elseConstant = BoolUtils.isFalse(elseExpression) || + BoolUtils.isTrue(elseExpression); + if (thenConstant == elseConstant) { + return; + } + registerError(expression, expression); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SimplifiableEqualsExpressionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SimplifiableEqualsExpressionInspection.java index ff83e0b4da..aecd420061 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SimplifiableEqualsExpressionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SimplifiableEqualsExpressionInspection.java @@ -28,267 +28,266 @@ import consulo.language.ast.IElementType; import consulo.language.editor.inspection.ProblemDescriptor; import consulo.language.psi.PsiElement; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; -import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; @ExtensionImpl public class SimplifiableEqualsExpressionInspection extends BaseInspection { - @Nls - @Nonnull - @Override - public String getDisplayName() { - return InspectionGadgetsLocalize.simplifiableEqualsExpressionDisplayName().get(); - } - - @Nonnull - @Override - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.simplifiableEqualsExpressionProblemDescriptor(infos[0]).get(); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new SimplifiableEqualsExpressionFix((String)infos[0]); - } - - private static class SimplifiableEqualsExpressionFix extends InspectionGadgetsFix { - - private final String myMethodName; - - public SimplifiableEqualsExpressionFix(String methodName) { - myMethodName = methodName; + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.simplifiableEqualsExpressionDisplayName(); } @Nonnull @Override - public String getName() { - return InspectionGadgetsLocalize.simplifiableEqualsExpressionQuickfix(myMethodName).get(); + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.simplifiableEqualsExpressionProblemDescriptor(infos[0]).get(); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) { - final PsiElement element = descriptor.getPsiElement(); - final PsiElement parent = ParenthesesUtils.getParentSkipParentheses(element); - if (!(parent instanceof PsiPolyadicExpression)) { - return; - } - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)parent; - final PsiExpression[] operands = polyadicExpression.getOperands(); - if (operands.length != 2) { - return; - } - PsiExpression operand = ParenthesesUtils.stripParentheses(operands[1]); - @NonNls final StringBuilder newExpressionText = new StringBuilder(); - if (operand instanceof PsiPrefixExpression) { - final PsiPrefixExpression prefixExpression = (PsiPrefixExpression)operand; - if (!JavaTokenType.EXCL.equals(prefixExpression.getOperationTokenType())) { - return; - } - newExpressionText.append('!'); - operand = ParenthesesUtils.stripParentheses(prefixExpression.getOperand()); - } - if (!(operand instanceof PsiMethodCallExpression)) { - return; - } - final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)operand; - final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); - final String referenceName = methodExpression.getReferenceName(); - final PsiExpression qualifier = methodExpression.getQualifierExpression(); - if (qualifier == null) { - return; - } - final PsiExpressionList argumentList = methodCallExpression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 1) { - return; - } - final PsiExpression argument = arguments[0]; - final PsiType type = argument.getType(); - if (PsiType.BOOLEAN.equals(type)) { - final Object value = ExpressionUtils.computeConstantExpression(argument); - if (Boolean.TRUE.equals(value)) { - newExpressionText.append("java.lang.Boolean.TRUE"); - } - else if (Boolean.FALSE.equals(value)) { - newExpressionText.append("java.lang.Boolean.FALSE"); - } - else { - newExpressionText.append("java.lang.Boolean.valueOf(").append(argument.getText()).append(')'); - } - } - else if (PsiType.BYTE.equals(type)) { - newExpressionText.append("java.lang.Byte.valueOf(").append(argument.getText()).append(')'); - } - else if (PsiType.SHORT.equals(type)) { - newExpressionText.append("java.lang.Short.valueOf(").append(argument.getText()).append(')'); - } - else if (PsiType.INT.equals(type)) { - newExpressionText.append("java.lang.Integer.valueOf(").append(argument.getText()).append(')'); - } - else if (PsiType.LONG.equals(type)) { - newExpressionText.append("java.lang.Long.valueOf(").append(argument.getText()).append(')'); - } - else if (PsiType.FLOAT.equals(type)) { - newExpressionText.append("java.lang.Float.valueOf(").append(argument.getText()).append(')'); - } - else if (PsiType.DOUBLE.equals(type)) { - newExpressionText.append("java.lang.Double.valueOf(").append(argument.getText()).append(')'); - } - else { - newExpressionText.append(argument.getText()); - } - newExpressionText.append('.').append(referenceName).append('(').append(qualifier.getText()).append(')'); - replaceExpression(polyadicExpression, newExpressionText.toString()); + protected InspectionGadgetsFix buildFix(Object... infos) { + return new SimplifiableEqualsExpressionFix((String) infos[0]); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new SimplifiableEqualsExpressionVisitor(); - } + private static class SimplifiableEqualsExpressionFix extends InspectionGadgetsFix { - private static class SimplifiableEqualsExpressionVisitor extends BaseInspectionVisitor { + private final String myMethodName; - @Override - public void visitPolyadicExpression(PsiPolyadicExpression expression) { - super.visitPolyadicExpression(expression); - final IElementType tokenType = expression.getOperationTokenType(); - if (JavaTokenType.ANDAND.equals(tokenType)) { - final PsiExpression[] operands = expression.getOperands(); - if (operands.length != 2) { - return; - } - final PsiExpression lhs = ParenthesesUtils.stripParentheses(operands[0]); - if (lhs == null) { - return; - } - final PsiVariable variable = getVariableFromNullComparison(lhs, false); - if (variable == null) { - return; + public SimplifiableEqualsExpressionFix(String methodName) { + myMethodName = methodName; } - final PsiExpression rhs = ParenthesesUtils.stripParentheses(operands[1]); - if (!isEqualsConstant(rhs, variable)) { - return; - } - registerError(lhs, getMethodName((PsiMethodCallExpression)rhs)); - } - else if (JavaTokenType.OROR.equals(tokenType)) { - final PsiExpression[] operands = expression.getOperands(); - if (operands.length != 2) { - return; - } - final PsiExpression lhs = ParenthesesUtils.stripParentheses(operands[0]); - if (lhs == null) { - return; - } - final PsiVariable variable = getVariableFromNullComparison(lhs, true); - if (variable == null) { - return; - } - final PsiExpression rhs = ParenthesesUtils.stripParentheses(operands[1]); - if (!(rhs instanceof PsiPrefixExpression)) { - return; - } - final PsiPrefixExpression prefixExpression = (PsiPrefixExpression)rhs; - if (!JavaTokenType.EXCL.equals(prefixExpression.getOperationTokenType())) { - return; + + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.simplifiableEqualsExpressionQuickfix(myMethodName); } - final PsiExpression operand = ParenthesesUtils.stripParentheses(prefixExpression.getOperand()); - if (!isEqualsConstant(operand, variable)) { - return; + + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) { + final PsiElement element = descriptor.getPsiElement(); + final PsiElement parent = ParenthesesUtils.getParentSkipParentheses(element); + if (!(parent instanceof PsiPolyadicExpression)) { + return; + } + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) parent; + final PsiExpression[] operands = polyadicExpression.getOperands(); + if (operands.length != 2) { + return; + } + PsiExpression operand = ParenthesesUtils.stripParentheses(operands[1]); + @NonNls final StringBuilder newExpressionText = new StringBuilder(); + if (operand instanceof PsiPrefixExpression) { + final PsiPrefixExpression prefixExpression = (PsiPrefixExpression) operand; + if (!JavaTokenType.EXCL.equals(prefixExpression.getOperationTokenType())) { + return; + } + newExpressionText.append('!'); + operand = ParenthesesUtils.stripParentheses(prefixExpression.getOperand()); + } + if (!(operand instanceof PsiMethodCallExpression)) { + return; + } + final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression) operand; + final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); + final String referenceName = methodExpression.getReferenceName(); + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (qualifier == null) { + return; + } + final PsiExpressionList argumentList = methodCallExpression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 1) { + return; + } + final PsiExpression argument = arguments[0]; + final PsiType type = argument.getType(); + if (PsiType.BOOLEAN.equals(type)) { + final Object value = ExpressionUtils.computeConstantExpression(argument); + if (Boolean.TRUE.equals(value)) { + newExpressionText.append("java.lang.Boolean.TRUE"); + } + else if (Boolean.FALSE.equals(value)) { + newExpressionText.append("java.lang.Boolean.FALSE"); + } + else { + newExpressionText.append("java.lang.Boolean.valueOf(").append(argument.getText()).append(')'); + } + } + else if (PsiType.BYTE.equals(type)) { + newExpressionText.append("java.lang.Byte.valueOf(").append(argument.getText()).append(')'); + } + else if (PsiType.SHORT.equals(type)) { + newExpressionText.append("java.lang.Short.valueOf(").append(argument.getText()).append(')'); + } + else if (PsiType.INT.equals(type)) { + newExpressionText.append("java.lang.Integer.valueOf(").append(argument.getText()).append(')'); + } + else if (PsiType.LONG.equals(type)) { + newExpressionText.append("java.lang.Long.valueOf(").append(argument.getText()).append(')'); + } + else if (PsiType.FLOAT.equals(type)) { + newExpressionText.append("java.lang.Float.valueOf(").append(argument.getText()).append(')'); + } + else if (PsiType.DOUBLE.equals(type)) { + newExpressionText.append("java.lang.Double.valueOf(").append(argument.getText()).append(')'); + } + else { + newExpressionText.append(argument.getText()); + } + newExpressionText.append('.').append(referenceName).append('(').append(qualifier.getText()).append(')'); + replaceExpression(polyadicExpression, newExpressionText.toString()); } - registerError(lhs, getMethodName((PsiMethodCallExpression)operand)); - } } - private static String getMethodName(PsiMethodCallExpression methodCallExpression) { - final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); - return methodExpression.getReferenceName(); + @Override + public BaseInspectionVisitor buildVisitor() { + return new SimplifiableEqualsExpressionVisitor(); } - private static boolean isEqualsConstant(PsiExpression expression, PsiVariable variable) { - if (!(expression instanceof PsiMethodCallExpression)) { - return false; - } - final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)expression; - final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); - final String methodName = methodExpression.getReferenceName(); - if (!HardcodedMethodConstants.EQUALS.equals(methodName) && !HardcodedMethodConstants.EQUALS_IGNORE_CASE.equals(methodName)) { - return false; - } - final PsiExpression qualifier = methodExpression.getQualifierExpression(); - if (!(qualifier instanceof PsiReferenceExpression)) { - return false; - } - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)qualifier; - final PsiElement target = referenceExpression.resolve(); - if (!variable.equals(target)) { - return false; - } - final PsiExpressionList argumentList = methodCallExpression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - if (arguments.length != 1) { - return false; - } - final PsiExpression argument = arguments[0]; - return PsiUtil.isConstantExpression(argument); - } + private static class SimplifiableEqualsExpressionVisitor extends BaseInspectionVisitor { - @Nullable - private static PsiVariable getVariableFromNullComparison(PsiExpression expression, boolean equals) { - if (!(expression instanceof PsiPolyadicExpression)) { - return null; - } - final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)expression; - final IElementType tokenType = polyadicExpression.getOperationTokenType(); - if (equals) { - if (!JavaTokenType.EQEQ.equals(tokenType)) { - return null; - } - } - else { - if (!JavaTokenType.NE.equals(tokenType)) { - return null; - } - } - final PsiExpression[] operands = polyadicExpression.getOperands(); - if (operands.length != 2) { - return null; - } - final PsiExpression lhs = ParenthesesUtils.stripParentheses(operands[0]); - if (lhs == null) { - return null; - } - final PsiExpression rhs = ParenthesesUtils.stripParentheses(operands[1]); - if (rhs == null) { - return null; - } - if (PsiType.NULL.equals(lhs.getType())) { - if (!(rhs instanceof PsiReferenceExpression)) { - return null; + @Override + public void visitPolyadicExpression(PsiPolyadicExpression expression) { + super.visitPolyadicExpression(expression); + final IElementType tokenType = expression.getOperationTokenType(); + if (JavaTokenType.ANDAND.equals(tokenType)) { + final PsiExpression[] operands = expression.getOperands(); + if (operands.length != 2) { + return; + } + final PsiExpression lhs = ParenthesesUtils.stripParentheses(operands[0]); + if (lhs == null) { + return; + } + final PsiVariable variable = getVariableFromNullComparison(lhs, false); + if (variable == null) { + return; + } + final PsiExpression rhs = ParenthesesUtils.stripParentheses(operands[1]); + if (!isEqualsConstant(rhs, variable)) { + return; + } + registerError(lhs, getMethodName((PsiMethodCallExpression) rhs)); + } + else if (JavaTokenType.OROR.equals(tokenType)) { + final PsiExpression[] operands = expression.getOperands(); + if (operands.length != 2) { + return; + } + final PsiExpression lhs = ParenthesesUtils.stripParentheses(operands[0]); + if (lhs == null) { + return; + } + final PsiVariable variable = getVariableFromNullComparison(lhs, true); + if (variable == null) { + return; + } + final PsiExpression rhs = ParenthesesUtils.stripParentheses(operands[1]); + if (!(rhs instanceof PsiPrefixExpression)) { + return; + } + final PsiPrefixExpression prefixExpression = (PsiPrefixExpression) rhs; + if (!JavaTokenType.EXCL.equals(prefixExpression.getOperationTokenType())) { + return; + } + final PsiExpression operand = ParenthesesUtils.stripParentheses(prefixExpression.getOperand()); + if (!isEqualsConstant(operand, variable)) { + return; + } + registerError(lhs, getMethodName((PsiMethodCallExpression) operand)); + } } - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)rhs; - final PsiElement target = referenceExpression.resolve(); - if (!(target instanceof PsiVariable)) { - return null; + + private static String getMethodName(PsiMethodCallExpression methodCallExpression) { + final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); + return methodExpression.getReferenceName(); } - return (PsiVariable)target; - } - else if (PsiType.NULL.equals(rhs.getType())) { - if (!(lhs instanceof PsiReferenceExpression)) { - return null; + + private static boolean isEqualsConstant(PsiExpression expression, PsiVariable variable) { + if (!(expression instanceof PsiMethodCallExpression)) { + return false; + } + final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression) expression; + final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); + final String methodName = methodExpression.getReferenceName(); + if (!HardcodedMethodConstants.EQUALS.equals(methodName) && !HardcodedMethodConstants.EQUALS_IGNORE_CASE.equals(methodName)) { + return false; + } + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (!(qualifier instanceof PsiReferenceExpression)) { + return false; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) qualifier; + final PsiElement target = referenceExpression.resolve(); + if (!variable.equals(target)) { + return false; + } + final PsiExpressionList argumentList = methodCallExpression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + if (arguments.length != 1) { + return false; + } + final PsiExpression argument = arguments[0]; + return PsiUtil.isConstantExpression(argument); } - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)lhs; - final PsiElement target = referenceExpression.resolve(); - if (!(target instanceof PsiVariable)) { - return null; + + @Nullable + private static PsiVariable getVariableFromNullComparison(PsiExpression expression, boolean equals) { + if (!(expression instanceof PsiPolyadicExpression)) { + return null; + } + final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression) expression; + final IElementType tokenType = polyadicExpression.getOperationTokenType(); + if (equals) { + if (!JavaTokenType.EQEQ.equals(tokenType)) { + return null; + } + } + else { + if (!JavaTokenType.NE.equals(tokenType)) { + return null; + } + } + final PsiExpression[] operands = polyadicExpression.getOperands(); + if (operands.length != 2) { + return null; + } + final PsiExpression lhs = ParenthesesUtils.stripParentheses(operands[0]); + if (lhs == null) { + return null; + } + final PsiExpression rhs = ParenthesesUtils.stripParentheses(operands[1]); + if (rhs == null) { + return null; + } + if (PsiType.NULL.equals(lhs.getType())) { + if (!(rhs instanceof PsiReferenceExpression)) { + return null; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) rhs; + final PsiElement target = referenceExpression.resolve(); + if (!(target instanceof PsiVariable)) { + return null; + } + return (PsiVariable) target; + } + else if (PsiType.NULL.equals(rhs.getType())) { + if (!(lhs instanceof PsiReferenceExpression)) { + return null; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) lhs; + final PsiElement target = referenceExpression.resolve(); + if (!(target instanceof PsiVariable)) { + return null; + } + return (PsiVariable) target; + } + return null; } - return (PsiVariable)target; - } - return null; } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementDensityInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementDensityInspection.java index cb279fcbfa..d8c520a5e3 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementDensityInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementDensityInspection.java @@ -27,77 +27,76 @@ import javax.swing.*; public abstract class SwitchStatementDensityInspection extends BaseInspection { + private static final int DEFAULT_DENSITY_LIMIT = 20; - private static final int DEFAULT_DENSITY_LIMIT = 20; + @SuppressWarnings("PublicField") + public int m_limit = DEFAULT_DENSITY_LIMIT; - @SuppressWarnings("PublicField") - public int m_limit = DEFAULT_DENSITY_LIMIT; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.switchStatementDensityDisplayName().get(); - } - - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.switchStatementDensityMinOption(); - return new SingleIntegerFieldOptionsPanel(message.get(), this, "m_limit"); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.switchStatementDensityDisplayName(); + } - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - final Integer intDensity = (Integer)infos[0]; - return InspectionGadgetsLocalize.switchStatementDensityProblemDescriptor(intDensity).get(); - } + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.switchStatementDensityMinOption(); + return new SingleIntegerFieldOptionsPanel(message.get(), this, "m_limit"); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new SwitchStatementDensityVisitor(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + final Integer intDensity = (Integer) infos[0]; + return InspectionGadgetsLocalize.switchStatementDensityProblemDescriptor(intDensity).get(); + } - private class SwitchStatementDensityVisitor extends BaseInspectionVisitor { @Override - public void visitSwitchStatement(@Nonnull PsiSwitchStatement statement) { - final PsiCodeBlock body = statement.getBody(); - if (body == null) { - return; - } - final int branchCount = SwitchUtils.calculateBranchCount(statement); - if (branchCount == 0) { - return; - } - final double density = calculateDensity(body, branchCount); - final int intDensity = (int)(density * 100.0); - if (intDensity > m_limit) { - return; - } - registerStatementError(statement, Integer.valueOf(intDensity)); + public BaseInspectionVisitor buildVisitor() { + return new SwitchStatementDensityVisitor(); } - private double calculateDensity(@Nonnull PsiCodeBlock body, int branchCount) { - final StatementCountVisitor visitor = new StatementCountVisitor(); - body.accept(visitor); - return (double)branchCount / (double)visitor.getStatementCount(); + private class SwitchStatementDensityVisitor extends BaseInspectionVisitor { + @Override + public void visitSwitchStatement(@Nonnull PsiSwitchStatement statement) { + final PsiCodeBlock body = statement.getBody(); + if (body == null) { + return; + } + final int branchCount = SwitchUtils.calculateBranchCount(statement); + if (branchCount == 0) { + return; + } + final double density = calculateDensity(body, branchCount); + final int intDensity = (int) (density * 100.0); + if (intDensity > m_limit) { + return; + } + registerStatementError(statement, Integer.valueOf(intDensity)); + } + + private double calculateDensity(@Nonnull PsiCodeBlock body, int branchCount) { + final StatementCountVisitor visitor = new StatementCountVisitor(); + body.accept(visitor); + return (double) branchCount / (double) visitor.getStatementCount(); + } } - } - private static class StatementCountVisitor extends JavaRecursiveElementVisitor { + private static class StatementCountVisitor extends JavaRecursiveElementVisitor { - private int statementCount = 0; + private int statementCount = 0; - @Override - public void visitStatement(@Nonnull PsiStatement statement) { - super.visitStatement(statement); - if (statement instanceof PsiSwitchLabelStatement || statement instanceof PsiBreakStatement) { - return; - } - statementCount++; - } + @Override + public void visitStatement(@Nonnull PsiStatement statement) { + super.visitStatement(statement); + if (statement instanceof PsiSwitchLabelStatement || statement instanceof PsiBreakStatement) { + return; + } + statementCount++; + } - public int getStatementCount() { - return statementCount; + public int getStatementCount() { + return statementCount; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementInspection.java index f1126c94e2..a430482147 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementInspection.java @@ -20,30 +20,31 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl public class SwitchStatementInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.switchStatementDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.switchStatementDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.statementProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.statementProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new SwitchStatementVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new SwitchStatementVisitor(); + } - private static class SwitchStatementVisitor extends BaseInspectionVisitor { - @Override - public void visitSwitchStatement(@Nonnull PsiSwitchStatement statement) { - super.visitSwitchStatement(statement); - registerStatementError(statement); + private static class SwitchStatementVisitor extends BaseInspectionVisitor { + @Override + public void visitSwitchStatement(@Nonnull PsiSwitchStatement statement) { + super.visitSwitchStatement(statement); + registerStatementError(statement); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementWithConfusingDeclarationInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementWithConfusingDeclarationInspection.java index 54b0fbbb03..8b6d228fe7 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementWithConfusingDeclarationInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementWithConfusingDeclarationInspection.java @@ -21,89 +21,93 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.PsiElement; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import java.util.HashSet; import java.util.Set; @ExtensionImpl public class SwitchStatementWithConfusingDeclarationInspection extends BaseInspection { + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "LocalVariableUsedAndDeclaredInDifferentSwitchBranches"; + } - @Nonnull - public String getID() { - return "LocalVariableUsedAndDeclaredInDifferentSwitchBranches"; - } - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.switchStatementWithConfusingDeclarationDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.switchStatementWithConfusingDeclarationDisplayName(); + } - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.switchStatementWithConfusingDeclarationProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.switchStatementWithConfusingDeclarationProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new SwitchStatementWithConfusingDeclarationVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new SwitchStatementWithConfusingDeclarationVisitor(); + } - private static class SwitchStatementWithConfusingDeclarationVisitor extends BaseInspectionVisitor { + private static class SwitchStatementWithConfusingDeclarationVisitor extends BaseInspectionVisitor { - @Override - public void visitSwitchStatement(@Nonnull PsiSwitchStatement statement) { - final PsiCodeBlock body = statement.getBody(); - if (body == null) { - return; - } - final Set variablesInPreviousBranches = new HashSet(5); - final Set variablesInCurrentBranch = new HashSet(5); - final PsiStatement[] statements = body.getStatements(); - final LocalVariableAccessVisitor visitor = new LocalVariableAccessVisitor(variablesInPreviousBranches); - for (final PsiStatement child : statements) { - if (child instanceof PsiDeclarationStatement) { - final PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement)child; - final PsiElement[] declaredElements = declarationStatement.getDeclaredElements(); - for (final PsiElement declaredElement : declaredElements) { - if (declaredElement instanceof PsiLocalVariable) { - final PsiLocalVariable localVariable = (PsiLocalVariable)declaredElement; - variablesInCurrentBranch.add(localVariable); + @Override + public void visitSwitchStatement(@Nonnull PsiSwitchStatement statement) { + final PsiCodeBlock body = statement.getBody(); + if (body == null) { + return; + } + final Set variablesInPreviousBranches = new HashSet(5); + final Set variablesInCurrentBranch = new HashSet(5); + final PsiStatement[] statements = body.getStatements(); + final LocalVariableAccessVisitor visitor = new LocalVariableAccessVisitor(variablesInPreviousBranches); + for (final PsiStatement child : statements) { + if (child instanceof PsiDeclarationStatement) { + final PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement) child; + final PsiElement[] declaredElements = declarationStatement.getDeclaredElements(); + for (final PsiElement declaredElement : declaredElements) { + if (declaredElement instanceof PsiLocalVariable) { + final PsiLocalVariable localVariable = (PsiLocalVariable) declaredElement; + variablesInCurrentBranch.add(localVariable); + } + } + } + else if (child instanceof PsiBreakStatement) { + variablesInPreviousBranches.addAll(variablesInCurrentBranch); + variablesInCurrentBranch.clear(); + } + child.accept(visitor); } - } - } - else if (child instanceof PsiBreakStatement) { - variablesInPreviousBranches.addAll(variablesInCurrentBranch); - variablesInCurrentBranch.clear(); } - child.accept(visitor); - } - } - class LocalVariableAccessVisitor extends JavaRecursiveElementVisitor { + class LocalVariableAccessVisitor extends JavaRecursiveElementVisitor { - private final Set myVariablesInPreviousBranches; + private final Set myVariablesInPreviousBranches; - public LocalVariableAccessVisitor(Set variablesInPreviousBranches) { - myVariablesInPreviousBranches = variablesInPreviousBranches; - } + public LocalVariableAccessVisitor(Set variablesInPreviousBranches) { + myVariablesInPreviousBranches = variablesInPreviousBranches; + } - @Override - public void visitReferenceExpression(@Nonnull PsiReferenceExpression referenceExpression) { - super.visitReferenceExpression(referenceExpression); - final PsiExpression qualifier = referenceExpression.getQualifierExpression(); - if (qualifier != null) { - return; - } - final PsiElement element = referenceExpression.resolve(); - if (!(element instanceof PsiLocalVariable)) { - return; - } - final PsiLocalVariable accessedVariable = (PsiLocalVariable)element; - if (myVariablesInPreviousBranches.contains(accessedVariable)) { - myVariablesInPreviousBranches.remove(accessedVariable); - registerVariableError(accessedVariable); + @Override + public void visitReferenceExpression(@Nonnull PsiReferenceExpression referenceExpression) { + super.visitReferenceExpression(referenceExpression); + final PsiExpression qualifier = referenceExpression.getQualifierExpression(); + if (qualifier != null) { + return; + } + final PsiElement element = referenceExpression.resolve(); + if (!(element instanceof PsiLocalVariable)) { + return; + } + final PsiLocalVariable accessedVariable = (PsiLocalVariable) element; + if (myVariablesInPreviousBranches.contains(accessedVariable)) { + myVariablesInPreviousBranches.remove(accessedVariable); + registerVariableError(accessedVariable); + } + } } - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementWithTooManyBranchesInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementWithTooManyBranchesInspection.java index 6d7358b95e..b6a6417c39 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementWithTooManyBranchesInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementWithTooManyBranchesInspection.java @@ -28,47 +28,47 @@ import javax.swing.*; public abstract class SwitchStatementWithTooManyBranchesInspection extends BaseInspection { + private static final int DEFAULT_BRANCH_LIMIT = 10; + /** + * this is public for the DefaultJDOMExternalizer thingy + * + * @noinspection PublicField + */ + public int m_limit = DEFAULT_BRANCH_LIMIT; - private static final int DEFAULT_BRANCH_LIMIT = 10; - /** - * this is public for the DefaultJDOMExternalizer thingy - * - * @noinspection PublicField - */ - public int m_limit = DEFAULT_BRANCH_LIMIT; - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.switchStatementWithTooManyBranchesDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.switchStatementWithTooManyBranchesDisplayName(); + } - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.ifStatementWithTooManyBranchesMaxOption(); - return new SingleIntegerFieldOptionsPanel(message.get(), this, "m_limit"); - } + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.ifStatementWithTooManyBranchesMaxOption(); + return new SingleIntegerFieldOptionsPanel(message.get(), this, "m_limit"); + } - @Nonnull - protected String buildErrorString(Object... infos) { - final Integer branchCount = (Integer)infos[0]; - return InspectionGadgetsLocalize.ifStatementWithTooManyBranchesProblemDescriptor(branchCount).get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + final Integer branchCount = (Integer) infos[0]; + return InspectionGadgetsLocalize.ifStatementWithTooManyBranchesProblemDescriptor(branchCount).get(); + } - public BaseInspectionVisitor buildVisitor() { - return new SwitchStatementWithTooManyBranchesVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new SwitchStatementWithTooManyBranchesVisitor(); + } - private class SwitchStatementWithTooManyBranchesVisitor extends BaseInspectionVisitor { - @Override - public void visitSwitchStatement(@Nonnull PsiSwitchStatement statement) { - final PsiCodeBlock body = statement.getBody(); - if (body == null) { - return; - } - final int branchCount = SwitchUtils.calculateBranchCount(statement); - if (branchCount <= m_limit) { - return; - } - registerStatementError(statement, branchCount); + private class SwitchStatementWithTooManyBranchesVisitor extends BaseInspectionVisitor { + @Override + public void visitSwitchStatement(@Nonnull PsiSwitchStatement statement) { + final PsiCodeBlock body = statement.getBody(); + if (body == null) { + return; + } + final int branchCount = SwitchUtils.calculateBranchCount(statement); + if (branchCount <= m_limit) { + return; + } + registerStatementError(statement, branchCount); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementsWithoutDefaultInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementsWithoutDefaultInspection.java index 75b28dcd01..777f060b78 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementsWithoutDefaultInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/SwitchStatementsWithoutDefaultInspection.java @@ -28,103 +28,103 @@ @ExtensionImpl public class SwitchStatementsWithoutDefaultInspection extends BaseInspection { + @SuppressWarnings("PublicField") + public boolean m_ignoreFullyCoveredEnums = true; - @SuppressWarnings("PublicField") - public boolean m_ignoreFullyCoveredEnums = true; - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.switchStatementsWithoutDefaultDisplayName().get(); - } - - @Nonnull - public String getID() { - return "SwitchStatementWithoutDefaultBranch"; - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.switchStatementsWithoutDefaultProblemDescriptor().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.switchStatementsWithoutDefaultDisplayName(); + } - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.switchStatementWithoutDefaultIgnoreOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "m_ignoreFullyCoveredEnums"); - } + @Nonnull + public String getID() { + return "SwitchStatementWithoutDefaultBranch"; + } - public BaseInspectionVisitor buildVisitor() { - return new SwitchStatementsWithoutDefaultVisitor(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.switchStatementsWithoutDefaultProblemDescriptor().get(); + } - private class SwitchStatementsWithoutDefaultVisitor extends BaseInspectionVisitor { + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.switchStatementWithoutDefaultIgnoreOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "m_ignoreFullyCoveredEnums"); + } - @Override - public void visitSwitchStatement(@Nonnull PsiSwitchStatement statement) { - super.visitSwitchStatement(statement); - if (switchStatementHasDefault(statement)) { - return; - } - if (m_ignoreFullyCoveredEnums && switchStatementIsFullyCoveredEnum(statement)) { - return; - } - registerStatementError(statement); + public BaseInspectionVisitor buildVisitor() { + return new SwitchStatementsWithoutDefaultVisitor(); } - private boolean switchStatementHasDefault(PsiSwitchStatement statement) { - final PsiCodeBlock body = statement.getBody(); - if (body == null) { - return true; // do not warn about incomplete code - } - final PsiStatement[] statements = body.getStatements(); - if (statements.length == 0) { - return true; // do not warn when no switch branches are present at all - } - for (final PsiStatement child : statements) { - if (!(child instanceof PsiSwitchLabelStatement)) { - continue; - } - final PsiSwitchLabelStatement switchLabelStatement = (PsiSwitchLabelStatement)child; - if (switchLabelStatement.isDefaultCase()) { - return true; + private class SwitchStatementsWithoutDefaultVisitor extends BaseInspectionVisitor { + + @Override + public void visitSwitchStatement(@Nonnull PsiSwitchStatement statement) { + super.visitSwitchStatement(statement); + if (switchStatementHasDefault(statement)) { + return; + } + if (m_ignoreFullyCoveredEnums && switchStatementIsFullyCoveredEnum(statement)) { + return; + } + registerStatementError(statement); } - } - return false; - } - private boolean switchStatementIsFullyCoveredEnum(PsiSwitchStatement statement) { - final PsiExpression expression = statement.getExpression(); - if (expression == null) { - return false; - } - final PsiType type = expression.getType(); - if (!(type instanceof PsiClassType)) { - return false; - } - final PsiClassType classType = (PsiClassType)type; - final PsiClass aClass = classType.resolve(); - if (aClass == null || !aClass.isEnum()) { - return false; - } - final PsiCodeBlock body = statement.getBody(); - if (body == null) { - return false; - } - final PsiStatement[] statements = body.getStatements(); - int numCases = 0; - for (final PsiStatement child : statements) { - if (child instanceof PsiSwitchLabelStatement) { - numCases++; + private boolean switchStatementHasDefault(PsiSwitchStatement statement) { + final PsiCodeBlock body = statement.getBody(); + if (body == null) { + return true; // do not warn about incomplete code + } + final PsiStatement[] statements = body.getStatements(); + if (statements.length == 0) { + return true; // do not warn when no switch branches are present at all + } + for (final PsiStatement child : statements) { + if (!(child instanceof PsiSwitchLabelStatement)) { + continue; + } + final PsiSwitchLabelStatement switchLabelStatement = (PsiSwitchLabelStatement) child; + if (switchLabelStatement.isDefaultCase()) { + return true; + } + } + return false; } - } - final PsiField[] fields = aClass.getFields(); - int numEnums = 0; - for (final PsiField field : fields) { - final PsiType fieldType = field.getType(); - if (fieldType.equals(type)) { - numEnums++; + + private boolean switchStatementIsFullyCoveredEnum(PsiSwitchStatement statement) { + final PsiExpression expression = statement.getExpression(); + if (expression == null) { + return false; + } + final PsiType type = expression.getType(); + if (!(type instanceof PsiClassType)) { + return false; + } + final PsiClassType classType = (PsiClassType) type; + final PsiClass aClass = classType.resolve(); + if (aClass == null || !aClass.isEnum()) { + return false; + } + final PsiCodeBlock body = statement.getBody(); + if (body == null) { + return false; + } + final PsiStatement[] statements = body.getStatements(); + int numCases = 0; + for (final PsiStatement child : statements) { + if (child instanceof PsiSwitchLabelStatement) { + numCases++; + } + } + final PsiField[] fields = aClass.getFields(); + int numEnums = 0; + for (final PsiField field : fields) { + final PsiType fieldType = field.getType(); + if (fieldType.equals(type)) { + numEnums++; + } + } + return numEnums == numCases; } - } - return numEnums == numCases; } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/TrivialIfInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/TrivialIfInspection.java index 9abba80ea8..c9028884c4 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/TrivialIfInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/TrivialIfInspection.java @@ -31,496 +31,544 @@ import consulo.language.psi.PsiWhiteSpace; import consulo.language.psi.util.PsiTreeUtil; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import org.jetbrains.annotations.NonNls; @ExtensionImpl public class TrivialIfInspection extends BaseInspection { - - @Override - @Nonnull - public String getID() { - return "RedundantIfStatement"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.trivialIfDisplayName().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.trivialIfProblemDescriptor().get(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new TrivialIfFix(); - } - - private static class TrivialIfFix extends InspectionGadgetsFix { @Nonnull - public String getName() { - return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix().get(); + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "RedundantIfStatement"; } + @Nonnull @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement ifKeywordElement = descriptor.getPsiElement(); - final PsiIfStatement statement = (PsiIfStatement)ifKeywordElement.getParent(); - if (isSimplifiableAssignment(statement)) { - replaceSimplifiableAssignment(statement); - } - else if (isSimplifiableReturn(statement)) { - repaceSimplifiableReturn(statement); - } - else if (isSimplifiableImplicitReturn(statement)) { - replaceSimplifiableImplicitReturn(statement); - } - else if (isSimplifiableAssignmentNegated(statement)) { - replaceSimplifiableAssignmentNegated(statement); - } - else if (isSimplifiableReturnNegated(statement)) { - repaceSimplifiableReturnNegated(statement); - } - else if (isSimplifiableImplicitReturnNegated(statement)) { - replaceSimplifiableImplicitReturnNegated(statement); - } - else if (isSimplifiableImplicitAssignment(statement)) { - replaceSimplifiableImplicitAssignment(statement); - } - else if (isSimplifiableImplicitAssignmentNegated(statement)) { - replaceSimplifiableImplicitAssignmentNegated(statement); - } + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.trivialIfDisplayName(); } - private static void replaceSimplifiableImplicitReturn( - PsiIfStatement statement) throws IncorrectOperationException { - final PsiExpression condition = statement.getCondition(); - if (condition == null) { - return; - } - final String conditionText = condition.getText(); - final PsiElement nextStatement = - PsiTreeUtil.skipSiblingsForward(statement, - PsiWhiteSpace.class); - @NonNls final String newStatement = "return " + conditionText + ';'; - replaceStatement(statement, newStatement); - assert nextStatement != null; - deleteElement(nextStatement); + @Override + public boolean isEnabledByDefault() { + return true; } - private static void repaceSimplifiableReturn(PsiIfStatement statement) - throws IncorrectOperationException { - final PsiExpression condition = statement.getCondition(); - if (condition == null) { - return; - } - final String conditionText = condition.getText(); - @NonNls final String newStatement = "return " + conditionText + ';'; - replaceStatement(statement, newStatement); + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.trivialIfProblemDescriptor().get(); } - private static void replaceSimplifiableAssignment( - PsiIfStatement statement) - throws IncorrectOperationException { - final PsiExpression condition = statement.getCondition(); - if (condition == null) { - return; - } - final String conditionText = condition.getText(); - final PsiStatement thenBranch = statement.getThenBranch(); - final PsiExpressionStatement assignmentStatement = - (PsiExpressionStatement) - ControlFlowUtils.stripBraces(thenBranch); - final PsiAssignmentExpression assignmentExpression = - (PsiAssignmentExpression)assignmentStatement.getExpression(); - final PsiJavaToken operator = - assignmentExpression.getOperationSign(); - final String operand = operator.getText(); - final PsiExpression lhs = assignmentExpression.getLExpression(); - final String lhsText = lhs.getText(); - replaceStatement(statement, - lhsText + operand + conditionText + ';'); + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + return new TrivialIfFix(); } - private static void replaceSimplifiableImplicitAssignment( - PsiIfStatement statement) throws IncorrectOperationException { - final PsiElement prevStatement = - PsiTreeUtil.skipSiblingsBackward(statement, - PsiWhiteSpace.class); - if (prevStatement == null) { - return; - } - final PsiExpression condition = statement.getCondition(); - if (condition == null) { - return; - } - final String conditionText = condition.getText(); - final PsiStatement thenBranch = statement.getThenBranch(); - final PsiExpressionStatement assignmentStatement = - (PsiExpressionStatement) - ControlFlowUtils.stripBraces(thenBranch); - final PsiAssignmentExpression assignmentExpression = - (PsiAssignmentExpression)assignmentStatement.getExpression(); - final PsiJavaToken operator = - assignmentExpression.getOperationSign(); - final String operand = operator.getText(); - final PsiExpression lhs = assignmentExpression.getLExpression(); - final String lhsText = lhs.getText(); - replaceStatement(statement, - lhsText + operand + conditionText + ';'); - deleteElement(prevStatement); - } + private static class TrivialIfFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix(); + } - private static void replaceSimplifiableImplicitAssignmentNegated( - PsiIfStatement statement) - throws IncorrectOperationException { - final PsiElement prevStatement = - PsiTreeUtil.skipSiblingsBackward(statement, - PsiWhiteSpace.class); - final PsiExpression condition = statement.getCondition(); - if (condition == null) { - return; - } - final String conditionText = - BoolUtils.getNegatedExpressionText(condition); - final PsiStatement thenBranch = statement.getThenBranch(); - final PsiExpressionStatement assignmentStatement = - (PsiExpressionStatement) - ControlFlowUtils.stripBraces(thenBranch); - final PsiAssignmentExpression assignmentExpression = - (PsiAssignmentExpression) - assignmentStatement.getExpression(); - final PsiJavaToken operator = - assignmentExpression.getOperationSign(); - final String operand = operator.getText(); - final PsiExpression lhs = assignmentExpression.getLExpression(); - final String lhsText = lhs.getText(); - replaceStatement(statement, - lhsText + operand + conditionText + ';'); - assert prevStatement != null; - deleteElement(prevStatement); - } + @Override + public void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement ifKeywordElement = descriptor.getPsiElement(); + final PsiIfStatement statement = (PsiIfStatement) ifKeywordElement.getParent(); + if (isSimplifiableAssignment(statement)) { + replaceSimplifiableAssignment(statement); + } + else if (isSimplifiableReturn(statement)) { + repaceSimplifiableReturn(statement); + } + else if (isSimplifiableImplicitReturn(statement)) { + replaceSimplifiableImplicitReturn(statement); + } + else if (isSimplifiableAssignmentNegated(statement)) { + replaceSimplifiableAssignmentNegated(statement); + } + else if (isSimplifiableReturnNegated(statement)) { + repaceSimplifiableReturnNegated(statement); + } + else if (isSimplifiableImplicitReturnNegated(statement)) { + replaceSimplifiableImplicitReturnNegated(statement); + } + else if (isSimplifiableImplicitAssignment(statement)) { + replaceSimplifiableImplicitAssignment(statement); + } + else if (isSimplifiableImplicitAssignmentNegated(statement)) { + replaceSimplifiableImplicitAssignmentNegated(statement); + } + } - private static void replaceSimplifiableImplicitReturnNegated( - PsiIfStatement statement) - throws IncorrectOperationException { - final PsiExpression condition = statement.getCondition(); - if (condition == null) { - return; - } - final String conditionText = - BoolUtils.getNegatedExpressionText(condition); - final PsiElement nextStatement = - PsiTreeUtil.skipSiblingsForward(statement, - PsiWhiteSpace.class); - if (nextStatement == null) { - return; - } - @NonNls final String newStatement = "return " + conditionText + ';'; - replaceStatement(statement, newStatement); - deleteElement(nextStatement); - } + private static void replaceSimplifiableImplicitReturn( + PsiIfStatement statement + ) throws IncorrectOperationException { + final PsiExpression condition = statement.getCondition(); + if (condition == null) { + return; + } + final String conditionText = condition.getText(); + final PsiElement nextStatement = + PsiTreeUtil.skipSiblingsForward( + statement, + PsiWhiteSpace.class + ); + @NonNls final String newStatement = "return " + conditionText + ';'; + replaceStatement(statement, newStatement); + assert nextStatement != null; + deleteElement(nextStatement); + } - private static void repaceSimplifiableReturnNegated( - PsiIfStatement statement) - throws IncorrectOperationException { - final PsiExpression condition = statement.getCondition(); - if (condition == null) { - return; - } - final String conditionText = - BoolUtils.getNegatedExpressionText(condition); - @NonNls final String newStatement = "return " + conditionText + ';'; - replaceStatement(statement, newStatement); - } + private static void repaceSimplifiableReturn(PsiIfStatement statement) + throws IncorrectOperationException { + final PsiExpression condition = statement.getCondition(); + if (condition == null) { + return; + } + final String conditionText = condition.getText(); + @NonNls final String newStatement = "return " + conditionText + ';'; + replaceStatement(statement, newStatement); + } - private static void replaceSimplifiableAssignmentNegated( - PsiIfStatement statement) - throws IncorrectOperationException { - final PsiExpression condition = statement.getCondition(); - if (condition == null) { - return; - } - final String conditionText = - BoolUtils.getNegatedExpressionText(condition); - final PsiStatement thenBranch = statement.getThenBranch(); - final PsiExpressionStatement assignmentStatement = - (PsiExpressionStatement) - ControlFlowUtils.stripBraces(thenBranch); - final PsiAssignmentExpression assignmentExpression = - (PsiAssignmentExpression) - assignmentStatement.getExpression(); - final PsiJavaToken operator = - assignmentExpression.getOperationSign(); - final String operand = operator.getText(); - final PsiExpression lhs = assignmentExpression.getLExpression(); - final String lhsText = lhs.getText(); - replaceStatement(statement, - lhsText + operand + conditionText + ';'); - } - } + private static void replaceSimplifiableAssignment( + PsiIfStatement statement + ) + throws IncorrectOperationException { + final PsiExpression condition = statement.getCondition(); + if (condition == null) { + return; + } + final String conditionText = condition.getText(); + final PsiStatement thenBranch = statement.getThenBranch(); + final PsiExpressionStatement assignmentStatement = + (PsiExpressionStatement) + ControlFlowUtils.stripBraces(thenBranch); + final PsiAssignmentExpression assignmentExpression = + (PsiAssignmentExpression) assignmentStatement.getExpression(); + final PsiJavaToken operator = + assignmentExpression.getOperationSign(); + final String operand = operator.getText(); + final PsiExpression lhs = assignmentExpression.getLExpression(); + final String lhsText = lhs.getText(); + replaceStatement( + statement, + lhsText + operand + conditionText + ';' + ); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new TrivialIfVisitor(); - } + private static void replaceSimplifiableImplicitAssignment( + PsiIfStatement statement + ) throws IncorrectOperationException { + final PsiElement prevStatement = + PsiTreeUtil.skipSiblingsBackward( + statement, + PsiWhiteSpace.class + ); + if (prevStatement == null) { + return; + } + final PsiExpression condition = statement.getCondition(); + if (condition == null) { + return; + } + final String conditionText = condition.getText(); + final PsiStatement thenBranch = statement.getThenBranch(); + final PsiExpressionStatement assignmentStatement = + (PsiExpressionStatement) + ControlFlowUtils.stripBraces(thenBranch); + final PsiAssignmentExpression assignmentExpression = + (PsiAssignmentExpression) assignmentStatement.getExpression(); + final PsiJavaToken operator = + assignmentExpression.getOperationSign(); + final String operand = operator.getText(); + final PsiExpression lhs = assignmentExpression.getLExpression(); + final String lhsText = lhs.getText(); + replaceStatement( + statement, + lhsText + operand + conditionText + ';' + ); + deleteElement(prevStatement); + } - private static class TrivialIfVisitor extends BaseInspectionVisitor { + private static void replaceSimplifiableImplicitAssignmentNegated( + PsiIfStatement statement + ) + throws IncorrectOperationException { + final PsiElement prevStatement = + PsiTreeUtil.skipSiblingsBackward( + statement, + PsiWhiteSpace.class + ); + final PsiExpression condition = statement.getCondition(); + if (condition == null) { + return; + } + final String conditionText = + BoolUtils.getNegatedExpressionText(condition); + final PsiStatement thenBranch = statement.getThenBranch(); + final PsiExpressionStatement assignmentStatement = + (PsiExpressionStatement) + ControlFlowUtils.stripBraces(thenBranch); + final PsiAssignmentExpression assignmentExpression = + (PsiAssignmentExpression) + assignmentStatement.getExpression(); + final PsiJavaToken operator = + assignmentExpression.getOperationSign(); + final String operand = operator.getText(); + final PsiExpression lhs = assignmentExpression.getLExpression(); + final String lhsText = lhs.getText(); + replaceStatement( + statement, + lhsText + operand + conditionText + ';' + ); + assert prevStatement != null; + deleteElement(prevStatement); + } - @Override - public void visitIfStatement(@Nonnull PsiIfStatement ifStatement) { - super.visitIfStatement(ifStatement); - final PsiExpression condition = ifStatement.getCondition(); - if (condition == null) { - return; - } - if (PsiUtilCore.hasErrorElementChild(ifStatement)) { - return; - } - if (isSimplifiableAssignment(ifStatement)) { - registerStatementError(ifStatement); - return; - } - if (isSimplifiableReturn(ifStatement)) { - registerStatementError(ifStatement); - return; - } - if (isSimplifiableImplicitReturn(ifStatement)) { - registerStatementError(ifStatement); - return; - } - if (isSimplifiableAssignmentNegated(ifStatement)) { - registerStatementError(ifStatement); - return; - } - if (isSimplifiableReturnNegated(ifStatement)) { - registerStatementError(ifStatement); - return; - } - if (isSimplifiableImplicitReturnNegated(ifStatement)) { - registerStatementError(ifStatement); - return; - } - if (isSimplifiableImplicitAssignment(ifStatement)) { - registerStatementError(ifStatement); - return; - } - if (isSimplifiableImplicitAssignmentNegated(ifStatement)) { - registerStatementError(ifStatement); - } - } - } + private static void replaceSimplifiableImplicitReturnNegated( + PsiIfStatement statement + ) + throws IncorrectOperationException { + final PsiExpression condition = statement.getCondition(); + if (condition == null) { + return; + } + final String conditionText = + BoolUtils.getNegatedExpressionText(condition); + final PsiElement nextStatement = + PsiTreeUtil.skipSiblingsForward( + statement, + PsiWhiteSpace.class + ); + if (nextStatement == null) { + return; + } + @NonNls final String newStatement = "return " + conditionText + ';'; + replaceStatement(statement, newStatement); + deleteElement(nextStatement); + } + + private static void repaceSimplifiableReturnNegated( + PsiIfStatement statement + ) + throws IncorrectOperationException { + final PsiExpression condition = statement.getCondition(); + if (condition == null) { + return; + } + final String conditionText = + BoolUtils.getNegatedExpressionText(condition); + @NonNls final String newStatement = "return " + conditionText + ';'; + replaceStatement(statement, newStatement); + } - public static boolean isSimplifiableImplicitReturn( - PsiIfStatement ifStatement) { - if (ifStatement.getElseBranch() != null) { - return false; + private static void replaceSimplifiableAssignmentNegated( + PsiIfStatement statement + ) + throws IncorrectOperationException { + final PsiExpression condition = statement.getCondition(); + if (condition == null) { + return; + } + final String conditionText = + BoolUtils.getNegatedExpressionText(condition); + final PsiStatement thenBranch = statement.getThenBranch(); + final PsiExpressionStatement assignmentStatement = + (PsiExpressionStatement) + ControlFlowUtils.stripBraces(thenBranch); + final PsiAssignmentExpression assignmentExpression = + (PsiAssignmentExpression) + assignmentStatement.getExpression(); + final PsiJavaToken operator = + assignmentExpression.getOperationSign(); + final String operand = operator.getText(); + final PsiExpression lhs = assignmentExpression.getLExpression(); + final String lhsText = lhs.getText(); + replaceStatement( + statement, + lhsText + operand + conditionText + ';' + ); + } } - PsiStatement thenBranch = ifStatement.getThenBranch(); - thenBranch = ControlFlowUtils.stripBraces(thenBranch); - final PsiElement nextStatement = - PsiTreeUtil.skipSiblingsForward(ifStatement, - PsiWhiteSpace.class); - if (!(nextStatement instanceof PsiStatement)) { - return false; + + @Override + public BaseInspectionVisitor buildVisitor() { + return new TrivialIfVisitor(); } - final PsiStatement elseBranch = (PsiStatement)nextStatement; - return ConditionalUtils.isReturn(thenBranch, PsiKeyword.TRUE) - && ConditionalUtils.isReturn(elseBranch, PsiKeyword.FALSE); - } + private static class TrivialIfVisitor extends BaseInspectionVisitor { - public static boolean isSimplifiableImplicitReturnNegated( - PsiIfStatement ifStatement) { - if (ifStatement.getElseBranch() != null) { - return false; + @Override + public void visitIfStatement(@Nonnull PsiIfStatement ifStatement) { + super.visitIfStatement(ifStatement); + final PsiExpression condition = ifStatement.getCondition(); + if (condition == null) { + return; + } + if (PsiUtilCore.hasErrorElementChild(ifStatement)) { + return; + } + if (isSimplifiableAssignment(ifStatement)) { + registerStatementError(ifStatement); + return; + } + if (isSimplifiableReturn(ifStatement)) { + registerStatementError(ifStatement); + return; + } + if (isSimplifiableImplicitReturn(ifStatement)) { + registerStatementError(ifStatement); + return; + } + if (isSimplifiableAssignmentNegated(ifStatement)) { + registerStatementError(ifStatement); + return; + } + if (isSimplifiableReturnNegated(ifStatement)) { + registerStatementError(ifStatement); + return; + } + if (isSimplifiableImplicitReturnNegated(ifStatement)) { + registerStatementError(ifStatement); + return; + } + if (isSimplifiableImplicitAssignment(ifStatement)) { + registerStatementError(ifStatement); + return; + } + if (isSimplifiableImplicitAssignmentNegated(ifStatement)) { + registerStatementError(ifStatement); + } + } } - PsiStatement thenBranch = ifStatement.getThenBranch(); - thenBranch = ControlFlowUtils.stripBraces(thenBranch); - final PsiElement nextStatement = - PsiTreeUtil.skipSiblingsForward(ifStatement, - PsiWhiteSpace.class); - if (!(nextStatement instanceof PsiStatement)) { - return false; - } - final PsiStatement elseBranch = (PsiStatement)nextStatement; - return ConditionalUtils.isReturn(thenBranch, PsiKeyword.FALSE) - && ConditionalUtils.isReturn(elseBranch, PsiKeyword.TRUE); - } + public static boolean isSimplifiableImplicitReturn( + PsiIfStatement ifStatement + ) { + if (ifStatement.getElseBranch() != null) { + return false; + } + PsiStatement thenBranch = ifStatement.getThenBranch(); + thenBranch = ControlFlowUtils.stripBraces(thenBranch); + final PsiElement nextStatement = + PsiTreeUtil.skipSiblingsForward( + ifStatement, + PsiWhiteSpace.class + ); + if (!(nextStatement instanceof PsiStatement)) { + return false; + } - public static boolean isSimplifiableReturn(PsiIfStatement ifStatement) { - PsiStatement thenBranch = ifStatement.getThenBranch(); - thenBranch = ControlFlowUtils.stripBraces(thenBranch); - PsiStatement elseBranch = ifStatement.getElseBranch(); - elseBranch = ControlFlowUtils.stripBraces(elseBranch); - return ConditionalUtils.isReturn(thenBranch, PsiKeyword.TRUE) - && ConditionalUtils.isReturn(elseBranch, PsiKeyword.FALSE); - } + final PsiStatement elseBranch = (PsiStatement) nextStatement; + return ConditionalUtils.isReturn(thenBranch, PsiKeyword.TRUE) + && ConditionalUtils.isReturn(elseBranch, PsiKeyword.FALSE); + } - public static boolean isSimplifiableReturnNegated( - PsiIfStatement ifStatement) { - PsiStatement thenBranch = ifStatement.getThenBranch(); - thenBranch = ControlFlowUtils.stripBraces(thenBranch); - PsiStatement elseBranch = ifStatement.getElseBranch(); - elseBranch = ControlFlowUtils.stripBraces(elseBranch); - return ConditionalUtils.isReturn(thenBranch, PsiKeyword.FALSE) - && ConditionalUtils.isReturn(elseBranch, PsiKeyword.TRUE); - } + public static boolean isSimplifiableImplicitReturnNegated( + PsiIfStatement ifStatement + ) { + if (ifStatement.getElseBranch() != null) { + return false; + } + PsiStatement thenBranch = ifStatement.getThenBranch(); + thenBranch = ControlFlowUtils.stripBraces(thenBranch); - public static boolean isSimplifiableAssignment(PsiIfStatement ifStatement) { - PsiStatement thenBranch = ifStatement.getThenBranch(); - thenBranch = ControlFlowUtils.stripBraces(thenBranch); - PsiStatement elseBranch = ifStatement.getElseBranch(); - elseBranch = ControlFlowUtils.stripBraces(elseBranch); - if (ConditionalUtils.isAssignment(thenBranch, PsiKeyword.TRUE) && - ConditionalUtils.isAssignment(elseBranch, PsiKeyword.FALSE)) { - final PsiExpressionStatement thenExpressionStatement = - (PsiExpressionStatement)thenBranch; - final PsiAssignmentExpression thenExpression = - (PsiAssignmentExpression) - thenExpressionStatement.getExpression(); - final PsiExpressionStatement elseExpressionStatement = - (PsiExpressionStatement)elseBranch; - final PsiAssignmentExpression elseExpression = - (PsiAssignmentExpression) - elseExpressionStatement.getExpression(); - final IElementType thenTokenType = thenExpression.getOperationTokenType(); - if (!thenTokenType.equals(elseExpression.getOperationTokenType())) { - return false; - } - final PsiExpression thenLhs = thenExpression.getLExpression(); - final PsiExpression elseLhs = elseExpression.getLExpression(); - return EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(thenLhs, - elseLhs); + final PsiElement nextStatement = + PsiTreeUtil.skipSiblingsForward( + ifStatement, + PsiWhiteSpace.class + ); + if (!(nextStatement instanceof PsiStatement)) { + return false; + } + final PsiStatement elseBranch = (PsiStatement) nextStatement; + return ConditionalUtils.isReturn(thenBranch, PsiKeyword.FALSE) + && ConditionalUtils.isReturn(elseBranch, PsiKeyword.TRUE); } - else { - return false; - } - } - public static boolean isSimplifiableAssignmentNegated( - PsiIfStatement ifStatement) { - PsiStatement thenBranch = ifStatement.getThenBranch(); - thenBranch = ControlFlowUtils.stripBraces(thenBranch); - PsiStatement elseBranch = ifStatement.getElseBranch(); - elseBranch = ControlFlowUtils.stripBraces(elseBranch); - if (ConditionalUtils.isAssignment(thenBranch, PsiKeyword.FALSE) && - ConditionalUtils.isAssignment(elseBranch, PsiKeyword.TRUE)) { - final PsiExpressionStatement thenExpressionStatement = - (PsiExpressionStatement)thenBranch; - final PsiAssignmentExpression thenExpression = - (PsiAssignmentExpression) - thenExpressionStatement.getExpression(); - final PsiExpressionStatement elseExpressionStatement = - (PsiExpressionStatement)elseBranch; - final PsiAssignmentExpression elseExpression = - (PsiAssignmentExpression) - elseExpressionStatement.getExpression(); - final IElementType thenTokenType = thenExpression.getOperationTokenType(); - if (!thenTokenType.equals(elseExpression.getOperationTokenType())) { - return false; - } - final PsiExpression thenLhs = thenExpression.getLExpression(); - final PsiExpression elseLhs = elseExpression.getLExpression(); - return EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(thenLhs, - elseLhs); - } - else { - return false; + public static boolean isSimplifiableReturn(PsiIfStatement ifStatement) { + PsiStatement thenBranch = ifStatement.getThenBranch(); + thenBranch = ControlFlowUtils.stripBraces(thenBranch); + PsiStatement elseBranch = ifStatement.getElseBranch(); + elseBranch = ControlFlowUtils.stripBraces(elseBranch); + return ConditionalUtils.isReturn(thenBranch, PsiKeyword.TRUE) + && ConditionalUtils.isReturn(elseBranch, PsiKeyword.FALSE); } - } - public static boolean isSimplifiableImplicitAssignment( - PsiIfStatement ifStatement) { - if (ifStatement.getElseBranch() != null) { - return false; - } - PsiStatement thenBranch = ifStatement.getThenBranch(); - thenBranch = ControlFlowUtils.stripBraces(thenBranch); - final PsiElement nextStatement = - PsiTreeUtil.skipSiblingsBackward(ifStatement, - PsiWhiteSpace.class); - if (!(nextStatement instanceof PsiStatement)) { - return false; - } - PsiStatement elseBranch = (PsiStatement)nextStatement; - elseBranch = ControlFlowUtils.stripBraces(elseBranch); - if (ConditionalUtils.isAssignment(thenBranch, PsiKeyword.TRUE) && - ConditionalUtils.isAssignment(elseBranch, PsiKeyword.FALSE)) { - final PsiExpressionStatement thenExpressionStatement = - (PsiExpressionStatement)thenBranch; - final PsiAssignmentExpression thenExpression = - (PsiAssignmentExpression) - thenExpressionStatement.getExpression(); - final PsiExpressionStatement elseExpressionStatement = - (PsiExpressionStatement)elseBranch; - final PsiAssignmentExpression elseExpression = - (PsiAssignmentExpression) - elseExpressionStatement.getExpression(); - final IElementType thenTokenType = thenExpression.getOperationTokenType(); - if (!thenTokenType.equals(elseExpression.getOperationTokenType())) { - return false; - } - final PsiExpression thenLhs = thenExpression.getLExpression(); - final PsiExpression elseLhs = elseExpression.getLExpression(); - return EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(thenLhs, - elseLhs); + public static boolean isSimplifiableReturnNegated( + PsiIfStatement ifStatement + ) { + PsiStatement thenBranch = ifStatement.getThenBranch(); + thenBranch = ControlFlowUtils.stripBraces(thenBranch); + PsiStatement elseBranch = ifStatement.getElseBranch(); + elseBranch = ControlFlowUtils.stripBraces(elseBranch); + return ConditionalUtils.isReturn(thenBranch, PsiKeyword.FALSE) + && ConditionalUtils.isReturn(elseBranch, PsiKeyword.TRUE); } - else { - return false; - } - } - public static boolean isSimplifiableImplicitAssignmentNegated( - PsiIfStatement ifStatement) { - if (ifStatement.getElseBranch() != null) { - return false; + public static boolean isSimplifiableAssignment(PsiIfStatement ifStatement) { + PsiStatement thenBranch = ifStatement.getThenBranch(); + thenBranch = ControlFlowUtils.stripBraces(thenBranch); + PsiStatement elseBranch = ifStatement.getElseBranch(); + elseBranch = ControlFlowUtils.stripBraces(elseBranch); + if (ConditionalUtils.isAssignment(thenBranch, PsiKeyword.TRUE) && + ConditionalUtils.isAssignment(elseBranch, PsiKeyword.FALSE)) { + final PsiExpressionStatement thenExpressionStatement = + (PsiExpressionStatement) thenBranch; + final PsiAssignmentExpression thenExpression = + (PsiAssignmentExpression) + thenExpressionStatement.getExpression(); + final PsiExpressionStatement elseExpressionStatement = + (PsiExpressionStatement) elseBranch; + final PsiAssignmentExpression elseExpression = + (PsiAssignmentExpression) + elseExpressionStatement.getExpression(); + final IElementType thenTokenType = thenExpression.getOperationTokenType(); + if (!thenTokenType.equals(elseExpression.getOperationTokenType())) { + return false; + } + final PsiExpression thenLhs = thenExpression.getLExpression(); + final PsiExpression elseLhs = elseExpression.getLExpression(); + return EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent( + thenLhs, + elseLhs + ); + } + else { + return false; + } } - PsiStatement thenBranch = ifStatement.getThenBranch(); - thenBranch = ControlFlowUtils.stripBraces(thenBranch); - final PsiElement nextStatement = - PsiTreeUtil.skipSiblingsBackward(ifStatement, - PsiWhiteSpace.class); - if (!(nextStatement instanceof PsiStatement)) { - return false; + + public static boolean isSimplifiableAssignmentNegated( + PsiIfStatement ifStatement + ) { + PsiStatement thenBranch = ifStatement.getThenBranch(); + thenBranch = ControlFlowUtils.stripBraces(thenBranch); + PsiStatement elseBranch = ifStatement.getElseBranch(); + elseBranch = ControlFlowUtils.stripBraces(elseBranch); + if (ConditionalUtils.isAssignment(thenBranch, PsiKeyword.FALSE) && + ConditionalUtils.isAssignment(elseBranch, PsiKeyword.TRUE)) { + final PsiExpressionStatement thenExpressionStatement = + (PsiExpressionStatement) thenBranch; + final PsiAssignmentExpression thenExpression = + (PsiAssignmentExpression) + thenExpressionStatement.getExpression(); + final PsiExpressionStatement elseExpressionStatement = + (PsiExpressionStatement) elseBranch; + final PsiAssignmentExpression elseExpression = + (PsiAssignmentExpression) + elseExpressionStatement.getExpression(); + final IElementType thenTokenType = thenExpression.getOperationTokenType(); + if (!thenTokenType.equals(elseExpression.getOperationTokenType())) { + return false; + } + final PsiExpression thenLhs = thenExpression.getLExpression(); + final PsiExpression elseLhs = elseExpression.getLExpression(); + return EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent( + thenLhs, + elseLhs + ); + } + else { + return false; + } } - PsiStatement elseBranch = (PsiStatement)nextStatement; - elseBranch = ControlFlowUtils.stripBraces(elseBranch); - if (ConditionalUtils.isAssignment(thenBranch, PsiKeyword.FALSE) && - ConditionalUtils.isAssignment(elseBranch, PsiKeyword.TRUE)) { - final PsiExpressionStatement thenExpressionStatement = - (PsiExpressionStatement)thenBranch; - final PsiAssignmentExpression thenExpression = - (PsiAssignmentExpression) - thenExpressionStatement.getExpression(); - final PsiExpressionStatement elseExpressionStatement = - (PsiExpressionStatement)elseBranch; - final PsiAssignmentExpression elseExpression = - (PsiAssignmentExpression) - elseExpressionStatement.getExpression(); - final IElementType thenTokenType = thenExpression.getOperationTokenType(); - if (!thenTokenType.equals(elseExpression.getOperationTokenType())) { - return false; - } - final PsiExpression thenLhs = thenExpression.getLExpression(); - final PsiExpression elseLhs = elseExpression.getLExpression(); - return EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(thenLhs, - elseLhs); + + public static boolean isSimplifiableImplicitAssignment( + PsiIfStatement ifStatement + ) { + if (ifStatement.getElseBranch() != null) { + return false; + } + PsiStatement thenBranch = ifStatement.getThenBranch(); + thenBranch = ControlFlowUtils.stripBraces(thenBranch); + final PsiElement nextStatement = + PsiTreeUtil.skipSiblingsBackward( + ifStatement, + PsiWhiteSpace.class + ); + if (!(nextStatement instanceof PsiStatement)) { + return false; + } + PsiStatement elseBranch = (PsiStatement) nextStatement; + elseBranch = ControlFlowUtils.stripBraces(elseBranch); + if (ConditionalUtils.isAssignment(thenBranch, PsiKeyword.TRUE) && + ConditionalUtils.isAssignment(elseBranch, PsiKeyword.FALSE)) { + final PsiExpressionStatement thenExpressionStatement = + (PsiExpressionStatement) thenBranch; + final PsiAssignmentExpression thenExpression = + (PsiAssignmentExpression) + thenExpressionStatement.getExpression(); + final PsiExpressionStatement elseExpressionStatement = + (PsiExpressionStatement) elseBranch; + final PsiAssignmentExpression elseExpression = + (PsiAssignmentExpression) + elseExpressionStatement.getExpression(); + final IElementType thenTokenType = thenExpression.getOperationTokenType(); + if (!thenTokenType.equals(elseExpression.getOperationTokenType())) { + return false; + } + final PsiExpression thenLhs = thenExpression.getLExpression(); + final PsiExpression elseLhs = elseExpression.getLExpression(); + return EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent( + thenLhs, + elseLhs + ); + } + else { + return false; + } } - else { - return false; + + public static boolean isSimplifiableImplicitAssignmentNegated( + PsiIfStatement ifStatement + ) { + if (ifStatement.getElseBranch() != null) { + return false; + } + PsiStatement thenBranch = ifStatement.getThenBranch(); + thenBranch = ControlFlowUtils.stripBraces(thenBranch); + final PsiElement nextStatement = + PsiTreeUtil.skipSiblingsBackward( + ifStatement, + PsiWhiteSpace.class + ); + if (!(nextStatement instanceof PsiStatement)) { + return false; + } + PsiStatement elseBranch = (PsiStatement) nextStatement; + elseBranch = ControlFlowUtils.stripBraces(elseBranch); + if (ConditionalUtils.isAssignment(thenBranch, PsiKeyword.FALSE) && + ConditionalUtils.isAssignment(elseBranch, PsiKeyword.TRUE)) { + final PsiExpressionStatement thenExpressionStatement = + (PsiExpressionStatement) thenBranch; + final PsiAssignmentExpression thenExpression = + (PsiAssignmentExpression) + thenExpressionStatement.getExpression(); + final PsiExpressionStatement elseExpressionStatement = + (PsiExpressionStatement) elseBranch; + final PsiAssignmentExpression elseExpression = + (PsiAssignmentExpression) + elseExpressionStatement.getExpression(); + final IElementType thenTokenType = thenExpression.getOperationTokenType(); + if (!thenTokenType.equals(elseExpression.getOperationTokenType())) { + return false; + } + final PsiExpression thenLhs = thenExpression.getLExpression(); + final PsiExpression elseLhs = elseExpression.getLExpression(); + return EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent( + thenLhs, + elseLhs + ); + } + else { + return false; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryConditionalExpressionInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryConditionalExpressionInspection.java index cadfe8f3cd..92938af738 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryConditionalExpressionInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryConditionalExpressionInspection.java @@ -25,92 +25,98 @@ import consulo.annotation.component.ExtensionImpl; import consulo.language.editor.inspection.ProblemDescriptor; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl -public class UnnecessaryConditionalExpressionInspection - extends BaseInspection { - - @Nonnull - public String getID() { - return "RedundantConditionalExpression"; - } +public class UnnecessaryConditionalExpressionInspection extends BaseInspection { + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "RedundantConditionalExpression"; + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.unnecessaryConditionalExpressionDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.unnecessaryConditionalExpressionDisplayName(); + } - public boolean isEnabledByDefault() { - return true; - } + public boolean isEnabledByDefault() { + return true; + } - public BaseInspectionVisitor buildVisitor() { - return new UnnecessaryConditionalExpressionVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new UnnecessaryConditionalExpressionVisitor(); + } - @Nonnull - public String buildErrorString(Object... infos) { - final PsiConditionalExpression expression = (PsiConditionalExpression)infos[0]; - return InspectionGadgetsLocalize.simplifiableConditionalExpressionProblemDescriptor(calculateReplacementExpression(expression)).get(); - } + @Nonnull + public String buildErrorString(Object... infos) { + final PsiConditionalExpression expression = (PsiConditionalExpression) infos[0]; + return InspectionGadgetsLocalize.simplifiableConditionalExpressionProblemDescriptor(calculateReplacementExpression(expression)) + .get(); + } - static String calculateReplacementExpression( - PsiConditionalExpression exp) { - final PsiExpression thenExpression = exp.getThenExpression(); - final PsiExpression elseExpression = exp.getElseExpression(); - final PsiExpression condition = exp.getCondition(); + static String calculateReplacementExpression( + PsiConditionalExpression exp + ) { + final PsiExpression thenExpression = exp.getThenExpression(); + final PsiExpression elseExpression = exp.getElseExpression(); + final PsiExpression condition = exp.getCondition(); - if (BoolUtils.isFalse(thenExpression) && - BoolUtils.isTrue(elseExpression)) { - return BoolUtils.getNegatedExpressionText(condition); - } - else { - return condition.getText(); + if (BoolUtils.isFalse(thenExpression) && + BoolUtils.isTrue(elseExpression)) { + return BoolUtils.getNegatedExpressionText(condition); + } + else { + return condition.getText(); + } } - } - public InspectionGadgetsFix buildFix(Object... infos) { - return new UnnecessaryConditionalFix(); - } + public InspectionGadgetsFix buildFix(Object... infos) { + return new UnnecessaryConditionalFix(); + } - private static class UnnecessaryConditionalFix - extends InspectionGadgetsFix { + private static class UnnecessaryConditionalFix + extends InspectionGadgetsFix { - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix().get(); - } + @Nonnull + public String getName() { + return InspectionGadgetsLocalize.constantConditionalExpressionSimplifyQuickfix().get(); + } - public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiConditionalExpression expression = (PsiConditionalExpression)descriptor.getPsiElement(); - final String newExpression = calculateReplacementExpression(expression); - replaceExpression(expression, newExpression); + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiConditionalExpression expression = (PsiConditionalExpression) descriptor.getPsiElement(); + final String newExpression = calculateReplacementExpression(expression); + replaceExpression(expression, newExpression); + } } - } - private static class UnnecessaryConditionalExpressionVisitor - extends BaseInspectionVisitor { + private static class UnnecessaryConditionalExpressionVisitor + extends BaseInspectionVisitor { - @Override - public void visitConditionalExpression( - PsiConditionalExpression expression) { - super.visitConditionalExpression(expression); - final PsiExpression thenExpression = expression.getThenExpression(); - if (thenExpression == null) { - return; - } - final PsiExpression elseExpression = expression.getElseExpression(); - if (elseExpression == null) { - return; - } - if (BoolUtils.isFalse(thenExpression) && - BoolUtils.isTrue(elseExpression) || - BoolUtils.isTrue(thenExpression) && - BoolUtils.isFalse(elseExpression)) { - registerError(expression, expression); - } + @Override + public void visitConditionalExpression( + PsiConditionalExpression expression + ) { + super.visitConditionalExpression(expression); + final PsiExpression thenExpression = expression.getThenExpression(); + if (thenExpression == null) { + return; + } + final PsiExpression elseExpression = expression.getElseExpression(); + if (elseExpression == null) { + return; + } + if (BoolUtils.isFalse(thenExpression) && + BoolUtils.isTrue(elseExpression) || + BoolUtils.isTrue(thenExpression) && + BoolUtils.isFalse(elseExpression)) { + registerError(expression, expression); + } + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryContinueInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryContinueInspection.java index 5f2b8a129e..e747fa505d 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryContinueInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryContinueInspection.java @@ -32,89 +32,89 @@ @ExtensionImpl public class UnnecessaryContinueInspection extends BaseInspection { + @SuppressWarnings("PublicField") + public boolean ignoreInThenBranch = false; - @SuppressWarnings("PublicField") - public boolean ignoreInThenBranch = false; - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.unnecessaryContinueDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.unnecessaryContinueDisplayName(); + } - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.unnecessaryContinueProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.unnecessaryContinueProblemDescriptor().get(); + } - public boolean isEnabledByDefault() { - return true; - } + public boolean isEnabledByDefault() { + return true; + } - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.unnecessaryReturnOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreInThenBranch"); - } + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.unnecessaryReturnOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreInThenBranch"); + } - public BaseInspectionVisitor buildVisitor() { - return new UnnecessaryContinueVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new UnnecessaryContinueVisitor(); + } - public InspectionGadgetsFix buildFix(Object... infos) { - return new DeleteUnnecessaryStatementFix("continue"); - } + public InspectionGadgetsFix buildFix(Object... infos) { + return new DeleteUnnecessaryStatementFix("continue"); + } - private class UnnecessaryContinueVisitor extends BaseInspectionVisitor { + private class UnnecessaryContinueVisitor extends BaseInspectionVisitor { - @Override - public void visitContinueStatement(@Nonnull PsiContinueStatement statement) { + @Override + public void visitContinueStatement(@Nonnull PsiContinueStatement statement) { /*if (JspPsiUtil.isInJspFile(statement.getContainingFile())) { return; } */ - final PsiStatement continuedStatement = statement.findContinuedStatement(); - PsiStatement body = null; - if (continuedStatement instanceof PsiForeachStatement) { - final PsiForeachStatement foreachStatement = (PsiForeachStatement)continuedStatement; - body = foreachStatement.getBody(); - } - else if (continuedStatement instanceof PsiForStatement) { - final PsiForStatement forStatement = (PsiForStatement)continuedStatement; - body = forStatement.getBody(); - } - else if (continuedStatement instanceof PsiDoWhileStatement) { - final PsiDoWhileStatement doWhileStatement = (PsiDoWhileStatement)continuedStatement; - body = doWhileStatement.getBody(); - } - else if (continuedStatement instanceof PsiWhileStatement) { - final PsiWhileStatement whileStatement = (PsiWhileStatement)continuedStatement; - body = whileStatement.getBody(); - } - if (body == null) { - return; - } - if (ignoreInThenBranch && isInThenBranch(statement)) { - return; - } - if (body instanceof PsiBlockStatement) { - final PsiBlockStatement blockStatement = (PsiBlockStatement)body; - final PsiCodeBlock block = blockStatement.getCodeBlock(); - if (ControlFlowUtils.blockCompletesWithStatement(block, statement)) { - registerStatementError(statement); + final PsiStatement continuedStatement = statement.findContinuedStatement(); + PsiStatement body = null; + if (continuedStatement instanceof PsiForeachStatement) { + final PsiForeachStatement foreachStatement = (PsiForeachStatement) continuedStatement; + body = foreachStatement.getBody(); + } + else if (continuedStatement instanceof PsiForStatement) { + final PsiForStatement forStatement = (PsiForStatement) continuedStatement; + body = forStatement.getBody(); + } + else if (continuedStatement instanceof PsiDoWhileStatement) { + final PsiDoWhileStatement doWhileStatement = (PsiDoWhileStatement) continuedStatement; + body = doWhileStatement.getBody(); + } + else if (continuedStatement instanceof PsiWhileStatement) { + final PsiWhileStatement whileStatement = (PsiWhileStatement) continuedStatement; + body = whileStatement.getBody(); + } + if (body == null) { + return; + } + if (ignoreInThenBranch && isInThenBranch(statement)) { + return; + } + if (body instanceof PsiBlockStatement) { + final PsiBlockStatement blockStatement = (PsiBlockStatement) body; + final PsiCodeBlock block = blockStatement.getCodeBlock(); + if (ControlFlowUtils.blockCompletesWithStatement(block, statement)) { + registerStatementError(statement); + } + } + else if (ControlFlowUtils.statementCompletesWithStatement(body, statement)) { + registerStatementError(statement); + } } - } - else if (ControlFlowUtils.statementCompletesWithStatement(body, statement)) { - registerStatementError(statement); - } - } - private boolean isInThenBranch(PsiStatement statement) { - final PsiIfStatement ifStatement = - PsiTreeUtil.getParentOfType(statement, PsiIfStatement.class, true, PsiMethod.class, PsiLambdaExpression.class); - if (ifStatement == null) { - return false; - } - final PsiStatement elseBranch = ifStatement.getElseBranch(); - return elseBranch != null && !PsiTreeUtil.isAncestor(elseBranch, statement, true); + private boolean isInThenBranch(PsiStatement statement) { + final PsiIfStatement ifStatement = + PsiTreeUtil.getParentOfType(statement, PsiIfStatement.class, true, PsiMethod.class, PsiLambdaExpression.class); + if (ifStatement == null) { + return false; + } + final PsiStatement elseBranch = ifStatement.getElseBranch(); + return elseBranch != null && !PsiTreeUtil.isAncestor(elseBranch, statement, true); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryDefaultInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryDefaultInspection.java index bfd5b25f6f..ff5c7a8436 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryDefaultInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryDefaultInspection.java @@ -23,134 +23,140 @@ import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.PsiElement; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @ExtensionImpl public class UnnecessaryDefaultInspection extends BaseInspection { - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.unnecessaryDefaultDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.unnecessaryDefaultProblemDescriptor().get(); - } - - public BaseInspectionVisitor buildVisitor() { - return new UnnecessaryDefaultVisitor(); - } - - private static class UnnecessaryDefaultVisitor - extends BaseInspectionVisitor { - + @Nonnull @Override - public void visitSwitchStatement( - @Nonnull PsiSwitchStatement statement) { - super.visitSwitchStatement(statement); - final PsiSwitchLabelStatement defaultStatement = - retrieveUnnecessaryDefault(statement); - if (defaultStatement == null) { - return; - } - PsiStatement nextStatement = PsiTreeUtil.getNextSiblingOfType( - defaultStatement, PsiStatement.class); - while (nextStatement != null && - !(nextStatement instanceof PsiBreakStatement) && - !(nextStatement instanceof PsiSwitchLabelStatement)) { - if (nextStatement instanceof PsiThrowStatement || - isStatementNeededForInitializationOfVariable(statement, - nextStatement)) { - return; - } - nextStatement = PsiTreeUtil.getNextSiblingOfType( - nextStatement, PsiStatement.class); - } - registerStatementError(defaultStatement); + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.unnecessaryDefaultDisplayName(); } - private static boolean isStatementNeededForInitializationOfVariable( - PsiSwitchStatement switchStatement, PsiStatement statement) { - if (!(statement instanceof PsiExpressionStatement)) { - return false; - } - final PsiExpressionStatement expressionStatement = - (PsiExpressionStatement)statement; - final PsiExpression expression = - expressionStatement.getExpression(); - if (!(expression instanceof PsiAssignmentExpression)) { - return false; - } - final PsiAssignmentExpression assignmentExpression = - (PsiAssignmentExpression)expression; - final PsiExpression lhs = assignmentExpression.getLExpression(); - if (!(lhs instanceof PsiReferenceExpression)) { - return false; - } - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)lhs; - final PsiElement target = referenceExpression.resolve(); - if (!(target instanceof PsiLocalVariable)) { - return false; - } - final PsiLocalVariable variable = (PsiLocalVariable)target; - return InitializationUtils.switchStatementAssignsVariableOrFails( - switchStatement, variable, true); + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.unnecessaryDefaultProblemDescriptor().get(); } - @Nullable - private static PsiSwitchLabelStatement retrieveUnnecessaryDefault( - PsiSwitchStatement statement) { - final PsiExpression expression = statement.getExpression(); - if (expression == null) { - return null; - } - final PsiType type = expression.getType(); - if (!(type instanceof PsiClassType)) { - return null; - } - final PsiClassType classType = (PsiClassType)type; - final PsiClass aClass = classType.resolve(); - if (aClass == null || !aClass.isEnum()) { - return null; - } - final PsiCodeBlock body = statement.getBody(); - if (body == null) { - return null; - } - final PsiStatement[] statements = body.getStatements(); - int numCases = 0; - PsiSwitchLabelStatement result = null; - for (final PsiStatement child : statements) { - if (!(child instanceof PsiSwitchLabelStatement)) { - continue; - } - final PsiSwitchLabelStatement labelStatement = - (PsiSwitchLabelStatement)child; - if (labelStatement.isDefaultCase()) { - result = labelStatement; + public BaseInspectionVisitor buildVisitor() { + return new UnnecessaryDefaultVisitor(); + } + + private static class UnnecessaryDefaultVisitor + extends BaseInspectionVisitor { + + @Override + public void visitSwitchStatement( + @Nonnull PsiSwitchStatement statement + ) { + super.visitSwitchStatement(statement); + final PsiSwitchLabelStatement defaultStatement = + retrieveUnnecessaryDefault(statement); + if (defaultStatement == null) { + return; + } + PsiStatement nextStatement = PsiTreeUtil.getNextSiblingOfType( + defaultStatement, PsiStatement.class); + while (nextStatement != null && + !(nextStatement instanceof PsiBreakStatement) && + !(nextStatement instanceof PsiSwitchLabelStatement)) { + if (nextStatement instanceof PsiThrowStatement || + isStatementNeededForInitializationOfVariable( + statement, + nextStatement + )) { + return; + } + nextStatement = PsiTreeUtil.getNextSiblingOfType( + nextStatement, PsiStatement.class); + } + registerStatementError(defaultStatement); } - else { - numCases++; + + private static boolean isStatementNeededForInitializationOfVariable( + PsiSwitchStatement switchStatement, PsiStatement statement + ) { + if (!(statement instanceof PsiExpressionStatement)) { + return false; + } + final PsiExpressionStatement expressionStatement = + (PsiExpressionStatement) statement; + final PsiExpression expression = + expressionStatement.getExpression(); + if (!(expression instanceof PsiAssignmentExpression)) { + return false; + } + final PsiAssignmentExpression assignmentExpression = + (PsiAssignmentExpression) expression; + final PsiExpression lhs = assignmentExpression.getLExpression(); + if (!(lhs instanceof PsiReferenceExpression)) { + return false; + } + final PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) lhs; + final PsiElement target = referenceExpression.resolve(); + if (!(target instanceof PsiLocalVariable)) { + return false; + } + final PsiLocalVariable variable = (PsiLocalVariable) target; + return InitializationUtils.switchStatementAssignsVariableOrFails( + switchStatement, variable, true); } - } - if (result == null) { - return null; - } - final PsiField[] fields = aClass.getFields(); - int numEnums = 0; - for (final PsiField field : fields) { - final PsiType fieldType = field.getType(); - if (fieldType.equals(type)) { - numEnums++; + + @Nullable + private static PsiSwitchLabelStatement retrieveUnnecessaryDefault( + PsiSwitchStatement statement + ) { + final PsiExpression expression = statement.getExpression(); + if (expression == null) { + return null; + } + final PsiType type = expression.getType(); + if (!(type instanceof PsiClassType)) { + return null; + } + final PsiClassType classType = (PsiClassType) type; + final PsiClass aClass = classType.resolve(); + if (aClass == null || !aClass.isEnum()) { + return null; + } + final PsiCodeBlock body = statement.getBody(); + if (body == null) { + return null; + } + final PsiStatement[] statements = body.getStatements(); + int numCases = 0; + PsiSwitchLabelStatement result = null; + for (final PsiStatement child : statements) { + if (!(child instanceof PsiSwitchLabelStatement)) { + continue; + } + final PsiSwitchLabelStatement labelStatement = + (PsiSwitchLabelStatement) child; + if (labelStatement.isDefaultCase()) { + result = labelStatement; + } + else { + numCases++; + } + } + if (result == null) { + return null; + } + final PsiField[] fields = aClass.getFields(); + int numEnums = 0; + for (final PsiField field : fields) { + final PsiType fieldType = field.getType(); + if (fieldType.equals(type)) { + numEnums++; + } + } + if (numEnums != numCases) { + return null; + } + return result; } - } - if (numEnums != numCases) { - return null; - } - return result; } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryLabelOnBreakStatementInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryLabelOnBreakStatementInspection.java index 6ad9a97be1..d4d2efbd8f 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryLabelOnBreakStatementInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryLabelOnBreakStatementInspection.java @@ -25,80 +25,80 @@ import consulo.language.psi.PsiElement; import consulo.language.psi.util.PsiTreeUtil; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; @ExtensionImpl -public class UnnecessaryLabelOnBreakStatementInspection - extends BaseInspection { - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.unnecessaryLabelOnBreakStatementDisplayName().get(); - } +public class UnnecessaryLabelOnBreakStatementInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.unnecessaryLabelOnBreakStatementDisplayName(); + } - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.unnecessaryLabelOnBreakStatementProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.unnecessaryLabelOnBreakStatementProblemDescriptor().get(); + } - public boolean isEnabledByDefault() { - return true; - } + public boolean isEnabledByDefault() { + return true; + } - public InspectionGadgetsFix buildFix(Object... infos) { - return new UnnecessaryLabelOnBreakStatementFix(); - } + public InspectionGadgetsFix buildFix(Object... infos) { + return new UnnecessaryLabelOnBreakStatementFix(); + } - private static class UnnecessaryLabelOnBreakStatementFix - extends InspectionGadgetsFix { + private static class UnnecessaryLabelOnBreakStatementFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.unnecessaryLabelRemoveQuickfix(); + } - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.unnecessaryLabelRemoveQuickfix().get(); + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement breakKeywordElement = descriptor.getPsiElement(); + final PsiBreakStatement breakStatement = (PsiBreakStatement) breakKeywordElement.getParent(); + final PsiIdentifier identifier = breakStatement.getLabelIdentifier(); + if (identifier == null) { + return; + } + identifier.delete(); + } } - public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement breakKeywordElement = descriptor.getPsiElement(); - final PsiBreakStatement breakStatement = (PsiBreakStatement)breakKeywordElement.getParent(); - final PsiIdentifier identifier = breakStatement.getLabelIdentifier(); - if (identifier == null) { - return; - } - identifier.delete(); + public BaseInspectionVisitor buildVisitor() { + return new UnnecessaryLabelOnBreakStatementVisitor(); } - } - public BaseInspectionVisitor buildVisitor() { - return new UnnecessaryLabelOnBreakStatementVisitor(); - } - - private static class UnnecessaryLabelOnBreakStatementVisitor extends BaseInspectionVisitor { - @Override - public void visitBreakStatement(@Nonnull PsiBreakStatement statement) { - final PsiIdentifier labelIdentifier = statement.getLabelIdentifier(); - if (labelIdentifier == null) { - return; - } - final String labelText = labelIdentifier.getText(); - if (labelText == null || labelText.length() == 0) { - return; - } - final PsiStatement exitedStatement = statement.findExitedStatement(); - if (exitedStatement == null) { - return; - } - final PsiStatement labelEnabledParent = - PsiTreeUtil.getParentOfType(statement, - PsiForStatement.class, PsiDoWhileStatement.class, - PsiForeachStatement.class, PsiWhileStatement.class, - PsiSwitchStatement.class); - if (labelEnabledParent == null) { - return; - } - if (exitedStatement.equals(labelEnabledParent)) { - registerStatementError(statement); - } + private static class UnnecessaryLabelOnBreakStatementVisitor extends BaseInspectionVisitor { + @Override + public void visitBreakStatement(@Nonnull PsiBreakStatement statement) { + final PsiIdentifier labelIdentifier = statement.getLabelIdentifier(); + if (labelIdentifier == null) { + return; + } + final String labelText = labelIdentifier.getText(); + if (labelText == null || labelText.length() == 0) { + return; + } + final PsiStatement exitedStatement = statement.findExitedStatement(); + if (exitedStatement == null) { + return; + } + final PsiStatement labelEnabledParent = + PsiTreeUtil.getParentOfType(statement, + PsiForStatement.class, PsiDoWhileStatement.class, + PsiForeachStatement.class, PsiWhileStatement.class, + PsiSwitchStatement.class + ); + if (labelEnabledParent == null) { + return; + } + if (exitedStatement.equals(labelEnabledParent)) { + registerStatementError(statement); + } + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryLabelOnContinueStatementInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryLabelOnContinueStatementInspection.java index 9c801b27c7..7806f9eccd 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryLabelOnContinueStatementInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryLabelOnContinueStatementInspection.java @@ -25,90 +25,91 @@ import consulo.language.psi.PsiElement; import consulo.language.psi.util.PsiTreeUtil; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; @ExtensionImpl -public class UnnecessaryLabelOnContinueStatementInspection - extends BaseInspection { - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.unnecessaryLabelOnContinueStatementDisplayName().get(); - } +public class UnnecessaryLabelOnContinueStatementInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.unnecessaryLabelOnContinueStatementDisplayName(); + } - public boolean isEnabledByDefault() { - return true; - } + public boolean isEnabledByDefault() { + return true; + } - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.unnecessaryLabelOnContinueStatementProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.unnecessaryLabelOnContinueStatementProblemDescriptor().get(); + } - public InspectionGadgetsFix buildFix(Object... infos) { - return new UnnecessaryLabelOnContinueStatementFix(); - } + public InspectionGadgetsFix buildFix(Object... infos) { + return new UnnecessaryLabelOnContinueStatementFix(); + } - private static class UnnecessaryLabelOnContinueStatementFix - extends InspectionGadgetsFix { + private static class UnnecessaryLabelOnContinueStatementFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.unnecessaryLabelRemoveQuickfix(); + } - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.unnecessaryLabelRemoveQuickfix().get(); + public void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement continueKeywordElement = + descriptor.getPsiElement(); + final PsiContinueStatement continueStatement = + (PsiContinueStatement) continueKeywordElement.getParent(); + final PsiIdentifier labelIdentifier = + continueStatement.getLabelIdentifier(); + if (labelIdentifier == null) { + return; + } + labelIdentifier.delete(); + } } - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement continueKeywordElement = - descriptor.getPsiElement(); - final PsiContinueStatement continueStatement = - (PsiContinueStatement)continueKeywordElement.getParent(); - final PsiIdentifier labelIdentifier = - continueStatement.getLabelIdentifier(); - if (labelIdentifier == null) { - return; - } - labelIdentifier.delete(); + public BaseInspectionVisitor buildVisitor() { + return new UnnecessaryLabelOnContinueStatementVisitor(); } - } - public BaseInspectionVisitor buildVisitor() { - return new UnnecessaryLabelOnContinueStatementVisitor(); - } + private static class UnnecessaryLabelOnContinueStatementVisitor + extends BaseInspectionVisitor { - private static class UnnecessaryLabelOnContinueStatementVisitor - extends BaseInspectionVisitor { - - @Override - public void visitContinueStatement( - @Nonnull PsiContinueStatement statement) { - final PsiIdentifier labelIdentifier = - statement.getLabelIdentifier(); - if (labelIdentifier == null) { - return; - } - final String labelText = labelIdentifier.getText(); - if (labelText == null || labelText.length() == 0) { - return; - } - final PsiStatement exitedStatement = - statement.findContinuedStatement(); - if (exitedStatement == null) { - return; - } - final PsiStatement labelEnabledParent = - PsiTreeUtil.getParentOfType(statement, - PsiForStatement.class, PsiDoWhileStatement.class, - PsiForeachStatement.class, PsiWhileStatement.class, - PsiSwitchStatement.class); - if (labelEnabledParent == null) { - return; - } - if (!exitedStatement.equals(labelEnabledParent)) { - return; - } - registerStatementError(statement); + @Override + public void visitContinueStatement( + @Nonnull PsiContinueStatement statement + ) { + final PsiIdentifier labelIdentifier = + statement.getLabelIdentifier(); + if (labelIdentifier == null) { + return; + } + final String labelText = labelIdentifier.getText(); + if (labelText == null || labelText.length() == 0) { + return; + } + final PsiStatement exitedStatement = + statement.findContinuedStatement(); + if (exitedStatement == null) { + return; + } + final PsiStatement labelEnabledParent = + PsiTreeUtil.getParentOfType(statement, + PsiForStatement.class, PsiDoWhileStatement.class, + PsiForeachStatement.class, PsiWhileStatement.class, + PsiSwitchStatement.class + ); + if (labelEnabledParent == null) { + return; + } + if (!exitedStatement.equals(labelEnabledParent)) { + return; + } + registerStatementError(statement); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryReturnInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryReturnInspection.java index 6272c926ba..16094a03d9 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryReturnInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/controlflow/UnnecessaryReturnInspection.java @@ -28,104 +28,106 @@ import consulo.language.psi.util.PsiTreeUtil; import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; @ExtensionImpl public class UnnecessaryReturnInspection extends BaseInspection { - @SuppressWarnings("PublicField") - public boolean ignoreInThenBranch = false; + @SuppressWarnings("PublicField") + public boolean ignoreInThenBranch = false; - @Override - @Nonnull - public String getID() { - return "UnnecessaryReturnStatement"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.unnecessaryReturnDisplayName().get(); - } + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "UnnecessaryReturnStatement"; + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return (Boolean)infos[0] - ? InspectionGadgetsLocalize.unnecessaryReturnConstructorProblemDescriptor().get() - : InspectionGadgetsLocalize.unnecessaryReturnProblemDescriptor().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.unnecessaryReturnDisplayName(); + } - @Override - public boolean isEnabledByDefault() { - return true; - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return (Boolean) infos[0] + ? InspectionGadgetsLocalize.unnecessaryReturnConstructorProblemDescriptor().get() + : InspectionGadgetsLocalize.unnecessaryReturnProblemDescriptor().get(); + } - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.unnecessaryReturnOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreInThenBranch"); - } + @Override + public boolean isEnabledByDefault() { + return true; + } - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new DeleteUnnecessaryStatementFix("return"); - } + @Override + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.unnecessaryReturnOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreInThenBranch"); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new UnnecessaryReturnVisitor(); - } + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + return new DeleteUnnecessaryStatementFix("return"); + } - private class UnnecessaryReturnVisitor extends BaseInspectionVisitor { @Override - public void visitReturnStatement(@Nonnull PsiReturnStatement statement) { - super.visitReturnStatement(statement); + public BaseInspectionVisitor buildVisitor() { + return new UnnecessaryReturnVisitor(); + } + + private class UnnecessaryReturnVisitor extends BaseInspectionVisitor { + @Override + public void visitReturnStatement(@Nonnull PsiReturnStatement statement) { + super.visitReturnStatement(statement); /* if (JspPsiUtil.isInJspFile(statement.getContainingFile())) { return; } */ - if (statement.getReturnValue() != null) { - return; - } - final PsiElement methodParent = PsiTreeUtil.getParentOfType(statement, PsiMethod.class, PsiLambdaExpression.class); - PsiCodeBlock codeBlock = null; - final boolean constructor; - if (methodParent instanceof PsiMethod) { - final PsiMethod method = (PsiMethod)methodParent; - codeBlock = method.getBody(); - constructor = method.isConstructor(); - } - else if (methodParent instanceof PsiLambdaExpression) { - constructor = false; - final PsiLambdaExpression lambdaExpression = (PsiLambdaExpression)methodParent; - final PsiElement lambdaBody = lambdaExpression.getBody(); - if (lambdaBody instanceof PsiCodeBlock) { - codeBlock = (PsiCodeBlock)lambdaBody; + if (statement.getReturnValue() != null) { + return; + } + final PsiElement methodParent = PsiTreeUtil.getParentOfType(statement, PsiMethod.class, PsiLambdaExpression.class); + PsiCodeBlock codeBlock = null; + final boolean constructor; + if (methodParent instanceof PsiMethod) { + final PsiMethod method = (PsiMethod) methodParent; + codeBlock = method.getBody(); + constructor = method.isConstructor(); + } + else if (methodParent instanceof PsiLambdaExpression) { + constructor = false; + final PsiLambdaExpression lambdaExpression = (PsiLambdaExpression) methodParent; + final PsiElement lambdaBody = lambdaExpression.getBody(); + if (lambdaBody instanceof PsiCodeBlock) { + codeBlock = (PsiCodeBlock) lambdaBody; + } + } + else { + return; + } + if (codeBlock == null) { + return; + } + if (!ControlFlowUtils.blockCompletesWithStatement(codeBlock, statement)) { + return; + } + if (ignoreInThenBranch && isInThenBranch(statement)) { + return; + } + registerStatementError(statement, Boolean.valueOf(constructor)); } - } - else { - return; - } - if (codeBlock == null) { - return; - } - if (!ControlFlowUtils.blockCompletesWithStatement(codeBlock, statement)) { - return; - } - if (ignoreInThenBranch && isInThenBranch(statement)) { - return; - } - registerStatementError(statement, Boolean.valueOf(constructor)); - } - private boolean isInThenBranch(PsiStatement statement) { - final PsiIfStatement ifStatement = - PsiTreeUtil.getParentOfType(statement, PsiIfStatement.class, true, PsiMethod.class, PsiLambdaExpression.class); - if (ifStatement == null) { - return false; - } - final PsiStatement elseBranch = ifStatement.getElseBranch(); - return elseBranch != null && !PsiTreeUtil.isAncestor(elseBranch, statement, true); + private boolean isInThenBranch(PsiStatement statement) { + final PsiIfStatement ifStatement = + PsiTreeUtil.getParentOfType(statement, PsiIfStatement.class, true, PsiMethod.class, PsiLambdaExpression.class); + if (ifStatement == null) { + return false; + } + final PsiStatement elseBranch = ifStatement.getElseBranch(); + return elseBranch != null && !PsiTreeUtil.isAncestor(elseBranch, statement, true); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/ConstantValueVariableUseInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/ConstantValueVariableUseInspection.java index 25330af0f0..0560485d5f 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/ConstantValueVariableUseInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/ConstantValueVariableUseInspection.java @@ -29,428 +29,442 @@ import consulo.language.psi.SmartPointerManager; import consulo.language.psi.SmartPsiElementPointer; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @ExtensionImpl public class ConstantValueVariableUseInspection extends BaseInspection { - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.constantValueVariableUseDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.constantValueVariableUseProblemDescriptor().get(); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiExpression expression = (PsiExpression)infos[0]; - return new ReplaceReferenceWithExpressionFix(expression); - } - - private static class ReplaceReferenceWithExpressionFix - extends InspectionGadgetsFix { - private final SmartPsiElementPointer expression; - private final String myText; - - ReplaceReferenceWithExpressionFix( - PsiExpression expression) { - this.expression = SmartPointerManager.getInstance(expression.getProject()).createSmartPsiElementPointer(expression); - myText = expression.getText(); + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.constantValueVariableUseDisplayName(); } - + @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.replaceReferenceWithExpressionQuickfix(myText).get(); + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.constantValueVariableUseProblemDescriptor().get(); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - - PsiExpression exp = expression.getElement(); - if (exp == null) return; - element.replace(exp); + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiExpression expression = (PsiExpression) infos[0]; + return new ReplaceReferenceWithExpressionFix(expression); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new ConstantValueVariableUseVisitor(); - } + private static class ReplaceReferenceWithExpressionFix + extends InspectionGadgetsFix { + private final SmartPsiElementPointer expression; + private final String myText; - private static class ConstantValueVariableUseVisitor - extends BaseInspectionVisitor { + ReplaceReferenceWithExpressionFix( + PsiExpression expression + ) { + this.expression = SmartPointerManager.getInstance(expression.getProject()).createSmartPsiElementPointer(expression); + myText = expression.getText(); + } - @Override - public void visitIfStatement(PsiIfStatement statement) { - super.visitIfStatement(statement); - final PsiExpression condition = statement.getCondition(); - final PsiStatement body = statement.getThenBranch(); - checkCondition(condition, body); - } + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.replaceReferenceWithExpressionQuickfix(myText); + } - @Override - public void visitWhileStatement(PsiWhileStatement statement) { - super.visitWhileStatement(statement); - final PsiExpression condition = statement.getCondition(); - final PsiStatement body = statement.getBody(); - checkCondition(condition, body); + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + + PsiExpression exp = expression.getElement(); + if (exp == null) { + return; + } + element.replace(exp); + } } @Override - public void visitForStatement(PsiForStatement statement) { - super.visitForStatement(statement); - final PsiExpression condition = statement.getCondition(); - final PsiStatement body = statement.getBody(); - checkCondition(condition, body); + public BaseInspectionVisitor buildVisitor() { + return new ConstantValueVariableUseVisitor(); } - private boolean checkCondition(@Nullable PsiExpression condition, - @Nullable PsiStatement body) { - if (body == null) { - return false; - } - if (!(condition instanceof PsiBinaryExpression)) { - return false; - } - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)condition; - final IElementType tokenType = - binaryExpression.getOperationTokenType(); - final PsiExpression lhs = binaryExpression.getLOperand(); - final PsiExpression rhs = binaryExpression.getROperand(); - if (JavaTokenType.ANDAND == tokenType) { - return checkCondition(lhs, body) || - checkCondition(rhs, body); - } - if (JavaTokenType.EQEQ != tokenType) { - return false; - } - if (rhs == null) { - return false; - } - if (PsiUtil.isConstantExpression(lhs)) { - return checkConstantValueVariableUse(rhs, lhs, body); - } - else if (PsiUtil.isConstantExpression(rhs)) { - return checkConstantValueVariableUse(lhs, rhs, body); - } - return false; - } + private static class ConstantValueVariableUseVisitor + extends BaseInspectionVisitor { - private boolean checkConstantValueVariableUse( - @Nullable PsiExpression expression, - @Nonnull PsiExpression constantExpression, - @Nonnull PsiElement body) { - final PsiType constantType = constantExpression.getType(); - if (PsiType.DOUBLE.equals(constantType)) { - final Object result = ExpressionUtils.computeConstantExpression( - constantExpression, false); - if (Double.valueOf(0.0).equals(result) || - Double.valueOf(-0.0).equals(result)) { - return false; + @Override + public void visitIfStatement(PsiIfStatement statement) { + super.visitIfStatement(statement); + final PsiExpression condition = statement.getCondition(); + final PsiStatement body = statement.getThenBranch(); + checkCondition(condition, body); } - } - if (!(expression instanceof PsiReferenceExpression)) { - return false; - } - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)expression; - final PsiElement target = referenceExpression.resolve(); - if (!(target instanceof PsiVariable)) { - return false; - } - if (target instanceof PsiField) { - return false; - } - final PsiVariable variable = (PsiVariable)target; - final VariableReadVisitor visitor = - new VariableReadVisitor(variable); - body.accept(visitor); - if (!visitor.isRead()) { - return false; - } - registerError(visitor.getReference(), constantExpression); - return true; - } - } - private static class VariableReadVisitor - extends JavaRecursiveElementVisitor { + @Override + public void visitWhileStatement(PsiWhileStatement statement) { + super.visitWhileStatement(statement); + final PsiExpression condition = statement.getCondition(); + final PsiStatement body = statement.getBody(); + checkCondition(condition, body); + } - @Nonnull - private final PsiVariable variable; - private boolean read = false; - private boolean written = false; - private PsiReferenceExpression reference = null; + @Override + public void visitForStatement(PsiForStatement statement) { + super.visitForStatement(statement); + final PsiExpression condition = statement.getCondition(); + final PsiStatement body = statement.getBody(); + checkCondition(condition, body); + } - VariableReadVisitor(@Nonnull PsiVariable variable) { - this.variable = variable; - } + private boolean checkCondition( + @Nullable PsiExpression condition, + @Nullable PsiStatement body + ) { + if (body == null) { + return false; + } + if (!(condition instanceof PsiBinaryExpression)) { + return false; + } + final PsiBinaryExpression binaryExpression = + (PsiBinaryExpression) condition; + final IElementType tokenType = + binaryExpression.getOperationTokenType(); + final PsiExpression lhs = binaryExpression.getLOperand(); + final PsiExpression rhs = binaryExpression.getROperand(); + if (JavaTokenType.ANDAND == tokenType) { + return checkCondition(lhs, body) || + checkCondition(rhs, body); + } + if (JavaTokenType.EQEQ != tokenType) { + return false; + } + if (rhs == null) { + return false; + } + if (PsiUtil.isConstantExpression(lhs)) { + return checkConstantValueVariableUse(rhs, lhs, body); + } + else if (PsiUtil.isConstantExpression(rhs)) { + return checkConstantValueVariableUse(lhs, rhs, body); + } + return false; + } - @Override - public void visitElement(@Nonnull PsiElement element) { - if (read || written) { - return; - } - super.visitElement(element); + private boolean checkConstantValueVariableUse( + @Nullable PsiExpression expression, + @Nonnull PsiExpression constantExpression, + @Nonnull PsiElement body + ) { + final PsiType constantType = constantExpression.getType(); + if (PsiType.DOUBLE.equals(constantType)) { + final Object result = ExpressionUtils.computeConstantExpression( + constantExpression, false); + if (Double.valueOf(0.0).equals(result) || + Double.valueOf(-0.0).equals(result)) { + return false; + } + } + if (!(expression instanceof PsiReferenceExpression)) { + return false; + } + final PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) expression; + final PsiElement target = referenceExpression.resolve(); + if (!(target instanceof PsiVariable)) { + return false; + } + if (target instanceof PsiField) { + return false; + } + final PsiVariable variable = (PsiVariable) target; + final VariableReadVisitor visitor = + new VariableReadVisitor(variable); + body.accept(visitor); + if (!visitor.isRead()) { + return false; + } + registerError(visitor.getReference(), constantExpression); + return true; + } } - @Override - public void visitAssignmentExpression( - @Nonnull PsiAssignmentExpression assignment) { - if (read || written) { - return; - } - super.visitAssignmentExpression(assignment); - final PsiExpression lhs = assignment.getLExpression(); - if (lhs instanceof PsiReferenceExpression) { - PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)lhs; - final PsiElement target = referenceExpression.resolve(); - if (variable.equals(target)) { - written = true; - return; + private static class VariableReadVisitor + extends JavaRecursiveElementVisitor { + + @Nonnull + private final PsiVariable variable; + private boolean read = false; + private boolean written = false; + private PsiReferenceExpression reference = null; + + VariableReadVisitor(@Nonnull PsiVariable variable) { + this.variable = variable; } - } - final PsiExpression rhs = assignment.getRExpression(); - if (rhs == null) { - return; - } - final VariableUsedVisitor visitor = - new VariableUsedVisitor(variable); - rhs.accept(visitor); - read = visitor.isUsed(); - reference = visitor.getReference(); - } - @Override - public void visitPrefixExpression( - @Nonnull PsiPrefixExpression prefixExpression) { - if (read || written) { - return; - } - super.visitPrefixExpression(prefixExpression); - final IElementType tokenType = prefixExpression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.PLUSPLUS) && - !tokenType.equals(JavaTokenType.MINUSMINUS)) { - return; - } - final PsiExpression operand = prefixExpression.getOperand(); - if (!(operand instanceof PsiReferenceExpression)) { - return; - } - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)operand; - final PsiElement target = referenceExpression.resolve(); - if (!variable.equals(target)) { - return; - } - written = true; - } + @Override + public void visitElement(@Nonnull PsiElement element) { + if (read || written) { + return; + } + super.visitElement(element); + } - @Override - public void visitPostfixExpression( - @Nonnull PsiPostfixExpression postfixExpression) { - if (read || written) { - return; - } - super.visitPostfixExpression(postfixExpression); - final IElementType tokenType = postfixExpression.getOperationTokenType(); - if (!tokenType.equals(JavaTokenType.PLUSPLUS) && - !tokenType.equals(JavaTokenType.MINUSMINUS)) { - return; - } - final PsiExpression operand = postfixExpression.getOperand(); - if (!(operand instanceof PsiReferenceExpression)) { - return; - } - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)operand; - final PsiElement target = referenceExpression.resolve(); - if (!variable.equals(target)) { - return; - } - written = true; - } + @Override + public void visitAssignmentExpression( + @Nonnull PsiAssignmentExpression assignment + ) { + if (read || written) { + return; + } + super.visitAssignmentExpression(assignment); + final PsiExpression lhs = assignment.getLExpression(); + if (lhs instanceof PsiReferenceExpression) { + PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) lhs; + final PsiElement target = referenceExpression.resolve(); + if (variable.equals(target)) { + written = true; + return; + } + } + final PsiExpression rhs = assignment.getRExpression(); + if (rhs == null) { + return; + } + final VariableUsedVisitor visitor = + new VariableUsedVisitor(variable); + rhs.accept(visitor); + read = visitor.isUsed(); + reference = visitor.getReference(); + } - @Override - public void visitVariable(@Nonnull PsiVariable variable) { - if (read || written) { - return; - } - super.visitVariable(variable); - final PsiExpression initalizer = variable.getInitializer(); - if (initalizer == null) { - return; - } - final VariableUsedVisitor visitor = - new VariableUsedVisitor(variable); - initalizer.accept(visitor); - read = visitor.isUsed(); - reference = visitor.getReference(); - } + @Override + public void visitPrefixExpression( + @Nonnull PsiPrefixExpression prefixExpression + ) { + if (read || written) { + return; + } + super.visitPrefixExpression(prefixExpression); + final IElementType tokenType = prefixExpression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.PLUSPLUS) && + !tokenType.equals(JavaTokenType.MINUSMINUS)) { + return; + } + final PsiExpression operand = prefixExpression.getOperand(); + if (!(operand instanceof PsiReferenceExpression)) { + return; + } + final PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) operand; + final PsiElement target = referenceExpression.resolve(); + if (!variable.equals(target)) { + return; + } + written = true; + } - @Override - public void visitMethodCallExpression( - @Nonnull PsiMethodCallExpression call) { - if (read || written) { - return; - } - super.visitMethodCallExpression(call); - final PsiExpressionList argumentList = call.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - for (final PsiExpression argument : arguments) { - final VariableUsedVisitor visitor = - new VariableUsedVisitor(variable); - argument.accept(visitor); - if (visitor.isUsed()) { - read = true; - reference = visitor.getReference(); - return; + @Override + public void visitPostfixExpression( + @Nonnull PsiPostfixExpression postfixExpression + ) { + if (read || written) { + return; + } + super.visitPostfixExpression(postfixExpression); + final IElementType tokenType = postfixExpression.getOperationTokenType(); + if (!tokenType.equals(JavaTokenType.PLUSPLUS) && + !tokenType.equals(JavaTokenType.MINUSMINUS)) { + return; + } + final PsiExpression operand = postfixExpression.getOperand(); + if (!(operand instanceof PsiReferenceExpression)) { + return; + } + final PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) operand; + final PsiElement target = referenceExpression.resolve(); + if (!variable.equals(target)) { + return; + } + written = true; } - } - } - @Override - public void visitNewExpression( - @Nonnull PsiNewExpression newExpression) { - if (read || written) { - return; - } - super.visitNewExpression(newExpression); - final PsiExpressionList argumentList = - newExpression.getArgumentList(); - if (argumentList == null) { - return; - } - final PsiExpression[] arguments = argumentList.getExpressions(); - for (final PsiExpression argument : arguments) { - final VariableUsedVisitor visitor = - new VariableUsedVisitor(variable); - argument.accept(visitor); - if (visitor.isUsed()) { - read = true; - reference = visitor.getReference(); - return; + @Override + public void visitVariable(@Nonnull PsiVariable variable) { + if (read || written) { + return; + } + super.visitVariable(variable); + final PsiExpression initalizer = variable.getInitializer(); + if (initalizer == null) { + return; + } + final VariableUsedVisitor visitor = + new VariableUsedVisitor(variable); + initalizer.accept(visitor); + read = visitor.isUsed(); + reference = visitor.getReference(); } - } - } - @Override - public void visitArrayInitializerExpression( - PsiArrayInitializerExpression expression) { - if (read || written) { - return; - } - super.visitArrayInitializerExpression(expression); - final PsiExpression[] arguments = expression.getInitializers(); - for (final PsiExpression argument : arguments) { - final VariableUsedVisitor visitor = - new VariableUsedVisitor(variable); - argument.accept(visitor); - if (visitor.isUsed()) { - read = true; - reference = visitor.getReference(); - return; + @Override + public void visitMethodCallExpression( + @Nonnull PsiMethodCallExpression call + ) { + if (read || written) { + return; + } + super.visitMethodCallExpression(call); + final PsiExpressionList argumentList = call.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + for (final PsiExpression argument : arguments) { + final VariableUsedVisitor visitor = + new VariableUsedVisitor(variable); + argument.accept(visitor); + if (visitor.isUsed()) { + read = true; + reference = visitor.getReference(); + return; + } + } } - } - } - @Override - public void visitReturnStatement( - @Nonnull PsiReturnStatement returnStatement) { - if (read || written) { - return; - } - super.visitReturnStatement(returnStatement); - final PsiExpression returnValue = returnStatement.getReturnValue(); - if (returnValue == null) { - return; - } - final VariableUsedVisitor visitor = - new VariableUsedVisitor(variable); - returnValue.accept(visitor); - read = visitor.isUsed(); - reference = visitor.getReference(); - } + @Override + public void visitNewExpression( + @Nonnull PsiNewExpression newExpression + ) { + if (read || written) { + return; + } + super.visitNewExpression(newExpression); + final PsiExpressionList argumentList = + newExpression.getArgumentList(); + if (argumentList == null) { + return; + } + final PsiExpression[] arguments = argumentList.getExpressions(); + for (final PsiExpression argument : arguments) { + final VariableUsedVisitor visitor = + new VariableUsedVisitor(variable); + argument.accept(visitor); + if (visitor.isUsed()) { + read = true; + reference = visitor.getReference(); + return; + } + } + } - /** - * check if variable is used in nested/inner class. - */ - @Override - public void visitClass(PsiClass aClass) { - if (read || written) { - return; - } - super.visitClass(aClass); - final VariableUsedVisitor visitor = - new VariableUsedVisitor(variable); - aClass.accept(visitor); - read = visitor.isUsed(); - reference = visitor.getReference(); - } + @Override + public void visitArrayInitializerExpression( + PsiArrayInitializerExpression expression + ) { + if (read || written) { + return; + } + super.visitArrayInitializerExpression(expression); + final PsiExpression[] arguments = expression.getInitializers(); + for (final PsiExpression argument : arguments) { + final VariableUsedVisitor visitor = + new VariableUsedVisitor(variable); + argument.accept(visitor); + if (visitor.isUsed()) { + read = true; + reference = visitor.getReference(); + return; + } + } + } - public boolean isRead() { - return read; - } + @Override + public void visitReturnStatement( + @Nonnull PsiReturnStatement returnStatement + ) { + if (read || written) { + return; + } + super.visitReturnStatement(returnStatement); + final PsiExpression returnValue = returnStatement.getReturnValue(); + if (returnValue == null) { + return; + } + final VariableUsedVisitor visitor = + new VariableUsedVisitor(variable); + returnValue.accept(visitor); + read = visitor.isUsed(); + reference = visitor.getReference(); + } - public PsiReferenceExpression getReference() { - return reference; + /** + * check if variable is used in nested/inner class. + */ + @Override + public void visitClass(PsiClass aClass) { + if (read || written) { + return; + } + super.visitClass(aClass); + final VariableUsedVisitor visitor = + new VariableUsedVisitor(variable); + aClass.accept(visitor); + read = visitor.isUsed(); + reference = visitor.getReference(); + } + + public boolean isRead() { + return read; + } + + public PsiReferenceExpression getReference() { + return reference; + } } - } - private static class VariableUsedVisitor - extends JavaRecursiveElementVisitor { + private static class VariableUsedVisitor + extends JavaRecursiveElementVisitor { - private final PsiVariable variable; - private boolean used = false; - private PsiReferenceExpression reference = null; + private final PsiVariable variable; + private boolean used = false; + private PsiReferenceExpression reference = null; - VariableUsedVisitor(PsiVariable variable) { - this.variable = variable; - } + VariableUsedVisitor(PsiVariable variable) { + this.variable = variable; + } - @Override - public void visitElement(PsiElement element) { - if (used) { - return; - } - super.visitElement(element); - } + @Override + public void visitElement(PsiElement element) { + if (used) { + return; + } + super.visitElement(element); + } - @Override - public void visitReferenceExpression( - @Nonnull PsiReferenceExpression expression) { - if (used) { - return; - } - super.visitReferenceExpression(expression); - final PsiElement referent = expression.resolve(); - if (referent == null) { - return; - } - if (referent.equals(variable)) { - reference = expression; - used = true; - } - } + @Override + public void visitReferenceExpression( + @Nonnull PsiReferenceExpression expression + ) { + if (used) { + return; + } + super.visitReferenceExpression(expression); + final PsiElement referent = expression.resolve(); + if (referent == null) { + return; + } + if (referent.equals(variable)) { + reference = expression; + used = true; + } + } - public boolean isUsed() { - return used; - } + public boolean isUsed() { + return used; + } - public PsiReferenceExpression getReference() { - return reference; + public PsiReferenceExpression getReference() { + return reference; + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/LawOfDemeterInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/LawOfDemeterInspection.java index 12d5d15ac7..40acfea420 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/LawOfDemeterInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/LawOfDemeterInspection.java @@ -32,108 +32,108 @@ @ExtensionImpl public class LawOfDemeterInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean ignoreLibraryCalls = true; - @SuppressWarnings({"PublicField"}) - public boolean ignoreLibraryCalls = true; + private static final Key key = Key.create("LawOfDemeterInspection"); - private static final Key key = - Key.create("LawOfDemeterInspection"); - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.lawOfDemeterDisplayName().get(); - } - - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.lawOfDemeterProblemDescriptor().get(); - } + @Nonnull + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.lawOfDemeterDisplayName(); + } - @Nullable - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.lawOfDemeterIgnoreLibraryCallsOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreLibraryCalls"); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.lawOfDemeterProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new LawOfDemeterVisitor(); - } + @Nullable + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.lawOfDemeterIgnoreLibraryCallsOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignoreLibraryCalls"); + } - private class LawOfDemeterVisitor extends BaseInspectionVisitor { + public BaseInspectionVisitor buildVisitor() { + return new LawOfDemeterVisitor(); + } - private static final int threshold = 2; + private class LawOfDemeterVisitor extends BaseInspectionVisitor { - @Override - public void visitMethodCallExpression( - PsiMethodCallExpression expression) { - super.visitMethodCallExpression(expression); - if (ignoreLibraryCalls && - LibraryUtil.callOnLibraryMethod(expression)) { - return; - } - expression.putUserData(key, Integer.valueOf(1)); - checkParents(expression, Integer.valueOf(1)); - } + private static final int threshold = 2; - public void checkParents(PsiExpression expression, Integer count) { - final PsiElement parent = expression.getParent(); - if (parent instanceof PsiLocalVariable) { - final Integer localCount = expression.getUserData(key); - parent.putUserData(key, localCount); - } - else if (parent instanceof PsiAssignmentExpression) { - final PsiAssignmentExpression assignmentExpression = - (PsiAssignmentExpression)parent; - final PsiExpression lhs = assignmentExpression.getLExpression(); - if (!(lhs instanceof PsiReferenceExpression)) { - return; + @Override + public void visitMethodCallExpression( + PsiMethodCallExpression expression + ) { + super.visitMethodCallExpression(expression); + if (ignoreLibraryCalls && + LibraryUtil.callOnLibraryMethod(expression)) { + return; + } + expression.putUserData(key, Integer.valueOf(1)); + checkParents(expression, Integer.valueOf(1)); } - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)lhs; - final PsiElement element = referenceExpression.resolve(); - if (!(element instanceof PsiLocalVariable)) { - return; - } - final Integer localCount = expression.getUserData(key); - element.putUserData(key, localCount); - } - else if (parent instanceof PsiReferenceExpression) { - final PsiElement grandParent = parent.getParent(); - if (!(grandParent instanceof PsiMethodCallExpression)) { - return; - } - final PsiMethodCallExpression methodCallExpression = - (PsiMethodCallExpression)grandParent; - final Integer userData = grandParent.getUserData(key); - if (userData == null) { - return; - } - final int localCount = userData.intValue(); - final int newCount = localCount + count.intValue(); - if (newCount == threshold) { - registerMethodCallError(methodCallExpression); + + public void checkParents(PsiExpression expression, Integer count) { + final PsiElement parent = expression.getParent(); + if (parent instanceof PsiLocalVariable) { + final Integer localCount = expression.getUserData(key); + parent.putUserData(key, localCount); + } + else if (parent instanceof PsiAssignmentExpression) { + final PsiAssignmentExpression assignmentExpression = + (PsiAssignmentExpression) parent; + final PsiExpression lhs = assignmentExpression.getLExpression(); + if (!(lhs instanceof PsiReferenceExpression)) { + return; + } + final PsiReferenceExpression referenceExpression = + (PsiReferenceExpression) lhs; + final PsiElement element = referenceExpression.resolve(); + if (!(element instanceof PsiLocalVariable)) { + return; + } + final Integer localCount = expression.getUserData(key); + element.putUserData(key, localCount); + } + else if (parent instanceof PsiReferenceExpression) { + final PsiElement grandParent = parent.getParent(); + if (!(grandParent instanceof PsiMethodCallExpression)) { + return; + } + final PsiMethodCallExpression methodCallExpression = + (PsiMethodCallExpression) grandParent; + final Integer userData = grandParent.getUserData(key); + if (userData == null) { + return; + } + final int localCount = userData.intValue(); + final int newCount = localCount + count.intValue(); + if (newCount == threshold) { + registerMethodCallError(methodCallExpression); + } + grandParent.putUserData(key, Integer.valueOf(newCount)); + checkParents(methodCallExpression, count); + } } - grandParent.putUserData(key, Integer.valueOf(newCount)); - checkParents(methodCallExpression, count); - } - } - @Override - public void visitReferenceExpression( - PsiReferenceExpression expression) { - super.visitReferenceExpression(expression); - final PsiElement parent = expression.getParent(); - if (!(parent instanceof PsiReferenceExpression)) { - return; - } - final PsiElement element = expression.resolve(); - if (!(element instanceof PsiLocalVariable)) { - return; - } - final Integer count = element.getUserData(key); - if (count != null) { - checkParents(expression, count); - } + @Override + public void visitReferenceExpression( + PsiReferenceExpression expression + ) { + super.visitReferenceExpression(expression); + final PsiElement parent = expression.getParent(); + if (!(parent instanceof PsiReferenceExpression)) { + return; + } + final PsiElement element = expression.resolve(); + if (!(element instanceof PsiLocalVariable)) { + return; + } + final Integer count = element.getUserData(key); + if (count != null) { + checkParents(expression, count); + } + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/ReuseOfLocalVariableInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/ReuseOfLocalVariableInspection.java index 1ed898e3a8..4054736990 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/ReuseOfLocalVariableInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/ReuseOfLocalVariableInspection.java @@ -35,6 +35,7 @@ import consulo.language.psi.search.ReferencesSearch; import consulo.language.psi.util.PsiTreeUtil; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @@ -45,220 +46,221 @@ @ExtensionImpl public class ReuseOfLocalVariableInspection extends BaseInspection { - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.reuseOfLocalVariableDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.reuseOfLocalVariableProblemDescriptor().get(); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new ReuseOfLocalVariableFix(); - } - - private static class ReuseOfLocalVariableFix - extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.reuseOfLocalVariableDisplayName(); + } + @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.reuseOfLocalVariableSplitQuickfix().get(); + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.reuseOfLocalVariableProblemDescriptor().get(); } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)descriptor.getPsiElement(); - final PsiLocalVariable variable = (PsiLocalVariable)referenceExpression.resolve(); - final PsiAssignmentExpression assignment = (PsiAssignmentExpression)referenceExpression.getParent(); - assert assignment != null; - final PsiExpressionStatement assignmentStatement = (PsiExpressionStatement)assignment.getParent(); - final PsiExpression lExpression = assignment.getLExpression(); - final String originalVariableName = lExpression.getText(); - assert variable != null; - final PsiType type = variable.getType(); - final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project); - final PsiCodeBlock variableBlock = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class); - final String newVariableName = codeStyleManager.suggestUniqueVariableName(originalVariableName, variableBlock, false); - final PsiCodeBlock codeBlock = PsiTreeUtil.getParentOfType(assignmentStatement, PsiCodeBlock.class); - final SearchScope scope; - if (codeBlock != null) { - scope = new LocalSearchScope(codeBlock); - } - else { - scope = variable.getUseScope(); - } - final Query query = ReferencesSearch.search(variable, scope, false); - final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); - final PsiElementFactory factory = psiFacade.getElementFactory(); - List collectedReferences = new ArrayList<>(); - for (PsiReference reference : query) { - final PsiElement referenceElement = reference.getElement(); - if (referenceElement == null) { - continue; - } - final TextRange textRange = assignmentStatement.getTextRange(); - if (referenceElement.getTextOffset() <= textRange.getEndOffset()) { - continue; + protected InspectionGadgetsFix buildFix(Object... infos) { + return new ReuseOfLocalVariableFix(); + } + + private static class ReuseOfLocalVariableFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.reuseOfLocalVariableSplitQuickfix(); } - final PsiExpression newExpression = factory.createExpressionFromText(newVariableName, referenceElement); - final PsiReferenceExpression replacementExpression = (PsiReferenceExpression)referenceElement.replace(newExpression); - collectedReferences.add(replacementExpression); - } - final PsiExpression rhs = assignment.getRExpression(); - final String rhsText; - if (rhs == null) { - rhsText = ""; - } - else { - rhsText = rhs.getText(); - } - @NonNls final String newStatementText = type.getCanonicalText() + ' ' + newVariableName + " = " + rhsText + ';'; - final PsiStatement newStatement = factory.createStatementFromText(newStatementText, assignmentStatement); - final PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement)assignmentStatement.replace(newStatement); - final PsiElement[] elements = - declarationStatement.getDeclaredElements(); - final PsiLocalVariable newVariable = (PsiLocalVariable)elements[0]; - final PsiElement context = declarationStatement.getParent(); - HighlightUtils.showRenameTemplate( - context, - newVariable, - collectedReferences.toArray(new PsiReferenceExpression[collectedReferences.size()]) - ); - } - } + @Override + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) descriptor.getPsiElement(); + final PsiLocalVariable variable = (PsiLocalVariable) referenceExpression.resolve(); + final PsiAssignmentExpression assignment = (PsiAssignmentExpression) referenceExpression.getParent(); + assert assignment != null; + final PsiExpressionStatement assignmentStatement = (PsiExpressionStatement) assignment.getParent(); + final PsiExpression lExpression = assignment.getLExpression(); + final String originalVariableName = lExpression.getText(); + assert variable != null; + final PsiType type = variable.getType(); + final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project); + final PsiCodeBlock variableBlock = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class); + final String newVariableName = codeStyleManager.suggestUniqueVariableName(originalVariableName, variableBlock, false); + final PsiCodeBlock codeBlock = PsiTreeUtil.getParentOfType(assignmentStatement, PsiCodeBlock.class); + final SearchScope scope; + if (codeBlock != null) { + scope = new LocalSearchScope(codeBlock); + } + else { + scope = variable.getUseScope(); + } + final Query query = ReferencesSearch.search(variable, scope, false); + final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); + final PsiElementFactory factory = psiFacade.getElementFactory(); + List collectedReferences = new ArrayList<>(); + for (PsiReference reference : query) { + final PsiElement referenceElement = reference.getElement(); + if (referenceElement == null) { + continue; + } + final TextRange textRange = assignmentStatement.getTextRange(); + if (referenceElement.getTextOffset() <= textRange.getEndOffset()) { + continue; + } + final PsiExpression newExpression = factory.createExpressionFromText(newVariableName, referenceElement); + final PsiReferenceExpression replacementExpression = (PsiReferenceExpression) referenceElement.replace(newExpression); + collectedReferences.add(replacementExpression); + } + final PsiExpression rhs = assignment.getRExpression(); + final String rhsText; + if (rhs == null) { + rhsText = ""; + } + else { + rhsText = rhs.getText(); + } + @NonNls final String newStatementText = type.getCanonicalText() + ' ' + newVariableName + " = " + rhsText + ';'; - @Override - public BaseInspectionVisitor buildVisitor() { - return new ReuseOfLocalVariableVisitor(); - } + final PsiStatement newStatement = factory.createStatementFromText(newStatementText, assignmentStatement); + final PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement) assignmentStatement.replace(newStatement); + final PsiElement[] elements = + declarationStatement.getDeclaredElements(); + final PsiLocalVariable newVariable = (PsiLocalVariable) elements[0]; + final PsiElement context = declarationStatement.getParent(); + HighlightUtils.showRenameTemplate( + context, + newVariable, + collectedReferences.toArray(new PsiReferenceExpression[collectedReferences.size()]) + ); + } + } - private static class ReuseOfLocalVariableVisitor extends BaseInspectionVisitor { @Override - public void visitAssignmentExpression( - @Nonnull PsiAssignmentExpression assignment) { - super.visitAssignmentExpression(assignment); - final PsiElement assignmentParent = assignment.getParent(); - if (!(assignmentParent instanceof PsiExpressionStatement)) { - return; - } - final PsiExpression lhs = assignment.getLExpression(); - if (!(lhs instanceof PsiReferenceExpression)) { - return; - } - final PsiReferenceExpression reference = (PsiReferenceExpression)lhs; - final PsiElement referent = reference.resolve(); - if (!(referent instanceof PsiLocalVariable)) { - return; - } - final PsiVariable variable = (PsiVariable)referent; + public BaseInspectionVisitor buildVisitor() { + return new ReuseOfLocalVariableVisitor(); + } - //TODO: this is safe, but can be weakened - if (variable.getInitializer() == null) { - return; - } - final IElementType tokenType = assignment.getOperationTokenType(); - if (!JavaTokenType.EQ.equals(tokenType)) { - return; - } - final PsiExpression rhs = assignment.getRExpression(); - if (rhs != null && VariableAccessUtils.variableIsUsed(variable, rhs)) { - return; - } - final PsiCodeBlock variableBlock = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class); - if (variableBlock == null) { - return; - } + private static class ReuseOfLocalVariableVisitor extends BaseInspectionVisitor { + @Override + public void visitAssignmentExpression( + @Nonnull PsiAssignmentExpression assignment + ) { + super.visitAssignmentExpression(assignment); + final PsiElement assignmentParent = assignment.getParent(); + if (!(assignmentParent instanceof PsiExpressionStatement)) { + return; + } + final PsiExpression lhs = assignment.getLExpression(); + if (!(lhs instanceof PsiReferenceExpression)) { + return; + } + final PsiReferenceExpression reference = (PsiReferenceExpression) lhs; + final PsiElement referent = reference.resolve(); + if (!(referent instanceof PsiLocalVariable)) { + return; + } + final PsiVariable variable = (PsiVariable) referent; - if (loopExistsBetween(assignment, variableBlock)) { - return; - } - if (tryExistsBetween(assignment, variableBlock)) { - // this could be weakened, slightly, if it could be verified - // that a variable is used in only one branch of a try statement - return; - } - final PsiElement assignmentBlock = assignmentParent.getParent(); - if (assignmentBlock == null) { - return; - } - if (variableBlock.equals(assignmentBlock)) { - registerError(lhs); - } - final PsiStatement[] statements = variableBlock.getStatements(); - final PsiElement containingStatement = getChildWhichContainsElement(variableBlock, assignment); - int statementPosition = -1; - for (int i = 0; i < statements.length; i++) { - if (statements[i].equals(containingStatement)) { - statementPosition = i; - break; - } - } - if (statementPosition == -1) { - return; - } - for (int i = statementPosition + 1; i < statements.length; i++) { - if (VariableAccessUtils.variableIsUsed(variable, statements[i])) { - return; - } - } - registerError(lhs); - } + //TODO: this is safe, but can be weakened + if (variable.getInitializer() == null) { + return; + } + final IElementType tokenType = assignment.getOperationTokenType(); + if (!JavaTokenType.EQ.equals(tokenType)) { + return; + } + final PsiExpression rhs = assignment.getRExpression(); + if (rhs != null && VariableAccessUtils.variableIsUsed(variable, rhs)) { + return; + } + final PsiCodeBlock variableBlock = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class); + if (variableBlock == null) { + return; + } - private static boolean loopExistsBetween(PsiAssignmentExpression assignment, PsiCodeBlock block) { - PsiElement elementToTest = assignment; - while (elementToTest != null) { - if (elementToTest.equals(block)) { - return false; - } - if (elementToTest instanceof PsiWhileStatement || - elementToTest instanceof PsiForeachStatement || - elementToTest instanceof PsiForStatement || - elementToTest instanceof PsiDoWhileStatement) { - return true; + if (loopExistsBetween(assignment, variableBlock)) { + return; + } + if (tryExistsBetween(assignment, variableBlock)) { + // this could be weakened, slightly, if it could be verified + // that a variable is used in only one branch of a try statement + return; + } + final PsiElement assignmentBlock = assignmentParent.getParent(); + if (assignmentBlock == null) { + return; + } + if (variableBlock.equals(assignmentBlock)) { + registerError(lhs); + } + final PsiStatement[] statements = variableBlock.getStatements(); + final PsiElement containingStatement = getChildWhichContainsElement(variableBlock, assignment); + int statementPosition = -1; + for (int i = 0; i < statements.length; i++) { + if (statements[i].equals(containingStatement)) { + statementPosition = i; + break; + } + } + if (statementPosition == -1) { + return; + } + for (int i = statementPosition + 1; i < statements.length; i++) { + if (VariableAccessUtils.variableIsUsed(variable, statements[i])) { + return; + } + } + registerError(lhs); } - elementToTest = elementToTest.getParent(); - } - return false; - } - private static boolean tryExistsBetween( - PsiAssignmentExpression assignment, PsiCodeBlock block) { - PsiElement elementToTest = assignment; - while (elementToTest != null) { - if (elementToTest.equals(block)) { - return false; + private static boolean loopExistsBetween(PsiAssignmentExpression assignment, PsiCodeBlock block) { + PsiElement elementToTest = assignment; + while (elementToTest != null) { + if (elementToTest.equals(block)) { + return false; + } + if (elementToTest instanceof PsiWhileStatement || + elementToTest instanceof PsiForeachStatement || + elementToTest instanceof PsiForStatement || + elementToTest instanceof PsiDoWhileStatement) { + return true; + } + elementToTest = elementToTest.getParent(); + } + return false; } - if (elementToTest instanceof PsiTryStatement) { - return true; + + private static boolean tryExistsBetween( + PsiAssignmentExpression assignment, PsiCodeBlock block + ) { + PsiElement elementToTest = assignment; + while (elementToTest != null) { + if (elementToTest.equals(block)) { + return false; + } + if (elementToTest instanceof PsiTryStatement) { + return true; + } + elementToTest = elementToTest.getParent(); + } + return false; } - elementToTest = elementToTest.getParent(); - } - return false; - } - /** - * @noinspection AssignmentToMethodParameter - */ - @Nullable - public static PsiElement getChildWhichContainsElement( - @Nonnull PsiCodeBlock ancestor, - @Nonnull PsiElement descendant) { - PsiElement element = descendant; - while (!element.equals(ancestor)) { - descendant = element; - element = descendant.getParent(); - if (element == null) { - return null; + /** + * @noinspection AssignmentToMethodParameter + */ + @Nullable + public static PsiElement getChildWhichContainsElement( + @Nonnull PsiCodeBlock ancestor, + @Nonnull PsiElement descendant + ) { + PsiElement element = descendant; + while (!element.equals(ancestor)) { + descendant = element; + element = descendant.getParent(); + if (element == null) { + return null; + } + } + return descendant; } - } - return descendant; } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/TooBroadScopeInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/TooBroadScopeInspection.java index 2ef2a3534b..572c0541eb 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/TooBroadScopeInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/TooBroadScopeInspection.java @@ -37,380 +37,383 @@ import consulo.language.psi.search.ReferencesSearch; import consulo.language.psi.util.PsiTreeUtil; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; +import org.intellij.lang.annotations.Pattern; import org.jetbrains.annotations.NonNls; import javax.swing.*; import java.util.Collection; public abstract class TooBroadScopeInspection extends BaseInspection { + /** + * @noinspection PublicField for externalization + */ + public boolean m_allowConstructorAsInitializer = false; - /** - * @noinspection PublicField for externalization - */ - public boolean m_allowConstructorAsInitializer = false; + /** + * @noinspection PublicField for externalization + */ + public boolean m_onlyLookAtBlocks = false; - /** - * @noinspection PublicField for externalization - */ - public boolean m_onlyLookAtBlocks = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.tooBroadScopeDisplayName().get(); - } - - @Override - @Nonnull - public String getID() { - return "TooBroadScope"; - } - - @Override - @Nullable - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel checkboxOptionsPanel = new MultipleCheckboxOptionsPanel(this); - checkboxOptionsPanel.addCheckbox(InspectionGadgetsLocalize.tooBroadScopeOnlyBlocksOption().get(), "m_onlyLookAtBlocks"); - checkboxOptionsPanel.addCheckbox(InspectionGadgetsLocalize.tooBroadScopeAllowOption().get(), "m_allowConstructorAsInitializer"); - return checkboxOptionsPanel; - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.tooBroadScopeProblemDescriptor().get(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - final PsiVariable variable = (PsiVariable)infos[0]; - return new TooBroadScopeInspectionFix(variable.getName()); - } - - private class TooBroadScopeInspectionFix extends InspectionGadgetsFix { + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "TooBroadScope"; + } - private final String variableName; + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.tooBroadScopeDisplayName(); + } - TooBroadScopeInspectionFix(String variableName) { - this.variableName = variableName; + @Override + @Nullable + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel checkboxOptionsPanel = new MultipleCheckboxOptionsPanel(this); + checkboxOptionsPanel.addCheckbox(InspectionGadgetsLocalize.tooBroadScopeOnlyBlocksOption().get(), "m_onlyLookAtBlocks"); + checkboxOptionsPanel.addCheckbox(InspectionGadgetsLocalize.tooBroadScopeAllowOption().get(), "m_allowConstructorAsInitializer"); + return checkboxOptionsPanel; } + @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.tooBroadScopeNarrowQuickfix(variableName).get(); + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.tooBroadScopeProblemDescriptor().get(); } @Override - protected void doFix(@Nonnull Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement variableIdentifier = descriptor.getPsiElement(); - if (!(variableIdentifier instanceof PsiIdentifier)) { - return; - } - final PsiVariable variable = (PsiVariable)variableIdentifier.getParent(); - assert variable != null; - final Query query = ReferencesSearch.search(variable, variable.getUseScope()); - final Collection referenceCollection = query.findAll(); - final PsiElement[] referenceElements = new PsiElement[referenceCollection.size()]; - int index = 0; - for (PsiReference reference : referenceCollection) { - final PsiElement referenceElement = reference.getElement(); - referenceElements[index] = referenceElement; - index++; - } - PsiElement commonParent = ScopeUtils.getCommonParent(referenceElements); - assert commonParent != null; - final PsiExpression initializer = variable.getInitializer(); - if (initializer != null) { - final PsiElement variableScope = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class, PsiForStatement.class); - assert variableScope != null; - commonParent = ScopeUtils.moveOutOfLoopsAndClasses(commonParent, variableScope); - if (commonParent == null) { - return; - } - } - final PsiElement referenceElement = referenceElements[0]; - final PsiElement firstReferenceScope = PsiTreeUtil.getParentOfType(referenceElement, PsiCodeBlock.class, PsiForStatement.class); - if (firstReferenceScope == null) { - return; - } - PsiDeclarationStatement newDeclaration; - if (firstReferenceScope.equals(commonParent)) { - newDeclaration = moveDeclarationToLocation(variable, referenceElement); - } - else { - final PsiElement commonParentChild = ScopeUtils.getChildWhichContainsElement(commonParent, referenceElement); - if (commonParentChild == null) { - return; - } - final PsiElement location = commonParentChild.getPrevSibling(); - newDeclaration = createNewDeclaration(variable, initializer); - newDeclaration = (PsiDeclarationStatement)commonParent.addAfter(newDeclaration, location); - } - final CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(project); - newDeclaration = (PsiDeclarationStatement)codeStyleManager.reformat(newDeclaration); - removeOldVariable(variable); - if (isOnTheFly()) { - HighlightUtils.highlightElement(newDeclaration); - } + public InspectionGadgetsFix buildFix(Object... infos) { + final PsiVariable variable = (PsiVariable) infos[0]; + return new TooBroadScopeInspectionFix(variable.getName()); } - private void removeOldVariable(@Nonnull PsiVariable variable) throws IncorrectOperationException { - final PsiDeclarationStatement declaration = (PsiDeclarationStatement)variable.getParent(); - if (declaration == null) { - return; - } - final PsiElement[] declaredElements = declaration.getDeclaredElements(); - if (declaredElements.length == 1) { - declaration.delete(); - } - else { - variable.delete(); - } - } + private class TooBroadScopeInspectionFix extends InspectionGadgetsFix { + private final String variableName; - private PsiDeclarationStatement createNewDeclaration(@Nonnull PsiVariable variable, @Nullable PsiExpression initializer) - throws IncorrectOperationException { - final Project project = variable.getProject(); - final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); - final PsiElementFactory factory = psiFacade.getElementFactory(); - String name = variable.getName(); - if (name == null) { - name = ""; - } - final String comment = getCommentText(variable); - final PsiType type = variable.getType(); - @NonNls final String statementText; - final String typeText = type.getCanonicalText(); - if (initializer == null) { - statementText = typeText + ' ' + name + ';' + comment; - } - else { - final String initializerText = initializer.getText(); - statementText = typeText + ' ' + name + '=' + initializerText + ';' + comment; - } - final PsiDeclarationStatement newDeclaration = (PsiDeclarationStatement)factory.createStatementFromText(statementText, variable); - final PsiLocalVariable newVariable = (PsiLocalVariable)newDeclaration.getDeclaredElements()[0]; - final PsiModifierList newModifierList = newVariable.getModifierList(); - final PsiModifierList modifierList = variable.getModifierList(); - if (newModifierList != null && modifierList != null) { - // remove final when PsiDeclarationFactory adds one by mistake - newModifierList.setModifierProperty(PsiModifier.FINAL, variable.hasModifierProperty(PsiModifier.FINAL)); - final PsiAnnotation[] annotations = modifierList.getAnnotations(); - for (PsiAnnotation annotation : annotations) { - newModifierList.add(annotation); + TooBroadScopeInspectionFix(String variableName) { + this.variableName = variableName; } - } - return newDeclaration; - } - private String getCommentText(PsiVariable variable) { - final PsiDeclarationStatement parentDeclaration = (PsiDeclarationStatement)variable.getParent(); - final PsiElement[] declaredElements = parentDeclaration.getDeclaredElements(); - if (declaredElements.length != 1) { - return ""; - } - final PsiElement lastChild = parentDeclaration.getLastChild(); - if (!(lastChild instanceof PsiComment)) { - return ""; - } - final PsiElement prevSibling = lastChild.getPrevSibling(); - if (prevSibling instanceof PsiWhiteSpace) { - return prevSibling.getText() + lastChild.getText(); - } - return lastChild.getText(); - } + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.tooBroadScopeNarrowQuickfix(variableName); + } + + @Override + protected void doFix(@Nonnull Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement variableIdentifier = descriptor.getPsiElement(); + if (!(variableIdentifier instanceof PsiIdentifier)) { + return; + } + final PsiVariable variable = (PsiVariable) variableIdentifier.getParent(); + assert variable != null; + final Query query = ReferencesSearch.search(variable, variable.getUseScope()); + final Collection referenceCollection = query.findAll(); + final PsiElement[] referenceElements = new PsiElement[referenceCollection.size()]; + int index = 0; + for (PsiReference reference : referenceCollection) { + final PsiElement referenceElement = reference.getElement(); + referenceElements[index] = referenceElement; + index++; + } + PsiElement commonParent = ScopeUtils.getCommonParent(referenceElements); + assert commonParent != null; + final PsiExpression initializer = variable.getInitializer(); + if (initializer != null) { + final PsiElement variableScope = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class, PsiForStatement.class); + assert variableScope != null; + commonParent = ScopeUtils.moveOutOfLoopsAndClasses(commonParent, variableScope); + if (commonParent == null) { + return; + } + } + final PsiElement referenceElement = referenceElements[0]; + final PsiElement firstReferenceScope = PsiTreeUtil.getParentOfType(referenceElement, PsiCodeBlock.class, PsiForStatement.class); + if (firstReferenceScope == null) { + return; + } + PsiDeclarationStatement newDeclaration; + if (firstReferenceScope.equals(commonParent)) { + newDeclaration = moveDeclarationToLocation(variable, referenceElement); + } + else { + final PsiElement commonParentChild = ScopeUtils.getChildWhichContainsElement(commonParent, referenceElement); + if (commonParentChild == null) { + return; + } + final PsiElement location = commonParentChild.getPrevSibling(); + newDeclaration = createNewDeclaration(variable, initializer); + newDeclaration = (PsiDeclarationStatement) commonParent.addAfter(newDeclaration, location); + } + final CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(project); + newDeclaration = (PsiDeclarationStatement) codeStyleManager.reformat(newDeclaration); + removeOldVariable(variable); + if (isOnTheFly()) { + HighlightUtils.highlightElement(newDeclaration); + } + } - private PsiDeclarationStatement moveDeclarationToLocation(@Nonnull PsiVariable variable, @Nonnull PsiElement location) - throws IncorrectOperationException { - PsiStatement statement = PsiTreeUtil.getParentOfType(location, PsiStatement.class, false); - assert statement != null; - PsiElement statementParent = statement.getParent(); - while (statementParent instanceof PsiStatement && !(statementParent instanceof PsiForStatement)) { - statement = (PsiStatement)statementParent; - statementParent = statement.getParent(); - } - assert statementParent != null; - final PsiExpression initializer = variable.getInitializer(); - if (isMoveable(initializer) && statement instanceof PsiExpressionStatement) { - final PsiExpressionStatement expressionStatement = (PsiExpressionStatement)statement; - final PsiExpression expression = expressionStatement.getExpression(); - if (expression instanceof PsiAssignmentExpression) { - final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)expression; - final PsiExpression rhs = assignmentExpression.getRExpression(); - final PsiExpression lhs = assignmentExpression.getLExpression(); - final IElementType tokenType = assignmentExpression.getOperationTokenType(); - if (location.equals(lhs) && JavaTokenType.EQ == tokenType && !VariableAccessUtils.variableIsUsed(variable, rhs)) { - PsiDeclarationStatement newDeclaration = createNewDeclaration(variable, rhs); - newDeclaration = (PsiDeclarationStatement)statementParent.addBefore(newDeclaration, statement); - final PsiElement parent = assignmentExpression.getParent(); - assert parent != null; - parent.delete(); + private void removeOldVariable(@Nonnull PsiVariable variable) throws IncorrectOperationException { + final PsiDeclarationStatement declaration = (PsiDeclarationStatement) variable.getParent(); + if (declaration == null) { + return; + } + final PsiElement[] declaredElements = declaration.getDeclaredElements(); + if (declaredElements.length == 1) { + declaration.delete(); + } + else { + variable.delete(); + } + } + + private PsiDeclarationStatement createNewDeclaration(@Nonnull PsiVariable variable, @Nullable PsiExpression initializer) + throws IncorrectOperationException { + final Project project = variable.getProject(); + final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); + final PsiElementFactory factory = psiFacade.getElementFactory(); + String name = variable.getName(); + if (name == null) { + name = ""; + } + final String comment = getCommentText(variable); + final PsiType type = variable.getType(); + @NonNls final String statementText; + final String typeText = type.getCanonicalText(); + if (initializer == null) { + statementText = typeText + ' ' + name + ';' + comment; + } + else { + final String initializerText = initializer.getText(); + statementText = typeText + ' ' + name + '=' + initializerText + ';' + comment; + } + final PsiDeclarationStatement newDeclaration = + (PsiDeclarationStatement) factory.createStatementFromText(statementText, variable); + final PsiLocalVariable newVariable = (PsiLocalVariable) newDeclaration.getDeclaredElements()[0]; + final PsiModifierList newModifierList = newVariable.getModifierList(); + final PsiModifierList modifierList = variable.getModifierList(); + if (newModifierList != null && modifierList != null) { + // remove final when PsiDeclarationFactory adds one by mistake + newModifierList.setModifierProperty(PsiModifier.FINAL, variable.hasModifierProperty(PsiModifier.FINAL)); + final PsiAnnotation[] annotations = modifierList.getAnnotations(); + for (PsiAnnotation annotation : annotations) { + newModifierList.add(annotation); + } + } return newDeclaration; - } } - } - PsiDeclarationStatement newDeclaration = createNewDeclaration(variable, initializer); - if (statement instanceof PsiForStatement) { - final PsiForStatement forStatement = (PsiForStatement)statement; - final PsiStatement initialization = forStatement.getInitialization(); - newDeclaration = (PsiDeclarationStatement)forStatement.addBefore(newDeclaration, initialization); - if (initialization != null) { - initialization.delete(); + + private String getCommentText(PsiVariable variable) { + final PsiDeclarationStatement parentDeclaration = (PsiDeclarationStatement) variable.getParent(); + final PsiElement[] declaredElements = parentDeclaration.getDeclaredElements(); + if (declaredElements.length != 1) { + return ""; + } + final PsiElement lastChild = parentDeclaration.getLastChild(); + if (!(lastChild instanceof PsiComment)) { + return ""; + } + final PsiElement prevSibling = lastChild.getPrevSibling(); + if (prevSibling instanceof PsiWhiteSpace) { + return prevSibling.getText() + lastChild.getText(); + } + return lastChild.getText(); } - return newDeclaration; - } - else { - return (PsiDeclarationStatement) - statementParent.addBefore(newDeclaration, statement); - } - } - } - private boolean isMoveable(PsiExpression expression) { - if (expression == null) { - return true; - } - if (PsiUtil.isConstantExpression(expression) || ExpressionUtils.isNullLiteral(expression)) { - return true; + private PsiDeclarationStatement moveDeclarationToLocation(@Nonnull PsiVariable variable, @Nonnull PsiElement location) + throws IncorrectOperationException { + PsiStatement statement = PsiTreeUtil.getParentOfType(location, PsiStatement.class, false); + assert statement != null; + PsiElement statementParent = statement.getParent(); + while (statementParent instanceof PsiStatement && !(statementParent instanceof PsiForStatement)) { + statement = (PsiStatement) statementParent; + statementParent = statement.getParent(); + } + assert statementParent != null; + final PsiExpression initializer = variable.getInitializer(); + if (isMoveable(initializer) && statement instanceof PsiExpressionStatement) { + final PsiExpressionStatement expressionStatement = (PsiExpressionStatement) statement; + final PsiExpression expression = expressionStatement.getExpression(); + if (expression instanceof PsiAssignmentExpression) { + final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression) expression; + final PsiExpression rhs = assignmentExpression.getRExpression(); + final PsiExpression lhs = assignmentExpression.getLExpression(); + final IElementType tokenType = assignmentExpression.getOperationTokenType(); + if (location.equals(lhs) && JavaTokenType.EQ == tokenType && !VariableAccessUtils.variableIsUsed(variable, rhs)) { + PsiDeclarationStatement newDeclaration = createNewDeclaration(variable, rhs); + newDeclaration = (PsiDeclarationStatement) statementParent.addBefore(newDeclaration, statement); + final PsiElement parent = assignmentExpression.getParent(); + assert parent != null; + parent.delete(); + return newDeclaration; + } + } + } + PsiDeclarationStatement newDeclaration = createNewDeclaration(variable, initializer); + if (statement instanceof PsiForStatement) { + final PsiForStatement forStatement = (PsiForStatement) statement; + final PsiStatement initialization = forStatement.getInitialization(); + newDeclaration = (PsiDeclarationStatement) forStatement.addBefore(newDeclaration, initialization); + if (initialization != null) { + initialization.delete(); + } + return newDeclaration; + } + else { + return (PsiDeclarationStatement) + statementParent.addBefore(newDeclaration, statement); + } + } } - if (expression instanceof PsiNewExpression) { - final PsiNewExpression newExpression = (PsiNewExpression)expression; - final PsiExpression[] arrayDimensions = newExpression.getArrayDimensions(); - if (arrayDimensions.length > 0) { - for (PsiExpression arrayDimension : arrayDimensions) { - if (!isMoveable(arrayDimension)) { - return false; - } + + private boolean isMoveable(PsiExpression expression) { + if (expression == null) { + return true; } - return true; - } - final PsiArrayInitializerExpression arrayInitializer = newExpression.getArrayInitializer(); - boolean result = true; - if (arrayInitializer != null) { - final PsiExpression[] initializers = arrayInitializer.getInitializers(); - for (final PsiExpression initializerExpression : initializers) { - result &= isMoveable(initializerExpression); + if (PsiUtil.isConstantExpression(expression) || ExpressionUtils.isNullLiteral(expression)) { + return true; } - } - else if (!m_allowConstructorAsInitializer) { - final PsiType type = newExpression.getType(); - if (!ClassUtils.isImmutable(type)) { - return false; + if (expression instanceof PsiNewExpression) { + final PsiNewExpression newExpression = (PsiNewExpression) expression; + final PsiExpression[] arrayDimensions = newExpression.getArrayDimensions(); + if (arrayDimensions.length > 0) { + for (PsiExpression arrayDimension : arrayDimensions) { + if (!isMoveable(arrayDimension)) { + return false; + } + } + return true; + } + final PsiArrayInitializerExpression arrayInitializer = newExpression.getArrayInitializer(); + boolean result = true; + if (arrayInitializer != null) { + final PsiExpression[] initializers = arrayInitializer.getInitializers(); + for (final PsiExpression initializerExpression : initializers) { + result &= isMoveable(initializerExpression); + } + } + else if (!m_allowConstructorAsInitializer) { + final PsiType type = newExpression.getType(); + if (!ClassUtils.isImmutable(type)) { + return false; + } + } + final PsiExpressionList argumentList = newExpression.getArgumentList(); + if (argumentList == null) { + return result; + } + final PsiExpression[] expressions = argumentList.getExpressions(); + for (final PsiExpression argumentExpression : expressions) { + result &= isMoveable(argumentExpression); + } + return result; + } + if (expression instanceof PsiReferenceExpression) { + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) expression; + final PsiElement target = referenceExpression.resolve(); + if (!(target instanceof PsiField)) { + return false; + } + final PsiField field = (PsiField) target; + if (ExpressionUtils.isConstant(field)) { + return true; + } } - } - final PsiExpressionList argumentList = newExpression.getArgumentList(); - if (argumentList == null) { - return result; - } - final PsiExpression[] expressions = argumentList.getExpressions(); - for (final PsiExpression argumentExpression : expressions) { - result &= isMoveable(argumentExpression); - } - return result; - } - if (expression instanceof PsiReferenceExpression) { - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)expression; - final PsiElement target = referenceExpression.resolve(); - if (!(target instanceof PsiField)) { return false; - } - final PsiField field = (PsiField)target; - if (ExpressionUtils.isConstant(field)) { - return true; - } } - return false; - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new TooBroadScopeVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new TooBroadScopeVisitor(); + } - private class TooBroadScopeVisitor extends BaseInspectionVisitor { + private class TooBroadScopeVisitor extends BaseInspectionVisitor { - @Override - public void visitVariable(@Nonnull PsiVariable variable) { - super.visitVariable(variable); - if (!(variable instanceof PsiLocalVariable)) { - return; - } - final PsiExpression initializer = variable.getInitializer(); - if (!isMoveable(initializer)) { - return; - } - final PsiElement variableScope = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class, PsiForStatement.class); - if (variableScope == null) { - return; - } - final Query query = ReferencesSearch.search(variable, variable.getUseScope()); - final Collection referencesCollection = query.findAll(); - final int size = referencesCollection.size(); - if (size == 0) { - return; - } - final PsiElement[] referenceElements = new PsiElement[referencesCollection.size()]; - int index = 0; - for (PsiReference reference : referencesCollection) { - final PsiElement referenceElement = reference.getElement(); - referenceElements[index] = referenceElement; - index++; - } - PsiElement commonParent = ScopeUtils.getCommonParent(referenceElements); - if (commonParent == null) { - return; - } - if (initializer != null) { - commonParent = ScopeUtils.moveOutOfLoopsAndClasses(commonParent, variableScope); - if (commonParent == null) { - return; - } - } - if (PsiTreeUtil.isAncestor(commonParent, variableScope, true)) { - return; - } - if (PsiTreeUtil.isAncestor(variableScope, commonParent, true)) { - registerVariableError(variable, variable); - return; - } - if (m_onlyLookAtBlocks) { - return; - } - if (commonParent instanceof PsiForStatement) { - return; - } - final PsiElement referenceElement = referenceElements[0]; - final PsiElement blockChild = ScopeUtils.getChildWhichContainsElement(variableScope, referenceElement); - if (blockChild == null) { - return; - } - final PsiElement insertionPoint = ScopeUtils.findTighterDeclarationLocation(blockChild, variable); - if (insertionPoint == null) { - if (!(blockChild instanceof PsiExpressionStatement)) { - return; - } - final PsiExpressionStatement expressionStatement = (PsiExpressionStatement)blockChild; - final PsiExpression expression = expressionStatement.getExpression(); - if (!(expression instanceof PsiAssignmentExpression)) { - return; - } - final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)expression; - final IElementType tokenType = assignmentExpression.getOperationTokenType(); - if (tokenType != JavaTokenType.EQ) { - return; - } - final PsiExpression lhs = assignmentExpression.getLExpression(); - if (!lhs.equals(referenceElement)) { - return; - } - final PsiExpression rhs = assignmentExpression.getRExpression(); - if (rhs != null && VariableAccessUtils.variableIsUsed(variable, rhs)) { - return; - } - } + @Override + public void visitVariable(@Nonnull PsiVariable variable) { + super.visitVariable(variable); + if (!(variable instanceof PsiLocalVariable)) { + return; + } + final PsiExpression initializer = variable.getInitializer(); + if (!isMoveable(initializer)) { + return; + } + final PsiElement variableScope = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class, PsiForStatement.class); + if (variableScope == null) { + return; + } + final Query query = ReferencesSearch.search(variable, variable.getUseScope()); + final Collection referencesCollection = query.findAll(); + final int size = referencesCollection.size(); + if (size == 0) { + return; + } + final PsiElement[] referenceElements = new PsiElement[referencesCollection.size()]; + int index = 0; + for (PsiReference reference : referencesCollection) { + final PsiElement referenceElement = reference.getElement(); + referenceElements[index] = referenceElement; + index++; + } + PsiElement commonParent = ScopeUtils.getCommonParent(referenceElements); + if (commonParent == null) { + return; + } + if (initializer != null) { + commonParent = ScopeUtils.moveOutOfLoopsAndClasses(commonParent, variableScope); + if (commonParent == null) { + return; + } + } + if (PsiTreeUtil.isAncestor(commonParent, variableScope, true)) { + return; + } + if (PsiTreeUtil.isAncestor(variableScope, commonParent, true)) { + registerVariableError(variable, variable); + return; + } + if (m_onlyLookAtBlocks) { + return; + } + if (commonParent instanceof PsiForStatement) { + return; + } + final PsiElement referenceElement = referenceElements[0]; + final PsiElement blockChild = ScopeUtils.getChildWhichContainsElement(variableScope, referenceElement); + if (blockChild == null) { + return; + } + final PsiElement insertionPoint = ScopeUtils.findTighterDeclarationLocation(blockChild, variable); + if (insertionPoint == null) { + if (!(blockChild instanceof PsiExpressionStatement)) { + return; + } + final PsiExpressionStatement expressionStatement = (PsiExpressionStatement) blockChild; + final PsiExpression expression = expressionStatement.getExpression(); + if (!(expression instanceof PsiAssignmentExpression)) { + return; + } + final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression) expression; + final IElementType tokenType = assignmentExpression.getOperationTokenType(); + if (tokenType != JavaTokenType.EQ) { + return; + } + final PsiExpression lhs = assignmentExpression.getLExpression(); + if (!lhs.equals(referenceElement)) { + return; + } + final PsiExpression rhs = assignmentExpression.getRExpression(); + if (rhs != null && VariableAccessUtils.variableIsUsed(variable, rhs)) { + return; + } + } /* if (insertionPoint != null && JspPsiUtil.isInJspFile(insertionPoint)) { PsiElement elementBefore = insertionPoint.getPrevSibling(); elementBefore = PsiTreeUtil.skipSiblingsBackward(elementBefore, PsiWhiteSpace.class); @@ -421,7 +424,7 @@ public void visitVariable(@Nonnull PsiVariable variable) { } } } */ - registerVariableError(variable, variable); + registerVariableError(variable, variable); + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/UnnecessaryLocalVariableInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/UnnecessaryLocalVariableInspection.java index 1a60460041..53cf767837 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/UnnecessaryLocalVariableInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/dataflow/UnnecessaryLocalVariableInspection.java @@ -28,370 +28,371 @@ import consulo.language.psi.PsiElement; import consulo.language.psi.PsiReference; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import javax.swing.*; public abstract class UnnecessaryLocalVariableInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean m_ignoreImmediatelyReturnedVariables = false; - /** - * @noinspection PublicField - */ - public boolean m_ignoreImmediatelyReturnedVariables = false; + /** + * @noinspection PublicField + */ + public boolean m_ignoreAnnotatedVariables = false; - /** - * @noinspection PublicField - */ - public boolean m_ignoreAnnotatedVariables = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.redundantLocalVariableDisplayName().get(); - } - - @Override - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this); - optionsPanel.addCheckbox( - InspectionGadgetsLocalize.redundantLocalVariableIgnoreOption().get(), - "m_ignoreImmediatelyReturnedVariables" - ); - optionsPanel.addCheckbox( - InspectionGadgetsLocalize.redundantLocalVariableAnnotationOption().get(), - "m_ignoreAnnotatedVariables" - ); - return optionsPanel; - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.unnecessaryLocalVariableProblemDescriptor().get(); - } - - @Override - public InspectionGadgetsFix buildFix(Object... infos) { - return new InlineVariableFix(); - } - - @Override - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new UnnecessaryLocalVariableVisitor(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.redundantLocalVariableDisplayName(); + } - private class UnnecessaryLocalVariableVisitor extends BaseInspectionVisitor { + @Override + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this); + optionsPanel.addCheckbox( + InspectionGadgetsLocalize.redundantLocalVariableIgnoreOption().get(), + "m_ignoreImmediatelyReturnedVariables" + ); + optionsPanel.addCheckbox( + InspectionGadgetsLocalize.redundantLocalVariableAnnotationOption().get(), + "m_ignoreAnnotatedVariables" + ); + return optionsPanel; + } - @SuppressWarnings({"IfStatementWithIdenticalBranches"}) @Override - public void visitLocalVariable(@Nonnull PsiLocalVariable variable) { - super.visitLocalVariable(variable); - if (m_ignoreAnnotatedVariables) { - final PsiModifierList list = variable.getModifierList(); - if (list != null && list.getAnnotations().length > 0) { - return; - } - } - if (isCopyVariable(variable)) { - registerVariableError(variable); - } - else if (!m_ignoreImmediatelyReturnedVariables && isImmediatelyReturned(variable)) { - registerVariableError(variable); - } - else if (!m_ignoreImmediatelyReturnedVariables && isImmediatelyThrown(variable)) { - registerVariableError(variable); - } - else if (isImmediatelyAssigned(variable)) { - registerVariableError(variable); - } - else if (isImmediatelyAssignedAsDeclaration(variable)) { - registerVariableError(variable); - } + public boolean isEnabledByDefault() { + return true; } - private boolean isCopyVariable(PsiVariable variable) { - final PsiExpression initializer = variable.getInitializer(); - if (!(initializer instanceof PsiReferenceExpression)) { - return false; - } - final PsiReferenceExpression reference = (PsiReferenceExpression)initializer; - final PsiElement referent = reference.resolve(); - if (referent == null) { - return false; - } - if (!(referent instanceof PsiLocalVariable || referent instanceof PsiParameter)) { - return false; - } - final PsiCodeBlock containingScope = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class); - if (containingScope == null) { - return false; - } - if (!variable.hasModifierProperty(PsiModifier.FINAL) && - VariableAccessUtils.variableIsAssigned(variable, containingScope, false)) { - return false; - } - final PsiVariable initialization = (PsiVariable)referent; - if (!initialization.hasModifierProperty(PsiModifier.FINAL) && - VariableAccessUtils.variableIsAssigned(initialization, containingScope, false)) { - return false; - } - if (!initialization.hasModifierProperty(PsiModifier.FINAL) && variable.hasModifierProperty(PsiModifier.FINAL)) { - if (VariableAccessUtils.variableIsUsedInInnerClass(variable, containingScope)) { - return false; - } - } - return !TypeConversionUtil.boxingConversionApplicable(variable.getType(), initialization.getType()); + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.unnecessaryLocalVariableProblemDescriptor().get(); } - private boolean isImmediatelyReturned(PsiVariable variable) { - final PsiCodeBlock containingScope = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class, true, PsiClass.class); - if (containingScope == null) { - return false; - } - final PsiElement parent = variable.getParent(); - if (!(parent instanceof PsiDeclarationStatement)) { - return false; - } - final PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement)parent; - PsiStatement nextStatement = null; - final PsiStatement[] statements = containingScope.getStatements(); - for (int i = 0; i < (statements.length - 1); i++) { - if (statements[i].equals(declarationStatement)) { - nextStatement = statements[i + 1]; - break; - } - } - if (!(nextStatement instanceof PsiReturnStatement)) { - return false; - } - final PsiReturnStatement returnStatement = (PsiReturnStatement)nextStatement; - final PsiExpression returnValue = returnStatement.getReturnValue(); - if (!(returnValue instanceof PsiReferenceExpression)) { - return false; - } - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)returnValue; - final PsiElement referent = referenceExpression.resolve(); - if (referent == null || !referent.equals(variable)) { - return false; - } - if (isVariableUsedInFollowingDeclarations(variable, declarationStatement)) { - return false; - } - return true; + @Override + public InspectionGadgetsFix buildFix(Object... infos) { + return new InlineVariableFix(); } - private boolean isImmediatelyThrown(PsiVariable variable) { - final PsiCodeBlock containingScope = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class, true, PsiClass.class); - if (containingScope == null) { - return false; - } - final PsiElement parent = variable.getParent(); - if (!(parent instanceof PsiDeclarationStatement)) { - return false; - } - final PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement)parent; - PsiStatement nextStatement = null; - final PsiStatement[] statements = containingScope.getStatements(); - for (int i = 0; i < (statements.length - 1); i++) { - if (statements[i].equals(declarationStatement)) { - nextStatement = statements[i + 1]; - break; - } - } - if (!(nextStatement instanceof PsiThrowStatement)) { - return false; - } - final PsiThrowStatement throwStatement = (PsiThrowStatement)nextStatement; - final PsiExpression returnValue = throwStatement.getException(); - if (!(returnValue instanceof PsiReferenceExpression)) { - return false; - } - final PsiElement referent = ((PsiReference)returnValue).resolve(); - if (referent == null || !referent.equals(variable)) { - return false; - } - if (isVariableUsedInFollowingDeclarations(variable, declarationStatement)) { - return false; - } - return true; + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; } - private boolean isImmediatelyAssigned(PsiVariable variable) { - final PsiCodeBlock containingScope = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class, true, PsiClass.class); - if (containingScope == null) { - return false; - } - final PsiElement parent = variable.getParent(); - if (!(parent instanceof PsiDeclarationStatement)) { - return false; - } - final PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement)parent; - PsiStatement nextStatement = null; - int followingStatementNumber = 0; - final PsiStatement[] statements = containingScope.getStatements(); - for (int i = 0; i < (statements.length - 1); i++) { - if (statements[i].equals(declarationStatement)) { - nextStatement = statements[i + 1]; - followingStatementNumber = i + 2; - break; - } - } - if (!(nextStatement instanceof PsiExpressionStatement)) { - return false; - } - final PsiExpressionStatement expressionStatement = (PsiExpressionStatement)nextStatement; - final PsiExpression expression = expressionStatement.getExpression(); - if (!(expression instanceof PsiAssignmentExpression)) { - return false; - } - final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)expression; - final IElementType tokenType = assignmentExpression.getOperationTokenType(); - if (tokenType != JavaTokenType.EQ) { - return false; - } - final PsiExpression rhs = assignmentExpression.getRExpression(); - if (!(rhs instanceof PsiReferenceExpression)) { - return false; - } - final PsiReferenceExpression reference = (PsiReferenceExpression)rhs; - final PsiElement referent = reference.resolve(); - if (referent == null || !referent.equals(variable)) { - return false; - } - final PsiExpression lhs = assignmentExpression.getLExpression(); - if (lhs instanceof PsiArrayAccessExpression) { - return false; - } - if (isVariableUsedInFollowingDeclarations(variable, declarationStatement)) { - return false; - } - for (int i = followingStatementNumber; i < statements.length; i++) { - if (VariableAccessUtils.variableIsUsed(variable, statements[i])) { - return false; - } - } - return true; + @Override + public BaseInspectionVisitor buildVisitor() { + return new UnnecessaryLocalVariableVisitor(); } - private boolean isImmediatelyAssignedAsDeclaration(PsiVariable variable) { - final PsiCodeBlock containingScope = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class, true, PsiClass.class); - if (containingScope == null) { - return false; - } - final PsiElement parent = variable.getParent(); - if (!(parent instanceof PsiDeclarationStatement)) { - return false; - } - final PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement)parent; - PsiStatement nextStatement = null; - int followingStatementNumber = 0; - final PsiStatement[] statements = containingScope.getStatements(); - for (int i = 0; i < (statements.length - 1); i++) { - if (statements[i].equals(declarationStatement)) { - nextStatement = statements[i + 1]; - followingStatementNumber = i + 2; - break; - } - } - if (nextStatement instanceof PsiDeclarationStatement) { - boolean referenceFound = false; - final PsiDeclarationStatement nextDeclarationStatement = (PsiDeclarationStatement)nextStatement; - for (PsiElement declaration : nextDeclarationStatement.getDeclaredElements()) { - if (!(declaration instanceof PsiVariable)) { - continue; - } - final PsiVariable nextVariable = (PsiVariable)declaration; - final PsiExpression initializer = nextVariable.getInitializer(); - if (!referenceFound && initializer instanceof PsiReferenceExpression) { - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)initializer; - final PsiElement referent = referenceExpression.resolve(); - if (variable.equals(referent)) { - referenceFound = true; - continue; + private class UnnecessaryLocalVariableVisitor extends BaseInspectionVisitor { + + @SuppressWarnings({"IfStatementWithIdenticalBranches"}) + @Override + public void visitLocalVariable(@Nonnull PsiLocalVariable variable) { + super.visitLocalVariable(variable); + if (m_ignoreAnnotatedVariables) { + final PsiModifierList list = variable.getModifierList(); + if (list != null && list.getAnnotations().length > 0) { + return; + } + } + if (isCopyVariable(variable)) { + registerVariableError(variable); + } + else if (!m_ignoreImmediatelyReturnedVariables && isImmediatelyReturned(variable)) { + registerVariableError(variable); + } + else if (!m_ignoreImmediatelyReturnedVariables && isImmediatelyThrown(variable)) { + registerVariableError(variable); + } + else if (isImmediatelyAssigned(variable)) { + registerVariableError(variable); + } + else if (isImmediatelyAssignedAsDeclaration(variable)) { + registerVariableError(variable); } - } - if (VariableAccessUtils.variableIsUsed(variable, initializer)) { - return false; - } - } - if (!referenceFound) { - return false; } - } - else if (nextStatement instanceof PsiTryStatement) { - final PsiTryStatement tryStatement = (PsiTryStatement)nextStatement; - final PsiResourceList resourceList = tryStatement.getResourceList(); - if (resourceList == null) { - return false; + + private boolean isCopyVariable(PsiVariable variable) { + final PsiExpression initializer = variable.getInitializer(); + if (!(initializer instanceof PsiReferenceExpression)) { + return false; + } + final PsiReferenceExpression reference = (PsiReferenceExpression) initializer; + final PsiElement referent = reference.resolve(); + if (referent == null) { + return false; + } + if (!(referent instanceof PsiLocalVariable || referent instanceof PsiParameter)) { + return false; + } + final PsiCodeBlock containingScope = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class); + if (containingScope == null) { + return false; + } + if (!variable.hasModifierProperty(PsiModifier.FINAL) && + VariableAccessUtils.variableIsAssigned(variable, containingScope, false)) { + return false; + } + final PsiVariable initialization = (PsiVariable) referent; + if (!initialization.hasModifierProperty(PsiModifier.FINAL) && + VariableAccessUtils.variableIsAssigned(initialization, containingScope, false)) { + return false; + } + if (!initialization.hasModifierProperty(PsiModifier.FINAL) && variable.hasModifierProperty(PsiModifier.FINAL)) { + if (VariableAccessUtils.variableIsUsedInInnerClass(variable, containingScope)) { + return false; + } + } + return !TypeConversionUtil.boxingConversionApplicable(variable.getType(), initialization.getType()); } - boolean referenceFound = false; - for (PsiResourceVariable resourceVariable : resourceList.getResourceVariables()) { - final PsiExpression initializer = resourceVariable.getInitializer(); - if (!referenceFound && initializer instanceof PsiReferenceExpression) { - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)initializer; + + private boolean isImmediatelyReturned(PsiVariable variable) { + final PsiCodeBlock containingScope = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class, true, PsiClass.class); + if (containingScope == null) { + return false; + } + final PsiElement parent = variable.getParent(); + if (!(parent instanceof PsiDeclarationStatement)) { + return false; + } + final PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement) parent; + PsiStatement nextStatement = null; + final PsiStatement[] statements = containingScope.getStatements(); + for (int i = 0; i < (statements.length - 1); i++) { + if (statements[i].equals(declarationStatement)) { + nextStatement = statements[i + 1]; + break; + } + } + if (!(nextStatement instanceof PsiReturnStatement)) { + return false; + } + final PsiReturnStatement returnStatement = (PsiReturnStatement) nextStatement; + final PsiExpression returnValue = returnStatement.getReturnValue(); + if (!(returnValue instanceof PsiReferenceExpression)) { + return false; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) returnValue; final PsiElement referent = referenceExpression.resolve(); - if (variable.equals(referent)) { - referenceFound = true; - continue; + if (referent == null || !referent.equals(variable)) { + return false; } - } - if (VariableAccessUtils.variableIsUsed(variable, initializer)) { - return false; - } - } - if (!referenceFound) { - return false; - } - if (VariableAccessUtils.variableIsUsed(variable, tryStatement.getTryBlock()) || - VariableAccessUtils.variableIsUsed(variable, tryStatement.getFinallyBlock())) { - return false; + if (isVariableUsedInFollowingDeclarations(variable, declarationStatement)) { + return false; + } + return true; } - for (PsiCatchSection section : tryStatement.getCatchSections()) { - if (VariableAccessUtils.variableIsUsed(variable, section)) { - return false; - } + + private boolean isImmediatelyThrown(PsiVariable variable) { + final PsiCodeBlock containingScope = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class, true, PsiClass.class); + if (containingScope == null) { + return false; + } + final PsiElement parent = variable.getParent(); + if (!(parent instanceof PsiDeclarationStatement)) { + return false; + } + final PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement) parent; + PsiStatement nextStatement = null; + final PsiStatement[] statements = containingScope.getStatements(); + for (int i = 0; i < (statements.length - 1); i++) { + if (statements[i].equals(declarationStatement)) { + nextStatement = statements[i + 1]; + break; + } + } + if (!(nextStatement instanceof PsiThrowStatement)) { + return false; + } + final PsiThrowStatement throwStatement = (PsiThrowStatement) nextStatement; + final PsiExpression returnValue = throwStatement.getException(); + if (!(returnValue instanceof PsiReferenceExpression)) { + return false; + } + final PsiElement referent = ((PsiReference) returnValue).resolve(); + if (referent == null || !referent.equals(variable)) { + return false; + } + if (isVariableUsedInFollowingDeclarations(variable, declarationStatement)) { + return false; + } + return true; } - } - else { - return false; - } - if (isVariableUsedInFollowingDeclarations(variable, declarationStatement)) { - return false; - } - for (int i = followingStatementNumber; i < statements.length; i++) { - if (VariableAccessUtils.variableIsUsed(variable, statements[i])) { - return false; + + private boolean isImmediatelyAssigned(PsiVariable variable) { + final PsiCodeBlock containingScope = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class, true, PsiClass.class); + if (containingScope == null) { + return false; + } + final PsiElement parent = variable.getParent(); + if (!(parent instanceof PsiDeclarationStatement)) { + return false; + } + final PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement) parent; + PsiStatement nextStatement = null; + int followingStatementNumber = 0; + final PsiStatement[] statements = containingScope.getStatements(); + for (int i = 0; i < (statements.length - 1); i++) { + if (statements[i].equals(declarationStatement)) { + nextStatement = statements[i + 1]; + followingStatementNumber = i + 2; + break; + } + } + if (!(nextStatement instanceof PsiExpressionStatement)) { + return false; + } + final PsiExpressionStatement expressionStatement = (PsiExpressionStatement) nextStatement; + final PsiExpression expression = expressionStatement.getExpression(); + if (!(expression instanceof PsiAssignmentExpression)) { + return false; + } + final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression) expression; + final IElementType tokenType = assignmentExpression.getOperationTokenType(); + if (tokenType != JavaTokenType.EQ) { + return false; + } + final PsiExpression rhs = assignmentExpression.getRExpression(); + if (!(rhs instanceof PsiReferenceExpression)) { + return false; + } + final PsiReferenceExpression reference = (PsiReferenceExpression) rhs; + final PsiElement referent = reference.resolve(); + if (referent == null || !referent.equals(variable)) { + return false; + } + final PsiExpression lhs = assignmentExpression.getLExpression(); + if (lhs instanceof PsiArrayAccessExpression) { + return false; + } + if (isVariableUsedInFollowingDeclarations(variable, declarationStatement)) { + return false; + } + for (int i = followingStatementNumber; i < statements.length; i++) { + if (VariableAccessUtils.variableIsUsed(variable, statements[i])) { + return false; + } + } + return true; } - } - return true; - } - private boolean isVariableUsedInFollowingDeclarations(PsiVariable variable, PsiDeclarationStatement declarationStatement) { - final PsiElement[] declaredElements = declarationStatement.getDeclaredElements(); - if (declaredElements.length == 1) { - return false; - } - boolean check = false; - for (PsiElement declaredElement : declaredElements) { - if (!check && variable.equals(declaredElement)) { - check = true; - } else { - if (VariableAccessUtils.variableIsUsed(variable, declaredElement)) { + private boolean isImmediatelyAssignedAsDeclaration(PsiVariable variable) { + final PsiCodeBlock containingScope = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class, true, PsiClass.class); + if (containingScope == null) { + return false; + } + final PsiElement parent = variable.getParent(); + if (!(parent instanceof PsiDeclarationStatement)) { + return false; + } + final PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement) parent; + PsiStatement nextStatement = null; + int followingStatementNumber = 0; + final PsiStatement[] statements = containingScope.getStatements(); + for (int i = 0; i < (statements.length - 1); i++) { + if (statements[i].equals(declarationStatement)) { + nextStatement = statements[i + 1]; + followingStatementNumber = i + 2; + break; + } + } + if (nextStatement instanceof PsiDeclarationStatement) { + boolean referenceFound = false; + final PsiDeclarationStatement nextDeclarationStatement = (PsiDeclarationStatement) nextStatement; + for (PsiElement declaration : nextDeclarationStatement.getDeclaredElements()) { + if (!(declaration instanceof PsiVariable)) { + continue; + } + final PsiVariable nextVariable = (PsiVariable) declaration; + final PsiExpression initializer = nextVariable.getInitializer(); + if (!referenceFound && initializer instanceof PsiReferenceExpression) { + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) initializer; + final PsiElement referent = referenceExpression.resolve(); + if (variable.equals(referent)) { + referenceFound = true; + continue; + } + } + if (VariableAccessUtils.variableIsUsed(variable, initializer)) { + return false; + } + } + if (!referenceFound) { + return false; + } + } + else if (nextStatement instanceof PsiTryStatement) { + final PsiTryStatement tryStatement = (PsiTryStatement) nextStatement; + final PsiResourceList resourceList = tryStatement.getResourceList(); + if (resourceList == null) { + return false; + } + boolean referenceFound = false; + for (PsiResourceVariable resourceVariable : resourceList.getResourceVariables()) { + final PsiExpression initializer = resourceVariable.getInitializer(); + if (!referenceFound && initializer instanceof PsiReferenceExpression) { + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) initializer; + final PsiElement referent = referenceExpression.resolve(); + if (variable.equals(referent)) { + referenceFound = true; + continue; + } + } + if (VariableAccessUtils.variableIsUsed(variable, initializer)) { + return false; + } + } + if (!referenceFound) { + return false; + } + if (VariableAccessUtils.variableIsUsed(variable, tryStatement.getTryBlock()) || + VariableAccessUtils.variableIsUsed(variable, tryStatement.getFinallyBlock())) { + return false; + } + for (PsiCatchSection section : tryStatement.getCatchSections()) { + if (VariableAccessUtils.variableIsUsed(variable, section)) { + return false; + } + } + } + else { + return false; + } + if (isVariableUsedInFollowingDeclarations(variable, declarationStatement)) { + return false; + } + for (int i = followingStatementNumber; i < statements.length; i++) { + if (VariableAccessUtils.variableIsUsed(variable, statements[i])) { + return false; + } + } return true; - } } - } - return false; + + private boolean isVariableUsedInFollowingDeclarations(PsiVariable variable, PsiDeclarationStatement declarationStatement) { + final PsiElement[] declaredElements = declarationStatement.getDeclaredElements(); + if (declaredElements.length == 1) { + return false; + } + boolean check = false; + for (PsiElement declaredElement : declaredElements) { + if (!check && variable.equals(declaredElement)) { + check = true; + } + else { + if (VariableAccessUtils.variableIsUsed(variable, declaredElement)) { + return true; + } + } + } + return false; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/PackageVisibleFieldInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/PackageVisibleFieldInspection.java index 90c6f54f86..7e27f6a6d4 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/PackageVisibleFieldInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/PackageVisibleFieldInspection.java @@ -23,54 +23,54 @@ 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 PackageVisibleFieldInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.packageVisibleFieldDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.packageVisibleFieldDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.packageVisibleFieldProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.packageVisibleFieldProblemDescriptor().get(); + } - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiField field = (PsiField)infos[0]; - return new EncapsulateVariableFix(field.getName()); - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiField field = (PsiField) infos[0]; + return new EncapsulateVariableFix(field.getName()); + } - @Override - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new PackageVisibleFieldVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new PackageVisibleFieldVisitor(); + } - private static class PackageVisibleFieldVisitor - extends BaseInspectionVisitor { + private static class PackageVisibleFieldVisitor + extends BaseInspectionVisitor { - @Override - public void visitField(@Nonnull PsiField field) { - if (field.hasModifierProperty(PsiModifier.PROTECTED) || - field.hasModifierProperty(PsiModifier.PUBLIC) || - field.hasModifierProperty(PsiModifier.PRIVATE)) { - return; - } - if (field.hasModifierProperty(PsiModifier.STATIC) && - field.hasModifierProperty(PsiModifier.FINAL)) { - return; - } - registerFieldError(field, field); + @Override + public void visitField(@Nonnull PsiField field) { + if (field.hasModifierProperty(PsiModifier.PROTECTED) || + field.hasModifierProperty(PsiModifier.PUBLIC) || + field.hasModifierProperty(PsiModifier.PRIVATE)) { + return; + } + if (field.hasModifierProperty(PsiModifier.STATIC) && + field.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + registerFieldError(field, field); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/PackageVisibleInnerClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/PackageVisibleInnerClassInspection.java index d7954bd4d3..ff251fe602 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/PackageVisibleInnerClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/PackageVisibleInnerClassInspection.java @@ -26,6 +26,7 @@ import consulo.annotation.component.ExtensionImpl; import consulo.deadCodeNotWorking.impl.MultipleCheckboxOptionsPanel; import consulo.language.psi.PsiElement; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @@ -33,75 +34,74 @@ @ExtensionImpl public class PackageVisibleInnerClassInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean ignoreEnums = false; - @SuppressWarnings({"PublicField"}) - public boolean ignoreEnums = false; + @SuppressWarnings("PublicField") + public boolean ignoreInterfaces = false; - @SuppressWarnings("PublicField") - public boolean ignoreInterfaces = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.packageVisibleInnerClassDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.packageVisibleInnerClassDisplayName(); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.packageVisibleInnerClassProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.packageVisibleInnerClassProblemDescriptor().get(); + } - @Override - @Nullable - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); - panel.addCheckbox(InspectionGadgetsLocalize.packageVisibleInnerClassIgnoreEnumOption().get(), "ignoreEnums"); - panel.addCheckbox(InspectionGadgetsLocalize.packageVisibleInnerClassIgnoreInterfaceOption().get(), "ignoreInterfaces"); - return panel; - } + @Override + @Nullable + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); + panel.addCheckbox(InspectionGadgetsLocalize.packageVisibleInnerClassIgnoreEnumOption().get(), "ignoreEnums"); + panel.addCheckbox(InspectionGadgetsLocalize.packageVisibleInnerClassIgnoreInterfaceOption().get(), "ignoreInterfaces"); + return panel; + } - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new MoveClassFix(); - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new MoveClassFix(); + } - @Override - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new PackageVisibleInnerClassVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new PackageVisibleInnerClassVisitor(); + } - private class PackageVisibleInnerClassVisitor extends BaseInspectionVisitor { + private class PackageVisibleInnerClassVisitor extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - if (aClass.hasModifierProperty(PsiModifier.PUBLIC) || - aClass.hasModifierProperty(PsiModifier.PROTECTED) || - aClass.hasModifierProperty(PsiModifier.PRIVATE)) { - return; - } - if (!ClassUtils.isInnerClass(aClass)) { - return; - } - if (ignoreEnums && aClass.isEnum()) { - return; - } - if (ignoreInterfaces && aClass.isInterface()) { - return; - } - final PsiElement parent = aClass.getParent(); - // parent must be class to not warn on - // the type parameters of classes, anonymous classes and - // enum constants for example. - if (!(parent instanceof PsiClass)) { - return; - } - registerClassError(aClass); + @Override + public void visitClass(@Nonnull PsiClass aClass) { + if (aClass.hasModifierProperty(PsiModifier.PUBLIC) || + aClass.hasModifierProperty(PsiModifier.PROTECTED) || + aClass.hasModifierProperty(PsiModifier.PRIVATE)) { + return; + } + if (!ClassUtils.isInnerClass(aClass)) { + return; + } + if (ignoreEnums && aClass.isEnum()) { + return; + } + if (ignoreInterfaces && aClass.isInterface()) { + return; + } + final PsiElement parent = aClass.getParent(); + // parent must be class to not warn on + // the type parameters of classes, anonymous classes and + // enum constants for example. + if (!(parent instanceof PsiClass)) { + return; + } + registerClassError(aClass); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/ProtectedFieldInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/ProtectedFieldInspection.java index 1bd4254b78..ccb02f1db4 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/ProtectedFieldInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/ProtectedFieldInspection.java @@ -23,51 +23,51 @@ 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 ProtectedFieldInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.protectedFieldDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.protectedFieldDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.protectedFieldProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.protectedFieldProblemDescriptor().get(); + } - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiField field = (PsiField)infos[0]; - return new EncapsulateVariableFix(field.getName()); - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiField field = (PsiField) infos[0]; + return new EncapsulateVariableFix(field.getName()); + } - @Override - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new ProtectedFieldVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new ProtectedFieldVisitor(); + } - private static class ProtectedFieldVisitor extends BaseInspectionVisitor { + private static class ProtectedFieldVisitor extends BaseInspectionVisitor { - @Override - public void visitField(@Nonnull PsiField field) { - if (!field.hasModifierProperty(PsiModifier.PROTECTED)) { - return; - } - if (field.hasModifierProperty(PsiModifier.STATIC) && - field.hasModifierProperty(PsiModifier.FINAL)) { - return; - } - registerFieldError(field, field); + @Override + public void visitField(@Nonnull PsiField field) { + if (!field.hasModifierProperty(PsiModifier.PROTECTED)) { + return; + } + if (field.hasModifierProperty(PsiModifier.STATIC) && + field.hasModifierProperty(PsiModifier.FINAL)) { + return; + } + registerFieldError(field, field); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/ProtectedInnerClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/ProtectedInnerClassInspection.java index 157a980378..a74778cf61 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/ProtectedInnerClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/ProtectedInnerClassInspection.java @@ -25,6 +25,7 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.deadCodeNotWorking.impl.MultipleCheckboxOptionsPanel; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @@ -32,66 +33,65 @@ @ExtensionImpl public class ProtectedInnerClassInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean ignoreEnums = false; - @SuppressWarnings({"PublicField"}) - public boolean ignoreEnums = false; + @SuppressWarnings("PublicField") + public boolean ignoreInterfaces = false; - @SuppressWarnings("PublicField") - public boolean ignoreInterfaces = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.protectedInnerClassDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.protectedInnerClassDisplayName(); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.protectedInnerClassProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.protectedInnerClassProblemDescriptor().get(); + } - @Override - @Nullable - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); - panel.addCheckbox(InspectionGadgetsLocalize.protectedInnerClassIgnoreEnumOption().get(), "ignoreEnums"); - panel.addCheckbox(InspectionGadgetsLocalize.protectedInnerClassIgnoreInterfaceOption().get(), "ignoreInterfaces"); - return panel; - } + @Override + @Nullable + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); + panel.addCheckbox(InspectionGadgetsLocalize.protectedInnerClassIgnoreEnumOption().get(), "ignoreEnums"); + panel.addCheckbox(InspectionGadgetsLocalize.protectedInnerClassIgnoreInterfaceOption().get(), "ignoreInterfaces"); + return panel; + } - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new MoveClassFix(); - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new MoveClassFix(); + } - @Override - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new ProtectedInnerClassVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new ProtectedInnerClassVisitor(); + } - private class ProtectedInnerClassVisitor extends BaseInspectionVisitor { + private class ProtectedInnerClassVisitor extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - if (!aClass.hasModifierProperty(PsiModifier.PROTECTED)) { - return; - } - if (!ClassUtils.isInnerClass(aClass)) { - return; - } - if (ignoreEnums && aClass.isEnum()) { - return; - } - if (ignoreInterfaces && aClass.isInterface()) { - return; - } - registerClassError(aClass); + @Override + public void visitClass(@Nonnull PsiClass aClass) { + if (!aClass.hasModifierProperty(PsiModifier.PROTECTED)) { + return; + } + if (!ClassUtils.isInnerClass(aClass)) { + return; + } + if (ignoreEnums && aClass.isEnum()) { + return; + } + if (ignoreInterfaces && aClass.isInterface()) { + return; + } + registerClassError(aClass); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/PublicFieldInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/PublicFieldInspection.java index 2661846f46..dc246e67f8 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/PublicFieldInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/PublicFieldInspection.java @@ -28,6 +28,7 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.deadCodeNotWorking.impl.CheckBox; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @@ -38,89 +39,88 @@ @ExtensionImpl public class PublicFieldInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean ignoreEnums = false; - @SuppressWarnings({"PublicField"}) - public boolean ignoreEnums = false; + @SuppressWarnings({"PublicField"}) + public final ExternalizableStringSet ignorableAnnotations = new ExternalizableStringSet(); - @SuppressWarnings({"PublicField"}) - public final ExternalizableStringSet ignorableAnnotations = new ExternalizableStringSet(); - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.publicFieldDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.publicFieldDisplayName(); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.publicFieldProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.publicFieldProblemDescriptor().get(); + } - @Override - @Nullable - public JComponent createOptionsPanel() { - final JPanel panel = new JPanel(new BorderLayout()); - final JPanel annotationsListControl = SpecialAnnotationsUtil.createSpecialAnnotationsListControl( - ignorableAnnotations, - InspectionGadgetsLocalize.ignoreIfAnnotatedBy().get() - ); - panel.add(annotationsListControl, BorderLayout.CENTER); - final CheckBox checkBox = - new CheckBox(InspectionGadgetsLocalize.publicFieldIgnoreEnumTypeFieldsOption().get(), this, "ignoreEnums"); - panel.add(checkBox, BorderLayout.SOUTH); - return panel; - } + @Override + @Nullable + public JComponent createOptionsPanel() { + final JPanel panel = new JPanel(new BorderLayout()); + final JPanel annotationsListControl = SpecialAnnotationsUtil.createSpecialAnnotationsListControl( + ignorableAnnotations, + InspectionGadgetsLocalize.ignoreIfAnnotatedBy().get() + ); + panel.add(annotationsListControl, BorderLayout.CENTER); + final CheckBox checkBox = + new CheckBox(InspectionGadgetsLocalize.publicFieldIgnoreEnumTypeFieldsOption().get(), this, "ignoreEnums"); + panel.add(checkBox, BorderLayout.SOUTH); + return panel; + } - @Nonnull - @Override - protected InspectionGadgetsFix[] buildFixes(Object... infos) { - final List fixes = new ArrayList(); - final PsiField field = (PsiField)infos[0]; - fixes.add(new EncapsulateVariableFix(field.getName())); - AddToIgnoreIfAnnotatedByListQuickFix.build(field, ignorableAnnotations, fixes); - return fixes.toArray(new InspectionGadgetsFix[fixes.size()]); - } + @Nonnull + @Override + protected InspectionGadgetsFix[] buildFixes(Object... infos) { + final List fixes = new ArrayList(); + final PsiField field = (PsiField) infos[0]; + fixes.add(new EncapsulateVariableFix(field.getName())); + AddToIgnoreIfAnnotatedByListQuickFix.build(field, ignorableAnnotations, fixes); + return fixes.toArray(new InspectionGadgetsFix[fixes.size()]); + } - @Override - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new PublicFieldVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new PublicFieldVisitor(); + } - private class PublicFieldVisitor extends BaseInspectionVisitor { + private class PublicFieldVisitor extends BaseInspectionVisitor { - @Override - public void visitField(@Nonnull PsiField field) { - if (!field.hasModifierProperty(PsiModifier.PUBLIC)) { - return; - } - if (AnnotationUtil.isAnnotated(field, ignorableAnnotations)) { - return; - } - if (field.hasModifierProperty(PsiModifier.FINAL)) { - if (field.hasModifierProperty(PsiModifier.STATIC)) { - return; - } - final PsiType type = field.getType(); - if (ClassUtils.isImmutable(type)) { - return; - } - if (ignoreEnums) { - if (type instanceof PsiClassType) { - final PsiClassType classType = (PsiClassType)type; - final PsiClass aClass = classType.resolve(); - if (aClass != null && aClass.isEnum()) { - return; + @Override + public void visitField(@Nonnull PsiField field) { + if (!field.hasModifierProperty(PsiModifier.PUBLIC)) { + return; + } + if (AnnotationUtil.isAnnotated(field, ignorableAnnotations)) { + return; + } + if (field.hasModifierProperty(PsiModifier.FINAL)) { + if (field.hasModifierProperty(PsiModifier.STATIC)) { + return; + } + final PsiType type = field.getType(); + if (ClassUtils.isImmutable(type)) { + return; + } + if (ignoreEnums) { + if (type instanceof PsiClassType) { + final PsiClassType classType = (PsiClassType) type; + final PsiClass aClass = classType.resolve(); + if (aClass != null && aClass.isEnum()) { + return; + } + } + } } - } + registerFieldError(field, field); } - } - registerFieldError(field, field); } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/PublicInnerClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/PublicInnerClassInspection.java index 45c37161e2..865d0fe696 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/PublicInnerClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/PublicInnerClassInspection.java @@ -25,6 +25,7 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.deadCodeNotWorking.impl.MultipleCheckboxOptionsPanel; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @@ -32,66 +33,65 @@ @ExtensionImpl public class PublicInnerClassInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean ignoreEnums = false; - @SuppressWarnings({"PublicField"}) - public boolean ignoreEnums = false; + @SuppressWarnings("PublicField") + public boolean ignoreInterfaces = false; - @SuppressWarnings("PublicField") - public boolean ignoreInterfaces = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.publicInnerClassDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.publicInnerClassDisplayName(); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.publicInnerClassProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.publicInnerClassProblemDescriptor().get(); + } - @Override - @Nullable - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); - panel.addCheckbox(InspectionGadgetsLocalize.publicInnerClassIgnoreEnumOption().get(), "ignoreEnums"); - panel.addCheckbox(InspectionGadgetsLocalize.publicInnerClassIgnoreInterfaceOption().get(), "ignoreInterfaces"); - return panel; - } + @Override + @Nullable + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); + panel.addCheckbox(InspectionGadgetsLocalize.publicInnerClassIgnoreEnumOption().get(), "ignoreEnums"); + panel.addCheckbox(InspectionGadgetsLocalize.publicInnerClassIgnoreInterfaceOption().get(), "ignoreInterfaces"); + return panel; + } - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new MoveClassFix(); - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new MoveClassFix(); + } - @Override - protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { - return true; - } + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new PublicInnerClassVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new PublicInnerClassVisitor(); + } - private class PublicInnerClassVisitor extends BaseInspectionVisitor { + private class PublicInnerClassVisitor extends BaseInspectionVisitor { - @Override - public void visitClass(@Nonnull PsiClass aClass) { - if (!aClass.hasModifierProperty(PsiModifier.PUBLIC)) { - return; - } - if (!ClassUtils.isInnerClass(aClass)) { - return; - } - if (ignoreEnums && aClass.isEnum()) { - return; - } - if (ignoreInterfaces && aClass.isInterface()) { - return; - } - registerClassError(aClass); + @Override + public void visitClass(@Nonnull PsiClass aClass) { + if (!aClass.hasModifierProperty(PsiModifier.PUBLIC)) { + return; + } + if (!ClassUtils.isInnerClass(aClass)) { + return; + } + if (ignoreEnums && aClass.isEnum()) { + return; + } + if (ignoreInterfaces && aClass.isInterface()) { + return; + } + registerClassError(aClass); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/ReturnOfCollectionFieldInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/ReturnOfCollectionFieldInspection.java index d4e2fdcdc7..91d5e98895 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/ReturnOfCollectionFieldInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/ReturnOfCollectionFieldInspection.java @@ -35,191 +35,213 @@ import consulo.project.Project; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; +import org.intellij.lang.annotations.Pattern; import org.jetbrains.annotations.NonNls; import javax.swing.*; @ExtensionImpl public class ReturnOfCollectionFieldInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean ignorePrivateMethods = true; - /** - * @noinspection PublicField - */ - public boolean ignorePrivateMethods = true; - - @Override - @Nonnull - public String getID() { - return "ReturnOfCollectionOrArrayField"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.returnOfCollectionArrayFieldDisplayName().get(); - } - - @Override - @Nullable - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.returnOfCollectionArrayFieldOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignorePrivateMethods"); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final PsiField field = (PsiField)infos[0]; - final PsiType type = field.getType(); - return type instanceof PsiArrayType - ? InspectionGadgetsLocalize.returnOfCollectionArrayFieldProblemDescriptorArray().get() - : InspectionGadgetsLocalize.returnOfCollectionArrayFieldProblemDescriptorCollection().get(); - } - - @Override - @Nullable - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)infos[1]; - final String text = referenceExpression.getText(); - if (TypeUtils.expressionHasTypeOrSubtype(referenceExpression, CommonClassNames.JAVA_UTIL_MAP)) { - if (TypeUtils.expressionHasTypeOrSubtype(referenceExpression, CommonClassNames.JAVA_UTIL_SORTED_MAP)) { - return new ReturnOfCollectionFieldFix(CommonClassNames.JAVA_UTIL_COLLECTIONS + ".unmodifiableSortedMap(" + text + ')', CommonClassNames.JAVA_UTIL_SORTED_MAP); - } - return new ReturnOfCollectionFieldFix(CommonClassNames.JAVA_UTIL_COLLECTIONS + ".unmodifiableMap(" + text + ')', CommonClassNames.JAVA_UTIL_MAP); - } - else if (TypeUtils.expressionHasTypeOrSubtype(referenceExpression, CommonClassNames.JAVA_UTIL_COLLECTION)) { - if (TypeUtils.expressionHasTypeOrSubtype(referenceExpression, CommonClassNames.JAVA_UTIL_SET)) { - if (TypeUtils.expressionHasTypeOrSubtype(referenceExpression, CommonClassNames.JAVA_UTIL_SORTED_SET)) { - return new ReturnOfCollectionFieldFix(CommonClassNames.JAVA_UTIL_COLLECTIONS + ".unmodifiableSortedSet(" + text + ')', CommonClassNames.JAVA_UTIL_SORTED_SET); - } - return new ReturnOfCollectionFieldFix(CommonClassNames.JAVA_UTIL_COLLECTIONS + ".unmodifiableSet(" + text + ')', CommonClassNames.JAVA_UTIL_SET); - } - else if (TypeUtils.expressionHasTypeOrSubtype(referenceExpression, CommonClassNames.JAVA_UTIL_LIST)) { - return new ReturnOfCollectionFieldFix(CommonClassNames.JAVA_UTIL_COLLECTIONS + ".unmodifiableList(" + text + ')', CommonClassNames.JAVA_UTIL_LIST); - } - return new ReturnOfCollectionFieldFix(CommonClassNames.JAVA_UTIL_COLLECTIONS + ".unmodifiableCollection(" + text + ')', CommonClassNames.JAVA_UTIL_COLLECTION); + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "ReturnOfCollectionOrArrayField"; } - return null; - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new ReturnOfCollectionFieldVisitor(); - } - - private static class ReturnOfCollectionFieldFix extends InspectionGadgetsFix { - - private final String myReplacementText; - private final String myQualifiedClassName; + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.returnOfCollectionArrayFieldDisplayName(); + } - ReturnOfCollectionFieldFix(@NonNls String replacementText, String qualifiedClassName) { - myReplacementText = replacementText; - myQualifiedClassName = qualifiedClassName; + @Override + @Nullable + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.returnOfCollectionArrayFieldOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignorePrivateMethods"); } + @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.returnOfCollectionFieldQuickfix(myReplacementText).get(); + public String buildErrorString(Object... infos) { + final PsiField field = (PsiField) infos[0]; + final PsiType type = field.getType(); + return type instanceof PsiArrayType + ? InspectionGadgetsLocalize.returnOfCollectionArrayFieldProblemDescriptorArray().get() + : InspectionGadgetsLocalize.returnOfCollectionArrayFieldProblemDescriptorCollection().get(); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - if (!(element instanceof PsiReferenceExpression)) { - return; - } - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)element; - fixContainingMethodReturnType(referenceExpression); - replaceExpressionAndShorten(referenceExpression, myReplacementText); + @Nullable + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) infos[1]; + final String text = referenceExpression.getText(); + if (TypeUtils.expressionHasTypeOrSubtype(referenceExpression, CommonClassNames.JAVA_UTIL_MAP)) { + if (TypeUtils.expressionHasTypeOrSubtype(referenceExpression, CommonClassNames.JAVA_UTIL_SORTED_MAP)) { + return new ReturnOfCollectionFieldFix( + CommonClassNames.JAVA_UTIL_COLLECTIONS + ".unmodifiableSortedMap(" + text + ')', + CommonClassNames.JAVA_UTIL_SORTED_MAP + ); + } + return new ReturnOfCollectionFieldFix( + CommonClassNames.JAVA_UTIL_COLLECTIONS + ".unmodifiableMap(" + text + ')', + CommonClassNames.JAVA_UTIL_MAP + ); + } + else if (TypeUtils.expressionHasTypeOrSubtype(referenceExpression, CommonClassNames.JAVA_UTIL_COLLECTION)) { + if (TypeUtils.expressionHasTypeOrSubtype(referenceExpression, CommonClassNames.JAVA_UTIL_SET)) { + if (TypeUtils.expressionHasTypeOrSubtype(referenceExpression, CommonClassNames.JAVA_UTIL_SORTED_SET)) { + return new ReturnOfCollectionFieldFix( + CommonClassNames.JAVA_UTIL_COLLECTIONS + ".unmodifiableSortedSet(" + text + ')', + CommonClassNames.JAVA_UTIL_SORTED_SET + ); + } + return new ReturnOfCollectionFieldFix( + CommonClassNames.JAVA_UTIL_COLLECTIONS + ".unmodifiableSet(" + text + ')', + CommonClassNames.JAVA_UTIL_SET + ); + } + else if (TypeUtils.expressionHasTypeOrSubtype(referenceExpression, CommonClassNames.JAVA_UTIL_LIST)) { + return new ReturnOfCollectionFieldFix( + CommonClassNames.JAVA_UTIL_COLLECTIONS + ".unmodifiableList(" + text + ')', + CommonClassNames.JAVA_UTIL_LIST + ); + } + return new ReturnOfCollectionFieldFix( + CommonClassNames.JAVA_UTIL_COLLECTIONS + ".unmodifiableCollection(" + text + ')', + CommonClassNames.JAVA_UTIL_COLLECTION + ); + } + return null; } - private void fixContainingMethodReturnType(PsiReferenceExpression referenceExpression) { - final PsiMethod method = PsiTreeUtil.getParentOfType(referenceExpression, PsiMethod.class, true); - if (method == null) { - return; - } - final PsiTypeElement returnTypeElement = method.getReturnTypeElement(); - if (returnTypeElement == null) { - return; - } - final PsiType type = returnTypeElement.getType(); - if (!InheritanceUtil.isInheritor(type, myQualifiedClassName)) { - return; - } - if (!(type instanceof PsiClassType)) { - return; - } - final Project project = referenceExpression.getProject(); - final PsiClassType classType = (PsiClassType)type; - final PsiClass aClass = classType.resolve(); - if (aClass == null || myQualifiedClassName.equals(aClass.getQualifiedName())) { - return; - } - final PsiType[] parameters = classType.getParameters(); - final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); - final String typeText; - if (parameters.length > 0) { - final StringBuilder builder = new StringBuilder(myQualifiedClassName); - builder.append('<'); - boolean comma = false; - for (PsiType parameter : parameters) { - if (comma) { - builder.append(','); - } else { - comma = true; - } - builder.append(parameter.getCanonicalText()); - } - builder.append('>'); - typeText = builder.toString(); - } else { - typeText = myQualifiedClassName; - } - final PsiTypeElement newTypeElement = factory.createTypeElementFromText(typeText, referenceExpression); - final PsiElement replacement = returnTypeElement.replace(newTypeElement); - final JavaCodeStyleManager javaCodeStyleManager = JavaCodeStyleManager.getInstance(project); - javaCodeStyleManager.shortenClassReferences(replacement); - HighlightUtils.highlightElement(replacement); + @Override + public BaseInspectionVisitor buildVisitor() { + return new ReturnOfCollectionFieldVisitor(); } - } - private class ReturnOfCollectionFieldVisitor extends BaseInspectionVisitor { + private static class ReturnOfCollectionFieldFix extends InspectionGadgetsFix { - @Override - public void visitReturnStatement(@Nonnull PsiReturnStatement statement) { - super.visitReturnStatement(statement); - final PsiExpression returnValue = statement.getReturnValue(); - if (returnValue == null) { - return; - } - final PsiMethod containingMethod = PsiTreeUtil.getParentOfType(statement, PsiMethod.class); - if (containingMethod == null) { - return; - } - if (ignorePrivateMethods && containingMethod.hasModifierProperty(PsiModifier.PRIVATE)) { - return; - } - final PsiClass returnStatementClass = containingMethod.getContainingClass(); - if (returnStatementClass == null) { - return; - } - if (!(returnValue instanceof PsiReferenceExpression)) { - return; - } - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)returnValue; - final PsiElement referent = referenceExpression.resolve(); - if (!(referent instanceof PsiField)) { - return; - } - final PsiField field = (PsiField)referent; - final PsiClass fieldClass = field.getContainingClass(); - if (!returnStatementClass.equals(fieldClass)) { - return; - } - if (!CollectionUtils.isArrayOrCollectionField(field)) { - return; - } - registerError(returnValue, field, returnValue); + private final String myReplacementText; + private final String myQualifiedClassName; + + ReturnOfCollectionFieldFix(@NonNls String replacementText, String qualifiedClassName) { + myReplacementText = replacementText; + myQualifiedClassName = qualifiedClassName; + } + + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.returnOfCollectionFieldQuickfix(myReplacementText); + } + + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + if (!(element instanceof PsiReferenceExpression)) { + return; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) element; + fixContainingMethodReturnType(referenceExpression); + replaceExpressionAndShorten(referenceExpression, myReplacementText); + } + + private void fixContainingMethodReturnType(PsiReferenceExpression referenceExpression) { + final PsiMethod method = PsiTreeUtil.getParentOfType(referenceExpression, PsiMethod.class, true); + if (method == null) { + return; + } + final PsiTypeElement returnTypeElement = method.getReturnTypeElement(); + if (returnTypeElement == null) { + return; + } + final PsiType type = returnTypeElement.getType(); + if (!InheritanceUtil.isInheritor(type, myQualifiedClassName)) { + return; + } + if (!(type instanceof PsiClassType)) { + return; + } + final Project project = referenceExpression.getProject(); + final PsiClassType classType = (PsiClassType) type; + final PsiClass aClass = classType.resolve(); + if (aClass == null || myQualifiedClassName.equals(aClass.getQualifiedName())) { + return; + } + final PsiType[] parameters = classType.getParameters(); + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); + final String typeText; + if (parameters.length > 0) { + final StringBuilder builder = new StringBuilder(myQualifiedClassName); + builder.append('<'); + boolean comma = false; + for (PsiType parameter : parameters) { + if (comma) { + builder.append(','); + } + else { + comma = true; + } + builder.append(parameter.getCanonicalText()); + } + builder.append('>'); + typeText = builder.toString(); + } + else { + typeText = myQualifiedClassName; + } + final PsiTypeElement newTypeElement = factory.createTypeElementFromText(typeText, referenceExpression); + final PsiElement replacement = returnTypeElement.replace(newTypeElement); + final JavaCodeStyleManager javaCodeStyleManager = JavaCodeStyleManager.getInstance(project); + javaCodeStyleManager.shortenClassReferences(replacement); + HighlightUtils.highlightElement(replacement); + } + } + + private class ReturnOfCollectionFieldVisitor extends BaseInspectionVisitor { + + @Override + public void visitReturnStatement(@Nonnull PsiReturnStatement statement) { + super.visitReturnStatement(statement); + final PsiExpression returnValue = statement.getReturnValue(); + if (returnValue == null) { + return; + } + final PsiMethod containingMethod = PsiTreeUtil.getParentOfType(statement, PsiMethod.class); + if (containingMethod == null) { + return; + } + if (ignorePrivateMethods && containingMethod.hasModifierProperty(PsiModifier.PRIVATE)) { + return; + } + final PsiClass returnStatementClass = containingMethod.getContainingClass(); + if (returnStatementClass == null) { + return; + } + if (!(returnValue instanceof PsiReferenceExpression)) { + return; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) returnValue; + final PsiElement referent = referenceExpression.resolve(); + if (!(referent instanceof PsiField)) { + return; + } + final PsiField field = (PsiField) referent; + final PsiClass fieldClass = field.getContainingClass(); + if (!returnStatementClass.equals(fieldClass)) { + return; + } + if (!CollectionUtils.isArrayOrCollectionField(field)) { + return; + } + registerError(returnValue, field, returnValue); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/ReturnOfDateFieldInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/ReturnOfDateFieldInspection.java index 4f6207d496..8fd24bf0e0 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/ReturnOfDateFieldInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/ReturnOfDateFieldInspection.java @@ -36,94 +36,96 @@ @ExtensionImpl public class ReturnOfDateFieldInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean ignorePrivateMethods = false; - @SuppressWarnings({"PublicField"}) - public boolean ignorePrivateMethods = false; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.returnDateCalendarFieldDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final String type = (String)infos[0]; - return InspectionGadgetsLocalize.returnDateCalendarFieldProblemDescriptor(type).get(); - } - - @Nullable - @Override - public JComponent createOptionsPanel() { - LocalizeValue message = InspectionGadgetsLocalize.returnOfNullIgnorePrivateOption(); - return new SingleCheckboxOptionsPanel(message.get(), this, "ignorePrivateMethods"); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - return new ReturnOfDateFieldFix((String)infos[0]); - } - - private static class ReturnOfDateFieldFix extends InspectionGadgetsFix { - - private final String myType; - - public ReturnOfDateFieldFix(String type) { - myType = type; + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.returnDateCalendarFieldDisplayName(); } - @Nonnull @Override - public String getName() { - return InspectionGadgetsLocalize.returnDateCalendarFieldQuickfix(myType).get(); + @Nonnull + public String buildErrorString(Object... infos) { + final String type = (String) infos[0]; + return InspectionGadgetsLocalize.returnDateCalendarFieldProblemDescriptor(type).get(); } + @Nullable @Override - protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - if (!(element instanceof PsiReferenceExpression)) { - return; - } - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)element; - final String type = - TypeUtils.expressionHasTypeOrSubtype(referenceExpression, CommonClassNames.JAVA_UTIL_DATE, CommonClassNames.JAVA_UTIL_CALENDAR); - if (type == null) { - return; - } - replaceExpression(referenceExpression, '(' + type + ')' + referenceExpression.getText() + ".clone()"); + public JComponent createOptionsPanel() { + LocalizeValue message = InspectionGadgetsLocalize.returnOfNullIgnorePrivateOption(); + return new SingleCheckboxOptionsPanel(message.get(), this, "ignorePrivateMethods"); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new ReturnOfDateFieldVisitor(); - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + return new ReturnOfDateFieldFix((String) infos[0]); + } - private class ReturnOfDateFieldVisitor extends BaseInspectionVisitor { + private static class ReturnOfDateFieldFix extends InspectionGadgetsFix { + private final String myType; + + public ReturnOfDateFieldFix(String type) { + myType = type; + } + + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.returnDateCalendarFieldQuickfix(myType); + } + + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + if (!(element instanceof PsiReferenceExpression)) { + return; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) element; + final String type = + TypeUtils.expressionHasTypeOrSubtype( + referenceExpression, + CommonClassNames.JAVA_UTIL_DATE, + CommonClassNames.JAVA_UTIL_CALENDAR + ); + if (type == null) { + return; + } + replaceExpression(referenceExpression, '(' + type + ')' + referenceExpression.getText() + ".clone()"); + } + } @Override - public void visitReturnStatement(@Nonnull PsiReturnStatement statement) { - super.visitReturnStatement(statement); - final PsiExpression returnValue = statement.getReturnValue(); - if (!(returnValue instanceof PsiReferenceExpression)) { - return; - } - final PsiMethod method = PsiTreeUtil.getParentOfType(statement, PsiMethod.class, true, PsiClass.class); - if (method == null || (ignorePrivateMethods && method.hasModifierProperty(PsiModifier.PRIVATE))) { - return; - } - final PsiReferenceExpression fieldReference = (PsiReferenceExpression)returnValue; - final PsiElement element = fieldReference.resolve(); - if (!(element instanceof PsiField)) { - return; - } - final String type = - TypeUtils.expressionHasTypeOrSubtype(returnValue, CommonClassNames.JAVA_UTIL_DATE, CommonClassNames.JAVA_UTIL_CALENDAR); - if (type == null) { - return; - } - registerError(returnValue, type); + public BaseInspectionVisitor buildVisitor() { + return new ReturnOfDateFieldVisitor(); + } + + private class ReturnOfDateFieldVisitor extends BaseInspectionVisitor { + + @Override + public void visitReturnStatement(@Nonnull PsiReturnStatement statement) { + super.visitReturnStatement(statement); + final PsiExpression returnValue = statement.getReturnValue(); + if (!(returnValue instanceof PsiReferenceExpression)) { + return; + } + final PsiMethod method = PsiTreeUtil.getParentOfType(statement, PsiMethod.class, true, PsiClass.class); + if (method == null || (ignorePrivateMethods && method.hasModifierProperty(PsiModifier.PRIVATE))) { + return; + } + final PsiReferenceExpression fieldReference = (PsiReferenceExpression) returnValue; + final PsiElement element = fieldReference.resolve(); + if (!(element instanceof PsiField)) { + return; + } + final String type = + TypeUtils.expressionHasTypeOrSubtype(returnValue, CommonClassNames.JAVA_UTIL_DATE, CommonClassNames.JAVA_UTIL_CALENDAR); + if (type == null) { + return; + } + registerError(returnValue, type); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/UseOfAnotherObjectsPrivateFieldInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/UseOfAnotherObjectsPrivateFieldInspection.java index 0a81027e91..7367c80a76 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/UseOfAnotherObjectsPrivateFieldInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/encapsulation/UseOfAnotherObjectsPrivateFieldInspection.java @@ -25,98 +25,101 @@ import consulo.deadCodeNotWorking.impl.MultipleCheckboxOptionsPanel; import consulo.language.psi.PsiElement; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; public abstract class UseOfAnotherObjectsPrivateFieldInspection extends BaseInspection { + @SuppressWarnings({"PublicField"}) + public boolean ignoreSameClass = false; + @SuppressWarnings({"PublicField"}) + public boolean ignoreEquals = false; - @SuppressWarnings({"PublicField"}) - public boolean ignoreSameClass = false; - @SuppressWarnings({"PublicField"}) - public boolean ignoreEquals = false; - - @Override - @Nonnull - public String getID() { - return "AccessingNonPublicFieldOfAnotherObject"; - } + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "AccessingNonPublicFieldOfAnotherObject"; + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.accessingNonPublicFieldOfAnotherObjectDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.accessingNonPublicFieldOfAnotherObjectDisplayName(); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.accessingNonPublicFieldOfAnotherObjectProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.accessingNonPublicFieldOfAnotherObjectProblemDescriptor().get(); + } - @Override - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); - panel.addCheckbox(InspectionGadgetsLocalize.ignoreAccessesFromTheSameClass().get(), "ignoreSameClass"); - panel.addCheckbox(InspectionGadgetsLocalize.ignoreAccessesFromEqualsMethod().get(), "ignoreEquals"); - return panel; - } + @Override + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); + panel.addCheckbox(InspectionGadgetsLocalize.ignoreAccessesFromTheSameClass().get(), "ignoreSameClass"); + panel.addCheckbox(InspectionGadgetsLocalize.ignoreAccessesFromEqualsMethod().get(), "ignoreEquals"); + return panel; + } - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiField field = (PsiField) infos[0]; - return new EncapsulateVariableFix(field.getName()); - } + @Override + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiField field = (PsiField) infos[0]; + return new EncapsulateVariableFix(field.getName()); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new UseOfAnotherObjectsPrivateFieldVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new UseOfAnotherObjectsPrivateFieldVisitor(); + } - private class UseOfAnotherObjectsPrivateFieldVisitor - extends BaseInspectionVisitor { + private class UseOfAnotherObjectsPrivateFieldVisitor + extends BaseInspectionVisitor { - @Override - public void visitReferenceExpression( - @Nonnull PsiReferenceExpression expression) { - super.visitReferenceExpression(expression); - final PsiExpression qualifier = expression.getQualifierExpression(); - if (qualifier == null || qualifier instanceof PsiThisExpression) { - return; - } - if (ignoreEquals) { - final PsiMethod method = - PsiTreeUtil.getParentOfType(expression, PsiMethod.class); - if (MethodUtils.isEquals(method)) { - return; - } - } - final PsiElement referent = expression.resolve(); - if (!(referent instanceof PsiField)) { - return; - } - final PsiField field = (PsiField) referent; - if (ignoreSameClass) { - final PsiClass parent = - PsiTreeUtil.getParentOfType(expression, PsiClass.class); - final PsiClass containingClass = field.getContainingClass(); - if (parent != null && parent.equals(containingClass)) { - return; + @Override + public void visitReferenceExpression( + @Nonnull PsiReferenceExpression expression + ) { + super.visitReferenceExpression(expression); + final PsiExpression qualifier = expression.getQualifierExpression(); + if (qualifier == null || qualifier instanceof PsiThisExpression) { + return; + } + if (ignoreEquals) { + final PsiMethod method = + PsiTreeUtil.getParentOfType(expression, PsiMethod.class); + if (MethodUtils.isEquals(method)) { + return; + } + } + final PsiElement referent = expression.resolve(); + if (!(referent instanceof PsiField)) { + return; + } + final PsiField field = (PsiField) referent; + if (ignoreSameClass) { + final PsiClass parent = + PsiTreeUtil.getParentOfType(expression, PsiClass.class); + final PsiClass containingClass = field.getContainingClass(); + if (parent != null && parent.equals(containingClass)) { + return; + } + } + if (!field.hasModifierProperty(PsiModifier.PRIVATE) && + !field.hasModifierProperty(PsiModifier.PROTECTED)) { + return; + } + if (field.hasModifierProperty(PsiModifier.STATIC)) { + return; + } + final PsiElement fieldNameElement = + expression.getReferenceNameElement(); + if (fieldNameElement == null) { + return; + } + registerError(fieldNameElement, field); } - } - if (!field.hasModifierProperty(PsiModifier.PRIVATE) && - !field.hasModifierProperty(PsiModifier.PROTECTED)) { - return; - } - if (field.hasModifierProperty(PsiModifier.STATIC)) { - return; - } - final PsiElement fieldNameElement = - expression.getReferenceNameElement(); - if (fieldNameElement == null) { - return; - } - registerError(fieldNameElement, field); } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/BadExceptionCaughtInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/BadExceptionCaughtInspection.java index 8c6d285550..041275e983 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/BadExceptionCaughtInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/BadExceptionCaughtInspection.java @@ -23,105 +23,107 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import consulo.ui.ex.awt.table.ListTable; import consulo.ui.ex.awt.table.ListWrappingTableModel; import consulo.util.lang.StringUtil; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; import java.util.List; @ExtensionImpl public class BadExceptionCaughtInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public String exceptionsString = ""; - /** - * @noinspection PublicField - */ - public String exceptionsString = ""; - - /** - * @noinspection PublicField - */ - public final ExternalizableStringSet exceptions = - new ExternalizableStringSet( + /** + * @noinspection PublicField + */ + public final ExternalizableStringSet exceptions = new ExternalizableStringSet( CommonClassNames.JAVA_LANG_NULL_POINTER_EXCEPTION, - "java.lang.IllegalMonitorStateException", + "java.lang.IllegalMonitorStateException", CommonClassNames.JAVA_LANG_ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION ); - public BadExceptionCaughtInspection() { - if (exceptionsString.length() != 0) { - exceptions.clear(); - final List strings = StringUtil.split(exceptionsString, ","); - for (String string : strings) { - exceptions.add(string); - } - exceptionsString = ""; + public BadExceptionCaughtInspection() { + if (exceptionsString.length() != 0) { + exceptions.clear(); + final List strings = StringUtil.split(exceptionsString, ","); + for (String string : strings) { + exceptions.add(string); + } + exceptionsString = ""; + } } - } - @Nonnull - public String getID() { - return "ProhibitedExceptionCaught"; - } + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "ProhibitedExceptionCaught"; + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.badExceptionCaughtDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.badExceptionCaughtDisplayName(); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.badExceptionCaughtProblemDescriptor().get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.badExceptionCaughtProblemDescriptor().get(); + } - @Override - public JComponent createOptionsPanel() { - final ListTable table = - new ListTable(new ListWrappingTableModel(exceptions, InspectionGadgetsLocalize.exceptionClassColumnName().get())); - return UiUtils.createAddRemoveTreeClassChooserPanel( - table, - InspectionGadgetsLocalize.chooseExceptionClass().get(), - CommonClassNames.JAVA_LANG_THROWABLE - ); - } + @Override + public JComponent createOptionsPanel() { + final ListTable table = + new ListTable(new ListWrappingTableModel(exceptions, InspectionGadgetsLocalize.exceptionClassColumnName().get())); + return UiUtils.createAddRemoveTreeClassChooserPanel( + table, + InspectionGadgetsLocalize.chooseExceptionClass().get(), + CommonClassNames.JAVA_LANG_THROWABLE + ); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new BadExceptionCaughtVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new BadExceptionCaughtVisitor(); + } - private class BadExceptionCaughtVisitor extends BaseInspectionVisitor { + private class BadExceptionCaughtVisitor extends BaseInspectionVisitor { - @Override - public void visitCatchSection(PsiCatchSection section) { - super.visitCatchSection(section); - final PsiParameter parameter = section.getParameter(); - if (parameter == null) { - return; - } - final PsiTypeElement typeElement = parameter.getTypeElement(); - if (typeElement == null) { - return; - } - final PsiTypeElement[] childTypeElements = PsiTreeUtil.getChildrenOfType(typeElement, PsiTypeElement.class); - if (childTypeElements != null) { - for (PsiTypeElement childTypeElement : childTypeElements) { - checkTypeElement(childTypeElement); + @Override + public void visitCatchSection(PsiCatchSection section) { + super.visitCatchSection(section); + final PsiParameter parameter = section.getParameter(); + if (parameter == null) { + return; + } + final PsiTypeElement typeElement = parameter.getTypeElement(); + if (typeElement == null) { + return; + } + final PsiTypeElement[] childTypeElements = PsiTreeUtil.getChildrenOfType(typeElement, PsiTypeElement.class); + if (childTypeElements != null) { + for (PsiTypeElement childTypeElement : childTypeElements) { + checkTypeElement(childTypeElement); + } + } + else { + checkTypeElement(typeElement); + } } - } - else { - checkTypeElement(typeElement); - } - } - private void checkTypeElement(PsiTypeElement typeElement) { - final PsiType type = typeElement.getType(); - if (exceptions.contains(type.getCanonicalText())) { - registerError(typeElement); - } + private void checkTypeElement(PsiTypeElement typeElement) { + final PsiType type = typeElement.getType(); + if (exceptions.contains(type.getCanonicalText())) { + registerError(typeElement); + } + } } - } } diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/BadExceptionDeclaredInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/BadExceptionDeclaredInspection.java index 659430aa8b..215f7b1a78 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/BadExceptionDeclaredInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/BadExceptionDeclaredInspection.java @@ -28,10 +28,12 @@ import consulo.annotation.component.ExtensionImpl; import consulo.deadCodeNotWorking.impl.CheckBox; import consulo.language.psi.PsiElement; +import consulo.localize.LocalizeValue; import consulo.ui.ex.awt.table.ListTable; import consulo.ui.ex.awt.table.ListWrappingTableModel; import consulo.util.lang.StringUtil; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; import java.awt.*; @@ -39,131 +41,132 @@ @ExtensionImpl public class BadExceptionDeclaredInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public String exceptionsString = ""; + + /** + * @noinspection PublicField + */ + public final ExternalizableStringSet exceptions = new ExternalizableStringSet( + CommonClassNames.JAVA_LANG_THROWABLE, + CommonClassNames.JAVA_LANG_EXCEPTION, + CommonClassNames.JAVA_LANG_ERROR, + CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION, + CommonClassNames.JAVA_LANG_NULL_POINTER_EXCEPTION, + CommonClassNames.JAVA_LANG_CLASS_CAST_EXCEPTION, + CommonClassNames.JAVA_LANG_ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION + ); - /** - * @noinspection PublicField - */ - public String exceptionsString = ""; - - /** - * @noinspection PublicField - */ - public final ExternalizableStringSet exceptions = new ExternalizableStringSet( - CommonClassNames.JAVA_LANG_THROWABLE, - CommonClassNames.JAVA_LANG_EXCEPTION, - CommonClassNames.JAVA_LANG_ERROR, - CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION, - CommonClassNames.JAVA_LANG_NULL_POINTER_EXCEPTION, - CommonClassNames.JAVA_LANG_CLASS_CAST_EXCEPTION, - CommonClassNames.JAVA_LANG_ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION - ); - - /** - * @noinspection PublicField - */ - public boolean ignoreTestCases = false; - - public boolean ignoreLibraryOverrides = false; - - public BadExceptionDeclaredInspection() { - if (exceptionsString.length() != 0) { - exceptions.clear(); - final List strings = StringUtil.split(exceptionsString, ","); - for (String string : strings) { - exceptions.add(string); - } - exceptionsString = ""; + /** + * @noinspection PublicField + */ + public boolean ignoreTestCases = false; + + public boolean ignoreLibraryOverrides = false; + + public BadExceptionDeclaredInspection() { + if (exceptionsString.length() != 0) { + exceptions.clear(); + final List strings = StringUtil.split(exceptionsString, ","); + for (String string : strings) { + exceptions.add(string); + } + exceptionsString = ""; + } } - } - - @Override - @Nonnull - public String getID() { - return "ProhibitedExceptionDeclared"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.badExceptionDeclaredDisplayName().get(); - } - - @Override - @Nonnull - public String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.badExceptionDeclaredProblemDescriptor().get(); - } - - @Override - public JComponent createOptionsPanel() { - final JComponent panel = new JPanel(new GridBagLayout()); - final ListTable table = - new ListTable(new ListWrappingTableModel(exceptions, InspectionGadgetsLocalize.exceptionClassColumnName().get())); - JPanel tablePanel = UiUtils.createAddRemoveTreeClassChooserPanel( - table, - InspectionGadgetsLocalize.chooseExceptionClass().get(), - CommonClassNames.JAVA_LANG_THROWABLE - ); - final GridBagConstraints constraints = new GridBagConstraints(); - constraints.gridx = 0; - constraints.gridy = 0; - constraints.weightx = 1.0; - constraints.weighty = 1.0; - constraints.fill = GridBagConstraints.BOTH; - panel.add(tablePanel, constraints); - - final CheckBox checkBox1 = - new CheckBox(InspectionGadgetsBundle.message("ignore.exceptions.declared.in.tests.option"), this, - "ignoreTestCases"); - constraints.gridy = 1; - constraints.weighty = 0.0; - panel.add(checkBox1, constraints); - - final CheckBox checkBox2 = new CheckBox( - InspectionGadgetsLocalize.ignoreExceptionsDeclaredOnLibraryOverrideOption().get(), - this, - "ignoreLibraryOverrides" - ); - constraints.gridy = 2; - panel.add(checkBox2, constraints); - return panel; - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new BadExceptionDeclaredVisitor(); - } + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "ProhibitedExceptionDeclared"; + } - private class BadExceptionDeclaredVisitor extends BaseInspectionVisitor { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.badExceptionDeclaredDisplayName(); + } @Override - public void visitMethod(@Nonnull PsiMethod method) { - super.visitMethod(method); - if (ignoreTestCases) { - final PsiClass containingClass = method.getContainingClass(); - if (containingClass != null && TestFrameworks.getInstance().isTestClass(containingClass)) { - return; - } - if (TestUtils.isJUnitTestMethod(method)) { - return; - } - } - if (ignoreLibraryOverrides && LibraryUtil.isOverrideOfLibraryMethod(method)) { - return; - } - final PsiReferenceList throwsList = method.getThrowsList(); - final PsiJavaCodeReferenceElement[] references = throwsList.getReferenceElements(); - for (PsiJavaCodeReferenceElement reference : references) { - final PsiElement element = reference.resolve(); - if (!(element instanceof PsiClass)) { - continue; - } - final PsiClass thrownClass = (PsiClass)element; - final String qualifiedName = thrownClass.getQualifiedName(); - if (qualifiedName != null && exceptions.contains(qualifiedName)) { - registerError(reference); + @Nonnull + public String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.badExceptionDeclaredProblemDescriptor().get(); + } + + @Override + public JComponent createOptionsPanel() { + final JComponent panel = new JPanel(new GridBagLayout()); + final ListTable table = + new ListTable(new ListWrappingTableModel(exceptions, InspectionGadgetsLocalize.exceptionClassColumnName().get())); + JPanel tablePanel = UiUtils.createAddRemoveTreeClassChooserPanel( + table, + InspectionGadgetsLocalize.chooseExceptionClass().get(), + CommonClassNames.JAVA_LANG_THROWABLE + ); + final GridBagConstraints constraints = new GridBagConstraints(); + constraints.gridx = 0; + constraints.gridy = 0; + constraints.weightx = 1.0; + constraints.weighty = 1.0; + constraints.fill = GridBagConstraints.BOTH; + panel.add(tablePanel, constraints); + + final CheckBox checkBox1 = + new CheckBox(InspectionGadgetsBundle.message("ignore.exceptions.declared.in.tests.option"), this, + "ignoreTestCases" + ); + constraints.gridy = 1; + constraints.weighty = 0.0; + panel.add(checkBox1, constraints); + + final CheckBox checkBox2 = new CheckBox( + InspectionGadgetsLocalize.ignoreExceptionsDeclaredOnLibraryOverrideOption().get(), + this, + "ignoreLibraryOverrides" + ); + constraints.gridy = 2; + panel.add(checkBox2, constraints); + return panel; + } + + @Override + public BaseInspectionVisitor buildVisitor() { + return new BadExceptionDeclaredVisitor(); + } + + private class BadExceptionDeclaredVisitor extends BaseInspectionVisitor { + + @Override + public void visitMethod(@Nonnull PsiMethod method) { + super.visitMethod(method); + if (ignoreTestCases) { + final PsiClass containingClass = method.getContainingClass(); + if (containingClass != null && TestFrameworks.getInstance().isTestClass(containingClass)) { + return; + } + if (TestUtils.isJUnitTestMethod(method)) { + return; + } + } + if (ignoreLibraryOverrides && LibraryUtil.isOverrideOfLibraryMethod(method)) { + return; + } + final PsiReferenceList throwsList = method.getThrowsList(); + final PsiJavaCodeReferenceElement[] references = throwsList.getReferenceElements(); + for (PsiJavaCodeReferenceElement reference : references) { + final PsiElement element = reference.resolve(); + if (!(element instanceof PsiClass)) { + continue; + } + final PsiClass thrownClass = (PsiClass) element; + final String qualifiedName = thrownClass.getQualifiedName(); + if (qualifiedName != null && exceptions.contains(qualifiedName)) { + registerError(reference); + } + } } - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/BadExceptionThrownInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/BadExceptionThrownInspection.java index f61ec199f2..21029408c8 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/BadExceptionThrownInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/BadExceptionThrownInspection.java @@ -25,98 +25,99 @@ import com.siyeh.ig.ui.ExternalizableStringSet; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import consulo.ui.ex.awt.table.ListTable; import consulo.ui.ex.awt.table.ListWrappingTableModel; import consulo.util.lang.StringUtil; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; import javax.swing.*; import java.util.List; @ExtensionImpl public class BadExceptionThrownInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public String exceptionsString = ""; - /** - * @noinspection PublicField - */ - public String exceptionsString = ""; - - @SuppressWarnings("PublicField") - public final ExternalizableStringSet exceptions = - new ExternalizableStringSet( - CommonClassNames.JAVA_LANG_THROWABLE, - CommonClassNames.JAVA_LANG_EXCEPTION, - CommonClassNames.JAVA_LANG_ERROR, - CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION, - CommonClassNames.JAVA_LANG_NULL_POINTER_EXCEPTION, - CommonClassNames.JAVA_LANG_CLASS_CAST_EXCEPTION, - CommonClassNames.JAVA_LANG_ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION + @SuppressWarnings("PublicField") + public final ExternalizableStringSet exceptions = new ExternalizableStringSet( + CommonClassNames.JAVA_LANG_THROWABLE, + CommonClassNames.JAVA_LANG_EXCEPTION, + CommonClassNames.JAVA_LANG_ERROR, + CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION, + CommonClassNames.JAVA_LANG_NULL_POINTER_EXCEPTION, + CommonClassNames.JAVA_LANG_CLASS_CAST_EXCEPTION, + CommonClassNames.JAVA_LANG_ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION ); - public BadExceptionThrownInspection() { - if (exceptionsString.length() != 0) { - exceptions.clear(); - final List strings = - StringUtil.split(exceptionsString, ","); - for (String string : strings) { - exceptions.add(string); - } - exceptionsString = ""; + public BadExceptionThrownInspection() { + if (exceptionsString.length() != 0) { + exceptions.clear(); + final List strings = StringUtil.split(exceptionsString, ","); + for (String string : strings) { + exceptions.add(string); + } + exceptionsString = ""; + } } - } - @Override - @Nonnull - public String getID() { - return "ProhibitedExceptionThrown"; - } + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "ProhibitedExceptionThrown"; + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.badExceptionThrownDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.badExceptionThrownDisplayName(); + } - @Override - public JComponent createOptionsPanel() { - final ListTable table = new ListTable(new ListWrappingTableModel(exceptions, InspectionGadgetsLocalize.exceptionClassColumnName().get())); - return UiUtils.createAddRemoveTreeClassChooserPanel( - table, - InspectionGadgetsLocalize.chooseExceptionClass().get(), - CommonClassNames.JAVA_LANG_THROWABLE - ); - } + @Override + public JComponent createOptionsPanel() { + final ListTable table = + new ListTable(new ListWrappingTableModel(exceptions, InspectionGadgetsLocalize.exceptionClassColumnName().get())); + return UiUtils.createAddRemoveTreeClassChooserPanel( + table, + InspectionGadgetsLocalize.chooseExceptionClass().get(), + CommonClassNames.JAVA_LANG_THROWABLE + ); + } - @Override - @Nonnull - public String buildErrorString(Object... infos) { - final PsiType type = (PsiType)infos[0]; - final String exceptionName = type.getPresentableText(); - return InspectionGadgetsLocalize.badExceptionThrownProblemDescriptor(exceptionName).get(); - } + @Override + @Nonnull + public String buildErrorString(Object... infos) { + final PsiType type = (PsiType) infos[0]; + final String exceptionName = type.getPresentableText(); + return InspectionGadgetsLocalize.badExceptionThrownProblemDescriptor(exceptionName).get(); + } - @Override - public BaseInspectionVisitor buildVisitor() { - return new BadExceptionThrownVisitor(); - } + @Override + public BaseInspectionVisitor buildVisitor() { + return new BadExceptionThrownVisitor(); + } - private class BadExceptionThrownVisitor extends BaseInspectionVisitor { + private class BadExceptionThrownVisitor extends BaseInspectionVisitor { - @Override - public void visitThrowStatement(PsiThrowStatement statement) { - super.visitThrowStatement(statement); - final PsiExpression exception = statement.getException(); - if (exception == null) { - return; - } - final PsiType type = exception.getType(); - if (type == null) { - return; - } - final String text = type.getCanonicalText(); - if (exceptions.contains(text)) { - registerStatementError(statement, type); - } + @Override + public void visitThrowStatement(PsiThrowStatement statement) { + super.visitThrowStatement(statement); + final PsiExpression exception = statement.getException(); + if (exception == null) { + return; + } + final PsiType type = exception.getType(); + if (type == null) { + return; + } + final String text = type.getCanonicalText(); + if (exceptions.contains(text)) { + registerStatementError(statement, type); + } + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/CaughtExceptionImmediatelyRethrownInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/CaughtExceptionImmediatelyRethrownInspection.java index ecdafb00c9..8f2cf4b177 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/CaughtExceptionImmediatelyRethrownInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/CaughtExceptionImmediatelyRethrownInspection.java @@ -31,240 +31,235 @@ import consulo.language.psi.search.ReferencesSearch; import consulo.language.psi.util.PsiTreeUtil; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import consulo.util.lang.ref.Ref; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; -import org.jetbrains.annotations.Nls; import java.util.HashSet; import java.util.Set; @ExtensionImpl public class CaughtExceptionImmediatelyRethrownInspection extends BaseInspection { - - @Override - @Nls - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.caughtExceptionImmediatelyRethrownDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.caughtExceptionImmediatelyRethrownProblemDescriptor().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - @Nullable - protected InspectionGadgetsFix buildFix(Object... infos) { - final PsiTryStatement tryStatement = (PsiTryStatement)infos[0]; - final boolean removeTryCatch = tryStatement.getCatchSections().length == 1 && tryStatement.getFinallyBlock() == null && - tryStatement.getResourceList() == null; - return new DeleteCatchSectionFix(removeTryCatch); - } - - private static class DeleteCatchSectionFix extends InspectionGadgetsFix { - - private final boolean removeTryCatch; - - DeleteCatchSectionFix(boolean removeTryCatch) { - this.removeTryCatch = removeTryCatch; + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.caughtExceptionImmediatelyRethrownDisplayName(); } + @Override @Nonnull - public String getName() { - if (removeTryCatch) { - return InspectionGadgetsLocalize.removeTryCatchQuickfix().get(); - } - else { - return InspectionGadgetsLocalize.deleteCatchSectionQuickfix().get(); - } + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.caughtExceptionImmediatelyRethrownProblemDescriptor().get(); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiElement parent = element.getParent(); - if (!(parent instanceof PsiParameter)) { - return; - } - final PsiParameter parameter = (PsiParameter)parent; - final PsiElement grandParent = parameter.getParent(); - if (!(grandParent instanceof PsiCatchSection)) { - return; - } - final PsiCatchSection catchSection = (PsiCatchSection)grandParent; - final PsiTryStatement tryStatement = catchSection.getTryStatement(); - if (removeTryCatch) { - final PsiCodeBlock codeBlock = tryStatement.getTryBlock(); - if (codeBlock == null) { - return; - } - final PsiStatement[] statements = codeBlock.getStatements(); - if (statements.length == 0) { - tryStatement.delete(); - return; - } - final PsiElement containingElement = tryStatement.getParent(); - final boolean keepBlock; - if (containingElement instanceof PsiCodeBlock) { - final PsiCodeBlock parentBlock = (PsiCodeBlock)containingElement; - keepBlock = VariableSearchUtils.containsConflictingDeclarations(codeBlock, parentBlock); - } - else { - keepBlock = true; + public boolean isEnabledByDefault() { + return true; + } + + @Override + @Nullable + protected InspectionGadgetsFix buildFix(Object... infos) { + final PsiTryStatement tryStatement = (PsiTryStatement) infos[0]; + final boolean removeTryCatch = tryStatement.getCatchSections().length == 1 && tryStatement.getFinallyBlock() == null && + tryStatement.getResourceList() == null; + return new DeleteCatchSectionFix(removeTryCatch); + } + + private static class DeleteCatchSectionFix extends InspectionGadgetsFix { + private final boolean removeTryCatch; + + DeleteCatchSectionFix(boolean removeTryCatch) { + this.removeTryCatch = removeTryCatch; } - if (keepBlock) { - final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); - final PsiElementFactory factory = psiFacade.getElementFactory(); - final PsiBlockStatement resultStatement = (PsiBlockStatement)factory.createStatementFromText("{}", element); - final PsiCodeBlock resultBlock = resultStatement.getCodeBlock(); - for (PsiStatement statement : statements) { - resultBlock.add(statement); - } - tryStatement.replace(resultStatement); + + @Nonnull + @Override + public LocalizeValue getName() { + return removeTryCatch + ? InspectionGadgetsLocalize.removeTryCatchQuickfix() + : InspectionGadgetsLocalize.deleteCatchSectionQuickfix(); } - else { - for (PsiStatement statement : statements) { - containingElement.addBefore(statement, tryStatement); - } - tryStatement.delete(); + + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiElement parent = element.getParent(); + if (!(parent instanceof PsiParameter)) { + return; + } + final PsiParameter parameter = (PsiParameter) parent; + final PsiElement grandParent = parameter.getParent(); + if (!(grandParent instanceof PsiCatchSection)) { + return; + } + final PsiCatchSection catchSection = (PsiCatchSection) grandParent; + final PsiTryStatement tryStatement = catchSection.getTryStatement(); + if (removeTryCatch) { + final PsiCodeBlock codeBlock = tryStatement.getTryBlock(); + if (codeBlock == null) { + return; + } + final PsiStatement[] statements = codeBlock.getStatements(); + if (statements.length == 0) { + tryStatement.delete(); + return; + } + final PsiElement containingElement = tryStatement.getParent(); + final boolean keepBlock; + if (containingElement instanceof PsiCodeBlock) { + final PsiCodeBlock parentBlock = (PsiCodeBlock) containingElement; + keepBlock = VariableSearchUtils.containsConflictingDeclarations(codeBlock, parentBlock); + } + else { + keepBlock = true; + } + if (keepBlock) { + final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); + final PsiElementFactory factory = psiFacade.getElementFactory(); + final PsiBlockStatement resultStatement = (PsiBlockStatement) factory.createStatementFromText("{}", element); + final PsiCodeBlock resultBlock = resultStatement.getCodeBlock(); + for (PsiStatement statement : statements) { + resultBlock.add(statement); + } + tryStatement.replace(resultStatement); + } + else { + for (PsiStatement statement : statements) { + containingElement.addBefore(statement, tryStatement); + } + tryStatement.delete(); + } + } + else { + catchSection.delete(); + } } - } - else { - catchSection.delete(); - } } - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new CaughtExceptionImmediatelyRethrownVisitor(); - } - - private static class CaughtExceptionImmediatelyRethrownVisitor extends BaseInspectionVisitor { @Override - public void visitThrowStatement(PsiThrowStatement statement) { - super.visitThrowStatement(statement); - final PsiExpression expression = ParenthesesUtils.stripParentheses(statement.getException()); - if (!(expression instanceof PsiReferenceExpression)) { - return; - } - final PsiStatement previousStatement = PsiTreeUtil.getPrevSiblingOfType(statement, PsiStatement.class); - if (previousStatement != null) { - return; - } - final PsiElement parent = statement.getParent(); - if (parent instanceof PsiStatement) { - // e.g. if (notsure) throw e; - return; - } - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)expression; - final PsiElement target = referenceExpression.resolve(); - if (!(target instanceof PsiParameter)) { - return; - } - final PsiParameter parameter = (PsiParameter)target; - final PsiElement declarationScope = parameter.getDeclarationScope(); - if (!(declarationScope instanceof PsiCatchSection)) { - return; - } - final PsiCatchSection catchSection = (PsiCatchSection)declarationScope; - final PsiCodeBlock block = PsiTreeUtil.getParentOfType(statement, PsiCodeBlock.class); - if (block == null) { - return; - } - final PsiElement blockParent = block.getParent(); - if (blockParent != catchSection) { - // e.g. if (notsure) { throw e; } - return; - } - if (isSuperClassExceptionCaughtLater(parameter, catchSection)) { - return; - } - final Query query = ReferencesSearch.search(parameter); - for (PsiReference reference : query) { - final PsiElement element = reference.getElement(); - if (element != expression) { - return; - } - } - final PsiTryStatement tryStatement = catchSection.getTryStatement(); - registerVariableError(parameter, tryStatement); + public BaseInspectionVisitor buildVisitor() { + return new CaughtExceptionImmediatelyRethrownVisitor(); } - private static boolean isSuperClassExceptionCaughtLater(PsiVariable parameter, PsiCatchSection catchSection) { - final PsiTryStatement tryStatement = catchSection.getTryStatement(); - final PsiCatchSection[] catchSections = tryStatement.getCatchSections(); - int index = 0; - while (catchSections[index] != catchSection && index < catchSections.length) { - index++; - } - final PsiType type = parameter.getType(); - final Set parameterClasses = new HashSet(); - processExceptionClasses(type, aClass -> { - parameterClasses.add(aClass); - return true; - }); - if (parameterClasses.isEmpty()) { - return false; - } - final Ref superClassExceptionType = new Ref(Boolean.FALSE); - for (int i = index; i < catchSections.length; i++) { - final PsiCatchSection nextCatchSection = catchSections[i]; - final PsiParameter nextParameter = nextCatchSection.getParameter(); - if (nextParameter == null) { - continue; + private static class CaughtExceptionImmediatelyRethrownVisitor extends BaseInspectionVisitor { + + @Override + public void visitThrowStatement(PsiThrowStatement statement) { + super.visitThrowStatement(statement); + final PsiExpression expression = ParenthesesUtils.stripParentheses(statement.getException()); + if (!(expression instanceof PsiReferenceExpression)) { + return; + } + final PsiStatement previousStatement = PsiTreeUtil.getPrevSiblingOfType(statement, PsiStatement.class); + if (previousStatement != null) { + return; + } + final PsiElement parent = statement.getParent(); + if (parent instanceof PsiStatement) { + // e.g. if (notsure) throw e; + return; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression) expression; + final PsiElement target = referenceExpression.resolve(); + if (!(target instanceof PsiParameter)) { + return; + } + final PsiParameter parameter = (PsiParameter) target; + final PsiElement declarationScope = parameter.getDeclarationScope(); + if (!(declarationScope instanceof PsiCatchSection)) { + return; + } + final PsiCatchSection catchSection = (PsiCatchSection) declarationScope; + final PsiCodeBlock block = PsiTreeUtil.getParentOfType(statement, PsiCodeBlock.class); + if (block == null) { + return; + } + final PsiElement blockParent = block.getParent(); + if (blockParent != catchSection) { + // e.g. if (notsure) { throw e; } + return; + } + if (isSuperClassExceptionCaughtLater(parameter, catchSection)) { + return; + } + final Query query = ReferencesSearch.search(parameter); + for (PsiReference reference : query) { + final PsiElement element = reference.getElement(); + if (element != expression) { + return; + } + } + final PsiTryStatement tryStatement = catchSection.getTryStatement(); + registerVariableError(parameter, tryStatement); } - final PsiType nextType = nextParameter.getType(); - processExceptionClasses(nextType, new Processor() { - @Override - public boolean process(PsiClass aClass) { - for (PsiClass parameterClass : parameterClasses) { - if (parameterClass.isInheritor(aClass, true)) { - superClassExceptionType.set(Boolean.TRUE); + + private static boolean isSuperClassExceptionCaughtLater(PsiVariable parameter, PsiCatchSection catchSection) { + final PsiTryStatement tryStatement = catchSection.getTryStatement(); + final PsiCatchSection[] catchSections = tryStatement.getCatchSections(); + int index = 0; + while (catchSections[index] != catchSection && index < catchSections.length) { + index++; + } + final PsiType type = parameter.getType(); + final Set parameterClasses = new HashSet(); + processExceptionClasses(type, aClass -> { + parameterClasses.add(aClass); + return true; + }); + if (parameterClasses.isEmpty()) { return false; - } } - return true; - } - }); - if (superClassExceptionType.get().booleanValue()) { - return true; + final Ref superClassExceptionType = new Ref(Boolean.FALSE); + for (int i = index; i < catchSections.length; i++) { + final PsiCatchSection nextCatchSection = catchSections[i]; + final PsiParameter nextParameter = nextCatchSection.getParameter(); + if (nextParameter == null) { + continue; + } + final PsiType nextType = nextParameter.getType(); + processExceptionClasses(nextType, new Processor() { + @Override + public boolean process(PsiClass aClass) { + for (PsiClass parameterClass : parameterClasses) { + if (parameterClass.isInheritor(aClass, true)) { + superClassExceptionType.set(Boolean.TRUE); + return false; + } + } + return true; + } + }); + if (superClassExceptionType.get().booleanValue()) { + return true; + } + } + return false; } - } - return false; - } - private static void processExceptionClasses(PsiType type, Processor processor) { - if (type instanceof PsiClassType) { - final PsiClassType classType = (PsiClassType)type; - final PsiClass aClass = classType.resolve(); - if (aClass != null) { - processor.process(aClass); - } - } - else if (type instanceof PsiDisjunctionType) { - final PsiDisjunctionType disjunctionType = (PsiDisjunctionType)type; - for (PsiType disjunction : disjunctionType.getDisjunctions()) { - if (!(disjunction instanceof PsiClassType)) { - continue; - } - final PsiClassType classType = (PsiClassType)disjunction; - final PsiClass aClass = classType.resolve(); - if (aClass != null) { - processor.process(aClass); - } + private static void processExceptionClasses(PsiType type, Processor processor) { + if (type instanceof PsiClassType) { + final PsiClassType classType = (PsiClassType) type; + final PsiClass aClass = classType.resolve(); + if (aClass != null) { + processor.process(aClass); + } + } + else if (type instanceof PsiDisjunctionType) { + final PsiDisjunctionType disjunctionType = (PsiDisjunctionType) type; + for (PsiType disjunction : disjunctionType.getDisjunctions()) { + if (!(disjunction instanceof PsiClassType)) { + continue; + } + final PsiClassType classType = (PsiClassType) disjunction; + final PsiClass aClass = classType.resolve(); + if (aClass != null) { + processor.process(aClass); + } + } + } } - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/CheckedExceptionClassInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/CheckedExceptionClassInspection.java index a6d6da9efe..7ea8a56c4e 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/CheckedExceptionClassInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/CheckedExceptionClassInspection.java @@ -22,39 +22,39 @@ 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 CheckedExceptionClassInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.checkedExceptionClassDisplayName(); + } - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.checkedExceptionClassDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.checkedExceptionClassProblemDescriptor().get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new CheckedExceptionClassVisitor(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.checkedExceptionClassProblemDescriptor().get(); + } - private static class CheckedExceptionClassVisitor - extends BaseInspectionVisitor { @Override - public void visitClass(@Nonnull PsiClass aClass) { - if (!InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_THROWABLE)) { - return; - } - if (InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION)) { - return; - } - registerClassError(aClass); + public BaseInspectionVisitor buildVisitor() { + return new CheckedExceptionClassVisitor(); + } + + private static class CheckedExceptionClassVisitor + extends BaseInspectionVisitor { + @Override + public void visitClass(@Nonnull PsiClass aClass) { + if (!InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_THROWABLE)) { + return; + } + if (InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION)) { + return; + } + registerClassError(aClass); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/ContinueOrBreakFromFinallyBlockInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/ContinueOrBreakFromFinallyBlockInspection.java index 02b4a14f28..2398c6f5a2 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/ContinueOrBreakFromFinallyBlockInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/ContinueOrBreakFromFinallyBlockInspection.java @@ -23,65 +23,66 @@ import com.siyeh.ig.psiutils.ControlFlowUtils; import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; @ExtensionImpl -public class ContinueOrBreakFromFinallyBlockInspection - extends BaseInspection { - - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.continueOrBreakFromFinallyBlockDisplayName().get(); - } +public class ContinueOrBreakFromFinallyBlockInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.continueOrBreakFromFinallyBlockDisplayName(); + } - public boolean isEnabledByDefault() { - return true; - } + public boolean isEnabledByDefault() { + return true; + } - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.continueOrBreakFromFinallyBlockProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.continueOrBreakFromFinallyBlockProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new ContinueOrBreakFromFinallyBlockVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new ContinueOrBreakFromFinallyBlockVisitor(); + } - private static class ContinueOrBreakFromFinallyBlockVisitor - extends BaseInspectionVisitor { + private static class ContinueOrBreakFromFinallyBlockVisitor + extends BaseInspectionVisitor { - @Override - public void visitContinueStatement( - @Nonnull PsiContinueStatement statement) { - super.visitContinueStatement(statement); - if (!ControlFlowUtils.isInFinallyBlock(statement)) { - return; - } - final PsiStatement continuedStatement = - statement.findContinuedStatement(); - if (continuedStatement == null) { - return; - } - if (ControlFlowUtils.isInFinallyBlock(continuedStatement)) { - return; - } - registerStatementError(statement); - } + @Override + public void visitContinueStatement( + @Nonnull PsiContinueStatement statement + ) { + super.visitContinueStatement(statement); + if (!ControlFlowUtils.isInFinallyBlock(statement)) { + return; + } + final PsiStatement continuedStatement = + statement.findContinuedStatement(); + if (continuedStatement == null) { + return; + } + if (ControlFlowUtils.isInFinallyBlock(continuedStatement)) { + return; + } + registerStatementError(statement); + } - @Override - public void visitBreakStatement(@Nonnull PsiBreakStatement statement) { - super.visitBreakStatement(statement); - if (!ControlFlowUtils.isInFinallyBlock(statement)) { - return; - } - final PsiStatement exitedStatement = statement.findExitedStatement(); - if (exitedStatement == null) { - return; - } - if (ControlFlowUtils.isInFinallyBlock(exitedStatement)) { - return; - } - registerStatementError(statement); + @Override + public void visitBreakStatement(@Nonnull PsiBreakStatement statement) { + super.visitBreakStatement(statement); + if (!ControlFlowUtils.isInFinallyBlock(statement)) { + return; + } + final PsiStatement exitedStatement = statement.findExitedStatement(); + if (exitedStatement == null) { + return; + } + if (ControlFlowUtils.isInFinallyBlock(exitedStatement)) { + return; + } + registerStatementError(statement); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/EmptyCatchBlockInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/EmptyCatchBlockInspection.java index 2a88802b3e..71c596d6b4 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/EmptyCatchBlockInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/EmptyCatchBlockInspection.java @@ -29,6 +29,7 @@ import consulo.language.psi.PsiComment; 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; @@ -38,147 +39,140 @@ @ExtensionImpl public class EmptyCatchBlockInspection extends BaseInspection { + /** + * @noinspection PublicField + */ + public boolean m_includeComments = true; + /** + * @noinspection PublicField + */ + public boolean m_ignoreTestCases = true; + /** + * @noinspection PublicField + */ + public boolean m_ignoreIgnoreParameter = true; - /** - * @noinspection PublicField - */ - public boolean m_includeComments = true; - /** - * @noinspection PublicField - */ - public boolean m_ignoreTestCases = true; - /** - * @noinspection PublicField - */ - public boolean m_ignoreIgnoreParameter = true; - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.emptyCatchBlockDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.emptyCatchBlockProblemDescriptor().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel optionsPanel = - new MultipleCheckboxOptionsPanel(this); - optionsPanel.addCheckbox(InspectionGadgetsLocalize.emptyCatchBlockCommentsOption().get(), "m_includeComments"); - optionsPanel.addCheckbox(InspectionGadgetsBundle.message( - "empty.catch.block.ignore.option"), "m_ignoreTestCases"); - optionsPanel.addCheckbox(InspectionGadgetsLocalize.emptyCatchBlockIgnoreIgnoreOption().get(), "m_ignoreIgnoreParameter"); - return optionsPanel; - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.emptyCatchBlockDisplayName(); + } - @Override - @Nullable - protected InspectionGadgetsFix buildFix(Object... infos) { - return new EmptyCatchBlockFix(); - } + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.emptyCatchBlockProblemDescriptor().get(); + } - private static class EmptyCatchBlockFix extends InspectionGadgetsFix { + @Override + public boolean isEnabledByDefault() { + return true; + } - @Nonnull - public String getName() { - return InspectionGadgetsLocalize.renameCatchParameterToIgnored().get(); + @Override + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this); + optionsPanel.addCheckbox(InspectionGadgetsLocalize.emptyCatchBlockCommentsOption().get(), "m_includeComments"); + optionsPanel.addCheckbox(InspectionGadgetsBundle.message("empty.catch.block.ignore.option"), "m_ignoreTestCases"); + optionsPanel.addCheckbox(InspectionGadgetsLocalize.emptyCatchBlockIgnoreIgnoreOption().get(), "m_ignoreIgnoreParameter"); + return optionsPanel; } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiElement parent = element.getParent(); - if (!(parent instanceof PsiCatchSection)) { - return; - } - final PsiCatchSection catchSection = (PsiCatchSection)parent; - final PsiParameter parameter = catchSection.getParameter(); - if (parameter == null) { - return; - } - final PsiIdentifier identifier = parameter.getNameIdentifier(); - if (identifier == null) { - return; - } - final PsiElementFactory factory = - JavaPsiFacade.getInstance(project).getElementFactory(); - final PsiIdentifier newIdentifier = - factory.createIdentifier("ignored"); - identifier.replace(newIdentifier); + @Nullable + protected InspectionGadgetsFix buildFix(Object... infos) { + return new EmptyCatchBlockFix(); } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new EmptyCatchBlockVisitor(); - } + private static class EmptyCatchBlockFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.renameCatchParameterToIgnored(); + } - private class EmptyCatchBlockVisitor 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 PsiCatchSection)) { + return; + } + final PsiCatchSection catchSection = (PsiCatchSection) parent; + final PsiParameter parameter = catchSection.getParameter(); + if (parameter == null) { + return; + } + final PsiIdentifier identifier = parameter.getNameIdentifier(); + if (identifier == null) { + return; + } + final PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory(); + final PsiIdentifier newIdentifier = factory.createIdentifier("ignored"); + identifier.replace(newIdentifier); + } + } @Override - public void visitTryStatement(@Nonnull PsiTryStatement statement) { - super.visitTryStatement(statement); - /* if (JspPsiUtil.isInJspFile(statement.getContainingFile())) { - return; - } */ - if (m_ignoreTestCases && TestUtils.isInTestCode(statement)) { - return; - } - final PsiCatchSection[] catchSections = statement.getCatchSections(); - for (final PsiCatchSection section : catchSections) { - checkCatchSection(section); - } + public BaseInspectionVisitor buildVisitor() { + return new EmptyCatchBlockVisitor(); } - private void checkCatchSection(PsiCatchSection section) { - final PsiCodeBlock block = section.getCatchBlock(); - if (block == null || !isCatchBlockEmpty(block)) { - return; - } - final PsiParameter parameter = section.getParameter(); - if (parameter == null) { - return; - } - final PsiIdentifier identifier = parameter.getNameIdentifier(); - if (identifier == null) { - return; - } - @NonNls final String parameterName = parameter.getName(); - if (m_ignoreIgnoreParameter && PsiUtil.isIgnoredName(parameterName)) { - return; - } - final PsiElement catchToken = section.getFirstChild(); - if (catchToken == null) { - return; - } - registerError(catchToken); - } + private class EmptyCatchBlockVisitor extends BaseInspectionVisitor { + @Override + public void visitTryStatement(@Nonnull PsiTryStatement statement) { + super.visitTryStatement(statement); + /*if (JspPsiUtil.isInJspFile(statement.getContainingFile())) { + return; + }*/ + if (m_ignoreTestCases && TestUtils.isInTestCode(statement)) { + return; + } + final PsiCatchSection[] catchSections = statement.getCatchSections(); + for (final PsiCatchSection section : catchSections) { + checkCatchSection(section); + } + } - private boolean isCatchBlockEmpty(PsiCodeBlock block) { - if (m_includeComments) { - final PsiElement[] children = block.getChildren(); - for (final PsiElement child : children) { - if (child instanceof PsiComment || - child instanceof PsiStatement) { - return false; - } + private void checkCatchSection(PsiCatchSection section) { + final PsiCodeBlock block = section.getCatchBlock(); + if (block == null || !isCatchBlockEmpty(block)) { + return; + } + final PsiParameter parameter = section.getParameter(); + if (parameter == null) { + return; + } + final PsiIdentifier identifier = parameter.getNameIdentifier(); + if (identifier == null) { + return; + } + @NonNls final String parameterName = parameter.getName(); + if (m_ignoreIgnoreParameter && PsiUtil.isIgnoredName(parameterName)) { + return; + } + final PsiElement catchToken = section.getFirstChild(); + if (catchToken == null) { + return; + } + registerError(catchToken); + } + + private boolean isCatchBlockEmpty(PsiCodeBlock block) { + if (m_includeComments) { + final PsiElement[] children = block.getChildren(); + for (final PsiElement child : children) { + if (child instanceof PsiComment || child instanceof PsiStatement) { + return false; + } + } + return true; + } + else { + final PsiStatement[] statements = block.getStatements(); + return statements.length == 0; + } } - return true; - } - else { - final PsiStatement[] statements = block.getStatements(); - return statements.length == 0; - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/EmptyFinallyBlockInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/EmptyFinallyBlockInspection.java index 594357a6f3..2bf42d4465 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/EmptyFinallyBlockInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/EmptyFinallyBlockInspection.java @@ -27,149 +27,152 @@ import consulo.language.psi.PsiWhiteSpace; import consulo.language.psi.util.PsiTreeUtil; import consulo.language.util.IncorrectOperationException; +import consulo.localize.LocalizeValue; import consulo.project.Project; import jakarta.annotation.Nonnull; @ExtensionImpl public class EmptyFinallyBlockInspection extends BaseInspection { - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.emptyFinallyBlockDisplayName().get(); - } - - @Override - public boolean isEnabledByDefault() { - return true; - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.emptyFinallyBlockProblemDescriptor().get(); - } - - @Override - protected InspectionGadgetsFix buildFix(Object... infos) { - final Integer count = (Integer)infos[0]; - if (count == 0) { - return new RemoveTryFinallyBlockFix(); - } - else { - return new RemoveFinallyBlockFix(); - } - } - - private static class RemoveTryFinallyBlockFix extends InspectionGadgetsFix { @Nonnull - public String getName() { - return InspectionGadgetsLocalize.removeTryFinallyBlockQuickfix().get(); + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.emptyFinallyBlockDisplayName(); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiTryStatement tryStatement = PsiTreeUtil.getParentOfType(element, PsiTryStatement.class); - if (tryStatement == null) { - return; - } - final PsiCodeBlock tryBlock = tryStatement.getTryBlock(); - if (tryBlock == null) { - return; - } - final PsiElement parent = tryStatement.getParent(); - if (parent == null) { - return; - } - - final PsiResourceList resources = tryStatement.getResourceList(); - if (resources != null) { - final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); - for (PsiResourceVariable resource : resources.getResourceVariables()) { - final PsiStatement statement = factory.createStatementFromText(resource.getText() + ";", parent); - parent.addBefore(statement, tryStatement); - } - } - - final PsiElement first = tryBlock.getFirstBodyElement(); - final PsiElement last = tryBlock.getLastBodyElement(); - if (first != null && last != null) { - parent.addRangeAfter(first, last, tryStatement); - } - - tryStatement.delete(); + public boolean isEnabledByDefault() { + return true; } - } - private static class RemoveFinallyBlockFix extends InspectionGadgetsFix { + @Override @Nonnull - public String getName() { - return InspectionGadgetsLocalize.removeFinallyBlockQuickfix().get(); + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.emptyFinallyBlockProblemDescriptor().get(); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiTryStatement tryStatement = - PsiTreeUtil.getParentOfType(element, PsiTryStatement.class); - if (tryStatement == null) { - return; - } - final PsiCodeBlock finallyBlock = tryStatement.getFinallyBlock(); - if (finallyBlock == null) { - return; - } - deleteUntilFinally(finallyBlock); + protected InspectionGadgetsFix buildFix(Object... infos) { + final Integer count = (Integer) infos[0]; + if (count == 0) { + return new RemoveTryFinallyBlockFix(); + } + else { + return new RemoveFinallyBlockFix(); + } } - private static void deleteUntilFinally(PsiElement element) { - if (element instanceof PsiJavaToken) { - final PsiJavaToken keyword = (PsiJavaToken)element; - final IElementType tokenType = keyword.getTokenType(); - if (tokenType.equals(JavaTokenType.FINALLY_KEYWORD)) { - keyword.delete(); - return; + private static class RemoveTryFinallyBlockFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.removeTryFinallyBlockQuickfix(); + } + + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiTryStatement tryStatement = PsiTreeUtil.getParentOfType(element, PsiTryStatement.class); + if (tryStatement == null) { + return; + } + final PsiCodeBlock tryBlock = tryStatement.getTryBlock(); + if (tryBlock == null) { + return; + } + final PsiElement parent = tryStatement.getParent(); + if (parent == null) { + return; + } + + final PsiResourceList resources = tryStatement.getResourceList(); + if (resources != null) { + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); + for (PsiResourceVariable resource : resources.getResourceVariables()) { + final PsiStatement statement = factory.createStatementFromText(resource.getText() + ";", parent); + parent.addBefore(statement, tryStatement); + } + } + + final PsiElement first = tryBlock.getFirstBodyElement(); + final PsiElement last = tryBlock.getLastBodyElement(); + if (first != null && last != null) { + parent.addRangeAfter(first, last, tryStatement); + } + + tryStatement.delete(); } - } - deleteUntilFinally(element.getPrevSibling()); - if (!(element instanceof PsiWhiteSpace)) { - element.delete(); - } } - } - @Override - public BaseInspectionVisitor buildVisitor() { - return new EmptyFinallyBlockVisitor(); - } + private static class RemoveFinallyBlockFix extends InspectionGadgetsFix { + @Nonnull + @Override + public LocalizeValue getName() { + return InspectionGadgetsLocalize.removeFinallyBlockQuickfix(); + } - private static class EmptyFinallyBlockVisitor - extends BaseInspectionVisitor { + @Override + protected void doFix(Project project, ProblemDescriptor descriptor) + throws IncorrectOperationException { + final PsiElement element = descriptor.getPsiElement(); + final PsiTryStatement tryStatement = PsiTreeUtil.getParentOfType(element, PsiTryStatement.class); + if (tryStatement == null) { + return; + } + final PsiCodeBlock finallyBlock = tryStatement.getFinallyBlock(); + if (finallyBlock == null) { + return; + } + deleteUntilFinally(finallyBlock); + } + + private static void deleteUntilFinally(PsiElement element) { + if (element instanceof PsiJavaToken) { + final PsiJavaToken keyword = (PsiJavaToken) element; + final IElementType tokenType = keyword.getTokenType(); + if (tokenType.equals(JavaTokenType.FINALLY_KEYWORD)) { + keyword.delete(); + return; + } + } + deleteUntilFinally(element.getPrevSibling()); + if (!(element instanceof PsiWhiteSpace)) { + element.delete(); + } + } + } @Override - public void visitTryStatement( - @Nonnull PsiTryStatement statement) { - super.visitTryStatement(statement); - /* if (JspPsiUtil.isInJspFile(statement.getContainingFile())) { - return; - } */ - final PsiCodeBlock finallyBlock = statement.getFinallyBlock(); - if (finallyBlock == null) { - return; - } - if (finallyBlock.getStatements().length != 0) { - return; - } - final PsiCodeBlock[] catchBlocks = statement.getCatchBlocks(); - final PsiElement[] children = statement.getChildren(); - for (final PsiElement child : children) { - final String childText = child.getText(); - if (PsiKeyword.FINALLY.equals(childText)) { - registerError(child, Integer.valueOf(catchBlocks.length)); - return; + public BaseInspectionVisitor buildVisitor() { + return new EmptyFinallyBlockVisitor(); + } + + private static class EmptyFinallyBlockVisitor + extends BaseInspectionVisitor { + + @Override + public void visitTryStatement( + @Nonnull PsiTryStatement statement + ) { + super.visitTryStatement(statement); + /*if (JspPsiUtil.isInJspFile(statement.getContainingFile())) { + return; + }*/ + final PsiCodeBlock finallyBlock = statement.getFinallyBlock(); + if (finallyBlock == null) { + return; + } + if (finallyBlock.getStatements().length != 0) { + return; + } + final PsiCodeBlock[] catchBlocks = statement.getCatchBlocks(); + final PsiElement[] children = statement.getChildren(); + for (final PsiElement child : children) { + final String childText = child.getText(); + if (PsiKeyword.FINALLY.equals(childText)) { + registerError(child, Integer.valueOf(catchBlocks.length)); + return; + } + } } - } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/EmptyTryBlockInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/EmptyTryBlockInspection.java index e858b46280..be10800380 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/EmptyTryBlockInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/EmptyTryBlockInspection.java @@ -21,46 +21,47 @@ 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 EmptyTryBlockInspection extends BaseInspection { + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.emptyTryBlockDisplayName(); + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.emptyTryBlockDisplayName().get(); - } - - public boolean isEnabledByDefault() { - return true; - } + public boolean isEnabledByDefault() { + return true; + } - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.emptyTryBlockProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.emptyTryBlockProblemDescriptor().get(); + } - public BaseInspectionVisitor buildVisitor() { - return new EmptyTryBlockVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new EmptyTryBlockVisitor(); + } - private static class EmptyTryBlockVisitor - extends BaseInspectionVisitor { + private static class EmptyTryBlockVisitor + extends BaseInspectionVisitor { - @Override - public void visitTryStatement(@Nonnull PsiTryStatement statement) { - super.visitTryStatement(statement); - /*if (JspPsiUtil.isInJspFile(statement.getContainingFile())) { - return; - } */ - final PsiCodeBlock finallyBlock = statement.getTryBlock(); - if (finallyBlock == null) { - return; - } - if (finallyBlock.getStatements().length != 0) { - return; - } - registerStatementError(statement); + @Override + public void visitTryStatement(@Nonnull PsiTryStatement statement) { + super.visitTryStatement(statement); + /*if (JspPsiUtil.isInJspFile(statement.getContainingFile())) { + return; + }*/ + final PsiCodeBlock finallyBlock = statement.getTryBlock(); + if (finallyBlock == null) { + return; + } + if (finallyBlock.getStatements().length != 0) { + return; + } + registerStatementError(statement); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/ErrorRethrownInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/ErrorRethrownInspection.java index d46bf9aaad..235a2d7038 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/ErrorRethrownInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/ErrorRethrownInspection.java @@ -25,88 +25,85 @@ import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.PsiElement; import consulo.language.psi.PsiReference; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl public class ErrorRethrownInspection extends BaseInspection { + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "ErrorNotRethrown"; + } - @Override - @Nonnull - public String getID() { - return "ErrorNotRethrown"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.errorRethrownDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.errorRethrownProblemDescriptor().get(); - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ErrorRethrownVisitor(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.errorRethrownDisplayName(); + } - private static class ErrorRethrownVisitor - extends BaseInspectionVisitor { + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.errorRethrownProblemDescriptor().get(); + } @Override - public void visitTryStatement(@Nonnull PsiTryStatement statement) { - super.visitTryStatement(statement); - final PsiCatchSection[] catchSections = - statement.getCatchSections(); - for (PsiCatchSection catchSection : catchSections) { - final PsiParameter parameter = catchSection.getParameter(); - final PsiCodeBlock catchBlock = catchSection.getCatchBlock(); - if (parameter != null && catchBlock != null) { - checkCatchBlock(parameter, catchBlock); - } - } + public BaseInspectionVisitor buildVisitor() { + return new ErrorRethrownVisitor(); } - private void checkCatchBlock(PsiParameter parameter, - PsiCodeBlock catchBlock) { - final PsiType type = parameter.getType(); - final PsiClass aClass = PsiUtil.resolveClassInType(type); - if (aClass == null) { - return; - } - if (!InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_ERROR)) { - return; - } - if (TypeUtils.typeEquals("java.lang.ThreadDeath", type)) { - return; - } - final PsiTypeElement typeElement = parameter.getTypeElement(); - final PsiStatement[] statements = catchBlock.getStatements(); - if (statements.length == 0) { - registerError(typeElement); - return; - } - final PsiStatement lastStatement = - statements[statements.length - 1]; - if (!(lastStatement instanceof PsiThrowStatement)) { - registerError(typeElement); - return; - } - final PsiThrowStatement throwStatement = - (PsiThrowStatement)lastStatement; - final PsiExpression exception = throwStatement.getException(); - if (!(exception instanceof PsiReferenceExpression)) { - registerError(typeElement); - return; - } - final PsiElement element = ((PsiReference)exception).resolve(); - if (parameter.equals(element)) { - return; - } - registerError(typeElement); + private static class ErrorRethrownVisitor extends BaseInspectionVisitor { + @Override + public void visitTryStatement(@Nonnull PsiTryStatement statement) { + super.visitTryStatement(statement); + final PsiCatchSection[] catchSections = statement.getCatchSections(); + for (PsiCatchSection catchSection : catchSections) { + final PsiParameter parameter = catchSection.getParameter(); + final PsiCodeBlock catchBlock = catchSection.getCatchBlock(); + if (parameter != null && catchBlock != null) { + checkCatchBlock(parameter, catchBlock); + } + } + } + + private void checkCatchBlock(PsiParameter parameter, PsiCodeBlock catchBlock) { + final PsiType type = parameter.getType(); + final PsiClass aClass = PsiUtil.resolveClassInType(type); + if (aClass == null) { + return; + } + if (!InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_ERROR)) { + return; + } + if (TypeUtils.typeEquals("java.lang.ThreadDeath", type)) { + return; + } + final PsiTypeElement typeElement = parameter.getTypeElement(); + final PsiStatement[] statements = catchBlock.getStatements(); + if (statements.length == 0) { + registerError(typeElement); + return; + } + final PsiStatement lastStatement = + statements[statements.length - 1]; + if (!(lastStatement instanceof PsiThrowStatement)) { + registerError(typeElement); + return; + } + final PsiThrowStatement throwStatement = (PsiThrowStatement) lastStatement; + final PsiExpression exception = throwStatement.getException(); + if (!(exception instanceof PsiReferenceExpression)) { + registerError(typeElement); + return; + } + final PsiElement element = ((PsiReference) exception).resolve(); + if (parameter.equals(element)) { + return; + } + registerError(typeElement); + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/ExceptionFromCatchWhichDoesntWrapInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/ExceptionFromCatchWhichDoesntWrapInspection.java index 451f808a1f..a12b43e1b4 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/ExceptionFromCatchWhichDoesntWrapInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/ExceptionFromCatchWhichDoesntWrapInspection.java @@ -28,8 +28,10 @@ import consulo.language.psi.PsiReference; import consulo.language.psi.search.ReferencesSearch; import consulo.language.psi.util.PsiTreeUtil; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; +import org.intellij.lang.annotations.Pattern; import org.jetbrains.annotations.NonNls; import javax.swing.*; @@ -38,168 +40,168 @@ @ExtensionImpl public class ExceptionFromCatchWhichDoesntWrapInspection extends BaseInspection { + @SuppressWarnings("PublicField") + public boolean ignoreGetMessage = false; - @SuppressWarnings("PublicField") - public boolean ignoreGetMessage = false; - - @SuppressWarnings("PublicField") - public boolean ignoreCantWrap = false; - - @Override - @Nonnull - public String getID() { - return "ThrowInsideCatchBlockWhichIgnoresCaughtException"; - } - - @Override - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.exceptionFromCatchWhichDoesntWrapDisplayName().get(); - } - - @Override - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.exceptionFromCatchWhichDoesntWrapProblemDescriptor().get(); - } - - @Override - @Nullable - public JComponent createOptionsPanel() { - final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); - panel.addCheckbox(InspectionGadgetsLocalize.exceptionFromCatchWhichDoesntwrapIgnoreOption().get(), "ignoreGetMessage"); - panel.addCheckbox(InspectionGadgetsLocalize.exceptionFromCatchWhichDoesntwrapIgnoreCantWrapOption().get(), "ignoreCantWrap"); - return panel; - } - - @Override - public BaseInspectionVisitor buildVisitor() { - return new ExceptionFromCatchWhichDoesntWrapVisitor(); - } - - private class ExceptionFromCatchWhichDoesntWrapVisitor extends BaseInspectionVisitor { + @SuppressWarnings("PublicField") + public boolean ignoreCantWrap = false; + @Nonnull @Override - public void visitThrowStatement(PsiThrowStatement statement) { - super.visitThrowStatement(statement); - final PsiCatchSection catchSection = PsiTreeUtil.getParentOfType(statement, PsiCatchSection.class, true, PsiClass.class); - if (catchSection == null) { - return; - } - final PsiParameter parameter = catchSection.getParameter(); - if (parameter == null) { - return; - } - @NonNls final String parameterName = parameter.getName(); - if ("ignore".equals(parameterName) || "ignored".equals(parameterName)) { - return; - } - final PsiExpression exception = statement.getException(); - if (exception == null) { - return; - } - if (ignoreCantWrap) { - final PsiType thrownType = exception.getType(); - if (thrownType instanceof PsiClassType) { - final PsiClassType classType = (PsiClassType)thrownType; - final PsiClass exceptionClass = classType.resolve(); - if (exceptionClass != null) { - final PsiMethod[] constructors = exceptionClass.getConstructors(); - final PsiClassType throwableType = TypeUtils.getType(CommonClassNames.JAVA_LANG_THROWABLE, statement); - boolean canWrap = false; - outer: - for (PsiMethod constructor : constructors) { - final PsiParameterList parameterList = constructor.getParameterList(); - final PsiParameter[] parameters = parameterList.getParameters(); - for (PsiParameter constructorParameter : parameters) { - final PsiType type = constructorParameter.getType(); - if (throwableType.equals(type)) { - canWrap = true; - break outer; + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "ThrowInsideCatchBlockWhichIgnoresCaughtException"; + } + + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.exceptionFromCatchWhichDoesntWrapDisplayName(); + } + + @Override + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.exceptionFromCatchWhichDoesntWrapProblemDescriptor().get(); + } + + @Override + @Nullable + public JComponent createOptionsPanel() { + final MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this); + panel.addCheckbox(InspectionGadgetsLocalize.exceptionFromCatchWhichDoesntwrapIgnoreOption().get(), "ignoreGetMessage"); + panel.addCheckbox(InspectionGadgetsLocalize.exceptionFromCatchWhichDoesntwrapIgnoreCantWrapOption().get(), "ignoreCantWrap"); + return panel; + } + + @Override + public BaseInspectionVisitor buildVisitor() { + return new ExceptionFromCatchWhichDoesntWrapVisitor(); + } + + private class ExceptionFromCatchWhichDoesntWrapVisitor extends BaseInspectionVisitor { + + @Override + public void visitThrowStatement(PsiThrowStatement statement) { + super.visitThrowStatement(statement); + final PsiCatchSection catchSection = PsiTreeUtil.getParentOfType(statement, PsiCatchSection.class, true, PsiClass.class); + if (catchSection == null) { + return; + } + final PsiParameter parameter = catchSection.getParameter(); + if (parameter == null) { + return; + } + @NonNls final String parameterName = parameter.getName(); + if ("ignore".equals(parameterName) || "ignored".equals(parameterName)) { + return; + } + final PsiExpression exception = statement.getException(); + if (exception == null) { + return; + } + if (ignoreCantWrap) { + final PsiType thrownType = exception.getType(); + if (thrownType instanceof PsiClassType) { + final PsiClassType classType = (PsiClassType) thrownType; + final PsiClass exceptionClass = classType.resolve(); + if (exceptionClass != null) { + final PsiMethod[] constructors = exceptionClass.getConstructors(); + final PsiClassType throwableType = TypeUtils.getType(CommonClassNames.JAVA_LANG_THROWABLE, statement); + boolean canWrap = false; + outer: + for (PsiMethod constructor : constructors) { + final PsiParameterList parameterList = constructor.getParameterList(); + final PsiParameter[] parameters = parameterList.getParameters(); + for (PsiParameter constructorParameter : parameters) { + final PsiType type = constructorParameter.getType(); + if (throwableType.equals(type)) { + canWrap = true; + break outer; + } + } + } + if (!canWrap) { + return; + } + } } - } } - if (!canWrap) { - return; + final ReferenceFinder visitor = new ReferenceFinder(parameter); + exception.accept(visitor); + if (visitor.usesParameter()) { + return; } - } + registerStatementError(statement); } - } - final ReferenceFinder visitor = new ReferenceFinder(parameter); - exception.accept(visitor); - if (visitor.usesParameter()) { - return; - } - registerStatementError(statement); } - } - private class ReferenceFinder extends JavaRecursiveElementVisitor { + private class ReferenceFinder extends JavaRecursiveElementVisitor { - private final Set visited = new HashSet(); - private boolean argumentsContainCatchParameter = false; - private final PsiParameter parameter; + private final Set visited = new HashSet(); + private boolean argumentsContainCatchParameter = false; + private final PsiParameter parameter; - public ReferenceFinder(PsiParameter parameter) { - this.parameter = parameter; - } + public ReferenceFinder(PsiParameter parameter) { + this.parameter = parameter; + } - @Override - public void visitReferenceExpression(PsiReferenceExpression expression) { - if (argumentsContainCatchParameter || !visited.add(expression)) { - return; - } - super.visitReferenceExpression(expression); - final PsiElement target = expression.resolve(); - if (!parameter.equals(target)) { - if (target instanceof PsiLocalVariable) { - final PsiLocalVariable variable = (PsiLocalVariable)target; - final Query query = ReferencesSearch.search(variable, variable.getUseScope(), false); - query.forEach(new Processor() { - @Override - public boolean process(PsiReference reference) { - final PsiElement element = reference.getElement(); - final PsiElement parent = PsiTreeUtil.skipParentsOfType(element, PsiParenthesizedExpression.class); - if (!(parent instanceof PsiReferenceExpression)) { - return true; - } - final PsiElement grandParent = parent.getParent(); - if (!(grandParent instanceof PsiMethodCallExpression)) { - return true; - } - final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)grandParent; - final PsiExpressionList argumentList = methodCallExpression.getArgumentList(); - final PsiExpression[] arguments = argumentList.getExpressions(); - for (PsiExpression argument : arguments) { - argument.accept(ReferenceFinder.this); - } - return true; + @Override + public void visitReferenceExpression(PsiReferenceExpression expression) { + if (argumentsContainCatchParameter || !visited.add(expression)) { + return; + } + super.visitReferenceExpression(expression); + final PsiElement target = expression.resolve(); + if (!parameter.equals(target)) { + if (target instanceof PsiLocalVariable) { + final PsiLocalVariable variable = (PsiLocalVariable) target; + final Query query = ReferencesSearch.search(variable, variable.getUseScope(), false); + query.forEach(new Processor() { + @Override + public boolean process(PsiReference reference) { + final PsiElement element = reference.getElement(); + final PsiElement parent = PsiTreeUtil.skipParentsOfType(element, PsiParenthesizedExpression.class); + if (!(parent instanceof PsiReferenceExpression)) { + return true; + } + final PsiElement grandParent = parent.getParent(); + if (!(grandParent instanceof PsiMethodCallExpression)) { + return true; + } + final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression) grandParent; + final PsiExpressionList argumentList = methodCallExpression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + for (PsiExpression argument : arguments) { + argument.accept(ReferenceFinder.this); + } + return true; + } + }); + final PsiExpression initializer = variable.getInitializer(); + if (initializer != null) { + initializer.accept(this); + } + } + return; + } + if (ignoreGetMessage) { + argumentsContainCatchParameter = true; + } + else { + final PsiElement parent = expression.getParent(); + if (parent instanceof PsiReferenceExpression) { + final PsiElement grandParent = parent.getParent(); + if (grandParent instanceof PsiMethodCallExpression) { + return; + } + } + argumentsContainCatchParameter = true; } - }); - final PsiExpression initializer = variable.getInitializer(); - if (initializer != null) { - initializer.accept(this); - } - } - return; - } - if (ignoreGetMessage) { - argumentsContainCatchParameter = true; - } - else { - final PsiElement parent = expression.getParent(); - if (parent instanceof PsiReferenceExpression) { - final PsiElement grandParent = parent.getParent(); - if (grandParent instanceof PsiMethodCallExpression) { - return; - } } - argumentsContainCatchParameter = true; - } - } - public boolean usesParameter() { - return argumentsContainCatchParameter; + public boolean usesParameter() { + return argumentsContainCatchParameter; + } } - } } \ No newline at end of file diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/FinallyBlockCannotCompleteNormallyInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/FinallyBlockCannotCompleteNormallyInspection.java index aeeb61b0e5..d4df5c2636 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/FinallyBlockCannotCompleteNormallyInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/errorhandling/FinallyBlockCannotCompleteNormallyInspection.java @@ -24,56 +24,59 @@ import com.siyeh.localize.InspectionGadgetsLocalize; import consulo.annotation.component.ExtensionImpl; import consulo.language.psi.PsiElement; +import consulo.localize.LocalizeValue; import jakarta.annotation.Nonnull; +import org.intellij.lang.annotations.Pattern; @ExtensionImpl -public class FinallyBlockCannotCompleteNormallyInspection - extends BaseInspection { - - @Nonnull - public String getID() { - return "finally"; - } +public class FinallyBlockCannotCompleteNormallyInspection extends BaseInspection { + @Nonnull + @Override + @Pattern(VALID_ID_PATTERN) + public String getID() { + return "finally"; + } - @Nonnull - public String getDisplayName() { - return InspectionGadgetsLocalize.finallyBlockCannotCompleteNormallyDisplayName().get(); - } + @Nonnull + @Override + public LocalizeValue getDisplayName() { + return InspectionGadgetsLocalize.finallyBlockCannotCompleteNormallyDisplayName(); + } - @Nonnull - protected String buildErrorString(Object... infos) { - return InspectionGadgetsLocalize.finallyBlockCannotCompleteNormallyProblemDescriptor().get(); - } + @Nonnull + protected String buildErrorString(Object... infos) { + return InspectionGadgetsLocalize.finallyBlockCannotCompleteNormallyProblemDescriptor().get(); + } - public boolean isEnabledByDefault() { - return true; - } + public boolean isEnabledByDefault() { + return true; + } - public BaseInspectionVisitor buildVisitor() { - return new FinallyBlockCannotCompleteNormallyVisitor(); - } + public BaseInspectionVisitor buildVisitor() { + return new FinallyBlockCannotCompleteNormallyVisitor(); + } - private static class FinallyBlockCannotCompleteNormallyVisitor - extends BaseInspectionVisitor { + private static class FinallyBlockCannotCompleteNormallyVisitor + extends BaseInspectionVisitor { - @Override - public void visitTryStatement(@Nonnull PsiTryStatement statement) { - super.visitTryStatement(statement); - final PsiCodeBlock finallyBlock = statement.getFinallyBlock(); - if (finallyBlock == null) { - return; - } - if (ControlFlowUtils.codeBlockMayCompleteNormally(finallyBlock)) { - return; - } - final PsiElement[] children = statement.getChildren(); - for (final PsiElement child : children) { - final String childText = child.getText(); - if (PsiKeyword.FINALLY.equals(childText)) { - registerError(child); - return; + @Override + public void visitTryStatement(@Nonnull PsiTryStatement statement) { + super.visitTryStatement(statement); + final PsiCodeBlock finallyBlock = statement.getFinallyBlock(); + if (finallyBlock == null) { + return; + } + if (ControlFlowUtils.codeBlockMayCompleteNormally(finallyBlock)) { + return; + } + final PsiElement[] children = statement.getChildren(); + for (final PsiElement child : children) { + final String childText = child.getText(); + if (PsiKeyword.FINALLY.equals(childText)) { + registerError(child); + return; + } + } } - } } - } } \ No newline at end of file