View Source Recode.Context (Recode v0.7.2)

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

Examples

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

iex> alias Rewrite.Source
...> alias Recode.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.Ex.from_string()
...> |> Source.get(:quoted)
...> |> Zipper.zip()
...> |> 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) |> Map.put(:node, nil)
%Context{
  node: nil,
  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: []
}

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 is available and not set to @doc false.

Returns true if @doc false.

Expands the module alias for the given mfa.

Returns true if an impl is available.

Returns the current module of a context.

Returns true if @moduledoc is available and not set to @moduledoc false.

Returns true if @moduledoc false.

Returns true if a spec is available.

Traverses the given zipper and applies fun on each node.

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

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,
  node: term() | nil,
  requirements: list(),
  spec: {term() | nil, Macro.t()} | nil,
  usages: list()
}
@type zipper() :: Sourceror.Zipper.t()

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()) :: boolean()

Returns true if @doc is available and not set to @doc false.

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

Returns true if @doc 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 available.

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

Returns the current module of a context.

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

Returns true if @moduledoc is available and not set to @moduledoc false.

Link to this function

moduledoc?(context, bool)

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

Returns true if @moduledoc false.

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

Returns true if a spec is available.

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

Traverses the given zipper and applies 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 applies fun on each node.