luau-syntax 0.732.0

Luau lexer, parser, AST, CST, and source utilities
Documentation
use super::*;

// Parser.test.cpp: parse_error_table_literal
#[test]
fn parse_error_table_literal() {
    parse_errors(r#"
function stringifyTable(t)
    local foo = (name = t)
    return foo
end
        "#)
    .assert_first_message(
        "Expected ')' (to close '(' at column 17), got '='; did you mean to use '{' when defining a table?",
    );
}

// Parser.test.cpp: get_a_nice_error_when_there_is_no_comma_between_table_members
#[test]
fn get_a_nice_error_when_there_is_no_comma_between_table_members() {
    with_parse(
        r#"
local t = {
    first = 1
    second = 2,
    third = 3,
    fouth = 4,
}
"#,
        ParseOptions::default(),
        |result| {
            let result = result.unwrap();
            assert_eq!(result.metadata.errors.len(), 1);
            assert_eq!(
                result.metadata.errors[0].location,
                loc!(pos!(3, 4), pos!(3, 10))
            );
            assert_eq!(
                result.metadata.errors[0].message,
                "Expected ',' after table constructor element"
            );
            assert_eq!(result.root.len(), 1);

            let [statement] = statement_kinds(result.root.as_slice()).exact();
            let local = statement.as_local().expect("expected local statement");
            let [table] = local.values else {
                panic!("expected one local value");
            };
            let ExpressionKind::Table { items } = table.kind() else {
                panic!("expected table expression");
            };
            assert_eq!(items.len(), 4);
        },
    );
}
// Parser.test.cpp: extra_table_indexer_recovery
#[test]
fn type_indexer_recovery_keeps_later_table_props() {
    with_parse(
        r#"
local a : { [string] : number, [number] : string, count: number }
"#,
        ParseOptions::default(),
        |result| {
            let result = result.unwrap();
            assert_eq!(result.metadata.errors.len(), 1);
        },
    );
}