diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2019-01-14 17:14:34 -0800 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2019-01-14 17:14:57 -0800 |
| commit | ddef8be3df626d63f6e575d4c1416295a22371ad (patch) | |
| tree | 78af9584447b085f06d6412d2cc20137a460848b /lib/compatibility/compatibility.nom | |
| parent | 9fceff7e785bb234971b443809eef3da9051c598 (diff) | |
Moved compatibility to lib/ and fixed path searching for .peg files.
Diffstat (limited to 'lib/compatibility/compatibility.nom')
| -rw-r--r-- | lib/compatibility/compatibility.nom | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/lib/compatibility/compatibility.nom b/lib/compatibility/compatibility.nom new file mode 100644 index 0000000..444be11 --- /dev/null +++ b/lib/compatibility/compatibility.nom @@ -0,0 +1,132 @@ +#!/usr/bin/env nomsu -V6.14 +# + This file contains code for defining ways to upgrade code between different versions + of Nomsu. + +use "filesystem" + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +$UPGRADES = {} +externally (upgrade to $version via $upgrade_fn) means: + $UPGRADES.$version = $upgrade_fn +$ACTION_UPGRADES = ({} with fallback $ -> {}) +externally (upgrade action $stub to $version via $upgrade_fn) means: + $ACTION_UPGRADES.$version.$stub = $upgrade_fn + +(upgrade $tree to $version as $body) parses as + upgrade to $version via (($ $end_version) -> ($ with $tree -> $body)) + +(upgrade action $actions to $version as $body) compiles to: + if ($actions is "Action" syntax tree): + $actions = \[$actions] + $lua = (Lua "") + for $action in $actions: + $replacements = {} + for $i in 1 to (size of $action): + if ($action.$i is "Var" syntax tree): + $replacements.($action.$i.1) = "\(\$tree as lua id)[\$i]" + define mangler + (make tree $t) means: + when: + ($t is "Var" syntax tree): + if $replacements.($t.1): + return $replacements.($t.1) + ..else: + external $needs_mangle = (yes) + return (" + SyntaxTree{type=\(quote $t.type), source=\(quote "\($t.source)"), \(quote (mangle $t.1))} + ") + + ($t is syntax tree): + $args = [] + for $k = $v in $t: + if ((type of $k) == "number"): + $args, add (make tree $v) + ..else: + $args, add "\($k)=\(make tree $v)" + return "SyntaxTree{\($args, joined with ", ")}" + + else: + return (quote $t) + + unless ("\$lua" == ""): + $lua, add "\n" + + $retval = (make tree $body) + $lua, add + Lua (" + upgrade_action_1_to_2_via(\(quote $action.stub), \($version as lua expr), function(\ + ..\(\$tree as lua id)) + return \$retval + end) + ") + return $lua + +externally [ + $tree upgraded from $start_version to $end_version + $tree upgraded to $end_version from $start_version +] all mean: + unless ($tree is syntax tree): return $tree + + ($ver as list) means (($ as number) for $ in $ver matching "[0-9]+") + + (Ver $) means: + [$lib, $ver] = ($, match "(.*)/([0-9.]+)") + if $lib: + return {.lib = $lib, .version = ($ver as list)} + return {.version = ($ as list)} + + $start = (Ver $start_version) + $end = (Ver $end_version) + assume $start.lib == $end.lib + + $seen = {} + $versions = {} + for $v = $ in $UPGRADES: $versions.$v = (yes) + for $v = $ in $ACTION_UPGRADES: $versions.$v = (yes) + $versions = [ + :for $v = $ in $versions: + if ((Ver $v).lib == $start.lib): + add $v + ] + + sort $versions by $ -> ($ as list) + for $ver in $versions: + if (($ver as list) <= $start.version): do next $ver + if (($ver as list) > $end.version): stop $ver + if $ACTION_UPGRADES.$ver: + $tree = + $tree with $ ->: + if (($ is "Action" syntax tree) and $ACTION_UPGRADES.$ver.($.stub)): + $with_upgraded_args = { + : for $k = $v in $: + add $k = ($v upgraded from $start_version to $end_version) + } + set $with_upgraded_args's metatable to ($'s metatable) + return ($ACTION_UPGRADES.$ver.($.stub) $with_upgraded_args $end_version) + + if $UPGRADES.$ver: + $with_upgraded_args = { + : for $k = $v in $tree: + add $k = ($v upgraded from $start_version to $end_version) + } + set $with_upgraded_args's metatable to ($tree's metatable) + $tree = ($UPGRADES.$ver $with_upgraded_args $end_version) + + if ($tree.version != $end_version): + $tree = (SyntaxTree {: for $k = $v in $tree: add $k = $v}) + $tree.version = $end_version + if $tree.shebang: + $tree.shebang = "#!/usr/bin/env nomsu -V\$end_version\n" + + return $tree + +externally ($tree upgraded from $start_version) means + $tree upgraded from $start_version to (Nomsu version) + +externally ($tree upgraded to $end_version) means + $tree upgraded from ($tree.version or (Nomsu version)) to $end_version + +externally ($tree upgraded) means + $tree upgraded from ($tree.version or (Nomsu version)) to (Nomsu version) |
