private static boolean isConcatenation(AssignmentExpressionTree tree) { if (tree.is(Tree.Kind.ASSIGNMENT)) { ExpressionTree expressionTree = ExpressionUtils.skipParentheses(tree.expression()); return expressionTree.is(Tree.Kind.PLUS) && concatenateVariable(tree.variable(), (BinaryExpressionTree) expressionTree); } return tree.is(Tree.Kind.PLUS_ASSIGNMENT); }
private static boolean isConcatenation(AssignmentExpressionTree tree) { if (tree.is(Tree.Kind.ASSIGNMENT)) { ExpressionTree expressionTree = ExpressionUtils.skipParentheses(tree.expression()); return expressionTree.is(Tree.Kind.PLUS) && concatenateVariable(tree.variable(), (BinaryExpressionTree) expressionTree); } return tree.is(Tree.Kind.PLUS_ASSIGNMENT); }
@Override public void visitAssignmentExpression(AssignmentExpressionTree tree) { ExpressionTree assign = tree.variable(); if (assign.is(Tree.Kind.IDENTIFIER)) { UpdateType type; if (tree.is(Tree.Kind.PLUS_ASSIGNMENT)) { // Will not work if the target is negative type = UpdateType.INCREMENT; } else if (tree.is(Tree.Kind.MINUS_ASSIGNMENT)) { // Will not work if the target is negative type = UpdateType.DECREMENT; } else { // Other assignments are to complex to decide between increment or decrement type = UpdateType.INDETERMINATE; } updates.add(new Update(((IdentifierTree) assign).symbol(), type)); } super.visitAssignmentExpression(tree); }
@Override public void visitAssignmentExpression(AssignmentExpressionTree tree) { ExpressionTree assign = tree.variable(); if (assign.is(Tree.Kind.IDENTIFIER)) { UpdateType type; if (tree.is(Tree.Kind.PLUS_ASSIGNMENT)) { // Will not work if the target is negative type = UpdateType.INCREMENT; } else if (tree.is(Tree.Kind.MINUS_ASSIGNMENT)) { // Will not work if the target is negative type = UpdateType.DECREMENT; } else { // Other assignments are to complex to decide between increment or decrement type = UpdateType.INDETERMINATE; } updates.add(new Update(((IdentifierTree) assign).symbol(), type)); } super.visitAssignmentExpression(tree); }
private void handleAssignment(Set<Symbol> out, Set<Tree> assignmentLHS, AssignmentExpressionTree element) { ExpressionTree lhs = ExpressionUtils.skipParentheses(element.variable()); if (lhs.is(Tree.Kind.IDENTIFIER)) { Symbol symbol = ((IdentifierTree) lhs).symbol(); if (isLocalVariable(symbol) && !out.contains(symbol) && (element.is(Tree.Kind.ASSIGNMENT) || isParentExpressionStatement(element))) { createIssue(element.operatorToken(), element.expression(), symbol); } assignmentLHS.add(lhs); if (element.is(Tree.Kind.ASSIGNMENT)) { out.remove(symbol); } else { out.add(symbol); } } }
private void handleAssignment(Set<Symbol> out, Set<Tree> assignmentLHS, AssignmentExpressionTree element) { ExpressionTree lhs = ExpressionUtils.skipParentheses(element.variable()); if (lhs.is(Tree.Kind.IDENTIFIER)) { Symbol symbol = ((IdentifierTree) lhs).symbol(); if (isLocalVariable(symbol) && !out.contains(symbol) && (element.is(Tree.Kind.ASSIGNMENT) || isParentExpressionStatement(element))) { createIssue(element.operatorToken(), element.expression(), symbol); } assignmentLHS.add(lhs); if (element.is(Tree.Kind.ASSIGNMENT)) { out.remove(symbol); } else { out.add(symbol); } } }
private boolean isConcatenation(AssignmentExpressionTree tree) { return tree.is(Tree.Kind.PLUS_ASSIGNMENT) || (tree.is(Tree.Kind.ASSIGNMENT) && removeParenthesis(tree.expression()).is(Tree.Kind.PLUS) && concatenateVariable(tree.variable(), (BinaryExpressionTree) removeParenthesis(tree.expression())) ); }
@Override public void visitAssignmentExpression(AssignmentExpressionTree aet) { if(aet.is(Tree.Kind.ASSIGNMENT)) { Type varType = aet.symbolType(); ExpressionTree expr = aet.expression(); checkExpression(varType, expr); } super.visitAssignmentExpression(aet); }
@Override public void visitAssignmentExpression(AssignmentExpressionTree aet) { if(aet.is(Tree.Kind.ASSIGNMENT)) { Type varType = aet.symbolType(); ExpressionTree expr = aet.expression(); checkExpression(varType, expr); } super.visitAssignmentExpression(aet); }
/** * In case of simple assignments, only the expression is evaluated, as we only use the reference to the variable to store the result. * For SE-Based checks, only a single value should be unstacked if its the case. For other cases, two values should be unstacked. * See JLS8-15.26 * * @param tree The assignment tree * @return true if the tree is a simple assignment * @see #extractIdentifier(AssignmentExpressionTree) */ public static boolean isSimpleAssignment(AssignmentExpressionTree tree) { if (!tree.is(Tree.Kind.ASSIGNMENT)) { // This can't possibly be a simple assignment. return false; } ExpressionTree variable = ExpressionUtils.skipParentheses(tree.variable()); return variable.is(Tree.Kind.IDENTIFIER) || isSelectOnThisOrSuper(tree); }
/** * In case of simple assignments, only the expression is evaluated, as we only use the reference to the variable to store the result. * For SE-Based checks, only a single value should be unstacked if its the case. For other cases, two values should be unstacked. * See JLS8-15.26 * * @param tree The assignment tree * @return true if the tree is a simple assignment * @see #extractIdentifier(AssignmentExpressionTree) */ public static boolean isSimpleAssignment(AssignmentExpressionTree tree) { if (!tree.is(Tree.Kind.ASSIGNMENT)) { // This can't possibly be a simple assignment. return false; } ExpressionTree variable = ExpressionUtils.skipParentheses(tree.variable()); return variable.is(Tree.Kind.IDENTIFIER) || isSelectOnThisOrSuper(tree); }
private void executeAssignement(AssignmentExpressionTree tree) { ExpressionTree variable = tree.variable(); if (variable.is(Tree.Kind.IDENTIFIER)) { // FIXME restricted to identifiers for now. ProgramState.Pop unstack = programState.unstackValue(2); SymbolicValue value = tree.is(Tree.Kind.ASSIGNMENT) ? unstack.values.get(1) : constraintManager.createSymbolicValue(tree); programState = unstack.state; programState = programState.put(((IdentifierTree) variable).symbol(), value); programState = programState.stackValue(value); } }
@Override public void visitAssignmentExpression(AssignmentExpressionTree tree) { //Check only = kind of assignements (not +=, *=, etc.) if (tree.is(Tree.Kind.ASSIGNMENT) && SyntacticEquivalence.areEquivalent(tree.expression(), tree.variable())) { context.addIssue(tree, this, "Remove or correct this useless self-assignment"); } super.visitAssignmentExpression(tree); } }
private void executeAssignment(AssignmentExpressionTree tree) { ProgramState.Pop unstack; SymbolicValue value; if (tree.is(Tree.Kind.ASSIGNMENT)) { unstack = ExpressionUtils.isSimpleAssignment(tree) ? programState.unstackValue(1) : programState.unstackValue(2); value = unstack.values.get(0); } else { unstack = programState.unstackValue(2); value = constraintManager.createSymbolicValue(tree); } programState = unstack.state; Symbol symbol = null; if (tree.variable().is(Tree.Kind.IDENTIFIER) || ExpressionUtils.isSelectOnThisOrSuper(tree)) { symbol = ExpressionUtils.extractIdentifier(tree).symbol(); programState = programState.put(symbol, value); } programState = programState.stackValue(value, symbol); }
private void executeAssignment(AssignmentExpressionTree tree) { ProgramState.Pop unstack; SymbolicValue value; if (tree.is(Tree.Kind.ASSIGNMENT)) { unstack = ExpressionUtils.isSimpleAssignment(tree) ? programState.unstackValue(1) : programState.unstackValue(2); value = unstack.values.get(0); } else { unstack = programState.unstackValue(2); value = constraintManager.createSymbolicValue(tree); } programState = unstack.state; Symbol symbol = null; if (tree.variable().is(Tree.Kind.IDENTIFIER) || ExpressionUtils.isSelectOnThisOrSuper(tree)) { symbol = ExpressionUtils.extractIdentifier(tree).symbol(); programState = programState.put(symbol, value); } programState = programState.stackValue(value, symbol); }