summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Linzberger <e@lefant.net>2011-09-22 15:01:22 +0200
committerTuncer Ayaz <tuncer.ayaz@gmail.com>2011-10-20 16:37:41 +0200
commit176ec0e71e37c53b541cd1eed1abd04206b97199 (patch)
tree8e9260377536170de53027d38997a390d362ddcc
parent3c7a5804e9c24fb0f34e62e2d1603b07a723d61a (diff)
Work around functions not found in source
For parameterized modules, the beam code will have a compiler generated new/1 and instance/1 function. If while checking the beam, xref detects one of those is unused, the rebars xref wrapper will try to find the location of the definition of that function in the source code for the module (to give a more specific warning to the user). Since the function was generated by the compiler it does not actually exist in the source, and rebar crashes at that stage. This patch works around that issue.
-rw-r--r--src/rebar_xref.erl16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/rebar_xref.erl b/src/rebar_xref.erl
index c210486..84d422e 100644
--- a/src/rebar_xref.erl
+++ b/src/rebar_xref.erl
@@ -188,8 +188,14 @@ find_mfa_source({M, F, A}) ->
%% Extract the original source filename from the abstract code
[{attribute, 1, file, {Source, _}} | _] = Code,
%% Extract the line number for a given function def
- [{function, Line, F, _, _}] = [E || E <- Code,
- safe_element(1, E) == function,
- safe_element(3, E) == F,
- safe_element(4, E) == A],
- {Source, Line}.
+ Fn = [E || E <- Code,
+ safe_element(1, E) == function,
+ safe_element(3, E) == F,
+ safe_element(4, E) == A],
+ case Fn of
+ [{function, Line, F, _, _}] -> {Source, Line};
+ %% do not crash if functions are exported, even though they
+ %% are not in the source.
+ %% parameterized modules add new/1 and instance/1 for example.
+ [] -> {Source, function_not_found}
+ end.