JS: Remove Import->SourceNode dependency from lazy cache

This commit is contained in:
Asger Feldthaus 2020-04-02 13:21:34 +01:00
Родитель 8f930fc3e6
Коммит 3804d3fcfd
1 изменённых файлов: 32 добавлений и 3 удалений

Просмотреть файл

@ -6,8 +6,11 @@ import javascript
module LazyCache { module LazyCache {
/** /**
* DEPRECATED. DO NOT USE.
*
* A lazy-cache object, usually created through an expression of form `require('lazy-cache')(require)`. * A lazy-cache object, usually created through an expression of form `require('lazy-cache')(require)`.
*/ */
deprecated
class LazyCacheObject extends DataFlow::SourceNode { class LazyCacheObject extends DataFlow::SourceNode {
LazyCacheObject() { LazyCacheObject() {
// Use `require` directly instead of `moduleImport` to avoid recursion. // Use `require` directly instead of `moduleImport` to avoid recursion.
@ -19,13 +22,26 @@ module LazyCache {
} }
} }
/**
* A variable containing a lazy-cache object.
*/
class LazyCacheVariable extends LocalVariable {
LazyCacheVariable() {
// To avoid recursion, this should not depend on `SourceNode`.
exists(Require req |
req.getArgument(0).getStringValue() = "lazy-cache" and
getAnAssignedExpr().(CallExpr).getCallee() = req
)
}
}
/** /**
* An import through `lazy-cache`. * An import through `lazy-cache`.
*/ */
class LazyCacheImport extends CallExpr, Import { class LazyCacheImport extends CallExpr, Import {
LazyCacheObject cache; LazyCacheVariable cache;
LazyCacheImport() { this = cache.getACall().asExpr() } LazyCacheImport() { getCallee() = cache.getAnAccess() }
/** Gets the name of the package as it's exposed on the lazy-cache object. */ /** Gets the name of the package as it's exposed on the lazy-cache object. */
string getLocalAlias() { string getLocalAlias() {
@ -39,10 +55,23 @@ module LazyCache {
override PathExpr getImportedPath() { result = getArgument(0) } override PathExpr getImportedPath() { result = getArgument(0) }
private LazyCacheVariable getVariable() {
result = cache
}
pragma[noopt]
override DataFlow::Node getImportedModuleNode() { override DataFlow::Node getImportedModuleNode() {
this instanceof LazyCacheImport and
result = this.flow() result = this.flow()
or or
result = cache.getAPropertyRead(getLocalAlias()) exists(LazyCacheVariable variable, Expr base, PropAccess access, string localName |
variable = getVariable() and
base = variable.getAnAccess() and
access.getBase() = base and
localName = getLocalAlias() and
access.getPropertyName() = localName and
result = access.flow()
)
} }
} }