aboutsummaryrefslogtreecommitdiff
path: root/examples/dependencies.tm
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-09-07 00:03:17 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-09-07 00:03:17 -0400
commitc454bfa3c4c11b30aa03cde266e76466d2971c20 (patch)
treea49faba5510631f007fdabf54c956c1bfa35e4cd /examples/dependencies.tm
parent8670cbf9435c1ed20120f8106d2e58c77f57a552 (diff)
Some improvements
Diffstat (limited to 'examples/dependencies.tm')
-rw-r--r--examples/dependencies.tm48
1 files changed, 39 insertions, 9 deletions
diff --git a/examples/dependencies.tm b/examples/dependencies.tm
index e13e3621..6a5fdea5 100644
--- a/examples/dependencies.tm
+++ b/examples/dependencies.tm
@@ -1,24 +1,50 @@
-# Show dependency graph
+# Show a Tomo dependency graph
use file
-func build_dependency_graph(filename:Text, dependencies:&{Text:@{Text}}):
+USAGE := "Usage: dependencies <files...>"
+
+HELP := "
+ dependencies: Show a file dependency graph for Tomo source files.
+ $USAGE
+"
+
+func build_dependency_graph(filename:Text, dependencies:&{Text:@{Text}}, module=""):
reader := when LineReader.from_file(filename) is Failure(msg):
+ !! Failed: $msg
return
is Open(reader): reader
+ key := if module: module else: filename
+ if not dependencies:has(key):
+ dependencies:set(key, @{:Text})
+
while when reader:next_line() is Success(line):
- if line:matches($/{start}use {..}.tm/):
- import := line:replace($/{start}use {..}/, "\2")
+ if line:matches($/use {..}.tm/):
+ import := line:replace($/use {..}/, "\1")
resolved := relative_path(resolve_path(import, filename))
if resolved != "":
import = resolved
- if not dependencies:has(filename):
- dependencies:set(filename, @{:Text})
+ dependencies:get(key):add(import)
- dependencies:get(filename):add(import)
if not dependencies:has(import):
build_dependency_graph(import, dependencies)
+ else if line:matches($/use {id}/):
+ import := line:replace($/use {..}/, "\1")
+
+ dependencies:get(key):add(import)
+ files_path := resolve_path("~/.local/src/tomo/$import/lib$(import).files")
+ if files_path == "":
+ !! couldn't resolve: $files_path
+ skip if files_path == ""
+ when read(files_path) is Failure(msg):
+ !! couldn't read: $files_path $msg
+ skip
+ is Success(files_content):
+ for line in files_content:lines():
+ line_resolved := resolve_path(line, relative_to="~/.local/src/tomo/$import/")
+ skip if line_resolved == ""
+ build_dependency_graph(line_resolved, dependencies, module=import)
func get_dependency_graph(file:Text)->{Text:{Text}}:
graph := {:Text:@{Text}}
@@ -27,8 +53,12 @@ func get_dependency_graph(file:Text)->{Text:{Text}}:
return {f:deps[] for f,deps in graph}
func draw_tree(file:Text, dependencies:{Text:{Text}}, already_printed:&{Text}, prefix="", is_last=yes):
- color_file := if resolve_path(file): file else: "$\x1b[31;1m$file$\x1b[m"
-
+ color_file := if file:matches($/{id}/):
+ "$\x1b[34;1m$file$\x1b[m"
+ else if resolve_path(file) != "":
+ file
+ else:
+ "$\x1b[31;1m$file (could not resolve)$\x1b[m"
if already_printed:has(file):
say(prefix ++ (if is_last: "└── " else: "├── ") ++ color_file ++ " $\x1b[2m(recursive)$\x1b[m")