luau-syntax 0.732.0

Luau lexer, parser, AST, CST, and source utilities
Documentation
mod analysis;
mod blocks;
mod calls;
mod classes;
mod errors;
mod expressions;
mod statements;
mod strings;
mod tolerant;
mod types;
mod variables;

use luau_common::ByteSlice;
use luau_common::flags;
use luau_syntax::allocator::AstArena;
use luau_syntax::ast_names::AstNameTable;
use luau_syntax::parser::{self, ParseOptions, ParseResult};

fn with_parse<R>(
    source: &str,
    options: ParseOptions,
    f: impl for<'ast> FnOnce(ParseResult<'ast>) -> R,
) -> R {
    let arena = AstArena::new();
    let mut names = AstNameTable::new(&arena);
    let result = parser::parse(source, &arena, &mut names, options).unwrap();
    f(result)
}

fn assert_pretty_prints(source: &str, expected: &str) {
    assert_eq!(
        luau_syntax::pretty_printer::pretty_print(source, ParseOptions::default(), false, false)
            .code
            .as_bytes(),
        expected.as_bytes()
    );
}

fn assert_round_trips(source: &str) {
    assert_pretty_prints(source, source);
}

fn assert_pretty_prints_with_types(source: &str, expected: &str) {
    let _classes = flags::DebugLuauUserDefinedClasses.scoped(true);
    with_parse(
        source,
        ParseOptions::default()
            .with_declaration_syntax(true)
            .with_cst_data(true),
        |result| {
            assert_eq!(
                luau_syntax::pretty_printer::pretty_print_with_types_and_cst(
                    result.root,
                    &result.metadata.cst_nodes
                )
                .as_bytes(),
                expected.as_bytes()
            );
        },
    );
}

fn assert_round_trips_with_types(source: &str) {
    assert_pretty_prints_with_types(source, source);
}