code: private static Set<String> findModifiedParameters(
        Node n, ImmutableSet<String> names, Set<String> unsafe, boolean inInnerFunction) {
      checkArgument(unsafe != null);
      if (n.isName()) {
        if (names.contains(n.getString()) && (inInnerFunction || canNameValueChange(n))) {
          unsafe.add(n.getString());
        }
      } else if (n.isFunction()) {
        // A function parameter can not be replaced with a direct inlined value
        // if it is referred to by an inner function. The inner function
        // can out live the call we are replacing, so inner function must
        // capture a unique name.  This approach does not work within loop
        // bodies so those are forbidden elsewhere.
        inInnerFunction = true;
      }
  
      for (Node c : n.children()) {
        findModifiedParameters(c, names, unsafe, inInnerFunction);
      }
  
      return unsafe;
    }
docs: Check for uses of the named value that imply a pass-by-value
  parameter is expected.  This is used to prevent cases like:
  
  function (x) {
  x=2;
  return x;
  }
  
  We don't want "undefined" to be substituted for "x", and get
  undefined=2
  
  @param n The node in question.
  @param parent The parent of the node.
  @param names The set of names to check.
  @param unsafe The set of names that require aliases.
  @param inInnerFunction Whether the inspection is occurring on a inner function.