From 670c4f4ac0ae2ddba4a58cf89fdd906676300a97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=BE=E5=80=99?= Date: Thu, 5 Dec 2019 10:28:43 +0800 Subject: [PATCH] fix https://github.com/alibaba/p3c/issues/209 --- .../rule/oop/WrapperTypeEqualityRule.java | 15 +- .../rule/oop/xml/WrapperTypeEqualityRule.xml | 320 ++++++++++-------- 2 files changed, 185 insertions(+), 150 deletions(-) diff --git a/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/oop/WrapperTypeEqualityRule.java b/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/oop/WrapperTypeEqualityRule.java index 6a262d7..1936940 100644 --- a/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/oop/WrapperTypeEqualityRule.java +++ b/p3c-pmd/src/main/java/com/alibaba/p3c/pmd/lang/java/rule/oop/WrapperTypeEqualityRule.java @@ -45,8 +45,14 @@ public class WrapperTypeEqualityRule extends AbstractAliRule { // possible elements around "==" are PrimaryExpression or UnaryExpression(e.g. a == -2) List expressions = node.findChildrenOfType(ASTPrimaryExpression.class); if (expressions.size() == NumberConstants.INTEGER_SIZE_OR_LENGTH_2) { - if (NodeUtils.isWrapperType(expressions.get(0)) && - NodeUtils.isWrapperType(expressions.get(1))) { + // PMD can not resolve array length type, but only the + ASTPrimaryExpression left = expressions.get(0); + ASTPrimaryExpression right = expressions.get(1); + + boolean bothArrayLength = isArrayLength(left) && isArrayLength(right); + boolean bothWrapperType = NodeUtils.isWrapperType(left) && NodeUtils.isWrapperType(right); + + if (!bothArrayLength && bothWrapperType) { addViolationWithMessage(data, node, "java.oop.WrapperTypeEqualityRule.violation.msg"); } } @@ -54,4 +60,9 @@ public class WrapperTypeEqualityRule extends AbstractAliRule { return super.visit(node, data); } + private boolean isArrayLength(ASTPrimaryExpression expression) { + // assume expression like "x.length" is the length of array, field with name "length" may result in misrecognition + return "length".equals(expression.jjtGetLastToken().getImage()) + && ".".equals(expression.jjtGetFirstToken().getNext().getImage()); + } } diff --git a/p3c-pmd/src/test/resources/com/alibaba/p3c/pmd/lang/java/rule/oop/xml/WrapperTypeEqualityRule.xml b/p3c-pmd/src/test/resources/com/alibaba/p3c/pmd/lang/java/rule/oop/xml/WrapperTypeEqualityRule.xml index 5c1a2bc..08d65da 100644 --- a/p3c-pmd/src/test/resources/com/alibaba/p3c/pmd/lang/java/rule/oop/xml/WrapperTypeEqualityRule.xml +++ b/p3c-pmd/src/test/resources/com/alibaba/p3c/pmd/lang/java/rule/oop/xml/WrapperTypeEqualityRule.xml @@ -3,151 +3,175 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sourceforge.net/rule-tests https://pmd.sourceforge.io/rule-tests_1_0_0.xsd"> - - - - - compare wrapper type objects without equals - 4 - 11,23,31,34 - - - - - - - importedExecutorsMethods = new HashSet<>(); - - @Override - public Object visit(ASTPrimaryExpression node, Object data) { - if (!executorsUsed && importedExecutorsMethods.isEmpty()) { - return super.visit(node, data); - } - - Token initToken = (Token) node.jjtGetFirstToken(); - if (!checkInitStatement(initToken)) { - addViolation(data, node); - } - return super.visit(node, data); - } - - private boolean checkInitStatement(Token token) { - String fullAssignStatement = getFullAssignStatement(token); - if (fullAssignStatement.startsWith(EXECUTORS_NEW)) { - return false; - } - if (!fullAssignStatement.startsWith(NEW) && !fullAssignStatement.startsWith(FULL_EXECUTORS_NEW)) { - return true; - } - // in case of lambda - int index = fullAssignStatement.indexOf(BRACKETS); - if (index == -1) { - return true; - } - fullAssignStatement = fullAssignStatement.substring(0, index); - - // avoid java.util.concurrent.Executors.newxxxx - if (importedExecutorsMethods.contains(fullAssignStatement)) { - return false; - } - // static import - return !importedExecutorsMethods.contains(Executors.class.getName() + DOT + fullAssignStatement); - } - - private String getFullAssignStatement(final Token token) { - if (token == null) { - return ""; - } - StringBuilder sb = new StringBuilder(48); - Token next = token; - while (next.next != null && !COLON.equals(next.image)) { - sb.append(next.image); - next = next.next; - } - return sb.toString(); - } - - @Override - public Object visit(ASTImportDeclaration node, Object data) { - ASTName name = node.getFirstChildOfType(ASTName.class); - // in case of static import - executorsUsed = executorsUsed || name.getType() == Executors.class; - if (name.getImage().startsWith(Executors.class.getName() + DOT)) { - importedExecutorsMethods.add(name.getImage()); - } - return super.visit(node, data); - } - } - ]]> - - - bugfix - 0 - - - + + + + + compare wrapper type objects without equals + 4 + 11,23,31,34 + + + + + + + importedExecutorsMethods = new HashSet<>(); + + @Override + public Object visit(ASTPrimaryExpression node, Object data) { + if (!executorsUsed && importedExecutorsMethods.isEmpty()) { + return super.visit(node, data); + } + + Token initToken = (Token) node.jjtGetFirstToken(); + if (!checkInitStatement(initToken)) { + addViolation(data, node); + } + return super.visit(node, data); + } + + private boolean checkInitStatement(Token token) { + String fullAssignStatement = getFullAssignStatement(token); + if (fullAssignStatement.startsWith(EXECUTORS_NEW)) { + return false; + } + if (!fullAssignStatement.startsWith(NEW) && !fullAssignStatement.startsWith(FULL_EXECUTORS_NEW)) { + return true; + } + // in case of lambda + int index = fullAssignStatement.indexOf(BRACKETS); + if (index == -1) { + return true; + } + fullAssignStatement = fullAssignStatement.substring(0, index); + + // avoid java.util.concurrent.Executors.newxxxx + if (importedExecutorsMethods.contains(fullAssignStatement)) { + return false; + } + // static import + return !importedExecutorsMethods.contains(Executors.class.getName() + DOT + fullAssignStatement); + } + + private String getFullAssignStatement(final Token token) { + if (token == null) { + return ""; + } + StringBuilder sb = new StringBuilder(48); + Token next = token; + while (next.next != null && !COLON.equals(next.image)) { + sb.append(next.image); + next = next.next; + } + return sb.toString(); + } + + @Override + public Object visit(ASTImportDeclaration node, Object data) { + ASTName name = node.getFirstChildOfType(ASTName.class); + // in case of static import + executorsUsed = executorsUsed || name.getType() == Executors.class; + if (name.getImage().startsWith(Executors.class.getName() + DOT)) { + importedExecutorsMethods.add(name.getImage()); + } + return super.visit(node, data); + } + } + ]]> + + + bugfix + 0 + + + + + + + + + + array length equals + 0 + + + + + + \ No newline at end of file -- GitLab