anchor.diff:          {function, 0, '__info__', 1, [
             functions_clause(Def),
             macros_clause(Defmacro),
  -          docs_clause(Module, Docs),
  -          moduledoc_clause(Line, Module, Docs),
             module_clause(Module),
             else_clause()
           ]}
  
positive.code:     true  ->
        elixir_errors:form_error(Line, File, ?MODULE, {internal_function_overridden, Pair});
      false ->
        Docs = elixir_compiler:get_opt(docs),
        {
          {attribute, Line, spec, {{'__info__', 1},
            [{type, Line, 'fun', [{type, Line, product, [ {type, Line, atom, []}]}, {type, Line, term, []} ]}]
  
negative.code: 
      Binary
    end).
  
  add_docs_chunk(Bin, Module, Line, true) ->
    {ok, _, Chunks0} = beam_lib:all_chunks(Bin),
    ChunkData = term_to_binary([
          {docs, get_docs(Module)},
          {moduledoc, get_moduledoc(Line, Module)}]),
    DocsChunk = {"ExDc", ChunkData},
    Chunks = [DocsChunk|Chunks0],
    {ok, NewBin} = beam_lib:build_module(Chunks),
    NewBin;
  
  add_docs_chunk(Bin, _, _, _) -> Bin.
  
  get_docs(Module) ->
    ordsets:from_list(
      [{Tuple, Line, Kind, Sig, Doc} ||
       {Tuple, Line, Kind, Sig, Doc} <- ets:tab2list(docs_table(Module)),
       Kind =/= type, Kind =/= opaque]).
  
  get_moduledoc(Line, Module) ->
    {Line, 'Elixir.Module':get_attribute(Module, moduledoc)}.
  
  
  check_module_availability(Line, File, Module) ->
    Reserved = ['Elixir.Any', 'Elixir.BitString', 'Elixir.Function', 'Elixir.PID',
  