@@ -13,6 +13,14 @@ class Node extends TNode {
1313 * Gets the underlying `Expr` or `VarDef` node, if this is an `AstNodeNode`.
1414 */
1515 AstNode asAstNode ( ) { astNode ( result ) = this }
16+
17+ /**
18+ * Gets the predicate containing this data-flow node.
19+ *
20+ * All data-flow nodes belong in exactly one predicate.
21+ * TODO: select clauses
22+ */
23+ Predicate getEnclosingPredicate ( ) { none ( ) } // overridden in subclasses
1624}
1725
1826/**
@@ -35,6 +43,10 @@ class AstNodeNode extends Node, MkAstNodeNode {
3543 AstNode getAstNode ( ) {
3644 result = ast
3745 }
46+
47+ override Predicate getEnclosingPredicate ( ) {
48+ result = ast .getEnclosingPredicate ( )
49+ }
3850}
3951
4052/**
@@ -71,6 +83,10 @@ class ScopedVariableNode extends Node, MkScopedVariable {
7183 AstNode getScope ( ) {
7284 result = scope
7385 }
86+
87+ override Predicate getEnclosingPredicate ( ) {
88+ result = var .getEnclosingPredicate ( )
89+ }
7490}
7591
7692/**
@@ -101,6 +117,10 @@ class ThisNode extends Node, MkThisNode {
101117 Predicate getPredicate ( ) {
102118 result = pred
103119 }
120+
121+ override Predicate getEnclosingPredicate ( ) {
122+ result = pred
123+ }
104124}
105125
106126/**
@@ -131,6 +151,10 @@ class ResultNode extends Node, MkResultNode {
131151 Predicate getPredicate ( ) {
132152 result = pred
133153 }
154+
155+ override Predicate getEnclosingPredicate ( ) {
156+ result = pred
157+ }
134158}
135159
136160/**
@@ -171,6 +195,10 @@ class FieldNode extends Node, MkFieldNode {
171195 override Location getLocation ( ) {
172196 result = pred .getLocation ( )
173197 }
198+
199+ override Predicate getEnclosingPredicate ( ) {
200+ result = pred
201+ }
174202}
175203
176204/**
0 commit comments