如何使用外部参照检索呼叫路径

时间:2016-02-04 06:07:36

标签: erlang

我正在尝试使用外部参照从一组模块的调用图中检索两个函数之间的路径。

考虑以下相互调用的函数:

x:a/1 -> y:b/1 -> y:c/1
x:d/1 -> y:e/1

使用查询:closure E | a:Mod || b:Mod将给出从模块a到模块b的任何直接或间接调用的路径的起点和终点的元组。因此对于上面的例子:

[{{x,a,1}, {y,b,1}},
 {{x,a,1}, {y,c,1}},
 {{x,d,1}, {y,e,1}}]

这是我正在寻找的调用图的路径集,但我也需要内部的顶点。对于上面的例子,这将是:

[[{x,a,1}, {y,b,1}],
 [{x,a,1}, {y,b,1}, {y,c,1}],
 [{x,d,1}, {y,e,1}]]

我已经尝试了XRef文档中给出的示例的各种变体。我确实理解查询语言对顶点和边的集合进行操作,但是没有掌握一些选择机制。

我正在使用rebar3的xref命令来处理查询,所有相关的代码都在我称之为rebar的项目中。我实际上是在尝试展示测试如何调用模块中的函数。

附带问题:是否有更温和的介绍外部参照查询语言?

1 个答案:

答案 0 :(得分:0)

希望您可以使用此代码段作为起点:

q(X) ->
    {ok, L} = xref:q(X, "closure E | x:Mod || y:Mod"),
    l(X, L).

l(_, []) -> [];
l(X, [{F,T}|L]) ->
    Q = io_lib:format("{~p, ~p} of E", [F, T]),
    {ok, Path} = xref:q(X, lists:flatten(Q)),
    [Path | l(X, L)].