code: @Override
    protected void visitVeLogNode(VeLogNode node) {
      // VeLogValidationPass enforces that the first child is either an open tag, or a placeholder for
      // an open tag. So this will be non-null at this point.
      HtmlOpenTagNode tag = node.getOpenTagNode();
      SourceLocation insertionLocation =
          tag.getSourceLocation()
              .getEndPoint()
              .offset(0, tag.isSelfClosing() ? -2 : -1)
              .asLocation(tag.getSourceLocation().getFilePath());
      FunctionNode funcNode =
          new FunctionNode(
              Identifier.create(VeLogFunction.NAME, insertionLocation),
              VeLogFunction.INSTANCE,
              insertionLocation);
      funcNode.addChild(node.getVeDataExpression().copy(new CopyState()));
      if (node.getLogonlyExpression() != null) {
        funcNode.addChild(node.getLogonlyExpression().copy(new CopyState()));
      }
      PrintNode attributeNode =
          new PrintNode(
              nodeIdGen.genId(),
              insertionLocation,
              /* isImplicit= */ true,
              /* expr= */ funcNode,
              /* attributes= */ ImmutableList.of(),
              ErrorReporter.exploding());
      tag.addChild(attributeNode);
      visitChildrenAllowingConcurrentModification(node);
    }
docs: Adds data-soylog attribute to the top-level DOM node in this {velog} block.