rocks-lang 0.2.2

Rust implementation of Crafting Interpreters' Lox Language.
Documentation
#[macro_use]
mod common;

#[cfg(test)]
mod variable {
    tests! {
        collide_with_parameter in variable is ERR
        "[line 2:7] Error at 'a': A variable is already defined with name 'a' in this scope"
    }

    tests! {
        duplicate_local in variable is ERR
        "[line 3:7] Error at 'a': A variable is already defined with name 'a' in this scope"
    }

    tests! {
        duplicate_parameter in variable is ERR
        "[line 1:14] Error at 'arg': A variable is already defined with name 'arg' in this scope"
    }

    tests! {
        early_bound in variable is OK
        "outer"
        "outer"
    }

    tests! {
        in_middle_of_block in variable is OK
        "a"
        "a b"
        "a c"
        "a b d"
    }

    tests! {
        in_nested_block in variable is OK
        "outer"
    }

    tests! {
        local_from_method in variable is OK
        "variable"
    }

    tests! {
        redeclare_global in variable is OK
        "null"
    }

    tests! {
        redefine_global in variable is OK
        "2"
    }

    tests! {
        scope_reuse_in_different_blocks in variable is OK
        "first"
        "second"
    }

    tests! {
        shadow_and_local in variable is OK
        "outer"
        "inner"
    }

    tests! {
        shadow_global in variable is OK
        "shadow"
        "global"
    }

    tests! {
        shadow_local in variable is OK
        "shadow"
        "local"
    }

    tests! {
        undefined_global in variable is ERR
        "[line 1:7] Error at 'notDefined': Undefined variable 'notDefined'"
    }

    tests! {
        undefined_local in variable is ERR
        "[line 2:9] Error at 'notDefined': Undefined variable 'notDefined'"
    }

    tests! {
        uninitialized in variable is OK
        "null"
    }

    tests! {
        unreached_undefined in variable is OK
        "ok"
    }

    tests! {
        use_false_as_var in variable is ERR
        "[line 2:5] Error at 'false': Expected variable name"
    }

    tests! {
        use_global_in_initializer in variable is OK
        "value"
    }

    tests! {
        use_local_in_initializer in variable is ERR
        "[line 3:11] Error at 'a': Cannot read local variable in its own initializer"
    }

    tests! {
        use_null_as_var in variable is ERR
        "[line 2:5] Error at 'null': Expected variable name"
    }

    tests! {
        use_this_as_var in variable is ERR
        "[line 2:5] Error at 'this': Expected variable name"
    }
}