code: @Override
    protected void visitHtmlAttributeNode(HtmlAttributeNode node) {
      IncrementalDomCodeBuilder jsCodeBuilder = getJsCodeBuilder();
  
      if (node.hasValue()) {
        // Attribute keys can only be print statements or constants. As such, the first child
        // should be the key and the second the value.
        checkState(isComputableAsJsExprsVisitor.exec(node.getChild(0)));
  
        jsCodeBuilder.append(
            INCREMENTAL_DOM_ATTR.call(
                // Attributes can only be print nodes or constants
                genJsExprsVisitor.exec(node.getChild(0)).get(0),
                CodeChunkUtils.concatChunksForceString(getAttributeValues(node))));
      } else {
        visitChildren(node); // Prints raw text or attributes node.
      }
    }
docs: Visits the {@link HtmlAttributeNode}. The attribute nodes will typically be children of the
  corresponding {@link HtmlOpenTagNode} or in a let/param of kind attributes, e.g.
  
  <pre>
  {let $attrs kind="attributes"}
  attr="value"
  {/let}
  </pre>
  
  This method prints the attribute declaration calls. For example, given
  
  <pre>
  &lt;div {if $condition}attr="value"{/if}&gt;
  </pre>
  
  it would print the call to {@code incrementalDom.attr}, resulting in:
  
  <pre>
  if (condition) {
  IncrementalDom.attr(attr, "value");
  }
  </pre>