aboutsummaryrefslogtreecommitdiff
path: root/tools/find_action.nom
blob: e7e3f498e82514d833b893774565e9e47d9de549 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env nomsu -V4.8.10
#
    Find an action by its stub. Usage:
    nomsu tools/find_action.nom "foo %" file1 file2 directory1 ...
    Will print all the code locations and code that uses the stub.

use "lib/os.nom"
use "lib/consolecolor.nom"

%stub = (command line args).1
say "Looking for stub: \%stub..."
%files = ((command line args).% for % in 2 to (size of (command line args)))
for %path in %files:
    for file %filename in %path:
        unless (%filename::matches "%.nom$") (do next %filename)
        %file = (read file %filename)
        %tree = (parse %file from %filename)
        %results = []
        for %t in recursive %tree:
            if (%t is "Action" syntax tree):
                if (%t.stub is %stub):
                    %line_num = (line number of %t.source.start in %file)
                    %results::add {..}
                        line: %line_num
                        text: "\
                            ..\(blue "\%filename:\%line_num:")
                            \(yellow (source lines of %t))"
            
            if (%t is syntax tree):
                for %sub in %t: recurse %t on %sub
        
        sort %results by % -> %.line
        for % in %results: say %.text