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;
}