@@ -4523,6 +4523,118 @@ module StdlibPrivate {
4523
4523
}
4524
4524
}
4525
4525
4526
+ /** A flow summary for `map`. */
4527
+ class MapSummary extends SummarizedCallable {
4528
+ MapSummary ( ) { this = "builtins.map" }
4529
+
4530
+ override DataFlow:: CallCfgNode getACall ( ) { result = API:: builtin ( "map" ) .getACall ( ) }
4531
+
4532
+ override DataFlow:: ArgumentNode getACallback ( ) {
4533
+ result = API:: builtin ( "map" ) .getAValueReachableFromSource ( )
4534
+ }
4535
+
4536
+ override predicate propagatesFlow ( string input , string output , boolean preservesValue ) {
4537
+ exists ( int i | exists ( any ( Call c ) .getArg ( i ) ) |
4538
+ (
4539
+ input = "Argument[" + ( i + 1 ) .toString ( ) + "].ListElement"
4540
+ or
4541
+ input = "Argument[" + ( i + 1 ) .toString ( ) + "].SetElement"
4542
+ or
4543
+ exists ( DataFlow:: TupleElementContent tc , int j | j = tc .getIndex ( ) |
4544
+ input = "Argument[" + ( i + 1 ) .toString ( ) + "].TupleElement[" + j .toString ( ) + "]"
4545
+ )
4546
+ // TODO: Once we have DictKeyContent, we need to transform that into ListElementContent
4547
+ ) and
4548
+ output = "Argument[0].Parameter[" + i .toString ( ) + "]" and
4549
+ preservesValue = true
4550
+ )
4551
+ or
4552
+ input = "Argument[0].ReturnValue" and
4553
+ output = "ReturnValue.ListElement" and
4554
+ preservesValue = true
4555
+ }
4556
+ }
4557
+
4558
+ /** A flow summary for `filter`. */
4559
+ class FilterSummary extends SummarizedCallable {
4560
+ FilterSummary ( ) { this = "builtins.filter" }
4561
+
4562
+ override DataFlow:: CallCfgNode getACall ( ) { result = API:: builtin ( "filter" ) .getACall ( ) }
4563
+
4564
+ override DataFlow:: ArgumentNode getACallback ( ) {
4565
+ result = API:: builtin ( "filter" ) .getAValueReachableFromSource ( )
4566
+ }
4567
+
4568
+ override predicate propagatesFlow ( string input , string output , boolean preservesValue ) {
4569
+ (
4570
+ input = "Argument[1].ListElement"
4571
+ or
4572
+ input = "Argument[1].SetElement"
4573
+ or
4574
+ exists ( DataFlow:: TupleElementContent tc , int i | i = tc .getIndex ( ) |
4575
+ input = "Argument[1].TupleElement[" + i .toString ( ) + "]"
4576
+ )
4577
+ // TODO: Once we have DictKeyContent, we need to transform that into ListElementContent
4578
+ ) and
4579
+ output = "Argument[0].Parameter[0]" and
4580
+ preservesValue = true
4581
+ }
4582
+ }
4583
+
4584
+ /**A summary for `enumerate`. */
4585
+ class EnumerateSummary extends SummarizedCallable {
4586
+ EnumerateSummary ( ) { this = "builtins.enumerate" }
4587
+
4588
+ override DataFlow:: CallCfgNode getACall ( ) { result = API:: builtin ( "enumerate" ) .getACall ( ) }
4589
+
4590
+ override DataFlow:: ArgumentNode getACallback ( ) {
4591
+ result = API:: builtin ( "enumerate" ) .getAValueReachableFromSource ( )
4592
+ }
4593
+
4594
+ override predicate propagatesFlow ( string input , string output , boolean preservesValue ) {
4595
+ (
4596
+ input = "Argument[0].ListElement"
4597
+ or
4598
+ input = "Argument[0].SetElement"
4599
+ or
4600
+ exists ( DataFlow:: TupleElementContent tc , int i | i = tc .getIndex ( ) |
4601
+ input = "Argument[0].TupleElement[" + i .toString ( ) + "]"
4602
+ )
4603
+ // TODO: Once we have DictKeyContent, we need to transform that into ListElementContent
4604
+ ) and
4605
+ output = "ReturnValue.ListElement.TupleElement[1]" and
4606
+ preservesValue = true
4607
+ }
4608
+ }
4609
+
4610
+ /** A flow summary for ``zip`. */
4611
+ class ZipSummary extends SummarizedCallable {
4612
+ ZipSummary ( ) { this = "builtins.zip" }
4613
+
4614
+ override DataFlow:: CallCfgNode getACall ( ) { result = API:: builtin ( "zip" ) .getACall ( ) }
4615
+
4616
+ override DataFlow:: ArgumentNode getACallback ( ) {
4617
+ result = API:: builtin ( "zip" ) .getAValueReachableFromSource ( )
4618
+ }
4619
+
4620
+ override predicate propagatesFlow ( string input , string output , boolean preservesValue ) {
4621
+ exists ( int i | exists ( any ( Call c ) .getArg ( i ) ) |
4622
+ (
4623
+ input = "Argument[" + i .toString ( ) + "].ListElement"
4624
+ or
4625
+ input = "Argument[" + i .toString ( ) + "].SetElement"
4626
+ or
4627
+ exists ( DataFlow:: TupleElementContent tc , int j | j = tc .getIndex ( ) |
4628
+ input = "Argument[" + i .toString ( ) + "].TupleElement[" + j .toString ( ) + "]"
4629
+ )
4630
+ // TODO: Once we have DictKeyContent, we need to transform that into ListElementContent
4631
+ ) and
4632
+ output = "ReturnValue.ListElement.TupleElement[" + i .toString ( ) + "]" and
4633
+ preservesValue = true
4634
+ )
4635
+ }
4636
+ }
4637
+
4526
4638
// ---------------------------------------------------------------------------
4527
4639
// Flow summaries for container methods
4528
4640
// ---------------------------------------------------------------------------
0 commit comments