code: private Config parseConfiguration(String function) {
      // Looks like this function_name(,$,)
      int first = function.indexOf('(');
      int last = function.indexOf(')');
      int colon = function.indexOf(EXCLUSION_PREFIX);
  
      // TODO(johnlenz): Make parsing precondition checks JSErrors reports.
      checkState(first != -1 && last != -1);
  
      String name = function.substring(0, first);
      String params = function.substring(first + 1, last);
  
      int paramCount = 0;
      List<Integer> replacementParameters = new ArrayList<>();
      String[] parts = params.split(",");
      for (String param : parts) {
        paramCount++;
        if (param.equals(REPLACE_ALL_MARKER)) {
          checkState(paramCount == 1 && parts.length == 1);
          replacementParameters.add(Config.REPLACE_ALL_VALUE);
        } else if (param.equals(REPLACE_ONE_MARKER)) {
          // TODO(johnlenz): Support multiple.
          checkState(!replacementParameters.contains(Config.REPLACE_ALL_VALUE));
          replacementParameters.add(paramCount);
        } else {
          // TODO(johnlenz): report an error.
          Preconditions.checkState(param.isEmpty(), "Unknown marker", param);
        }
      }
  
      checkState(!replacementParameters.isEmpty());
  
      return new Config(
          name,
          replacementParameters,
          colon == -1
              ? ImmutableSet.of()
              : ImmutableSet.copyOf(
                  function.substring(colon + EXCLUSION_PREFIX.length()).split(",")));
    }
docs: Convert the provide string into a Config. The string can be a static function: foo(,,?)
  foo.bar(?) or a class method: foo.prototype.bar(?) And is allowed to either replace all
  parameters using "*" or one parameter "?". "," is used as a placeholder for ignored parameters.