Skip to content

Commit ad4ce49

Browse files
mmahroussfda-odoo
authored andcommitted
[IMP] catch and diagnose cyclic dependencies without panicking
1 parent 378f379 commit ad4ce49

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

server/src/core/diagnostic_codes_list.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,10 @@ OLS04010, DiagnosticSetting::Error, "Module {0} depends on {1} which is not foun
202202
*/
203203
OLS04011, DiagnosticSetting::Error, "Do not use dict unpacking to build your manifest",
204204
/**
205+
* Module dependency cycle: make sure nested dependencies are correct
206+
*/
207+
OLS04012, DiagnosticSetting::Error, "Module dependency: module {0} depends on current module",
208+
/**
205209
* Form is no longer available on odoo.tests.common, thus it should not be imported from there.
206210
*/
207211
OLS03301, DiagnosticSetting::Warning, "Deprecation Warning: Since 17.0: odoo.tests.common.Form is deprecated, use odoo.tests.Form",

server/src/core/symbols/module_symbol.rs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ impl ModuleSymbol {
139139
}
140140

141141
pub fn load_module_info(symbol: &Rc<RefCell<Symbol>>, session: &mut SessionInfo, odoo_addons: Rc<RefCell<Symbol>>) {
142-
let (mut diagnostics, _loaded) = ModuleSymbol::_load_depends(&mut (*symbol).borrow_mut(), session, odoo_addons);
142+
let (mut diagnostics, _loaded) = ModuleSymbol::_load_depends(symbol.clone(), session, odoo_addons);
143143
diagnostics.extend(ModuleSymbol::check_data(&symbol, session));
144144
if !symbol.borrow().as_module_package().loaded {
145145
diagnostics.append(&mut ModuleSymbol::_load_arch(symbol.clone(), session));
@@ -288,15 +288,17 @@ impl ModuleSymbol {
288288

289289
/* ensure that all modules indicates in the module dependencies are well loaded.
290290
Returns list of diagnostics to publish in manifest file */
291-
fn _load_depends(symbol: &mut Symbol, session: &mut SessionInfo, odoo_addons: Rc<RefCell<Symbol>>) -> (Vec<Diagnostic>, Vec<OYarn>) {
292-
symbol.as_module_package_mut().all_depends.clear();
293-
let all_depends = symbol.as_module_package().depends.iter().map(|(depend, _)| depend.clone()).collect::<Vec<_>>();
294-
symbol.as_module_package_mut().all_depends.extend(all_depends);
291+
fn _load_depends(symbol_rc: Rc<RefCell<Symbol>>, session: &mut SessionInfo, odoo_addons: Rc<RefCell<Symbol>>) -> (Vec<Diagnostic>, Vec<OYarn>) {
292+
symbol_rc.borrow_mut().as_module_package_mut().all_depends.clear();
293+
let all_depends = symbol_rc.borrow_mut().as_module_package().depends.iter().map(|(depend, _)| depend.clone()).collect::<Vec<_>>();
294+
symbol_rc.borrow_mut().as_module_package_mut().all_depends.extend(all_depends);
295295
let mut diagnostics: Vec<Diagnostic> = vec![];
296296
let mut loaded: Vec<OYarn> = vec![];
297-
for (depend, range) in symbol.as_module_package().depends.clone().iter() {
297+
let dependencies = symbol_rc.borrow().as_module_package().depends.clone();
298+
for (depend, range) in dependencies.iter() {
298299
//TODO: raise an error on dependency cycle
299300
if !session.sync_odoo.modules.contains_key(depend) {
301+
let mut symbol = symbol_rc.borrow_mut();
300302
let module = find_module(session, odoo_addons.clone(), depend);
301303
if module.is_none() {
302304
symbol.get_entry().unwrap().borrow_mut().not_found_symbols.insert(symbol.weak_self().as_ref().unwrap().upgrade().expect("The symbol must be in the tree"));
@@ -317,9 +319,18 @@ impl ModuleSymbol {
317319
} else {
318320
let module = session.sync_odoo.modules.get(depend).unwrap().upgrade().unwrap();
319321
SyncOdoo::build_now(session, &module, BuildSteps::ARCH);
322+
let name = symbol_rc.borrow().name().clone();
323+
if module.borrow().as_module_package().all_depends.contains(&name){
324+
if let Some(diagnostic_base) = create_diagnostic(&session, DiagnosticCode::OLS04012, &[depend]) {
325+
diagnostics.push(Diagnostic {
326+
range: FileMgr::textRange_to_temporary_Range(range),
327+
..diagnostic_base.clone()
328+
});
329+
}
330+
}
320331
let mut module = (*module).borrow_mut();
321-
symbol.as_module_package_mut().all_depends.extend(module.as_module_package().all_depends.clone());
322-
symbol.add_dependency(&mut module, BuildSteps::ARCH, BuildSteps::ARCH)
332+
symbol_rc.borrow_mut().as_module_package_mut().all_depends.extend(module.as_module_package().all_depends.clone());
333+
symbol_rc.borrow_mut().add_dependency(&mut module, BuildSteps::ARCH, BuildSteps::ARCH)
323334
}
324335
}
325336
(diagnostics, loaded)

0 commit comments

Comments
 (0)