aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-09-07 00:26:30 -0400
committerBruce Hill <bruce@bruce-hill.com>2024-09-07 00:26:30 -0400
commit3f16e95127de7a5eb58801406435f4fd8f5712f6 (patch)
tree9ef1ae104269ba1040c05eebc279f92f97fae492 /examples
parentc454bfa3c4c11b30aa03cde266e76466d2971c20 (diff)
USAGE and HELP need an underscore prefix so they're not imported into
other files. Also fixed up dependency tool so it works good now
Diffstat (limited to 'examples')
-rw-r--r--examples/dependencies.tm98
-rw-r--r--examples/ini.tm8
2 files changed, 72 insertions, 34 deletions
diff --git a/examples/dependencies.tm b/examples/dependencies.tm
index 6a5fdea5..3719e074 100644
--- a/examples/dependencies.tm
+++ b/examples/dependencies.tm
@@ -1,55 +1,93 @@
# Show a Tomo dependency graph
use file
-USAGE := "Usage: dependencies <files...>"
+_USAGE := "Usage: dependencies <files...>"
-HELP := "
+_HELP := "
dependencies: Show a file dependency graph for Tomo source files.
- $USAGE
+ $_USAGE
"
-func build_dependency_graph(filename:Text, dependencies:&{Text:@{Text}}, module=""):
- reader := when LineReader.from_file(filename) is Failure(msg):
+func get_module_imports_from_file(file:Text, imports:&{Text}, visited_files:&{Text}):
+ return if visited_files:has(file)
+
+ reader := when LineReader.from_file(file) 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})
+ visited_files:add(file)
while when reader:next_line() is Success(line):
if line:matches($/use {..}.tm/):
- import := line:replace($/use {..}/, "\1")
- resolved := relative_path(resolve_path(import, filename))
+ local_import := line:replace($/use {..}/, "\1")
+ resolved := relative_path(resolve_path(local_import, file))
if resolved != "":
- import = resolved
+ local_import = resolved
+ get_module_imports_from_file(local_import, imports, visited_files)
+ else if line:matches($/use {id}/):
+ other_module := line:replace($/use {..}/, "\1")
+ imports:add(other_module)
+
+func get_module_imports_from_module(module:Text)->{Text}:
+ files_path := resolve_path("~/.local/src/tomo/$module/lib$(module).files")
+ if files_path == "":
+ !! couldn't resolve: $files_path
+ return {:Text}
+
+ when read(files_path) is Failure(msg):
+ !! couldn't read: $files_path $msg
+ return {:Text}
+ is Success(files_content):
+ imports := {:Text}
+ visited := {:Text}
+ for line in files_content:lines():
+ line_resolved := resolve_path(line, relative_to="~/.local/src/tomo/$module/")
+ skip if line_resolved == ""
+ get_module_imports_from_file(line_resolved, &imports, &visited)
+ return imports
+
+func build_module_dependency_graph(module:Text, dependencies:&{Text:@{Text}}):
+ return if dependencies:has(module)
+
+ module_deps := @{:Text}
+ dependencies:set(module, module_deps)
+
+ for dep in get_module_imports_from_module(module):
+ module_deps:add(dep)
+ build_module_dependency_graph(dep, dependencies)
+
+
+func build_file_dependency_graph(filename:Text, dependencies:&{Text:@{Text}}):
+ return if dependencies:has(filename)
- dependencies:get(key):add(import)
+ reader := when LineReader.from_file(filename) is Failure(msg):
+ !! Failed: $msg
+ return
+ is Open(reader): reader
+
+ file_deps := @{:Text}
+ dependencies:set(filename, file_deps)
- if not dependencies:has(import):
- build_dependency_graph(import, dependencies)
+ while when reader:next_line() is Success(line):
+ if line:matches($/use {..}.tm/):
+ used_file := line:replace($/use {..}/, "\1")
+ resolved := relative_path(resolve_path(used_file, filename))
+ if resolved != "":
+ used_file = resolved
+
+ file_deps:add(used_file)
+ build_file_dependency_graph(used_file, 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)
+ module := line:replace($/use {..}/, "\1")
+ file_deps:add(module)
+ build_module_dependency_graph(module, dependencies)
+
func get_dependency_graph(file:Text)->{Text:{Text}}:
graph := {:Text:@{Text}}
resolved := relative_path(file)
- build_dependency_graph(resolved, &graph)
+ build_file_dependency_graph(resolved, &graph)
return {f:deps[] for f,deps in graph}
func draw_tree(file:Text, dependencies:{Text:{Text}}, already_printed:&{Text}, prefix="", is_last=yes):
diff --git a/examples/ini.tm b/examples/ini.tm
index 38ccb624..1f818a2e 100644
--- a/examples/ini.tm
+++ b/examples/ini.tm
@@ -1,9 +1,9 @@
-USAGE := "
+_USAGE := "
Usage: ini <filename> "[section[/key]]"
"
-HELP := "
+_HELP := "
ini: A .ini config file reader tool.
- $USAGE
+ $_USAGE
"
file := use ./file.tm
@@ -37,7 +37,7 @@ func main(filename:Text, key:Text):
if keys.length > 2:
fail("
Too many arguments!
- $USAGE
+ $_USAGE
")
data := parse_ini(filename)