text: "use strict";
  
  Object.defineProperty(exports, "__esModule", {
    value: true
  });
  exports.default = getBindingIdentifiers;
  
  var _generated = require("../validators/generated");
  
  function getBindingIdentifiers(node, duplicates, outerOnly) {
    let search = [].concat(node);
    const ids = Object.create(null);
  
    while (search.length) {
      const id = search.shift();
      if (!id) continue;
      const keys = getBindingIdentifiers.keys[id.type];
  
      if ((0, _generated.isIdentifier)(id)) {
        if (duplicates) {
          const _ids = ids[id.name] = ids[id.name] || [];
  
          _ids.push(id);
        } else {
          ids[id.name] = id;
        }
  
        continue;
      }
  
      if ((0, _generated.isExportDeclaration)(id)) {
        if ((0, _generated.isDeclaration)(id.declaration)) {
          search.push(id.declaration);
        }
  
        continue;
      }
  
      if (outerOnly) {
        if ((0, _generated.isFunctionDeclaration)(id)) {
          search.push(id.id);
          continue;
        }
  
        if ((0, _generated.isFunctionExpression)(id)) {
          continue;
        }
      }
  
      if (keys) {
        for (let i = 0; i < keys.length; i++) {
          const key = keys[i];
  
          if (id[key]) {
            search = search.concat(id[key]);
          }
        }
      }
    }
  
    return ids;
  }
  
  getBindingIdentifiers.keys = {
    DeclareClass: ["id"],
    DeclareFunction: ["id"],
    DeclareModule: ["id"],
    DeclareVariable: ["id"],
    DeclareInterface: ["id"],
    DeclareTypeAlias: ["id"],
    DeclareOpaqueType: ["id"],
    InterfaceDeclaration: ["id"],
    TypeAlias: ["id"],
    OpaqueType: ["id"],
    CatchClause: ["param"],
    LabeledStatement: ["label"],
    UnaryExpression: ["argument"],
    AssignmentExpression: ["left"],
    ImportSpecifier: ["local"],
    ImportNamespaceSpecifier: ["local"],
    ImportDefaultSpecifier: ["local"],
    ImportDeclaration: ["specifiers"],
    ExportSpecifier: ["exported"],
    ExportNamespaceSpecifier: ["exported"],
    ExportDefaultSpecifier: ["exported"],
    FunctionDeclaration: ["id", "params"],
    FunctionExpression: ["id", "params"],
    ArrowFunctionExpression: ["params"],
    ObjectMethod: ["params"],
    ClassMethod: ["params"],
    ForInStatement: ["left"],
    ForOfStatement: ["left"],
    ClassDeclaration: ["id"],
    ClassExpression: ["id"],
    RestElement: ["argument"],
    UpdateExpression: ["argument"],
    ObjectProperty: ["value"],
    AssignmentPattern: ["left"],
    ArrayPattern: ["elements"],
    ObjectPattern: ["properties"],
    VariableDeclaration: ["declarations"],
    VariableDeclarator: ["id"]
  };