@@ -325,12 +325,41 @@ module ExprNodes {
325325 /** A control-flow node that wraps a `MemberExpr` expression that is being written to. */
326326 class MemberCfgWriteAccessNode extends MemberCfgNode {
327327 MemberCfgWriteAccessNode ( ) { this .getExpr ( ) instanceof MemberExprWriteAccess }
328+
329+ StmtNodes:: AssignStmtCfgNode getAssignStmt ( ) { result .getLeftHandSide ( ) = this }
328330 }
329331
330332 /** A control-flow node that wraps a `MemberExpr` expression that is being read from. */
331333 class MemberCfgReadAccessNode extends MemberCfgNode {
332334 MemberCfgReadAccessNode ( ) { this .getExpr ( ) instanceof MemberExprReadAccess }
333335 }
336+
337+ class IndexChildMapping extends ExprChildMapping , IndexExpr {
338+ override predicate relevantChild ( Ast n ) { n = this .getBase ( ) or n = this .getIndex ( ) }
339+ }
340+
341+ /** A control-flow node that wraps a `MemberExpr` expression. */
342+ class IndexCfgNode extends ExprCfgNode {
343+ override string getAPrimaryQlClass ( ) { result = "IndexCfgNode" }
344+
345+ override IndexChildMapping e ;
346+
347+ final ExprCfgNode getBase ( ) { e .hasCfgChild ( e .getBase ( ) , this , result ) }
348+
349+ final ExprCfgNode getIndex ( ) { e .hasCfgChild ( e .getIndex ( ) , this , result ) }
350+ }
351+
352+ /** A control-flow node that wraps a `MemberExpr` expression that is being written to. */
353+ class IndexCfgWriteNode extends IndexCfgNode {
354+ IndexCfgWriteNode ( ) { this .getExpr ( ) instanceof IndexExprWrite }
355+
356+ StmtNodes:: AssignStmtCfgNode getAssignStmt ( ) { result .getLeftHandSide ( ) = this }
357+ }
358+
359+ /** A control-flow node that wraps a `MemberExpr` expression that is being read from. */
360+ class IndexCfgReadNode extends IndexCfgNode {
361+ IndexCfgReadNode ( ) { this .getExpr ( ) instanceof IndexExprRead }
362+ }
334363}
335364
336365module StmtNodes {
0 commit comments