Packages
zotonic_stdlib
1.31.0
1.31.2
1.31.1
1.31.0
1.30.1
1.30.0
1.29.1
1.29.0
1.28.1
1.28.0
1.27.0
1.26.1
1.25.0
1.24.0
1.23.1
1.23.0
1.22.0
1.21.0
1.20.3
1.20.2
1.20.1
1.20.0
1.19.0
1.18.0
1.17.0
1.16.0
1.15.1
1.15.0
1.14.0
1.13.0
1.12.0
1.11.2
1.11.1
1.11.0
1.10.0
1.9.0
1.8.0
1.7.0
1.6.0
1.5.11
1.5.10
1.5.9
1.5.8
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.11
1.2.10
1.2.9
1.2.8
1.2.7
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.0
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-alpha5
1.0.0-alpha4
1.0.0-alpha3
1.0.0-alpha2
1.0.0-alpha1
Zotonic standard library
Current section
Files
Jump to
Current section
Files
src/z_cover.erl
%% @author Bob Ippolito <bob@mochimedia.com>
%% @copyright 2010 Mochi Media, Inc.
%% @doc Workarounds for various cover deficiencies.
-module(z_cover).
-export([get_beam/1, get_abstract_code/1,
get_clauses/2, clause_lookup_table/1]).
-export([clause_lookup_table/2]).
%% Internal
get_beam(Module) ->
{Module, Beam, _Path} = code:get_object_code(Module),
Beam.
get_abstract_code(Beam) ->
{ok, {_Module,
[{abstract_code,
{raw_abstract_v1, L}}]}} = beam_lib:chunks(Beam, [abstract_code]),
L.
get_clauses(Function, Code) ->
[L] = [Clauses || {function, _, FName, _, Clauses}
<- Code, FName =:= Function],
L.
clause_lookup_table(Module, Function) ->
clause_lookup_table(
get_clauses(Function,
get_abstract_code(get_beam(Module)))).
clause_lookup_table(Clauses) ->
lists:foldr(fun clause_fold/2, [], Clauses).
clause_fold({clause, _,
[InTerm],
_Guards=[],
[OutTerm]},
Acc) ->
try [{erl_parse:normalise(InTerm), erl_parse:normalise(OutTerm)} | Acc]
catch error:_ -> Acc
end;
clause_fold(_, Acc) ->
Acc.
%%
%% Tests
%%
-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
foo_table(a) -> b;
foo_table("a") -> <<"b">>;
foo_table(123) -> {4, 3, 2};
foo_table([list]) -> [];
foo_table([list1, list2]) -> [list1, list2, list3];
foo_table(ignored) -> some, code, ignored;
foo_table(Var) -> Var.
foo_table_test() ->
T = clause_lookup_table(?MODULE, foo_table),
[?assertEqual(V, foo_table(K)) || {K, V} <- T].
clause_lookup_table_test() ->
?assertEqual(b, foo_table(a)),
?assertEqual(ignored, foo_table(ignored)),
?assertEqual('Var', foo_table('Var')),
?assertEqual(
[{a, b},
{"a", <<"b">>},
{123, {4, 3, 2}},
{[list], []},
{[list1, list2], [list1, list2, list3]}],
clause_lookup_table(?MODULE, foo_table)).
-endif.