   end
 
   @doc false
+  @spec encoded_expr(Macro.t()) :: Macro.t()
   def encoded_expr(expr) do
     quote @anno do
       Drab.Core.encode_js(unquote(expr))
     end
   end
 
+  @spec line_from_expr(Macro.t()) :: integer | nil
   defp line_from_expr({_, meta, _}) when is_list(meta), do: Keyword.get(meta, :line)
   defp line_from_expr(_), do: nil
 
   # @doc false
   # defp to_safe(literal), do: to_safe(literal, @anno)
 
+  @spec to_safe(Macro.t(), integer | nil) :: iodata
   defp to_safe(literal, _line) when is_binary(literal) or is_atom(literal) or is_number(literal) do
     Phoenix.HTML.Safe.to_iodata(literal)
   end

    |> Enum.map(&expr_from_cache/1)
  end

  defp expr_from_cache(text) do
    # TODO: not sure
    case Regex.run(@expr, text) do

    if p, do: List.last(p), else: nil
  end

  @spec find_attr_in_html(String.t()) :: String.t() | nil
  defp find_attr_in_html(html) do
    args_removed = args_removed(html)

