@@ -176,6 +176,23 @@ abstract private class ExprChildMapping extends Expr {
176
176
/** Provides classes for control-flow nodes that wrap AST expressions. */
177
177
module ExprNodes {
178
178
// TODO: Add more classes
179
+ private class AssignmentExprChildMapping extends ExprChildMapping , Assignment {
180
+ override predicate relevantChild ( Expr e ) { e = this .getAnOperand ( ) }
181
+ }
182
+
183
+ /** A control-flow node that wraps an `Assignment` AST expression. */
184
+ class AssignmentCfgNode extends ExprCfgNode {
185
+ override AssignmentExprChildMapping e ;
186
+
187
+ final override Assignment getExpr ( ) { result = ExprCfgNode .super .getExpr ( ) }
188
+
189
+ /** Gets the LHS of this assignment. */
190
+ final ExprCfgNode getLhs ( ) { e .hasCfgChild ( e .getLhs ( ) , this , result ) }
191
+
192
+ /** Gets the RHS of this assignment. */
193
+ final ExprCfgNode getRhs ( ) { e .hasCfgChild ( e .getRhs ( ) , this , result ) }
194
+ }
195
+
179
196
private class BinaryOperationExprChildMapping extends ExprChildMapping , BinaryOperation {
180
197
override predicate relevantChild ( Expr e ) { e = this .getAnOperand ( ) }
181
198
}
@@ -193,6 +210,40 @@ module ExprNodes {
193
210
final ExprCfgNode getRightOperand ( ) { e .hasCfgChild ( e .getRightOperand ( ) , this , result ) }
194
211
}
195
212
213
+ private class CallExprChildMapping extends ExprChildMapping , Call {
214
+ override predicate relevantChild ( Expr e ) { e = [ this .getAnArgument ( ) , this .getReceiver ( ) ] }
215
+ }
216
+
217
+ /** A control-flow node that wraps a `Call` AST expression. */
218
+ class CallCfgNode extends ExprCfgNode {
219
+ override CallExprChildMapping e ;
220
+
221
+ final override Call getExpr ( ) { result = ExprCfgNode .super .getExpr ( ) }
222
+
223
+ /** Gets the `n`th argument of this call. */
224
+ final ExprCfgNode getArgument ( int n ) { e .hasCfgChild ( e .getArgument ( n ) , this , result ) }
225
+
226
+ /** Gets the receiver of this call. */
227
+ final ExprCfgNode getReceiver ( ) { e .hasCfgChild ( e .getReceiver ( ) , this , result ) }
228
+ }
229
+
230
+ private class ExprSequenceChildMapping extends ExprChildMapping , ExprSequence {
231
+ override predicate relevantChild ( Expr e ) { e = this .getAnExpr ( ) }
232
+ }
233
+
234
+ /** A control-flow node that wraps an `ExprSequence` AST expression. */
235
+ class ExprSequenceCfgNode extends ExprCfgNode {
236
+ override ExprSequenceChildMapping e ;
237
+
238
+ final override ExprSequence getExpr ( ) { result = ExprCfgNode .super .getExpr ( ) }
239
+
240
+ /** Gets the last expression in this sequence, if any. */
241
+ final ExprCfgNode getLastExpr ( ) { e .hasCfgChild ( e .getLastExpr ( ) , this , result ) }
242
+
243
+ /** Gets the 'n'th expression of this expression sequence. */
244
+ final ExprCfgNode getExpr ( int n ) { e .hasCfgChild ( e .getExpr ( n ) , this , result ) }
245
+ }
246
+
196
247
/** A control-flow node that wraps a `VariableReadAccess` AST expression. */
197
248
class VariableReadAccessCfgNode extends ExprCfgNode {
198
249
override VariableReadAccess e ;
0 commit comments