Skip to content

Commit 9dbf5e4

Browse files
committed
[IMP] refactor odoo step is_model
1 parent 113c3a0 commit 9dbf5e4

File tree

1 file changed

+14
-44
lines changed

1 file changed

+14
-44
lines changed

server/src/core/python_odoo_builder.rs

Lines changed: 14 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ impl PythonOdooBuilder {
4444
if sym.borrow().typ() != SymType::CLASS {
4545
return diagnostics;
4646
}
47-
if !self.test_symbol_is_model(session, &mut diagnostics) {
47+
if !self.is_symbol_model(session, &mut diagnostics) {
4848
return diagnostics;
4949
}
5050
self._load_class_inherit(session, &mut diagnostics);
@@ -352,36 +352,10 @@ impl PythonOdooBuilder {
352352
}
353353

354354
/* true if the symbol inherits from BaseModel, Model, TransientModel, or CachedModel. symbol must be the data of rc_symbol and must be a Class */
355-
fn test_symbol_is_model(&mut self, session: &mut SessionInfo, diagnostics: &mut Vec<Diagnostic>) -> bool {
355+
fn is_symbol_model(&mut self, session: &mut SessionInfo, diagnostics: &mut Vec<Diagnostic>) -> bool {
356356
let symbol = &self.symbol.clone();
357-
let odoo_symbol_tree = symbol.borrow().get_main_entry_tree(session);
358-
let mut sym = symbol.borrow_mut();
359-
if [&[Sy!("BaseModel")], &[Sy!("Model")], &[Sy!("TransientModel")]].iter().any(|x| x == &odoo_symbol_tree.1.as_slice()) &&
360-
// [BaseModel|Model|TransientModel]
361-
(( // < 18.1, and we are on odoo.models.
362-
compare_semver(session.sync_odoo.full_version.as_str(), "18.1") == Ordering::Less
363-
&& odoo_symbol_tree.0 == &["odoo", "models"]
364-
) || ( // >= 18.1, and we are on odoo.orm.models.
365-
compare_semver(session.sync_odoo.full_version.as_str(), "18.1") >= Ordering::Equal
366-
&& odoo_symbol_tree.0 == &["odoo", "orm", "models"]
367-
))
368-
// >= 18.3, and we are on odoo.orm.models_transient.TransientModel
369-
|| (
370-
compare_semver(session.sync_odoo.full_version.as_str(), "18.3") >= Ordering::Equal
371-
&& odoo_symbol_tree.1 == &["TransientModel"]
372-
&& odoo_symbol_tree.0 == &["odoo", "orm", "models_transient"]
373-
)
374-
// we are on odoo.orm.models_cached.CachedModel
375-
|| (
376-
compare_semver(session.sync_odoo.full_version.as_str(), "19.1") >= Ordering::Equal
377-
&& odoo_symbol_tree.1 == &["CachedModel"]
378-
&& odoo_symbol_tree.0 == &["odoo", "orm", "models_cached"]
379-
)
380-
{
381-
//we don't want to compare these classes with themselves, so we exit early
382-
return false;
383-
}
384-
if sym.as_class_sym().bases.is_empty() {
357+
// let sym = symbol.borrow();
358+
if symbol.borrow().as_class_sym().bases.is_empty() {
385359
return false;
386360
}
387361
let mut base_model_tree = (vec![Sy!("odoo"), Sy!("models")], vec![Sy!("BaseModel")]);
@@ -405,41 +379,37 @@ impl PythonOdooBuilder {
405379
// Check if the symbol is exactly BaseModel, Model or TransientModel
406380
// BaseModel, Model, or TransientModel are abstract base classes, we don't want to mark them as models
407381
if Rc::ptr_eq(symbol, &base_model_syms[0])
408-
|| model_syms.first().is_some_and(|s| Rc::ptr_eq(symbol, s))
409-
|| transient_syms.first().is_some_and(|s| Rc::ptr_eq(symbol, s))
382+
|| model_syms.iter().any(|s| Rc::ptr_eq(symbol, s))
383+
|| transient_syms.iter().any(|s| Rc::ptr_eq(symbol, s))
410384
{
411385
return false;
412386
}
413387
if compare_semver(session.sync_odoo.full_version.as_str(), "19.1") >= Ordering::Equal{
414388
let cached_model_tree = (vec![Sy!("odoo"), Sy!("orm"), Sy!("models_cached")], vec![Sy!("CachedModel")]);
415389
let cached_model_syms = session.sync_odoo.get_symbol(session.sync_odoo.config.odoo_path.as_ref().unwrap(), &cached_model_tree, u32::MAX);
416-
if cached_model_syms.first().is_some_and(|s| Rc::ptr_eq(symbol, s)){
390+
if cached_model_syms.iter().any(|s| Rc::ptr_eq(symbol, s)){
417391
return false;
418392
}
419393

420394
}
421-
if !sym.as_class_sym().inherits(&base_model_syms[0], &mut None) {
395+
if !symbol.borrow().as_class_sym().inherits(&base_model_syms[0], &mut None) {
422396
return false;
423397
}
398+
let mut sym = symbol.borrow_mut();
424399
sym.as_class_sym_mut()._model = Some(ModelData::new());
425400
// Check if we have a _register = False
426401
let register = sym.get_symbol(&(vec![], vec![Sy!("_register")]), u32::MAX);
427402
if let Some(register) = register.last() {
428403
let loc_register = register.borrow();
429-
let register_evals = &loc_register.evaluations().unwrap();
404+
let register_evals = loc_register.evaluations().unwrap();
430405
if register_evals.len() == 1 { //we don't handle multiple values
431-
let eval = &register_evals[0];
432-
let value = eval.follow_ref_and_get_value(session, &mut None, diagnostics);
433-
if value.is_some() {
434-
let value = value.unwrap();
435-
if let EvaluationValue::CONSTANT(Expr::BooleanLiteral(b)) = value {
436-
if !b.value {
437-
return false;
438-
}
406+
let maybe_value = register_evals[0].follow_ref_and_get_value(session, &mut None, diagnostics);
407+
if let Some(EvaluationValue::CONSTANT(Expr::BooleanLiteral(b))) = maybe_value {
408+
if !b.value {
409+
return false;
439410
}
440411
}
441412
}
442-
return true;
443413
}
444414
true
445415
}

0 commit comments

Comments
 (0)