private static boolean isTruthyLiteral(Tree tree, boolean isTruthy) { ExpressionTree conditionWithoutParentheses = CheckUtils.removeParenthesis((ExpressionTree) tree); return isTruthy && conditionWithoutParentheses.is( Kind.ARRAY_LITERAL, Kind.OBJECT_LITERAL, Kind.NEW_EXPRESSION, Kind.NUMERIC_LITERAL, Kind.STRING_LITERAL); }
public static ExpressionTree removeParenthesis(ExpressionTree expressionTree) { if (expressionTree.is(Tree.Kind.PARENTHESISED_EXPRESSION)) { return removeParenthesis(((ParenthesisedExpressionTree) expressionTree).expression()); } return expressionTree; }
private static boolean isIIFE(ExpressionTree expression) { if (expression.is(Kind.CALL_EXPRESSION)) { CallExpressionTree callExpressionTree = (CallExpressionTree) expression; ExpressionTree callee = CheckUtils.removeParenthesis(callExpressionTree.callee()); return callee.is(Kind.FUNCTION_EXPRESSION, Kind.ARROW_FUNCTION); } else if (expression.is(Kind.LOGICAL_COMPLEMENT)) { ExpressionTree operand = ((UnaryExpressionTree) expression).expression(); return isIIFE(CheckUtils.removeParenthesis(operand)); } return false; }
@Override public void visitNode(Tree tree) { UnaryExpressionTree voidExpression = (UnaryExpressionTree) tree; ExpressionTree operand = CheckUtils.removeParenthesis(voidExpression.expression()); if (!isZero(operand)) { addIssue(voidExpression.operatorToken(), MESSAGE); } }
@Override public void visitBinaryExpression(BinaryExpressionTree tree) { if (isAndWithEqualToNull(tree) || isOrWithNonEqualToNull(tree)) { BinaryExpressionTree leftOperand = (BinaryExpressionTree) CheckUtils.removeParenthesis(tree.leftOperand()); ExpressionTree expression = CheckUtils.removeParenthesis(getNonNullLiteralOperand(leftOperand)); tree.rightOperand().accept(new NullExpressionUsageVisitor(expression, this)); } super.visitBinaryExpression(tree); }
private static String getCalleeName(CallExpressionTree callExpression) { ExpressionTree callee = CheckUtils.removeParenthesis(callExpression.callee()); if (callee.is(Kind.DOT_MEMBER_EXPRESSION)) { return ((DotMemberExpressionTree) callee).property().name(); } else { return CheckUtils.asString(callee); } }
private static boolean isNullComparison(ExpressionTree expression, Tree.Kind kind1, Tree.Kind kind2) { ExpressionTree tree = CheckUtils.removeParenthesis(expression); if (tree.is(kind1, kind2)) { BinaryExpressionTree binaryExp = (BinaryExpressionTree) tree; return isNullOrUndefined(binaryExp.leftOperand()) || isNullOrUndefined(binaryExp.rightOperand()); } return false; }
@Override public void visitUnaryExpression(UnaryExpressionTree tree) { ExpressionTree argument = CheckUtils.removeParenthesis(tree.expression()); if (tree.is(Tree.Kind.DELETE) && !isMemberAccess(argument) && !isGlobalProperty(argument)) { addIssue(tree, MESSAGE); } super.visitUnaryExpression(tree); }
private static boolean isBasicValue(ExpressionTree expression) { if (expression.is(Kind.BOOLEAN_LITERAL, Kind.NUMERIC_LITERAL, Kind.STRING_LITERAL, Kind.NULL_LITERAL)) { return BASIC_LITERAL_VALUES.contains(((LiteralTree) expression).value()); } else if (expression.is(Kind.UNARY_MINUS)) { ExpressionTree operand = ((UnaryExpressionTree) expression).expression(); return BASIC_LITERAL_VALUES.contains("-" + ((LiteralTree) operand).value()); } else if (expression.is(Kind.ARRAY_LITERAL)) { return ((ArrayLiteralTree) expression).elements().isEmpty(); } else if (expression.is(Kind.OBJECT_LITERAL)) { return ((ObjectLiteralTree) expression).properties().isEmpty(); } else if (expression.is(Kind.IDENTIFIER_REFERENCE)) { return ((IdentifierTree) expression).name().equals("undefined"); } ExpressionTree withoutParenthesis = CheckUtils.removeParenthesis(expression); if (withoutParenthesis.is(Kind.VOID)) { ExpressionTree operand = ((UnaryExpressionTree) withoutParenthesis).expression(); return operand.is(Kind.NUMERIC_LITERAL) && "0".equals(((LiteralTree) operand).value()); } return false; }
@Override public void visitExpressionStatement(ExpressionStatementTree tree) { ExpressionTree expression = CheckUtils.removeParenthesis(tree.expression()); if (expression.is(Kind.STRING_LITERAL)) { if (!isDirective((LiteralTree) expression)) { addIssue(tree, MESSAGE); } } else if (!expression.is(KINDS_WITH_SIDE_EFFECTS) && !isIIFE(expression) && !insideTry(tree)) { addIssue(tree, MESSAGE); } super.visitExpressionStatement(tree); }
@Override public void visitNewExpression(NewExpressionTree tree) { ExpressionTree expression = tree.expression(); if (!expression.types().isEmpty() && !isConstructor(expression.types())) { Tree primaryLocationTree = expression; String expressionStr = CheckUtils.asString(expression); ExpressionTree unwrapped = CheckUtils.removeParenthesis(expression); if (unwrapped.is(Tree.Kind.FUNCTION_EXPRESSION)) { primaryLocationTree = ((FunctionExpressionTree) unwrapped).functionKeyword(); expressionStr = "this function"; } addIssue(primaryLocationTree, String.format(MESSAGE, expressionStr)) .secondary(tree.newKeyword()); } super.visitNewExpression(tree); }