123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- "use strict";
- const assert = require("assert");
- const ScopeManager = require("./scope-manager");
- const Referencer = require("./referencer");
- const Reference = require("./reference");
- const Variable = require("./variable");
- const Scope = require("./scope").Scope;
- const version = require("../package.json").version;
- function defaultOptions() {
- return {
- optimistic: false,
- directive: false,
- nodejsScope: false,
- impliedStrict: false,
- sourceType: "script",
- ecmaVersion: 5,
- childVisitorKeys: null,
- fallback: "iteration"
- };
- }
- function updateDeeply(target, override) {
-
- function isHashObject(value) {
- return typeof value === "object" && value instanceof Object && !(value instanceof Array) && !(value instanceof RegExp);
- }
- for (const key in override) {
- if (Object.prototype.hasOwnProperty.call(override, key)) {
- const val = override[key];
- if (isHashObject(val)) {
- if (isHashObject(target[key])) {
- updateDeeply(target[key], val);
- } else {
- target[key] = updateDeeply({}, val);
- }
- } else {
- target[key] = val;
- }
- }
- }
- return target;
- }
- function analyze(tree, providedOptions) {
- const options = updateDeeply(defaultOptions(), providedOptions);
- const scopeManager = new ScopeManager(options);
- const referencer = new Referencer(options, scopeManager);
- referencer.visit(tree);
- assert(scopeManager.__currentScope === null, "currentScope should be null.");
- return scopeManager;
- }
- module.exports = {
-
- version,
-
- Reference,
-
- Variable,
-
- Scope,
-
- ScopeManager,
- analyze
- };
|