“use strict”;

Object.defineProperty(exports, “__esModule”, {

value: true

}); exports.default = isReferenced;

function isReferenced(node, parent, grandparent) {

switch (parent.type) {
  case "MemberExpression":
  case "JSXMemberExpression":
  case "OptionalMemberExpression":
    if (parent.property === node) {
      return !!parent.computed;
    }

    return parent.object === node;

  case "VariableDeclarator":
    return parent.init === node;

  case "ArrowFunctionExpression":
    return parent.body === node;

  case "ExportSpecifier":
    if (parent.source) {
      return false;
    }

    return parent.local === node;

  case "PrivateName":
    return false;

  case "ObjectProperty":
  case "ClassProperty":
  case "ClassPrivateProperty":
  case "ClassMethod":
  case "ClassPrivateMethod":
  case "ObjectMethod":
    if (parent.key === node) {
      return !!parent.computed;
    }

    if (parent.value === node) {
      return !grandparent || grandparent.type !== "ObjectPattern";
    }

    return true;

  case "ClassDeclaration":
  case "ClassExpression":
    return parent.superClass === node;

  case "AssignmentExpression":
    return parent.right === node;

  case "AssignmentPattern":
    return parent.right === node;

  case "LabeledStatement":
    return false;

  case "CatchClause":
    return false;

  case "RestElement":
    return false;

  case "BreakStatement":
  case "ContinueStatement":
    return false;

  case "FunctionDeclaration":
  case "FunctionExpression":
    return false;

  case "ExportNamespaceSpecifier":
  case "ExportDefaultSpecifier":
    return false;

  case "ImportDefaultSpecifier":
  case "ImportNamespaceSpecifier":
  case "ImportSpecifier":
    return false;

  case "JSXAttribute":
    return false;

  case "ObjectPattern":
  case "ArrayPattern":
    return false;

  case "MetaProperty":
    return false;

  case "ObjectTypeProperty":
    return parent.key !== node;

  case "TSEnumMember":
    return parent.id !== node;

  case "TSPropertySignature":
    if (parent.key === node) {
      return !!parent.computed;
    }

    return true;
}

return true;

}