private static boolean isLengthOrSizeProperty(DotMemberExpressionTree memberExpressionTree) { String name = memberExpressionTree.property().name(); return "length".equals(name) || "size".equals(name); }
private void checkArgumentToBeFunctionWithReturn(DotMemberExpressionTree callee, int argumentIndex, ProgramState currentState) { Tree parent = callee.parent(); if (parent.is(Kind.CALL_EXPRESSION)) { CallExpressionTree callExpressionTree = (CallExpressionTree) parent; if (callExpressionTree.argumentClause().arguments().size() > argumentIndex) { Tree argument = callExpressionTree.argumentClause().arguments().get(argumentIndex); if (argument.is(Kind.FUNCTION_EXPRESSION, Kind.ARROW_FUNCTION) && !hasReturnWithValue((FunctionTree)argument) && !isAsyncFunction((FunctionTree) argument)) { addUniqueIssue(functionToken((FunctionTree) argument), MESSAGE); } else if (argument.is(Kind.IDENTIFIER_REFERENCE)) { checkArgumentIdentifier((IdentifierTree) argument, currentState); } } } }
private static boolean isArrayFromMethod(DotMemberExpressionTree memberExpression, ProgramState currentState) { SymbolicValue symbolicValue = currentState.peekStack(); return symbolicValue.equals(BuiltInObjectSymbolicValue.ARRAY) && "from".equals(memberExpression.property().name()); } }
@Override public void beforeBlockElement(ProgramState currentState, Tree element, ProgramPoint programPoint) { if (isUndefinedProperty(currentState, element, programPoint)) { IdentifierTree propertyTree = ((DotMemberExpressionTree) element).property(); addUniqueIssue(element, String.format(MESSAGE, propertyTree.name(), getTypeOfObject(currentState))); } }
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); } }
@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); } } }
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 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); } }
@Override public void visitMemberExpression(MemberExpressionTree tree) { if (tree.is(Tree.Kind.DOT_MEMBER_EXPRESSION)) { DotMemberExpressionTree dme = (DotMemberExpressionTree) tree; String obj = getObjectName(dme); String method = dme.property().name(); if (OBJECTS.contains(obj) && API_CALLS.contains(method)) { saveDebtLocation(tree, obj); } } else if (tree.is(Tree.Kind.BRACKET_MEMBER_EXPRESSION)) { String obj = getObjectName(tree); if (OBJECTS.contains(obj)) { saveDebtLocation(tree, obj); } } super.visitMemberExpression(tree); }
@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 isModelExtendMethod(ExpressionTree tree) { if (tree.is(Tree.Kind.DOT_MEMBER_EXPRESSION)) { DotMemberExpressionTree expr = (DotMemberExpressionTree) tree; if ("extend".equals(expr.property().name())) { if (expr.object().types().contains(Type.Kind.BACKBONE_MODEL)){ return true; } if (expr.object().is(Tree.Kind.DOT_MEMBER_EXPRESSION)) { DotMemberExpressionTree subExpr = (DotMemberExpressionTree) expr.object(); return Utils.identifierWithName(subExpr.object(), "Backbone") && "Model".equals(subExpr.property().name()); } } } return false; }
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 String getObjectName(MemberExpressionTree dme) { if (dme.object().is(Tree.Kind.DOT_MEMBER_EXPRESSION)) { DotMemberExpressionTree d2 = (DotMemberExpressionTree) dme.object(); return d2.property().name(); } else { return CheckUtils.asString(dme.object()); } }