summaryrefslogtreecommitdiff
path: root/src/ast
diff options
context:
space:
mode:
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;
+}
+