code: private void backwardsInferenceFromCallSite(Node n, FunctionType fnType, FlowScope scope) {
      boolean updatedFnType = inferTemplatedTypesForCall(n, fnType, scope);
      if (updatedFnType) {
        fnType = n.getFirstChild().getJSType().toMaybeFunctionType();
      }
      updateTypeOfArguments(n, fnType);
      updateBind(n);
    }
docs: We only do forward type inference. We do not do full backwards type inference.
  
  In other words, if we have,
  <code>
  var x = f();
  g(x);
  </code>
  a forward type-inference engine would try to figure out the type
  of "x" from the return type of "f". A backwards type-inference engine
  would try to figure out the type of "x" from the parameter type of "g".
  
  <p>However, there are a few special syntactic forms where we do some some half-assed backwards
  type-inference, because programmers expect it in this day and age. To take an example from
  Java,
  <code>
  List<String> x = Lists.newArrayList();
  </code>
  The Java compiler will be able to infer the generic type of the List returned by
  newArrayList().
  
  <p>In much the same way, we do some special-case backwards inference for JS. Those cases are
  enumerated here.