diff options
Diffstat (limited to 'org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/VariableAssignmentVisitor.java')
-rw-r--r-- | org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/VariableAssignmentVisitor.java | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/VariableAssignmentVisitor.java b/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/VariableAssignmentVisitor.java index ebe4ce4..2530210 100644 --- a/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/VariableAssignmentVisitor.java +++ b/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/VariableAssignmentVisitor.java @@ -4,8 +4,14 @@ import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTExpression; +import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTInitializer; +import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression; +import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression; +import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IVariable; /******************************************************************************* * Copyright (c) 2009 Elliott Baron @@ -31,7 +37,11 @@ public class VariableAssignmentVisitor extends ASTVisitor { public int visit(IASTInitializer initializer) { IASTNode parent = initializer.getParent(); if (parent instanceof IASTDeclarator) { - es.addClause(new ExecutionStateClause(parent)); + if (initializer instanceof IASTInitializerExpression) { + IASTDeclarator decl = (IASTDeclarator) parent; + IASTExpression expr = ((IASTInitializerExpression) initializer).getExpression(); + parseAssignment(parent, decl.getName(), expr); + } return PROCESS_SKIP; } return PROCESS_CONTINUE; @@ -44,13 +54,43 @@ public class VariableAssignmentVisitor extends ASTVisitor { int op = binExpr.getOperator(); // Check operator is an assignment operator - if (op >= IASTBinaryExpression.op_assign - && op <= IASTBinaryExpression.op_binaryOrAssign) { - es.addClause(new ExecutionStateClause(binExpr)); + if (op == IASTBinaryExpression.op_assign) { // FIXME other ops + IASTExpression o1 = binExpr.getOperand1(); + if (o1 instanceof IASTIdExpression) { + IASTName name = ((IASTIdExpression) o1).getName(); + parseAssignment(binExpr, name, binExpr.getOperand2()); + } return PROCESS_SKIP; } } return PROCESS_CONTINUE; } + private void parseAssignment(IASTNode parent, IASTName name, IASTExpression valueExpr) { + IBinding binding = name.resolveBinding(); + if (binding instanceof IVariable) { + IVariable var = (IVariable) binding; + Boolean truth = getTruthValue(valueExpr); + if (truth != null) { + es.addTruthAssignment(var, truth); + } + } + } + + private Boolean getTruthValue(IASTExpression valueExpr) { + Boolean result = null; + // Handle assignment from literals + if (valueExpr instanceof IASTLiteralExpression) { + int kind = ((IASTLiteralExpression) valueExpr).getKind(); + String value = String.valueOf(((IASTLiteralExpression) valueExpr).getValue()); + switch (kind) { + case IASTLiteralExpression.lk_integer_constant: + // 0 = False, > 0 = True + result = !value.equals("0"); + } + } + // TODO other variable assignments + return result; + } + } |