summaryrefslogtreecommitdiff
path: root/src/ast
diff options
context:
space:
mode:
authorTuowen Zhao <ztuowen@gmail.com>2016-10-06 16:07:35 -0600
committerTuowen Zhao <ztuowen@gmail.com>2016-10-06 16:07:35 -0600
commitf329ee2b4cfdde656d2fe30f2a2789d8a3774203 (patch)
treeea000895ad943188ebdded11f4311b4e1cf011bb /src/ast
parentb7a50e256d0ac6ec120050173b37f34d434ef325 (diff)
downloadchill-f329ee2b4cfdde656d2fe30f2a2789d8a3774203.tar.gz
chill-f329ee2b4cfdde656d2fe30f2a2789d8a3774203.tar.bz2
chill-f329ee2b4cfdde656d2fe30f2a2789d8a3774203.zip
cleanup
Diffstat (limited to 'src/ast')
-rw-r--r--src/ast/node.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/ast/node.cpp b/src/ast/node.cpp
index c8a3c08..6117f91 100644
--- a/src/ast/node.cpp
+++ b/src/ast/node.cpp
@@ -364,3 +364,26 @@ chillAST_Node* chillAST_Node::findContainingStmt() {
return p->findContainingStmt();
}
+chillAST_Node *chillAST_Node::getEnclosingStatement(int level) { // TODO do for subclasses?
+ if (isArraySubscriptExpr()) return parent->getEnclosingStatement(level + 1);
+
+ if (level != 0) {
+ if (isBinaryOperator() ||
+ isUnaryOperator() ||
+ isTernaryOperator() ||
+ isReturnStmt() ||
+ isCallExpr()
+ )
+ return this;
+ // things that are not endpoints. recurse through parent
+ if (isMemberExpr()) return parent->getEnclosingStatement(level + 1);
+ if (isImplicitCastExpr()) return parent->getEnclosingStatement(level + 1);
+ if (isSizeof()) return parent->getEnclosingStatement(level + 1);
+ if (isCStyleCastExpr()) return parent->getEnclosingStatement(level + 1);
+ return NULL;
+ }
+ CHILL_ERROR("level %d type %s, returning NULL\n", level, getTypeString());
+ exit(-1);
+ return NULL;
+}
+