anchor.diff:         ?f("-export([find_enum_def/1, fetch_enum_def/1]).~n"),
          format_enum_value_symbol_converter_exports(Defs),
          ?f("-export([get_package_name/0]).~n"),
  +       ?f("-export([get_service_def/0]).~n"),
  +       ?f("-export([get_rpc_names/0]).~n"),
  +       ?f("-export([find_rpc_def/1, fetch_rpc_def/1]).~n"),
          [?f("-export([descriptor/0]).~n") || get_gen_descriptor_by_opts(Opts)],
          ?f("-export([gpb_version_as_string/0, gpb_version_as_list/0]).~n"),
          "\n",
  
positive.code:      ?f("~n"),
       format_enum_value_symbol_converters(EnumDefs),
       ?f("~n"),
       format_get_package_name(Defs),
       ?f("~n"),
       format_descriptor(Defs, Opts)
      ].
  
  def_trees(EnumDefs, MsgDefs, Opts) ->
      EnumDefTrees = [erl_parse:abstract(EnumDef) || EnumDef <- EnumDefs],
      MsgDefTrees = [msg_def_tree(MsgDef, Opts) || MsgDef <- MsgDefs],
      erl_syntax:list(EnumDefTrees ++ MsgDefTrees).
  
negative.code: format_introspection(Defs, Opts) ->
      MsgDefs  = [Item || {{msg, _}, _}=Item <- Defs],
      EnumDefs = [Item || {{enum, _}, _}=Item <- Defs],
      {ServiceDef, RpcDefs} = case [{Item, Rpcs} || {{service, _}, Rpcs}=Item <- Defs] of
          [{Service, Rpcs}] ->
              {Service, Rpcs};
          _ -> 
              {undefined, []}
      end,
      [gpb_codegen:format_fn(
         get_msg_defs, fun() -> '<Defs>' end,
         [replace_tree('<Defs>', msg_def_trees(EnumDefs, MsgDefs, Opts))]),
       "\n",
       gpb_codegen:format_fn(
         get_msg_names, fun() -> '<Names>' end,
  