"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const estraverse_1 = require("estraverse");
const esrecurse = require("esrecurse");
const reference_1 = require("./reference");
const variable_1 = require("./variable");
const patternVisitor_1 = require("./patternVisitor");
const definition_1 = require("./definition");
const assert = require("assert");
const importManager_1 = require("./importManager");
const exportManager_1 = require("./exportManager");
function traverseIdentifierInPattern(options, rootPattern, referencer, callback) {
const visitor = new patternVisitor_1.PatternVisitor(options, rootPattern, callback);
visitor.visit(rootPattern);
if (referencer !== null && referencer !== undefined) {
visitor.rightHandNodes.forEach(referencer.visit, referencer);
}
}
class Importer extends esrecurse.Visitor {
constructor(declaration, referencer) {
super(undefined, referencer.options);
this.declaration = declaration;
this.referencer = referencer;
}
get moduleScope() {
return this.referencer.currentScope;
}
visitImport(id, specifier) {
this.referencer.visitPattern(id, undefined, pattern => {
this.referencer.currentScope.__define(pattern, new definition_1.Definition(variable_1.VariableType.ImportBinding, pattern, specifier, this.declaration));
});
}
ImportNamespaceSpecifier(node) {
const local = node.local;
this.visitImport(local, node);
const importId = new importManager_1.ImportIdentifierInfo(local.name, local.name, this.declaration.source.value, importManager_1.ImportType.Namespace);
this.moduleScope.importManager.addImportId(importId);
}
ImportDefaultSpecifier(node) {
const local = node.local;
this.visitImport(local, node);
const importId = new importManager_1.ImportIdentifierInfo(local.name, "default", this.declaration.source.value, importManager_1.ImportType.Default);
this.moduleScope.importManager.addImportId(importId);
}
ImportSpecifier(node) {
const local = node.local;
this.visitImport(local, node);
const importId = new importManager_1.ImportIdentifierInfo(local.name, node.imported.name, this.declaration.source.value, importManager_1.ImportType.Identifier);
this.moduleScope.importManager.addImportId(importId);
}
}
class Referencer extends esrecurse.Visitor {
constructor(options, scopeManager) {
super(undefined, options);
this.options = options;
this.scopeManager = scopeManager;
this.parent = null;
this.isInnerMethodDefinition = false;
this.exportingSource = null;
this.isExportingFromLocal = false;
}
get currentScope() {
return this.scopeManager.__currentScope;
}
close(node) {
while (this.currentScope &&
node === this.currentScope.block) {
this.scopeManager.__currentScope = this.currentScope.__close(this.scopeManager);
}
}
pushInnerMethodDefinition(isInnerMethodDefinition) {
const previous = this.isInnerMethodDefinition;
this.isInnerMethodDefinition = isInnerMethodDefinition;
return previous;
}
popInnerMethodDefinition(isInnerMethodDefinition) {
this.isInnerMethodDefinition = isInnerMethodDefinition;
}
materializeTDZScope(node, iterationNode) {
this.scopeManager.__nestTDZScope(node);
this.visitVariableDeclaration(this.currentScope, variable_1.VariableType.TDZ, iterationNode.left, 0, true);
}
materializeIterationScope(node) {
const letOrConstDecl = node.left;
this.scopeManager.__nestForScope(node);
this.visitVariableDeclaration(this.currentScope, variable_1.VariableType.Variable, letOrConstDecl, 0);
this.visitPattern(letOrConstDecl.declarations[0].id, undefined, pattern => {
this.currentScope.__referencing(pattern, reference_1.Reference.WRITE, node.right, undefined, true, true);
});
}
referencingDefaultValue(pattern, assignments, maybeImplicitGlobal, init) {
const scope = this.currentScope;
assignments.forEach(assignment => {
scope.__referencing(pattern, reference_1.Reference.WRITE, assignment.right, maybeImplicitGlobal, pattern !== assignment.left, init);
});
}
visitPattern(node, options = { processRightHandNodes: false }, callback) {
traverseIdentifierInPattern(this.options, node, options.processRightHandNodes ? this : null, callback);
}
visitFunction(node) {
let i, iz;
if (node.type === estraverse_1.Syntax.FunctionDeclaration) {
this.currentScope.__define(node.id, new definition_1.Definition(variable_1.VariableType.FunctionName, node.id, node));
}
if (node.type === estraverse_1.Syntax.FunctionExpression && node.id) {
this.scopeManager.__nestFunctionExpressionNameScope(node);
}
this.scopeManager.__nestFunctionScope(node, this.isInnerMethodDefinition);
const that = this;
function visitPatternCallback(pattern, info) {
that.currentScope.__define(pattern, new definition_1.ParameterDefinition(pattern, node, i, info.rest));
that.referencingDefaultValue(pattern, info.assignments, undefined, true);
}
for (i = 0, iz = node.params.length; i < iz; ++i) {
this.visitPattern(node.params[i], { processRightHandNodes: true }, visitPatternCallback);
}
if (node.body) {
if (node.body.type === estraverse_1.Syntax.BlockStatement) {
this.visitChildren(node.body);
}
else {
this.visit(node.body);
}
}
this.close(node);
}
visitClass(node) {
if (node.type === estraverse_1.Syntax.ClassDeclaration) {
this.currentScope.__define(node.id, new definition_1.Definition(variable_1.VariableType.ClassName, node.id, node));
}
this.visit(node.superClass);
this.scopeManager.__nestClassScope(node);
if (node.id) {
this.currentScope.__define(node.id, new definition_1.Definition(variable_1.VariableType.ClassName, node.id, node));
}
this.visit(node.body);
this.close(node);
}
visitProperty(node) {
let previous;
if (node.computed) {
this.visit(node.key);
}
const isMethodDefinition = node.type === estraverse_1.Syntax.MethodDefinition;
if (isMethodDefinition) {
previous = this.pushInnerMethodDefinition(true);
}
this.visit(node.value);
if (isMethodDefinition) {
this.popInnerMethodDefinition(previous);
}
}
visitForIn(node) {
if (node.left.type === estraverse_1.Syntax.VariableDeclaration &&
node.left.kind !== "var") {
this.materializeTDZScope(node.right, node);
this.visit(node.right);
this.close(node.right);
this.materializeIterationScope(node);
this.visit(node.body);
this.close(node);
}
else {
if (node.left.type === estraverse_1.Syntax.VariableDeclaration) {
this.visit(node.left);
this.visitPattern(node.left.declarations[0].id, undefined, pattern => {
this.currentScope.__referencing(pattern, reference_1.Reference.WRITE, node.right, undefined, true, true);
});
}
else {
this.visitPattern(node.left, { processRightHandNodes: true }, (pattern, info) => {
let maybeImplicitGlobal;
if (!this.currentScope.isStrict) {
maybeImplicitGlobal = {
pattern,
node,
};
}
this.referencingDefaultValue(pattern, info.assignments, maybeImplicitGlobal, false);
this.currentScope.__referencing(pattern, reference_1.Reference.WRITE, node.right, maybeImplicitGlobal, true, false);
});
}
this.visit(node.right);
this.visit(node.body);
}
}
visitVariableDeclaration(variableTargetScope, type, node, index, fromTDZ) {
const decl = node.declarations[index];
const init = decl.init;
this.visitPattern(decl.id, { processRightHandNodes: !fromTDZ }, (pattern, info) => {
variableTargetScope.__define(pattern, new definition_1.Definition(type, pattern, decl, node, index, node.kind));
if (!fromTDZ) {
this.referencingDefaultValue(pattern, info.assignments, undefined, true);
}
if (init) {
this.currentScope.__referencing(pattern, reference_1.Reference.WRITE, init, undefined, !info.topLevel, true);
}
});
}
AssignmentExpression(node) {
if (patternVisitor_1.PatternVisitor.isPattern(node.left)) {
if (node.operator === "=") {
this.visitPattern(node.left, { processRightHandNodes: true }, (pattern, info) => {
let maybeImplicitGlobal;
if (!this.currentScope.isStrict) {
maybeImplicitGlobal = {
pattern,
node,
};
}
this.referencingDefaultValue(pattern, info.assignments, maybeImplicitGlobal, false);
this.currentScope.__referencing(pattern, reference_1.Reference.WRITE, node.right, maybeImplicitGlobal, !info.topLevel, false);
});
}
else {
this.currentScope.__referencing(node.left, reference_1.Reference.RW, node.right);
}
}
else {
this.visit(node.left);
}
this.visit(node.right);
}
CatchClause(node) {
this.scopeManager.__nestCatchScope(node);
this.visitPattern(node.param, { processRightHandNodes: true }, (pattern, info) => {
this.currentScope.__define(pattern, new definition_1.Definition(variable_1.VariableType.CatchClause, node.param, node));
this.referencingDefaultValue(pattern, info.assignments, undefined, true);
});
this.visit(node.body);
this.close(node);
}
Program(node) {
this.scopeManager.__nestGlobalScope(node);
if (this.scopeManager.__isNodejsScope()) {
this.currentScope.isStrict = false;
this.scopeManager.__nestFunctionScope(node, false);
}
if (this.scopeManager.__isES6() &&
this.scopeManager.isModule()) {
this.scopeManager.__nestModuleScope(node);
}
if (this.scopeManager.isStrictModeSupported() &&
this.scopeManager.isImpliedStrict()) {
this.currentScope.isStrict = true;
}
this.visitChildren(node);
this.close(node);
}
Identifier(node) {
this.currentScope.__referencing(node, undefined, undefined, undefined, undefined, undefined, this.isExportingFromLocal);
}
UpdateExpression(node) {
if (patternVisitor_1.PatternVisitor.isPattern(node.argument)) {
this.currentScope.__referencing(node.argument, reference_1.Reference.RW);
}
else {
this.visitChildren(node);
}
}
MemberExpression(node) {
this.visit(node.object);
if (node.computed) {
this.visit(node.property);
}
}
Property(node) {
this.visitProperty(node);
}
MethodDefinition(node) {
this.visitProperty(node);
}
BreakStatement() { }
ContinueStatement() { }
LabeledStatement(node) {
this.visit(node.body);
}
ForStatement(node) {
if (node.init &&
node.init.type === estraverse_1.Syntax.VariableDeclaration &&
node.init.kind !== "var") {
this.scopeManager.__nestForScope(node);
}
this.visitChildren(node);
this.close(node);
}
ClassExpression(node) {
this.visitClass(node);
}
ClassDeclaration(node) {
this.visitClass(node);
}
CallExpression(node) {
if (!this.scopeManager.__ignoreEval() &&
node.callee.type === estraverse_1.Syntax.Identifier &&
node.callee.name === "eval") {
this.currentScope.variableScope.__detectEval();
}
this.visitChildren(node);
}
BlockStatement(node) {
if (this.scopeManager.__isES6()) {
this.scopeManager.__nestBlockScope(node);
}
this.visitChildren(node);
this.close(node);
}
ThisExpression() {
this.currentScope.variableScope.__detectThis();
}
WithStatement(node) {
this.visit(node.object);
this.scopeManager.__nestWithScope(node);
this.visit(node.body);
this.close(node);
}
VariableDeclaration(node) {
const variableTargetScope = node.kind === "var"
? this.currentScope.variableScope
: this.currentScope;
for (let i = 0, iz = node.declarations.length; i < iz; ++i) {
const decl = node.declarations[i];
this.visitVariableDeclaration(variableTargetScope, variable_1.VariableType.Variable, node, i);
if (decl.init) {
this.visit(decl.init);
}
}
}
SwitchStatement(node) {
this.visit(node.discriminant);
if (this.scopeManager.__isES6()) {
this.scopeManager.__nestSwitchScope(node);
}
for (let i = 0, iz = node.cases.length; i < iz; ++i) {
this.visit(node.cases[i]);
}
this.close(node);
}
FunctionDeclaration(node) {
this.visitFunction(node);
}
FunctionExpression(node) {
this.visitFunction(node);
}
ForOfStatement(node) {
this.visitForIn(node);
}
ForInStatement(node) {
this.visitForIn(node);
}
ArrowFunctionExpression(node) {
this.visitFunction(node);
}
ImportDeclaration(node) {
assert(this.scopeManager.__isES6() &&
this.scopeManager.isModule(), "ImportDeclaration should appear when the mode is ES6 and in the module context.");
const importer = new Importer(node, this);
importer.visit(node);
}
visitExportDeclaration(node) {
if (node.source) {
this.exportingSource = node.source.value;
}
else {
this.exportingSource = null;
}
if (node.declaration) {
this.visit(node.declaration);
return;
}
this.visitChildren(node);
}
ExportNamedDeclaration(node) {
const moduleScope = this.currentScope;
const previous = moduleScope.isExportingNamedDeclaration;
moduleScope.isExportingNamedDeclaration = true;
this.visitExportDeclaration(node);
moduleScope.isExportingNamedDeclaration = previous;
}
ExportDefaultDeclaration(node) {
const currentScope = this.currentScope;
if (currentScope.type !== "module") {
throw new Error("use export in a non module scope");
}
let localExportVar;
if (node.declaration.type === "Identifier") {
localExportVar = {
type: exportManager_1.ExportVariableType.Local,
exportName: "default",
localName: node.declaration.name,
node: node.declaration,
};
this.isExportingFromLocal = true;
this.visit(node.declaration);
this.isExportingFromLocal = false;
}
else {
localExportVar = {
type: exportManager_1.ExportVariableType.Local,
exportName: "default",
localName: null,
node: node.declaration,
};
this.visit(node.declaration);
}
currentScope.exportManager.addLocalExportVariable(localExportVar);
}
ExportAllDeclaration(node) {
const currentScope = this.currentScope;
currentScope.exportManager.addExternalVariable({
type: exportManager_1.ExportVariableType.External,
moduleName: node.source.value,
moduleType: exportManager_1.ExternalType.All,
});
}
ExportSpecifier(node) {
const local = node.local;
const currentScope = this.currentScope;
if (this.exportingSource) {
currentScope.exportManager.addExternalVariable({
type: exportManager_1.ExportVariableType.External,
moduleName: this.exportingSource,
moduleType: exportManager_1.ExternalType.Identifier,
names: {
exportName: node.exported.name,
sourceName: node.local.name,
},
});
}
else {
this.isExportingFromLocal = true;
this.visit(local);
currentScope.exportManager.addLocalExportVariable({
type: exportManager_1.ExportVariableType.Local,
exportName: node.exported.name,
localName: node.local.name,
node: node.local,
});
this.isExportingFromLocal = false;
}
}
MetaProperty() {
}
}
exports.Referencer = Referencer;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWZlcmVuY2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMkNBQW9DO0FBQ3BDLHVDQUF1QztBQUN2QywyQ0FBd0Q7QUFDeEQseUNBQTBDO0FBQzFDLHFEQUkwQjtBQUMxQiw2Q0FBK0Q7QUFDL0QsaUNBQWlDO0FBSWpDLG1EQUd5QjtBQUN6QixtREFFeUI7QUFFekIscUNBQ0UsT0FBZ0MsRUFDaEMsV0FBd0IsRUFDeEIsVUFBNkIsRUFDN0IsUUFBZ0M7SUFHaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBYyxDQUNoQyxPQUFPLEVBQ1AsV0FBVyxFQUNYLFFBQVEsQ0FDVCxDQUFDO0lBRUYsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUczQixJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtRQUNuRCxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FDNUIsVUFBVSxDQUFDLEtBQUssRUFDaEIsVUFBVSxDQUNYLENBQUM7S0FDSDtBQUNILENBQUM7QUFhRCxjQUFlLFNBQVEsU0FBUyxDQUFDLE9BQU87SUFDdEMsWUFDa0IsV0FBcUMsRUFDckMsVUFBc0I7UUFFdEMsS0FBSyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIckIsZ0JBQVcsR0FBWCxXQUFXLENBQTBCO1FBQ3JDLGVBQVUsR0FBVixVQUFVLENBQVk7SUFHeEMsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUEyQixDQUFDO0lBQ3JELENBQUM7SUFFTSxXQUFXLENBQ2hCLEVBQXFCLEVBQ3JCLFNBQThCO1FBRTlCLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDcEQsSUFBSSxDQUFDLFVB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