@@ -5,18 +5,41 @@ import javascript
55
66/** Provides a unified model of [lodash](https://lodash.com/) and [underscore](http://underscorejs.org/). */
77module LodashUnderscore {
8+ /**
9+ * A data flow node that accesses a given member of `lodash` or `underscore`.
10+ */
11+ abstract class Member extends DataFlow:: SourceNode {
12+ /** Gets the name of the accessed member. */
13+ abstract string getName ( ) ;
14+ }
15+
16+ /**
17+ * An import of `lodash` or `underscore` accessing a given member of that package.
18+ */
19+ private class DefaultMember extends Member {
20+ string name ;
21+
22+ DefaultMember ( ) {
23+ this = DataFlow:: moduleMember ( "underscore" , name ) or
24+ this = DataFlow:: moduleMember ( "lodash" , name ) or
25+ this = DataFlow:: moduleImport ( "lodash/" + name ) or
26+ this = DataFlow:: moduleImport ( "lodash." + name ) or
27+ this = DataFlow:: globalVarRef ( "_" ) .getAPropertyRead ( name )
28+ }
29+
30+ override string getName ( ) {
31+ result = name
32+ }
33+ }
34+
835 /**
936 * Gets a data flow node that accesses the given member of `lodash` or `underscore`.
1037 *
1138 * In addition to normal imports, this supports per-method imports such as `require("lodash.map")` and `require("lodash/map")`.
1239 * In addition, the global variable `_` is assumed to refer to `lodash` or `underscore`.
1340 */
1441 DataFlow:: SourceNode member ( string name ) {
15- result = DataFlow:: moduleMember ( "underscore" , name ) or
16- result = DataFlow:: moduleMember ( "lodash" , name ) or
17- result = DataFlow:: moduleImport ( "lodash/" + name ) or
18- result = DataFlow:: moduleImport ( "lodash." + name ) or
19- result = DataFlow:: globalVarRef ( "_" ) .getAPropertyRead ( name )
42+ result .( Member ) .getName ( ) = name
2043 }
2144}
2245
0 commit comments