@@ -29,29 +29,26 @@ private module Immutable {
2929 }
3030
3131 /**
32- * An instance of an immutable map .
32+ * An instance of any immutable collection .
3333 */
34- API:: Node immutableMap ( ) {
35- result = immutableImport ( ) .getMember ( "Map" ) .getReturn ( )
34+ API:: Node immutableCollection ( ) {
35+ result = immutableImport ( ) .getMember ( [ "Map" , "fromJS" ] ) .getReturn ( )
3636 or
37- result = immutableMap ( ) . getMember ( "set" ) . getReturn ( )
37+ result . getAnImmediateUse ( ) = step ( immutableCollection ( ) . getAUse ( ) )
3838 }
3939
40- /**
41- * An instance of any immutable collection.
42- */
43- API:: Node immutableCollection ( ) { result = immutableMap ( ) }
44-
4540 /**
4641 * Gets the immutable collection where `pred` has been stored using the name `prop`.
4742 */
4843 DataFlow:: SourceNode storeStep ( DataFlow:: Node pred , string prop ) {
49- exists ( DataFlow:: CallNode call | call = immutableImport ( ) .getMember ( "Map" ) .getACall ( ) |
44+ exists ( DataFlow:: CallNode call |
45+ call = immutableImport ( ) .getMember ( [ "Map" , "fromJS" ] ) .getACall ( )
46+ |
5047 pred = call .getOptionArgument ( 0 , prop ) and
5148 result = call
5249 )
5350 or
54- exists ( DataFlow:: CallNode call | call = immutableMap ( ) .getMember ( "set" ) .getACall ( ) |
51+ exists ( DataFlow:: CallNode call | call = immutableCollection ( ) .getMember ( "set" ) .getACall ( ) |
5552 call .getArgument ( 0 ) .mayHaveStringValue ( prop ) and
5653 pred = call .getArgument ( 1 ) and
5754 result = call
@@ -63,7 +60,9 @@ private module Immutable {
6360 */
6461 DataFlow:: Node loadStep ( DataFlow:: Node pred , string prop ) {
6562 // map.get()
66- exists ( DataFlow:: MethodCallNode call | call = immutableMap ( ) .getMember ( "get" ) .getACall ( ) |
63+ exists ( DataFlow:: MethodCallNode call |
64+ call = immutableCollection ( ) .getMember ( "get" ) .getACall ( )
65+ |
6766 call .getArgument ( 0 ) .mayHaveStringValue ( prop ) and
6867 pred = call .getReceiver ( ) and
6968 result = call
@@ -73,14 +72,14 @@ private module Immutable {
7372 /**
7473 * Gets an immutable collection that contains all the elements from `pred`.
7574 */
76- DataFlow:: Node step ( DataFlow:: Node pred ) {
75+ DataFlow:: SourceNode step ( DataFlow:: Node pred ) {
7776 // map.set() copies all existing values
78- exists ( DataFlow:: CallNode call | call = immutableMap ( ) .getMember ( "set" ) .getACall ( ) |
77+ exists ( DataFlow:: CallNode call | call = immutableCollection ( ) .getMember ( "set" ) .getACall ( ) |
7978 pred = call .getReceiver ( ) and
8079 result = call
8180 )
8281 or
83- // toJS() or any immutable collection converts it to a plain JavaScript object/array.
82+ // toJS() or any immutable collection converts it to a plain JavaScript object/array (and vice versa for `fromJS`) .
8483 exists ( DataFlow:: CallNode call | call = immutableCollection ( ) .getMember ( "toJS" ) .getACall ( ) |
8584 pred = call .getReceiver ( ) and
8685 result = call
0 commit comments