Show only matching caller modules
[khome.git] / home / bin / erlcode-find-calls-to-module
CommitLineData
2b05907b
SK
1#! /bin/bash
2
3target_module="$1"
15f22284
SK
4target_fun_regex="$2"
5shift 2
2b05907b
SK
6dirs=$@
7
8find $dirs -type f -name '*.erl' -exec grep -Hn "\<$target_module\>:" '{}' \; \
9| sed 's/%.*$//g' \
15f22284
SK
10| awk \
11 -F "${target_module}:" \
12 -v target_module="$target_module" \
13 -v target_fun_regex="$target_fun_regex" '
2b05907b
SK
14 $1 && $2 {
15 caller_module_file = $1
16 sub(":.*$", "", caller_module_file)
17
18 called_function = $2
19 sub("\\(.*$", "", called_function)
20
21 if (called_function ~ /^[a-z][a-zA-Z_0-9]+$/) {
fc84ff9c 22 # Gather full API of the target_module
2b05907b 23 Calls[called_function]++
fc84ff9c
SK
24
25 # Gather target call sites
26 if (called_function ~ target_fun_regex) {
27 Calls_from[caller_module_file, called_function]++
28 Caller_modules[caller_module_file]++
29 }
2b05907b
SK
30 } else {
31 printf \
32 "[WARN] skipped an invalid erlang function name. File: \"%s\", function: \"%s\", original line: \"%s\"\n", \
33 caller_module_file, called_function, $0 \
34 > "/dev/stderr"
35 }
36 }
37
38 END {
39 indent = " "
40 for (caller_module_file in Caller_modules) {
41 print caller_module_file;
42 for (cf in Calls_from) {
43 split(cf, call, SUBSEP);
fc84ff9c 44 if (call[1] == caller_module_file)
2b05907b
SK
45 printf "%s%s\n", indent, call[2] | "sort";
46 }
47 close("sort")
48 }
49
50 print ""
51 printf "Inferred API of %s:\n", target_module
52 for (called_function in Calls)
53 printf "%s%s\n", indent, called_function | "sort"
54 close("sort")
55 }'
This page took 0.028061 seconds and 4 git commands to generate.