docs: private Map<PyExpr, PyExpr> collectVarNameListAndToPyExprMap() {
      Map<PyExpr, PyExpr> nodePyVarToPyExprMap = new LinkedHashMap<>();
      for (Map.Entry<String, MsgSubstUnitNode> entry : msgNode.getVarNameToRepNodeMap().entrySet()) {
        MsgSubstUnitNode substUnitNode = entry.getValue();
        PyExpr substPyExpr = null;
  
        if (substUnitNode instanceof MsgPlaceholderNode) {
          SoyNode phInitialNode = ((AbstractParentSoyNode<?>) substUnitNode).getChild(0);
  
          if (phInitialNode instanceof PrintNode
              || phInitialNode instanceof CallNode
              || phInitialNode instanceof RawTextNode) {
            substPyExpr =
                PyExprUtils.concatPyExprs(genPyExprsVisitor.exec(phInitialNode)).toPyString();
          }
  
          // when the placeholder is generated by HTML tags
          if (phInitialNode instanceof MsgHtmlTagNode) {
            substPyExpr =
                PyExprUtils.concatPyExprs(
                        genPyExprsVisitor.execOnChildren((ParentSoyNode<?>) phInitialNode))
                    .toPyString();
          }
        } else if (substUnitNode instanceof MsgPluralNode) {
          // Translates {@link MsgPluralNode#pluralExpr} into a Python lookup expression.
          // Note that {@code pluralExpr} represents the soy expression of the {@code plural} attr,
          // i.e. the {@code $numDrafts} in {@code {plural $numDrafts}...{/plural}}.
          substPyExpr = translateToPyExprVisitor.exec(((MsgPluralNode) substUnitNode).getExpr());
        } else if (substUnitNode instanceof MsgSelectNode) {
          substPyExpr = translateToPyExprVisitor.exec(((MsgSelectNode) substUnitNode).getExpr());
        }
  
        if (substPyExpr != null) {
          nodePyVarToPyExprMap.put(new PyStringExpr("'" + entry.getKey() + "'"), substPyExpr);
        }
      }
  
      return nodePyVarToPyExprMap;
    }