PrecRTL GenJS::getPrecedence()

in lib/AST2JS/AST2JS.cpp [878:947]


PrecRTL GenJS::getPrecedence(Node *node) {
  // Precedence order taken from
  // https://github.com/facebook/flow/blob/master/src/parser_utils/output/js_layout_generator.ml

  if (llvh::isa<IdentifierNode>(node) || llvh::isa<NullLiteralNode>(node) ||
      llvh::isa<BooleanLiteralNode>(node) ||
      llvh::isa<StringLiteralNode>(node) ||
      llvh::isa<NumericLiteralNode>(node) ||
      llvh::isa<RegExpLiteralNode>(node) ||
      llvh::isa<ThisExpressionNode>(node) || llvh::isa<SuperNode>(node) ||
      llvh::isa<ArrayExpressionNode>(node) ||
      llvh::isa<ObjectExpressionNode>(node) ||
      llvh::isa<ObjectPatternNode>(node) ||
      llvh::isa<FunctionExpressionNode>(node) ||
      llvh::isa<ClassExpressionNode>(node) ||
      llvh::isa<TemplateLiteralNode>(node)) {
    return kPrimaryPrec;
  }

  if (llvh::isa<MemberExpressionNode>(node) ||
      llvh::isa<MetaPropertyNode>(node) ||
      llvh::isa<CallExpressionNode>(node) ||
      // `new foo()` has higher precedence than `new foo`. In pretty mode we
      // always append the `()`, but otherwise we must check the number of args.
      (llvh::isa<NewExpressionNode>(node) &&
       (pretty_ || !llvh::cast<NewExpressionNode>(node)->_arguments.empty()))) {
    return kMemberPrec;
  }

  if (llvh::isa<NewExpressionNode>(node)) {
    return kNewNoArgsPrec;
  }

  if (llvh::isa<TaggedTemplateExpressionNode>(node) ||
      llvh::isa<ImportExpressionNode>(node)) {
    return kTaggedTemplatePrec;
  }

  if (llvh::isa<UpdateExpressionNode>(node) &&
      !llvh::cast<UpdateExpressionNode>(node)->_prefix) {
    return kPostUpdatePrec;
  }

  if (llvh::isa<UpdateExpressionNode>(node) ||
      llvh::isa<UnaryExpressionNode>(node)) {
    return {kUnaryPrec, true};
  }

  if (auto *bin = llvh::dyn_cast<BinaryExpressionNode>(node))
    return getBinaryPrecedence(bin->_operator->str());
  if (auto *bin = llvh::dyn_cast<LogicalExpressionNode>(node))
    return getBinaryPrecedence(bin->_operator->str());

  if (llvh::isa<ConditionalExpressionNode>(node))
    return {kCondPrec, true};

  if (llvh::isa<AssignmentExpressionNode>(node))
    return {kAssignPrec, true};

  if (llvh::isa<YieldExpressionNode>(node))
    return kYieldPrec;

  if (llvh::isa<ArrowFunctionExpressionNode>(node))
    return kYieldPrec;

  if (llvh::isa<SequenceExpressionNode>(node))
    return {kSeqPrec, true};

  return kAlwaysParenPrec;
}