add of Set, Stack and similar to the Immutable model

This commit is contained in:
Erik Krogh Kristensen
2021-02-04 12:05:04 +01:00
parent b74df66463
commit 6cbf7b3267
3 changed files with 40 additions and 4 deletions

View File

@@ -38,10 +38,18 @@ private module Immutable {
API::Node immutableCollection() {
// keep this predicate in sync with the constructors defined in `storeStep`/`step`.
result =
immutableImport().getMember(["Map", "OrderedMap", "List", "fromJS", "merge"]).getReturn()
immutableImport()
.getMember(["Map", "OrderedMap", "List", "Stack", "Set", "OrderedSet", "fromJS", "merge"])
.getReturn()
or
result = immutableImport().getMember("Record").getReturn().getReturn()
or
result =
immutableImport()
.getMember(["List", "Set", "OrderedSet", "Stack"])
.getMember("of")
.getReturn()
or
result = immutableCollection().getMember(["set", "map", "filter", "push", "merge"]).getReturn()
}
@@ -59,7 +67,7 @@ private module Immutable {
or
// Immutable.List()
exists(DataFlow::CallNode call, DataFlow::ArrayCreationNode arr |
call = immutableImport().getMember("List").getACall()
call = immutableImport().getMember(["List", "Stack", "Set", "OrderedSet"]).getACall()
|
arr = call.getArgument(0).getALocalSource() and
exists(int i |
@@ -91,6 +99,19 @@ private module Immutable {
pred = [factoryCall, recordCall].getOptionArgument(0, prop) and
result = recordCall
)
or
// List/Set/Stack.of(values)
exists(API::CallNode call |
call =
immutableImport()
.getMember(["List", "Set", "OrderedSet", "Stack"])
.getMember("of")
.getACall()
|
pred = call.getAnArgument() and
result = call and
prop = DataFlow::PseudoProperties::arrayElement()
)
}
/**