aboutsummaryrefslogtreecommitdiff
path: root/examples/tomodeps.tm
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-09-15 17:50:43 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-09-15 17:50:43 -0400
commit8b512adbbcf62f49b3e92410e643c86f2e70908a (patch)
treeb3f5e08c6589bc7c00e2a089fbe5304cb60d742a /examples/tomodeps.tm
parent3d1a102a8d8425b8f4a08b78c77ee4b38f6de55b (diff)
Move each example to its own folder
Diffstat (limited to 'examples/tomodeps.tm')
-rw-r--r--examples/tomodeps.tm124
1 files changed, 0 insertions, 124 deletions
diff --git a/examples/tomodeps.tm b/examples/tomodeps.tm
deleted file mode 100644
index e3354136..00000000
--- a/examples/tomodeps.tm
+++ /dev/null
@@ -1,124 +0,0 @@
-# Show a Tomo dependency graph
-
-_USAGE := "Usage: dependencies <files...>"
-
-_HELP := "
- dependencies: Show a file dependency graph for Tomo source files.
- $_USAGE
-"
-
-enum Dependency(File(path:Path), Module(name:Text))
-
-func _get_file_dependencies(file:Path)->{Dependency}:
- if not file:is_file():
- !! Could not read file: $file
- return {:Dependency}
-
- deps := {:Dependency}
- if lines := file:by_line():
- for line in lines:
- if line:matches($/use {..}.tm/):
- file_import := Path.from_unsafe_text(line:replace($/use {..}/, "\1")):resolved(relative_to=file)
- deps:add(Dependency.File(file_import))
- else if line:matches($/use {id}/):
- module_name := line:replace($/use {..}/, "\1")
- deps:add(Dependency.Module(module_name))
- return deps
-
-func _build_dependency_graph(dep:Dependency, dependencies:&{Dependency:{Dependency}}):
- return if dependencies:has(dep)
-
- dependencies:set(dep, {:Dependency}) # Placeholder
-
- dep_deps := when dep is File(path):
- _get_file_dependencies(path)
- is Module(module):
- files_path := (~/.local/src/tomo/$module/lib$module.files):resolved()
- if not files_path:is_file():
- !! Could not read file: $files_path
- return
-
- unvisited := {:Path}
- if lines := files_path:by_line():
- for line in lines:
- tm_path := Path.from_unsafe_text(line):resolved(relative_to=(~/.local/src/tomo/$module/))
- unvisited:add(tm_path)
-
- module_deps := {:Dependency}
- visited := {:Path}
- while unvisited.length > 0:
- file := unvisited.items[-1]
- unvisited:remove(file)
- visited:add(file)
-
- for file_dep in _get_file_dependencies(file):
- when file_dep is File(f):
- if not visited:has(f):
- unvisited:add(f)
- is Module(m):
- module_deps:add(file_dep)
- module_deps
-
- dependencies:set(dep, dep_deps)
-
- for dep2 in dep_deps:
- _build_dependency_graph(dep2, dependencies)
-
-func get_dependency_graph(dep:Dependency)->{Dependency:{Dependency}}:
- graph := {:Dependency:{Dependency}}
- _build_dependency_graph(dep, &graph)
- return graph
-
-func _printable_name(dep:Dependency)->Text:
- when dep is Module(module):
- return "$(\x1b)[34;1m$module$(\x1b)[m"
- is File(f):
- f = f:relative()
- if f:exists():
- return "$(f.text_content)"
- else:
- return "$(\x1b)[31;1m$(f.text_content) (not found)$(\x1b)[m"
-
-func _draw_tree(dep:Dependency, dependencies:{Dependency:{Dependency}}, already_printed:&{Dependency}, prefix="", is_last=yes):
- if already_printed:has(dep):
- say(prefix ++ (if is_last: "└── " else: "├── ") ++ _printable_name(dep) ++ " $\x1b[2m(recursive)$\x1b[m")
- return
-
- say(prefix ++ (if is_last: "└── " else: "├── ") ++ _printable_name(dep))
- already_printed:add(dep)
-
- child_prefix := prefix ++ (if is_last: " " else: "│ ")
-
- children := dependencies:get(dep):or_else({:Dependency})
- for i,child in children.items:
- is_child_last := (i == children.length)
- _draw_tree(child, dependencies, already_printed, child_prefix, is_child_last)
-
-func draw_tree(dep:Dependency, dependencies:{Dependency:{Dependency}}):
- printed := {:Dependency}
- say(_printable_name(dep))
- printed:add(dep)
- deps := dependencies:get(dep):or_else({:Dependency})
- for i,child in deps.items:
- is_child_last := (i == deps.length)
- _draw_tree(child, dependencies, already_printed=&printed, is_last=is_child_last)
-
-func main(files:[Text]):
- if files.length == 0:
- exit("
- Please provide at least one file!
- $_USAGE
- ")
-
- for arg in files:
- if arg:matches($/{..}.tm/):
- path := Path.from_unsafe_text(arg):resolved()
- dependencies := get_dependency_graph(File(path))
- draw_tree(File(path), dependencies)
- else if arg:matches($/{id}/):
- dependencies := get_dependency_graph(Module(arg))
- draw_tree(Module(arg), dependencies)
- else:
- say("$\x1b[2mSkipping $arg$\x1b[m")
- skip
-