luaur_analysis/methods/
frontend_parse_frontend_alt_b.rs1use crate::records::frontend::Frontend;
2use crate::records::source_module::SourceModule;
3use crate::type_aliases::module_name_file_resolver::ModuleName;
4use alloc::sync::Arc;
5use luaur_ast::enums::mode::Mode;
6use luaur_ast::records::ast_array::AstArray;
7use luaur_ast::records::ast_stat_block::AstStatBlock;
8use luaur_ast::records::location::Location;
9use luaur_ast::records::parse_options::ParseOptions;
10use luaur_ast::records::parser::Parser;
11use luaur_common::macros::luau_timetrace_argument::LUAU_TIMETRACE_ARGUMENT;
12use luaur_common::macros::luau_timetrace_scope::LUAU_TIMETRACE_SCOPE;
13
14impl Frontend {
15 pub fn parse_module_name_string_view_parse_options(
16 &mut self,
17 name: &ModuleName,
18 src: &str,
19 parse_options: &ParseOptions,
20 ) -> SourceModule {
21 LUAU_TIMETRACE_SCOPE!("Frontend::parse", "Frontend");
22 LUAU_TIMETRACE_ARGUMENT!("name", name.as_str());
23
24 let mut source_module = SourceModule::source_module();
25
26 let timestamp = crate::functions::get_timestamp::get_timestamp();
27
28 let parse_result = Parser::parse(
29 src,
30 src.len(),
31 Arc::get_mut(&mut source_module.names)
32 .expect("SourceModule names must be uniquely owned while parsing"),
33 Arc::get_mut(&mut source_module.allocator)
34 .expect("SourceModule allocator must be uniquely owned while parsing"),
35 parse_options.clone(),
36 );
37
38 self.stats.time_parse += crate::functions::get_timestamp::get_timestamp() - timestamp;
39 self.stats.files += 1;
40 self.stats.lines += parse_result.lines;
41
42 if !parse_result.errors.is_empty() {
43 source_module
44 .parse_errors
45 .extend(parse_result.errors.iter().cloned());
46 }
47
48 if parse_result.errors.is_empty() || !parse_result.root.is_null() {
49 source_module.root = parse_result.root;
50 source_module.mode =
51 crate::functions::parse_mode::parse_mode(&parse_result.hotcomments);
52 } else {
53 let empty_body = AstArray {
54 data: core::ptr::null_mut(),
55 size: 0,
56 };
57 source_module.root = Arc::get_mut(&mut source_module.allocator)
58 .expect("SourceModule allocator must be uniquely owned while parsing")
59 .alloc(AstStatBlock::new(
60 Location::new(
61 luaur_ast::records::position::Position::default(),
62 luaur_ast::records::position::Position::default(),
63 ),
64 empty_body,
65 false,
66 ));
67 source_module.mode = Some(Mode::NoCheck);
68 }
69
70 source_module.name = name.clone();
71 source_module.human_readable_name =
72 self.module_resolver.get_human_readable_module_name(name);
73
74 if parse_options.capture_comments {
75 source_module.comment_locations = parse_result.comment_locations;
76 source_module.hotcomments = parse_result.hotcomments;
77 }
78
79 source_module
80 }
81}