code: @VisibleForTesting
    @GwtIncompatible("Unnecessary")
    void printBundleTo(Iterable<CompilerInput> inputs, Appendable out) throws IOException {
      // Prebuild ASTs before they're needed in getLoadFlags, for performance and because
      // StackOverflowErrors can be hit if not prebuilt.
      if (compiler.getOptions().numParallelThreads > 1) {
        new PrebuildAst(compiler, compiler.getOptions().numParallelThreads).prebuild(inputs);
      }
      if (!compiler.getOptions().preventLibraryInjection) {
        // ES6 modules will need a runtime in a bundle. Skip appending this runtime if there are no
        // ES6 modules to cut down on size.
        for (CompilerInput input : inputs) {
          if ("es6".equals(input.getLoadFlags().get("module"))) {
            appendRuntimeTo(out);
            break;
          }
        }
      }
  
      for (CompilerInput input : inputs) {
        String name = input.getName();
        String code = input.getSourceFile().getCode();
  
        // Ignore empty fill files created by the compiler to facilitate cross-module code motion.
        // Note that non-empty fill files (ones whose code has actually been moved into) are still
        // emitted. In particular, this ensures that if there are no (real) inputs the bundle will be
        // empty.
        if (Compiler.isFillFileName(name) && code.isEmpty()) {
          continue;
        }
  
        String rootRelativePath = rootRelativePathsMap.get(name);
        String displayName = rootRelativePath != null
            ? rootRelativePath
            : input.getName();
        out.append("//");
        out.append(displayName);
        out.append("\n");
  
        prepForBundleAndAppendTo(out, input, code);
  
        out.append("\n");
      }
    }
docs: Prints all the input contents, starting with a comment that specifies the input file name
  (using root-relative paths) before each file.