docs: public List<String> genJsSrc(
        SoyFileSetNode soyTree,
        TemplateRegistry templateRegistry,
        SoyJsSrcOptions jsSrcOptions,
        @Nullable SoyMsgBundle msgBundle,
        ErrorReporter errorReporter) {
  
      // VeLogInstrumentationVisitor add html attributes for {velog} commands and also run desugaring
      // pass since code generator does not understand html nodes (yet).
      new VeLogInstrumentationVisitor(templateRegistry).exec(soyTree);
      BidiGlobalDir bidiGlobalDir =
          SoyBidiUtils.decodeBidiGlobalDirFromJsOptions(
              jsSrcOptions.getBidiGlobalDir(), jsSrcOptions.getUseGoogIsRtlForBidiGlobalDir());
      try (SoyScopedData.InScope inScope = apiCallScope.enter(msgBundle, bidiGlobalDir)) {
        // Replace MsgNodes.
        if (jsSrcOptions.shouldGenerateGoogMsgDefs()) {
          Preconditions.checkState(
              bidiGlobalDir != null,
              "If enabling shouldGenerateGoogMsgDefs, must also set bidi global directionality.");
        } else {
          Preconditions.checkState(
              bidiGlobalDir == null || bidiGlobalDir.isStaticValue(),
              "If using bidiGlobalIsRtlCodeSnippet, must also enable shouldGenerateGoogMsgDefs.");
          new InsertMsgsVisitor(msgBundle, errorReporter).insertMsgs(soyTree);
        }
        // Combine raw text nodes before codegen.
        new CombineConsecutiveRawTextNodesPass().run(soyTree);
        return createVisitor(jsSrcOptions, typeRegistry, inScope.getBidiGlobalDir(), errorReporter)
            .gen(soyTree, templateRegistry, errorReporter);
      }
    }