View Source Recode.Context (Recode v0.1.0)

This moudle provides functions to traverse an AST with a %Context{}.

examples

Examples

The following example shows the %Context{} for the definition of MyApp.Bar.bar/1.

iex> alias Recode.{Source, Context}
...> """
...> defmodule MyApp.Foo do
...>   def foo, do: :foo
...> end
...>
...> defmodule MyApp.Bar do
...>   alias MyApp.Foo
...>
...>   def bar(x) do
...>     {Foo.foo(), x}
...>   end
...> end
...> """
...> |> Source.from_string()
...> |> Source.zipper()
...> |> Context.traverse(nil, fn
...>   zipper, context, nil ->
...>     case context.definition do
...>       {{:def, :bar, 1}, _meta} -> {zipper, context, context}
...>       _def -> {zipper, context, nil}
...>     end
...>   zipper, context, acc ->
...>     {zipper, context, acc}
...> end)
...> |> elem(1)
%Context{
  aliases: [
    {MyApp.Foo,
     [
       trailing_comments: [],
       leading_comments: [],
       end_of_expression: [newlines: 2, line: 6, column: 18],
       line: 6,
       column: 3
     ], nil}
  ],
  assigns: %{},
  definition:
    {{:def, :bar, 1},
     [
       trailing_comments: [],
       leading_comments: [],
       do: [line: 8, column: 14],
       end: [line: 10, column: 3],
       line: 8,
       column: 3
     ]},
  imports: [],
  module:
    {MyApp.Bar,
     [
       trailing_comments: [],
       leading_comments: [],
       do: [line: 5, column: 21],
       end: [line: 11, column: 1],
       line: 5,
       column: 1
     ]},
  requirements: [],
  usages: []
}

Link to this section Summary

Functions

Assigns the given value under key to the context.

Merges the given map to the assigns of the context.

Returns true if definition satisfies the assumption.

Returns true if @doc has the given value.

Expands the module alias for the given mfa.

Returns true if an impl is availbale.

Returns the current module of a context.

Returns true if @moduledoc has the given value.

Returns true if a spec is availbale.

Traverses the given zipper and applys fun on each node.

Traverses the given zipper with an acc and applys fun on each node.

Link to this section Types

@type t() :: %Recode.Context{
  aliases: list(),
  assigns: map(),
  definition: term(),
  doc: {term() | nil, Macro.t()} | nil,
  impl: {term() | nil, Macro.t()} | nil,
  imports: list(),
  module: term() | nil,
  moduledoc: Macro.t() | nil,
  requirements: list(),
  spec: {term() | nil, Macro.t()} | nil,
  usages: list()
}
@type zipper() :: Sourceror.Zipper.zipper()

Link to this section Functions

Link to this function

assign(context, key, value)

View Source
@spec assign(t(), atom(), term()) :: t()

Assigns the given value under key to the context.

@spec assigns(t(), map()) :: t()

Merges the given map to the assigns of the context.

Link to this function

definition?(context, atom)

View Source
@spec definition?(t(), :public | :visible) :: boolean()

Returns true if definition satisfies the assumption.

@spec doc?(t(), term()) :: boolean()

Returns true if @doc has the given value.

Usually used to check if @doc is set to false:

Context.moduledoc?(context, false)
Link to this function

expand_mfa(context, arg)

View Source
@spec expand_mfa(t(), mfa()) :: {:ok, mfa()} | :error

Expands the module alias for the given mfa.

@spec impl?(t()) :: boolean()

Returns true if an impl is availbale.

@spec module(t()) :: module() | nil

Returns the current module of a context.

Link to this function

moduledoc?(context, value)

View Source
@spec moduledoc?(t(), term()) :: boolean()

Returns true if @moduledoc has the given value.

Usually used to check if @moduldoc is set to false:

Context.moduledoc?(context, false)
@spec spec?(t()) :: boolean()

Returns true if a spec is availbale.

@spec traverse(zipper(), fun) :: zipper() when fun: (zipper(), t() -> {zipper(), t()})

Traverses the given zipper and applys fun on each node.

The fun gets the current zipper and context as arguments.

Link to this function

traverse(zipper, acc, fun)

View Source
@spec traverse(zipper(), acc, fun) :: {zipper(), acc}
when acc: term(), fun: (zipper(), t(), acc -> {zipper(), t(), acc})

Traverses the given zipper with an acc and applys fun on each node.