#!/usr/bin/env nomsu -V5.12.12.8
#
    This file defines upgrades from Nomsu <2.4 to Nomsu 2.4
    
use "compatibility/compatibility.nom"

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

upgrade $tree to "2.4" as:
    unless ($tree is "Action" syntax tree): return
    if $tree.stub is:
        "when" "if":
            if ((size of $tree) == 3): return $tree
            $conditions = []
            $new_lines = []
            $body = (($tree.2 upgraded) if ($tree.2 is "Block" syntax tree) else [$tree.2 upgraded])
            for $line in $body:
                when:
                    (not ($line is "Action" syntax tree)): $new_lines|add $line
                    ($line.stub is "*"):
                        if ((size of $line) == 2):
                            $conditions|add $line.2
                        ..else:
                            $new_lines|add $line
                    
                    ($line.stub == "* else"):
                        $new_lines|add (\(else $block) with vars {block: $line.3})
                    
                    else:
                        $conditions|add $line.2
                        $action = $line.3
                        unless ($action is "Block" syntax tree):
                            $action = (=lua "SyntaxTree{type='Block', source=\$action.source, \$action}")
                        $conditions|add $action
                        $new_lines|
                            add (=lua "SyntaxTree{type='Action', source=\$conditions[1].source, unpack(\$conditions)}")
                        $conditions = []
            
            return (..)
                \(when $body) with vars {..}
                    body: =lua "SyntaxTree{type='Block', source=\$tree[2].source, unpack(\$new_lines)}"
        
        "if 1 is ?" "if 1 = ?":
            $values = []
            $new_lines = []
            $body = (($tree.5 upgraded) if ($tree.5 is "Block" syntax tree) else [$tree.5 upgraded])
            for $line in $body:
                when:
                    (not ($line is "Action" syntax tree)): $new_lines|add $line
                    ($line.stub is "*"):
                        if ((size of $line) == 2):
                            $values|add $line.2
                        ..else:
                            $new_lines|add $line
                    
                    ($line.stub == "* else"):
                        $new_lines|add (\(else $block) with vars {block: $line.3})
                    
                    else:
                        $values|add $line.2
                        $action = $line.3
                        unless ($action is "Block" syntax tree): $action = \(: $action)
                        $values|add $action
                        $new_lines|
                            add (=lua "SyntaxTree{type='Action', source=\$values[1].source, unpack(\$values)}")
                        $values = []
            
            return (..)
                \(if $var is $body) with vars {..}
                    var: $tree.2 upgraded, body: =lua "SyntaxTree{type='Block', source=\$tree[5].source, unpack(\$new_lines)}"