cluna 1.1.0

Tool to convert Lua code into Clue code Made by MarkosTh09
Documentation
---
source: src/main.rs
expression: compiled
input_file: test-data/lua5.2-tests/goto.lua
---
local fn errmsg(code, m) {
    local st, msg = load(code)
    assert(!st && string.find(msg, m));
}
errmsg(` goto l1; do ::l1:: end `, "label 'l1'");
errmsg(` do ::l1:: end goto l1; `, "label 'l1'");
errmsg(` ::l1:: ::l1:: `, "label 'l1'");
errmsg(` goto l1; local aa ::l1:: ::l2:: print(3) `, "local 'aa'");
errmsg(`
do local bb, cc;  end
local aa
 print(3)
`, "local 'aa'");
errmsg(` do ::l1:: end goto l1 `, "label 'l1'");
errmsg(` goto l1 do ::l1:: end `, "label 'l1'");
errmsg(`
  repeat
    if x then  end
    local xuxu = 10

  until xuxu < x
`, "local 'xuxu'");
local x
{
    local y = 12
    x = x + 1
    x = y
}
assert(x == 13);
{
    local prog = `
  do
    local a = 1
     a = a + 1
    a = a + 10
     a = a + 2
    a = a + 20
    return a
  end
  `
    local label = string.rep("0123456789", 40)
    prog = string.format(prog, label, label, label, label)
    assert(assert(load(prog))() == 31);
}
{
    
}
{
    local a = 23
    x = a
}
while true {
    local x = 45
}
assert(x == 13);
if print {
    error("should not be here");
    local x
} else {
    
}
local fn foo() {
    local a = {}
    a[(#a + 1)] = 1
    a[(#a + 1)] = 2
    a[(#a + 1)] = 3
    a[(#a + 1)] = 4
    a[(#a + 1)] = 5
    assert(a[(1)] == 3 && a[(2)] == 1 && a[(3)] == 2 && a[(4)] == 5 && a[(5)] == 4);
    if !a[(6)] {
        a[(6)] = true
    }
}
foo();
local fn foo() {
    local a = {}
    {
        local i = 1
        local k = 0
        a[(0)] = fn (y) {
            k = y
        }
        {
            local x
            if i > 2 {
                
            }
            a[(i)] = fn (y) {
                if y {
                    x = y
                } else {
                    return x + k
                }
            }
            i = i + 1
        }
    }
    return a
}
local a = foo()
a[(1)](10);
a[(2)](20);
assert(a[(1)]() == 10 && a[(2)]() == 20 && a[(3)] == nil);
a[(0)](13);
assert(a[(1)]() == 23 && a[(2)]() == 33);
local fn testG(a) {
    if a == 1 {
        error("should never be here!");
    } elseif if a == 2 {
        
    } elseif if a == 3 {
        
    } elseif if a == 4 {
        error("should never be here!");
        a = a + 1
    } else {
        a = a * 2
        error("should never be here!");
        error("should never be here!");
    }
    {
        return a
    }
    {
        return "2"
    }
    {
        return "3"
    }
    return "1"
}
assert(testG(1) == "1");
assert(testG(2) == "2");
assert(testG(3) == "3");
assert(testG(4) == 5);
assert(testG(5) == 10);
print('OK');