JavaScript: Teach API graphs to handle promisify.

Following a suggestion by Asger, we track use nodes through calls to `promisify`. When we see a call to a promisified function, we introduce a new synthetic API-graph node representing the callback argument synthesised by the promisification, and track the result of the call to an `await` (or other promise resolution), which is then considered to be a use of the first parameter of the synthetic callback (the zeroth parameter being an error code, which we do not model yet).
This commit is contained in:
Max Schaefer
2020-11-23 10:22:14 +00:00
parent 59abcd6dae
commit ecab17a626
5 changed files with 86 additions and 10 deletions

View File

@@ -0,0 +1 @@
import ApiGraphs.VerifyAssertions

View File

@@ -0,0 +1,28 @@
var bluebird = require("bluebird");
var readFile = require("fs").readFile;
var readFileAsync = bluebird.promisify(readFile);
readFile(
"tst.txt", // def (parameter 0 (member readFile (member exports (module fs))))
"utf8", // def (parameter 1 (member readFile (member exports (module fs))))
function (
err, // use (parameter 0 (parameter 2 (member readFile (member exports (module fs)))))
contents // use (parameter 1 (parameter 2 (member readFile (member exports (module fs)))))
) { });
readFileAsync(
"tst.txt" // def (parameter 0 (member readFile (member exports (module fs))))
).then(
function (buf) { } // use (parameter 1 (parameter 1 (member readFile (member exports (module fs)))))
).catch(
function (err) { } // not yet modelled: (parameter 0 (parameter 1 (member readFile (member exports (module fs)))))
);
try {
let p = readFileAsync(
"tst.txt", // def (parameter 0 (member readFile (member exports (module fs))))
"utf8" // def (parameter 1 (member readFile (member exports (module fs))))
);
let data = await p; // use (parameter 1 (parameter 2 (member readFile (member exports (module fs)))))
} catch (e) { } // not yet modelled: (parameter 0 (parameter 2 (member readFile (member exports (module fs)))))

View File

@@ -0,0 +1,6 @@
{
"name": "promisify-test",
"dependencies": {
"bluebird": "*"
}
}