createTextBinding method

NodeReference createTextBinding(
  1. BindingSource text,
  2. CompileElement parent,
  3. int nodeIndex
)

Implementation

NodeReference createTextBinding(
  ir.BindingSource text,
  CompileElement parent,
  int nodeIndex,
) {
  final renderNode = _textNode(text, nodeIndex);
  final parentNode = _getParentRenderNode(parent);
  final isImmutable = text.isImmutable;
  if (parentNode != o.nullExpr) {
    if (isImmutable) {
      // Phase 3 (SSR): Use RenderNode factory for SSR compatibility.
      // We do not create a class-level member, effectively "one-time".
      final createText =
          o.importExpr(RenderNodeHelpers.createRenderText).callFn([
        _textValue(text),
      ]);
      _createMethod.addStmt(renderNode.toWriteStmt(createText));
      // Use appendRenderChild helper for SSR compatibility
      _createMethod.addStmt(o.importExpr(RenderNodeHelpers.appendRenderChild)
          .callFn([parentNode, renderNode.toReadExpr()]).toStmt());
    } else {
      // A class-level member is created in a previous phase, and all we need
      // to do is append it to its parent (and detectChanges will handle
      // updating it).
      _createMethod.addStmt(o.importExpr(RenderNodeHelpers.appendRenderChild)
          .callFn([parentNode, renderNode.toReadExpr()]).toStmt());
    }
  } else if (isImmutable) {
    // Phase 3 (SSR): Use RenderNode factory for SSR compatibility.
    // Text is being appended or otherwise used somewhere else in the build
    // (it does not start attached). Store it so initRootNode can use it.
    final createText =
        o.importExpr(RenderNodeHelpers.createRenderText).callFn([
      _textValue(text),
    ]);
    _createMethod.addStmt(renderNode.toWriteStmt(createText));
  } else {
    // A mutable string without being appended to anything.
    // For example, text nodes that are attached to the root node use the
    // initN(...) function to append themselves, and not ".append".
  }
  return renderNode;
}