private static boolean isArrayFromMethod(DotMemberExpressionTree memberExpression, ProgramState currentState) { SymbolicValue symbolicValue = currentState.peekStack(); return symbolicValue.equals(BuiltInObjectSymbolicValue.ARRAY) && "from".equals(memberExpression.property().name()); } }
private void checkExpression(DotMemberExpressionTree expression) { if (!expression.object().is(Kind.IDENTIFIER_REFERENCE) || !expression.property().is(Kind.PROPERTY_IDENTIFIER)) { return; } String object = ((IdentifierTree) expression.object()).name(); String property = (expression.property()).name(); if (ARGUMENTS.equals(object)) { checkArgumentsProperty(expression, property); } else if (scope.contains(object)) { checkFunctionsProperty(expression, object, property); } }
private void checkExpression(DotMemberExpressionTree expression) { if (!expression.object().is(Kind.IDENTIFIER_REFERENCE) || !expression.property().is(Kind.IDENTIFIER_NAME)) { return; } String object = ((IdentifierTree) expression.object()).name(); String property = (expression.property()).name(); if (ARGUMENTS.equals(object)) { checkArgumentsProperty(expression, property); } else if (scope.contains(object)) { checkFunctionsProperty(expression, object, property); } }
private static boolean isBackboneSetMethod(DotMemberExpressionTree dotExpr) { return CheckUtils.asString(dotExpr.property()).equals(SET) && dotExpr.object().types().contains(Type.Kind.BACKBONE_MODEL_OBJECT); }
private static boolean isChangedPropertyAccess(DotMemberExpressionTree tree) { return tree.property().name().equals(CHANGED) && tree.object().types().contains(Type.Kind.BACKBONE_MODEL_OBJECT); }
@Override public void beforeBlockElement(ProgramState currentState, Tree element, ProgramPoint programPoint) { if (element.is(Kind.DOT_MEMBER_EXPRESSION)) { DotMemberExpressionTree memberExpression = (DotMemberExpressionTree) element; if (isArrayPropertyExecuted(currentState) && METHODS_WITH_CALLBACK.contains(memberExpression.property().name())) { checkArgumentToBeFunctionWithReturn(memberExpression, 0, currentState); } else if (isArrayFromMethod(memberExpression, currentState)) { checkArgumentToBeFunctionWithReturn(memberExpression, 1, currentState); } } }
@Override public void visitNode(Tree tree) { Tree expression = ((ExpressionStatementTree) tree).expression(); if (expression.is(Kind.CALL_EXPRESSION)) { ExpressionTree callee = ((CallExpressionTree) expression).callee(); if (callee.is(Kind.DOT_MEMBER_EXPRESSION)) { DotMemberExpressionTree memberExpression = (DotMemberExpressionTree) callee; if (memberExpression.object().types().containsOnly(Type.Kind.STRING) && !isReplaceExclusion(memberExpression.property(), ((CallExpressionTree) expression).argumentClause())) { addIssue(memberExpression.property(), String.format(MESSAGE, getVariable(memberExpression))); } } } }
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 void checkSelectorProperty(ExpressionTree expressionTree, List<String> deprecated, String parentheses) { if (expressionTree.is(Tree.Kind.DOT_MEMBER_EXPRESSION)) { ExpressionTree object = ((DotMemberExpressionTree) expressionTree).object(); IdentifierTree property = ((DotMemberExpressionTree) expressionTree).property(); if (object.types().contains(ObjectType.FrameworkType.JQUERY_SELECTOR_OBJECT) && propertyIsDeprecated(property, deprecated)) { addIssue(property, String.format(MESSAGE, property.name() + parentheses)); } } }
@Override public void visitCallExpression(CallExpressionTree tree) { if (tree.callee().is(Tree.Kind.DOT_MEMBER_EXPRESSION)){ DotMemberExpressionTree callee = (DotMemberExpressionTree) tree.callee(); boolean isWindow = callee.object().types().contains(Type.Kind.WINDOW) || hasWindowLikeName(callee.object()); if (isWindow && CheckUtils.asString(callee.property()).equals(POST_MESSAGE)){ getContext().addIssue(this, callee.property(), MESSAGE); } } super.visitCallExpression(tree); }
private void checkJQueryProperty(ExpressionTree expressionTree, List<String> deprecated, String parentheses) { if (expressionTree.is(Tree.Kind.DOT_MEMBER_EXPRESSION)) { ExpressionTree object = ((DotMemberExpressionTree) expressionTree).object(); IdentifierTree property = ((DotMemberExpressionTree) expressionTree).property(); if (object.types().contains(ObjectType.FrameworkType.JQUERY_OBJECT) && propertyIsDeprecated(property, deprecated)) { addIssue(property, String.format(MESSAGE, property.name() + parentheses)); } } }
@Override public void visitAssignmentExpression(AssignmentExpressionTree tree) { ExpressionTree variable = tree.variable(); if (variable.is(Tree.Kind.DOT_MEMBER_EXPRESSION) && isChangedPropertyAccess((DotMemberExpressionTree) variable)) { addIssue(((DotMemberExpressionTree) variable).property(), MESSAGE); } super.visitAssignmentExpression(tree); }
private static boolean isIndexOfCall(ExpressionTree expression) { if (expression.is(Kind.CALL_EXPRESSION)) { CallExpressionTree callExpr = (CallExpressionTree) expression; if (callExpr.arguments().parameters().size() == 1 && callExpr.callee().is(Kind.DOT_MEMBER_EXPRESSION)) { DotMemberExpressionTree memberExpr = (DotMemberExpressionTree) ((CallExpressionTree) expression).callee(); return "indexOf".equals(memberExpr.property().name()); } } return false; }
private static boolean isIndexOfCall(ExpressionTree expression) { if (expression.is(Kind.CALL_EXPRESSION)) { CallExpressionTree callExpr = (CallExpressionTree) expression; if (callExpr.argumentClause().arguments().size() == 1 && callExpr.callee().is(Kind.DOT_MEMBER_EXPRESSION)) { DotMemberExpressionTree memberExpr = (DotMemberExpressionTree) ((CallExpressionTree) expression).callee(); return "indexOf".equals(memberExpr.property().name()); } } return false; }
private static boolean sameValue(IdentifierTree variable, ExpressionTree expression) { if (SyntacticEquivalence.areEquivalent(variable, expression)) { return true; } if (expression.is(Kind.CALL_EXPRESSION) && ((CallExpressionTree) expression).callee().is(Kind.DOT_MEMBER_EXPRESSION)) { DotMemberExpressionTree callee = (DotMemberExpressionTree) ((CallExpressionTree) expression).callee(); String method = callee.property().name(); return sameValue(variable, callee.object()) && METHODS_WITH_SIDE_EFFECTS.contains(method); } return false; } }
private void checkJQueryProperty(ExpressionTree expressionTree, List<String> deprecated, String parentheses) { if (expressionTree.is(Tree.Kind.DOT_MEMBER_EXPRESSION)){ ExpressionTree object = ((DotMemberExpressionTree) expressionTree).object(); IdentifierTree property = ((DotMemberExpressionTree) expressionTree).property(); if (object.types().contains(ObjectType.FrameworkType.JQUERY_OBJECT) && propertyIsDeprecated(property, deprecated)){ getContext().addIssue(this, property, String.format(MESSAGE, property.name() + parentheses)); } } }
private void checkSelectorProperty(ExpressionTree expressionTree, List<String> deprecated, String parentheses) { if (expressionTree.is(Tree.Kind.DOT_MEMBER_EXPRESSION)){ ExpressionTree object = ((DotMemberExpressionTree) expressionTree).object(); IdentifierTree property = ((DotMemberExpressionTree) expressionTree).property(); if (object.types().contains(ObjectType.FrameworkType.JQUERY_SELECTOR_OBJECT) && propertyIsDeprecated(property, deprecated)){ getContext().addIssue(this, property, String.format(MESSAGE, property.name() + parentheses)); } } }
public static boolean isElementList(ExpressionTree tree) { if (tree.is(Tree.Kind.CALL_EXPRESSION) && ((CallExpressionTree) tree).callee().is(Tree.Kind.DOT_MEMBER_EXPRESSION)) { DotMemberExpressionTree callee = (DotMemberExpressionTree) ((CallExpressionTree) tree).callee(); if (callee.object().types().contains(Type.Kind.DOCUMENT) && DOCUMENT_METHODS_TO_GET_ELEMENTS.contains(callee.property().name())) { return true; } } return false; }
private static boolean isAllowedCallback(FunctionTree functionTree) { Tree parent = functionTree.parent(); if (parent.is(Kind.ARGUMENT_LIST) && parent.parent().is(Kind.CALL_EXPRESSION)) { CallExpressionTree callExpression = (CallExpressionTree) parent.parent(); if (callExpression.callee().is(Kind.DOT_MEMBER_EXPRESSION)) { String calledMethod = ((DotMemberExpressionTree) callExpression.callee()).property().name(); return ALLOWED_CALLBACKS.contains(calledMethod); } } return false; }
protected boolean isSelectorObject(ExpressionTree expressionTree) { if (isDirectJQuerySelectorObject(expressionTree)){ return true; } if (expressionTree.is(Tree.Kind.CALL_EXPRESSION) && ((CallExpressionTree)expressionTree).callee().is(Tree.Kind.DOT_MEMBER_EXPRESSION)){ DotMemberExpressionTree callee = (DotMemberExpressionTree) ((CallExpressionTree)expressionTree).callee(); return isSelectorObject(callee.object()) && isJQuerySelectorMethod(callee.property()); } return false; }