Package Exports
- periscopic
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (periscopic) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
periscopic
Utility for analyzing scopes belonging to an ESTree-compliant AST.
API
import { analyze } from 'periscopic';
const ast = acorn.parse(`
const a = b;
console.log(a);
`);
const { map, globals, scope } = analyze(ast);mapis aWeakMap<Node, Scope>, where the keys are the nodes of your AST that create a scopeglobalsis aSet<string>of all the identifiers that are referenced without being declared anywhere in the program (in this case,bandconsole)scopeis the top-levelScopebelonging to the program
Scope
Each Scope instance has the following properties:
scope.block— true if the scope is created by a block statement (i.e.let,constandclassare contained to it), false otherwisescope.parent— the parent scope objectscope.declarations— aMap<string, Node>of all the variables declared in this scopescope.references— aSet<string>of all the names referenced in this scope (or child scopes)
It also has two methods:
scope.has(name)— returnstrueifnameis declared in this scope or an ancestor scopescope.find_owner(name)— returns the scope object in whichnameis declared (ornullif it is not declared)
extract_identifiers and extract_names
This package also exposes utilities for extracting the identifiers contained in a declaration or a function parameter:
import { extract_identifiers, extract_names } from 'periscopic';
const ast = acorn.parse(`
const { a, b: [c, d] = e } = opts;
`);
const lhs = ast.body[0].declarations[0].id;
extract_identifiers(lhs);
/*
[
{ type: 'Identifier', name: 'a', start: 9, end: 10 },
{ type: 'Identifier', name: 'c', start: 16, end: 17 },
{ type: 'Identifier', name: 'd', start: 19, end: 20 }
]
*/
extract_names(lhs);
/*
['a', 'c', 'd']
*/