interpolateValues = (string, supplemental, createTreeNode) => {
    // If this is text and not a doctype, add as a text node.
    if (string && !doctypeEx.test(string) && !tokenEx.test(string)) {
      return t.arrayExpression([t.stringLiteral('#text'), t.stringLiteral(string)]);
    }

    const childNodes = [];
    const parts = string.split(tokenEx);
    let { length } = parts;

    for (let i = 0; i < length; i++) {
      const value = parts[i];

      // When we split on the token expression, the capture group will replace
      // the token's position. So all we do is ensure that we're on an odd
      // index and then we can source the correct value.
      if (i % 2 === 1) {
        const nextValue = supplemental.children[value];
        const isFragment = nextValue && nextValue.nodeType === 11;

        if (!nextValue) continue;

        if (typeof nextValue.rawNodeName === 'string' && isFragment) {
          childNodes.push(...nextValue.childNodes);
        }
        else {
          if (nextValue.type === 'StringLiteral' || nextValue.type === 'NumberLiteral') {
            childNodes.push(t.callExpression(createTreeNode, [t.stringLiteral('#text'), nextValue]));
          }
          else {
            childNodes.push(nextValue);
          }
        }
      }
      else if (!doctypeEx.test(value) && value) {
        childNodes.push(t.callExpression(createTreeNode, [t.stringLiteral('#text'), t.stringLiteral(value)]));
      }
    }

    let retVal = null;

    // If no children were present, send back an empty text node.
    if (childNodes.length === 0) {
      retVal = t.callExpression(
        createTreeNode,
        [t.stringLiteral('#text'), t.stringLiteral('')],
      );
    }
    // Wrap multiple nodes in a fragment.
    else if (childNodes.length > 1) {
      retVal = t.callExpression(createTreeNode, [
        t.stringLiteral('#document-fragment'),
        t.arrayExpression(childNodes),
      ]);
    }
    else {
      retVal = childNodes[0];
    }

    return t.arrayExpression([retVal]);
  }
Transpiles a matching tagged template literal to createTree calls, the
end goal avoids HTML parsing at runtime.

@return {Object} containing the visitor handler.