summaryrefslogtreecommitdiffstats
path: root/org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/VariableAssignmentVisitor.java
diff options
context:
space:
mode:
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.java48
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;
+ }
+
}