#!/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