JavaScript: Teach type inference about AMD imports.

This commit is contained in:
Max Schaefer
2018-10-31 23:12:05 -04:00
parent e77ea62179
commit b058854964
5 changed files with 51 additions and 0 deletions

View File

@@ -232,6 +232,42 @@ private class AnalyzedAmdExport extends AnalyzedPropertyWrite, DataFlow::ValueNo
}
}
/**
* Flow analysis for AMD imports, interpreted as an implicit read of
* the `module.exports` property of the imported module.
*/
private class AnalyzedAmdImport extends AnalyzedPropertyRead, DataFlow::Node {
Module required;
AnalyzedAmdImport() {
exists (AMDModule amd, PathExpr dep, Parameter p |
amd.getDefine().dependencyParameter(dep, p) and
this = DataFlow::parameterNode(p) and
required.getFile() = amd.resolve(dep)
)
}
override predicate reads(AbstractValue base, string propName) {
base = TAbstractModuleObject(required) and
propName = "exports"
}
}
/**
* Flow analysis for parameters corresponding to AMD imports.
*/
private class AnalyzedAmdParameter extends AnalyzedVarDef, @vardecl {
AnalyzedAmdImport imp;
AnalyzedAmdParameter() {
imp = DataFlow::parameterNode(this)
}
override AbstractValue getAnRhsValue() {
result = imp.getALocalValue()
}
}
/**
* Flow analysis for exports that export a single value.
*/