use crate::functions::parse_source_for_module::parse_source_for_module;
use crate::functions::persist_checked_types::persist_checked_types;
use crate::records::frontend::{Frontend, FrontendStats};
use crate::records::global_types::GlobalTypes;
use crate::records::load_definition_file_result::LoadDefinitionFileResult;
use crate::records::require_cycle::RequireCycle;
use crate::records::source_module::SourceModule;
use crate::records::type_check_limits::TypeCheckLimits;
use crate::type_aliases::scope_ptr_type::ScopePtr;
use alloc::string::String;
use alloc::vec::Vec;
use luaur_ast::enums::mode::Mode;
use luaur_common::macros::luau_timetrace_scope::LUAU_TIMETRACE_SCOPE;
impl Frontend {
pub fn load_definition_file(
&mut self,
globals: &mut GlobalTypes,
target_scope: ScopePtr,
source: &str,
package_name: String,
capture_comments: bool,
_type_check_for_autocomplete: bool,
) -> LoadDefinitionFileResult {
LUAU_TIMETRACE_SCOPE!("loadDefinitionFile", "Frontend");
let mut source_module = SourceModule::source_module();
source_module.name = package_name.clone();
source_module.human_readable_name = package_name.clone();
let parse_result = parse_source_for_module(source, &mut source_module, capture_comments);
if !parse_result.errors.is_empty() {
return LoadDefinitionFileResult {
success: false,
parse_result,
source_module,
module: None,
};
}
let mut dummy_stats = FrontendStats::default();
let checked_module = self.check_source_module_mode_vector_require_cycle_optional_scope_ptr_bool_bool_frontend_stats_type_check_limits(
&source_module,
Mode::Definition,
Vec::<RequireCycle>::new(),
None,
false,
false,
&mut dummy_stats,
TypeCheckLimits::default(),
);
if !checked_module.errors.is_empty() {
return LoadDefinitionFileResult {
success: false,
parse_result,
source_module,
module: Some(checked_module),
};
}
persist_checked_types(checked_module.clone(), globals, target_scope, package_name);
LoadDefinitionFileResult {
success: true,
parse_result,
source_module,
module: Some(checked_module),
}
}
}