aboutsummaryrefslogtreecommitdiff
path: root/tools/find_action.nom
blob: c6cbe36fcd400a0f09081d63403918950c0f692c (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
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/env nomsu -V4.11.12.8
#
    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..."
for % in 2 to (size of (command line args)):
    for %filename in (files for (command line args).%):
        if (%filename == "-"):
            %filename = "stdin"
        
        unless ((%filename == "stdin") or (%filename::matches "%.nom$")):
            do next %filename
        
        %file = (read file %filename)
        %code = (NomsuCode from (%Source %filename 1 (size of %file)) %file)
        try:
            %tree = (%code parsed)
        ..and if it barfs %msg:
            say (red "\%filename failed to parse:\n\%msg")
            %tree = (nil)
        
        unless %tree:
            do next %filename
        
        %results = []
        for %t in recursive %tree:
            if ((%t is "Action" syntax tree) and (%t.stub is %stub)):
                %line_num = (%file::line number at %t.source.start)
                %results::add {..}
                    line: %line_num, text: "\(blue "\%filename:\%line_num:")\n\(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