lib/hologram/compiler/ir.ex

defmodule Hologram.Compiler.IR do
  # TYPES

  defmodule AnonymousFunctionType do
    defstruct arity: nil, params: [], bindings: [], body: []
  end

  defmodule AtomType do
    defstruct value: nil
  end

  defmodule BinaryType do
    defstruct parts: []
  end

  defmodule BooleanType do
    defstruct value: nil
  end

  defmodule IntegerType do
    defstruct value: nil
  end

  defmodule ListType do
    defstruct data: []
  end

  defmodule MapType do
    defstruct data: []
  end

  defmodule ModuleType do
    defstruct module: nil
  end

  defmodule NilType do
    defstruct []
  end

  defmodule StringType do
    defstruct value: nil
  end

  defmodule StructType do
    defstruct module: nil, data: []
  end

  defmodule TupleType do
    defstruct data: []
  end

  # OPERATORS

  defmodule AccessOperator do
    defstruct data: nil, key: nil
  end

  defmodule AdditionOperator do
    defstruct left: nil, right: nil
  end

  defmodule BooleanAndOperator do
    defstruct left: nil, right: nil
  end

  defmodule DotOperator do
    defstruct left: nil, right: nil
  end

  defmodule EqualToOperator do
    defstruct left: nil, right: nil
  end

  defmodule MatchOperator do
    defstruct bindings: [], left: nil, right: nil
  end

  defmodule ModuleAttributeOperator do
    defstruct name: nil
  end

  defmodule TypeOperator do
    defstruct left: nil, right: nil
  end

  # DEFINITIONS

  defmodule FunctionDefinition do
    defstruct module: nil,
              name: nil,
              arity: nil,
              params: [],
              bindings: [],
              body: [],
              visibility: nil
  end

  defmodule FunctionDefinitionVariants do
    defstruct name: nil, variants: []
  end

  # DEFER: implement
  defmodule FunctionHead do
    defstruct []
  end

  defmodule MacroDefinition do
    defstruct module: nil, name: nil, arity: nil, params: [], bindings: [], body: []
  end

  defmodule ModuleDefinition do
    defstruct module: nil,
              uses: [],
              imports: [],
              requires: [],
              aliases: [],
              attributes: [],
              functions: [],
              macros: [],
              component?: nil,
              layout?: nil,
              page?: nil,
              templatable?: nil
  end

  defmodule ModuleAttributeDefinition do
    defstruct name: nil, value: nil
  end

  # DEFER: implement
  defmodule ProtocolDefinition do
    defstruct []
  end

  # DIRECTIVES

  defmodule AliasDirective do
    defstruct module: nil, as: nil
  end

  defmodule ImportDirective do
    defstruct module: nil, only: nil
  end

  defmodule RequireDirective do
    defstruct module: nil
  end

  defmodule UseDirective do
    defstruct module: nil, opts: []
  end

  # CONTROL FLOW

  defmodule IfExpression do
    defstruct condition: nil, do: nil, else: nil, ast: nil
  end

  # ACCESS

  defmodule MapAccess do
    defstruct key: nil
  end

  # OTHER

  defmodule FunctionCall do
    defstruct module: nil, function: nil, args: []
  end

  defmodule Quote do
    defstruct body: []
  end

  defmodule ModulePseudoVariable do
    defstruct []
  end

  defmodule Unquote do
    defstruct expression: nil
  end

  defmodule Typespec do
    defstruct []
  end

  defmodule Variable do
    defstruct name: nil
  end

  # NOT SUPPORTED

  defmodule NotSupportedExpression do
    defstruct ast: nil, type: nil
  end
end