Skip to main content

luaur_analysis/methods/
frontend_parse_frontend_alt_b.rs

1use 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}