@@ -16,6 +16,36 @@ class ExitCfgNode = CfgImpl::ExitNode;
1616
1717class AnnotatedExitCfgNode = CfgImpl:: AnnotatedExitNode ;
1818
19+ /** A variable access. */
20+ final class VariableAccessCfgNode extends PathExprBaseCfgNode {
21+ private VariableAccess a ;
22+
23+ VariableAccessCfgNode ( ) { a = this .getAstNode ( ) }
24+
25+ /** Gets the underlying `VariableAccess`. */
26+ VariableAccess getAccess ( ) { result = a }
27+ }
28+
29+ /** A variable write. */
30+ final class VariableWriteAccessCfgNode extends VariableAccessCfgNode {
31+ private VariableWriteAccess a ;
32+
33+ VariableWriteAccessCfgNode ( ) { a = this .getAstNode ( ) }
34+
35+ /** Gets the underlying `VariableWriteAccess`. */
36+ VariableWriteAccess getAccess ( ) { result = a }
37+ }
38+
39+ /** A variable read. */
40+ final class VariableReadAccessCfgNode extends VariableAccessCfgNode {
41+ private VariableReadAccess a ;
42+
43+ VariableReadAccessCfgNode ( ) { a = this .getAstNode ( ) }
44+
45+ /** Gets the underlying `VariableReadAccess`. */
46+ VariableReadAccess getAccess ( ) { result = a }
47+ }
48+
1949/**
2050 * An assignment expression, for example
2151 *
@@ -24,12 +54,42 @@ class AnnotatedExitCfgNode = CfgImpl::AnnotatedExitNode;
2454 * ```
2555 */
2656final class AssignmentExprCfgNode extends BinaryExprCfgNode {
27- AssignmentExpr a ;
57+ AssignmentExprChildMapping a ;
2858
2959 AssignmentExprCfgNode ( ) { a = this .getBinaryExpr ( ) }
3060
3161 /** Gets the underlying `AssignmentExpr`. */
3262 AssignmentExpr getAssignmentExpr ( ) { result = a }
63+
64+ /**
65+ * Gets a write access that occurs in the left-hand side of this assignment expression.
66+ */
67+ VariableWriteAccessCfgNode getAWriteAccess ( ) {
68+ a = result .getAccess ( ) .getAssignmentExpr ( ) and
69+ any ( ChildMapping mapping ) .hasCfgChild ( a , result .getAccess ( ) , this , result )
70+ }
71+ }
72+
73+ /**
74+ * A compound assignment expression, for example:
75+ * ```rust
76+ * x += y;
77+ * ```
78+ *
79+ * Note that compound assignment expressions are syntatic sugar for
80+ * trait invocations, i.e., the above actually means
81+ *
82+ * ```rust
83+ * (&mut x).add_assign(y);
84+ * ```
85+ */
86+ final class CompoundAssignmentExprCfgNode extends BinaryExprCfgNode {
87+ CompoundAssignmentExpr a ;
88+
89+ CompoundAssignmentExprCfgNode ( ) { a = this .getBinaryExpr ( ) }
90+
91+ /** Gets the underlying `CompoundAssignmentExpr`. */
92+ CompoundAssignmentExpr getCompoundAssignmentExpr ( ) { result = a }
3393}
3494
3595/**
0 commit comments