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);
}