Statifier.Machine.Content.Send (Statifier v2.0.0)

Copy Markdown View Source

A compiled <send> executable-content node (spec 6.2) - the interned counterpart to Statifier.Document.Send.

event, target, type, and delay each fold their own static/expr attribute pair into a single Machine.expr() | nil, mirroring Statifier.Machine.Invoke.type/.src: {:static, v} from event/target/type/delay, {:compiled, ...} from eventexpr/targetexpr/typeexpr/delayexpr, nil when neither sibling was written (an already-validated document never writes both - 6.2.1's "Must not occur with" pairs).

id is the author's literal id attribute, used verbatim (ADR-0008 as amended). idlocation stays a raw, uncompiled location path string, never a compiled expression - Statifier.Machine.Invoke.idlocation's own moduledoc gives the reason: a location path cannot be resolved any earlier than execute time, even in principle.

namelist and params are kept as two separate lists of Statifier.Machine.Param.t(), every namelist entry compiled with kind: :location - the same split Statifier.Machine.Invoke keeps for its own namelist/params, so the validator can enforce 6.2.1's "namelist Must not occur with the <param> element". A namelist entry that fails to compile as a location expression does not fail Statifier.Compiler.compile/1: it carries {:invalid, error} on the entry's expr (5.9.4 deferral, see Statifier.Machine.Param) and is discarded at execute time - resolve_params/2 below - rather than at load time.

content folds <content>'s markup into a single Machine.expr(), exactly as Machine.Invoke.content and Machine.Donedata.expr do - nil when <send> has no <content> child.

attribute_locations is Statifier.Document.Send's own map, carried through unchanged rather than distilled into individual *_location fields - the same call Statifier.Machine.Invoke's moduledoc makes for its own eight source attributes.

Its Statifier.ExecutableContent implementation lives right below the struct: this file is the whole node, top to bottom, with no dispatcher anywhere else in the tree.

Summary

Types

t()

@type t() :: %Statifier.Machine.Content.Send{
  attribute_locations: Statifier.Document.attribute_locations(),
  c_index: non_neg_integer(),
  content: Statifier.Machine.expr() | nil,
  delay: Statifier.Machine.expr() | nil,
  event: Statifier.Machine.expr() | nil,
  id: String.t() | nil,
  idlocation: String.t() | nil,
  location: Statifier.Parser.Location.t(),
  namelist: [Statifier.Machine.Param.t()],
  params: [Statifier.Machine.Param.t()],
  target: Statifier.Machine.expr() | nil,
  type: Statifier.Machine.expr() | nil
}