# `Reach.IR.Node`
[🔗](https://github.com/elixir-vibe/reach/blob/v2.2.0/lib/reach/ir/node.ex#L1)

A node in the internal representation.

Every node is an expression or sub-expression, following the expression-oriented
approach (EDG) rather than statement-oriented (classic PDG).

# `id`

```elixir
@type id() :: non_neg_integer()
```

# `node_type`

```elixir
@type node_type() ::
  :entry
  | :exit
  | :block
  | :literal
  | :var
  | :match
  | :call
  | :case
  | :clause
  | :guard
  | :fn
  | :try
  | :rescue
  | :catch_clause
  | :after
  | :receive
  | :comprehension
  | :generator
  | :filter
  | :binary_op
  | :unary_op
  | :tuple
  | :list
  | :cons
  | :map
  | :map_field
  | :struct
  | :pin
  | :access
  | :module_def
  | :function_def
  | :dispatch
```

# `source_span`

```elixir
@type source_span() :: %{
  file: String.t() | nil,
  start_line: pos_integer(),
  start_col: pos_integer(),
  end_line: pos_integer() | nil,
  end_col: pos_integer() | nil
}
```

# `t`

```elixir
@type t() :: %Reach.IR.Node{
  children: [t()],
  id: id(),
  meta: map(),
  source_span: source_span() | nil,
  type: node_type()
}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
