use luau_bytecode::builder::{BytecodeBuilder, BytecodeDumpFlags};
use luau_common::{BString, flags};
use luau_compiler::{CompileHost, CompileOptions, Compiler, EmptyCompileHost};
use luau_syntax::{
allocator::AstArena, ast_names::AstNameTable, parser::ParseOptions, parser::parse,
};
pub fn compile_dumped_function_with_options(
source: &str,
id: usize,
options: CompileOptions,
host: &dyn CompileHost,
dump_flags: BytecodeDumpFlags,
dump_source: Option<&[u8]>,
) -> BString {
let _string_interp = flags::LuauCompileStringInterpTargetTop.scoped(true);
let arena = AstArena::new();
let mut names = AstNameTable::new(&arena);
let result =
parse(source, &arena, &mut names, ParseOptions::default()).expect("source should parse");
let mut builder = BytecodeBuilder::new();
builder.set_dump_flags(dump_flags);
if let Some(source) = dump_source {
builder.set_dump_source(source);
}
Compiler::with_host(options, host)
.compile_into(&result, &mut names, &mut builder)
.expect("source should compile");
builder.dump_function(id)
}
pub fn compile_function0_constants(source: &str) -> BString {
let mut dump_flags = BytecodeDumpFlags::default();
dump_flags.set_code(true);
dump_flags.set_constants(true);
compile_dumped_function_with_options(
source,
0,
CompileOptions::default(),
&EmptyCompileHost,
dump_flags,
None,
)
}
pub fn compile_function0_source(source: &str) -> BString {
let mut dump_flags = BytecodeDumpFlags::default();
dump_flags.set_code(true);
dump_flags.set_source(true);
compile_dumped_function_with_options(
source,
0,
CompileOptions::default(),
&EmptyCompileHost,
dump_flags,
Some(source.as_bytes()),
)
}