{"version":3,"names":["parens","require","_t","_nodes","VISITOR_KEYS","TokenContext","exports","normal","expressionStatement","arrowBody","exportDefault","arrowFlowReturnType","forInitHead","forInHead","forOfHead","forInOrInitHeadAccumulate","forInOrInitHeadAccumulatePassThroughMask","type","Object","keys","func","generatorInfosMap","has","get","newCalleeNeedsParens","node","current","object","tag","expression","parentNeedsParens","parent","parentId","callee","isDecoratorMemberExpression","computed","property","isLastChild","child","visitorKeys","i","length","val","Array","isArray","j"],"sources":["../../src/node/index.ts"],"sourcesContent":["import * as parens from \"./parentheses.ts\";\nimport { VISITOR_KEYS } from \"@babel/types\";\nimport type * as t from \"@babel/types\";\n\nimport { generatorInfosMap } from \"../nodes.ts\";\n\nexport const enum TokenContext {\n  normal = 0,\n  expressionStatement = 1 << 0,\n  arrowBody = 1 << 1,\n  exportDefault = 1 << 2,\n  arrowFlowReturnType = 1 << 3,\n  forInitHead = 1 << 4,\n  forInHead = 1 << 5,\n  forOfHead = 1 << 6,\n  // This flag lives across the token boundary, and will\n  // be reset after forIn or forInit head is printed\n  forInOrInitHeadAccumulate = 1 << 7,\n  forInOrInitHeadAccumulatePassThroughMask = 0b10000000,\n}\n\nexport type NodeHandler<R> = (\n  node: t.Node,\n  // todo:\n  // node: K extends keyof typeof t\n  //   ? Extract<typeof t[K], { type: \"string\" }>\n  //   : t.Node,\n  parent: t.Node,\n  parentId: number,\n  tokenContext?: number,\n  getRawIdentifier?: (node: t.Identifier) => string,\n) => R | undefined;\n\nfor (const type of Object.keys(parens) as (keyof typeof parens)[]) {\n  const func = parens[type];\n  if (generatorInfosMap.has(type)) {\n    generatorInfosMap.get(type)![2] = func;\n  }\n}\n\nfunction newCalleeNeedsParens(node: t.Node): boolean {\n  let current: t.Node = node;\n  while (true) {\n    switch (current.type) {\n      case \"CallExpression\":\n      case \"ImportExpression\":\n      case \"OptionalCallExpression\":\n      case \"OptionalMemberExpression\":\n        return true;\n      case \"MemberExpression\":\n        current = current.object;\n        break;\n      case \"TaggedTemplateExpression\":\n        current = current.tag;\n        break;\n      case \"TSNonNullExpression\":\n        current = current.expression;\n        break;\n      default:\n        return false;\n    }\n  }\n}\n\nexport function parentNeedsParens(\n  node: t.Node,\n  parent: any,\n  parentId: number,\n): boolean {\n  switch (parentId) {\n    case __node(\"NewExpression\"):\n      if (parent.callee === node) {\n        return newCalleeNeedsParens(node);\n      }\n      break;\n    case __node(\"Decorator\"):\n      return (\n        !isDecoratorMemberExpression(node) &&\n        !(\n          node.type === \"CallExpression\" &&\n          isDecoratorMemberExpression(node.callee)\n        ) &&\n        node.type !== \"ParenthesizedExpression\"\n      );\n  }\n  return false;\n}\n\nfunction isDecoratorMemberExpression(node: t.Node): boolean {\n  switch (node.type) {\n    case \"Identifier\":\n      return true;\n    case \"MemberExpression\":\n      return (\n        !node.computed &&\n        node.property.type === \"Identifier\" &&\n        isDecoratorMemberExpression(node.object)\n      );\n    default:\n      return false;\n  }\n}\n\nexport function isLastChild(parent: t.Node, child: t.Node) {\n  const visitorKeys = VISITOR_KEYS[parent.type];\n  for (let i = visitorKeys.length - 1; i >= 0; i--) {\n    const val = (parent as any)[visitorKeys[i]] as t.Node | t.Node[] | null;\n    if (val === child) {\n      return true;\n    } else if (Array.isArray(val)) {\n      let j = val.length - 1;\n      while (j >= 0 && val[j] === null) j--;\n      return j >= 0 && val[j] === child;\n    } else if (val) {\n      return false;\n    }\n  }\n  return false;\n}\n"],"mappings":"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","ignoreList":[]}