@@ -351,71 +351,80 @@ impl PythonOdooBuilder {
351351 }
352352 }
353353
354- /* true if the symbol inherit from odoo.models. BaseModel. symbol must be the data of rc_symbol and must be a Class */
354+ /* true if the symbol inherits from BaseModel, Model, TransientModel, or CachedModel . symbol must be the data of rc_symbol and must be a Class */
355355 fn test_symbol_is_model ( & mut self , session : & mut SessionInfo , diagnostics : & mut Vec < Diagnostic > ) -> bool {
356356 let symbol = & self . symbol . clone ( ) ;
357357 let odoo_symbol_tree = symbol. borrow ( ) . get_main_entry_tree ( session) ;
358358 let mut sym = symbol. borrow_mut ( ) ;
359- if (
360- compare_semver ( session. sync_odoo . full_version . as_str ( ) , "18.1" ) == Ordering :: Less && odoo_symbol_tree. 0 . len ( ) == 2
361- && odoo_symbol_tree. 1 . len ( ) == 1
362- && odoo_symbol_tree. 0 [ 0 ] == "odoo"
363- && odoo_symbol_tree. 0 [ 1 ] == "models"
364- && ( odoo_symbol_tree. 1 [ 0 ] == "BaseModel" || odoo_symbol_tree. 1 [ 0 ] == "Model" || odoo_symbol_tree. 1 [ 0 ] == "TransientModel" ) )
365- || ( compare_semver ( session. sync_odoo . full_version . as_str ( ) , "18.1" ) >= Ordering :: Equal && odoo_symbol_tree. 0 . len ( ) == 3
366- && odoo_symbol_tree. 1 . len ( ) == 1
367- && odoo_symbol_tree. 0 [ 0 ] == "odoo"
368- && odoo_symbol_tree. 0 [ 1 ] == "orm"
369- && odoo_symbol_tree. 0 [ 2 ] == "models"
370- && ( odoo_symbol_tree. 1 [ 0 ] == "BaseModel" || odoo_symbol_tree. 1 [ 0 ] == "Model" || odoo_symbol_tree. 1 [ 0 ] == "TransientModel" ) )
371- || ( compare_semver ( session. sync_odoo . full_version . as_str ( ) , "18.3" ) >= Ordering :: Equal && odoo_symbol_tree. 0 . len ( ) == 3
372- && odoo_symbol_tree. 1 . len ( ) == 1
373- && odoo_symbol_tree. 0 [ 0 ] == "odoo"
374- && odoo_symbol_tree. 0 [ 1 ] == "orm"
375- && odoo_symbol_tree. 0 [ 2 ] == "models_transient"
376- && odoo_symbol_tree. 1 [ 0 ] == "TransientModel" ) {
377- //we don't want to compare these classes with themselves (> 18.3)
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
378382 return false ;
379- } else {
380- if sym. as_class_sym ( ) . bases . is_empty ( ) {
381- return false ;
382- }
383- let mut base_model_tree = ( vec ! [ Sy !( "odoo" ) , Sy !( "models" ) ] , vec ! [ Sy !( "BaseModel" ) ] ) ;
384- let mut model_tree = ( vec ! [ Sy !( "odoo" ) , Sy !( "models" ) ] , vec ! [ Sy !( "Model" ) ] ) ;
385- let mut transient_tree = ( vec ! [ Sy !( "odoo" ) , Sy !( "models" ) ] , vec ! [ Sy !( "TransientModel" ) ] ) ;
386- if compare_semver ( session. sync_odoo . full_version . as_str ( ) , "18.1" ) >= Ordering :: Equal {
387- base_model_tree = ( vec ! [ Sy !( "odoo" ) , Sy !( "orm" ) , Sy !( "models" ) ] , vec ! [ Sy !( "BaseModel" ) ] ) ;
388- model_tree = ( vec ! [ Sy !( "odoo" ) , Sy !( "orm" ) , Sy !( "models" ) ] , vec ! [ Sy !( "Model" ) ] ) ;
389- transient_tree = ( vec ! [ Sy !( "odoo" ) , Sy !( "orm" ) , Sy !( "models" ) ] , vec ! [ Sy !( "TransientModel" ) ] ) ;
390- }
391- if compare_semver ( session. sync_odoo . full_version . as_str ( ) , "18.3" ) >= Ordering :: Equal {
392- transient_tree = ( vec ! [ Sy !( "odoo" ) , Sy !( "orm" ) , Sy !( "models_transient" ) ] , vec ! [ Sy !( "TransientModel" ) ] ) ;
393- }
394- let base_model = session. sync_odoo . get_symbol ( session. sync_odoo . config . odoo_path . as_ref ( ) . unwrap ( ) , & base_model_tree, u32:: MAX ) ;
395- let model = session. sync_odoo . get_symbol ( session. sync_odoo . config . odoo_path . as_ref ( ) . unwrap ( ) , & model_tree, u32:: MAX ) ;
396- let transient = session. sync_odoo . get_symbol ( session. sync_odoo . config . odoo_path . as_ref ( ) . unwrap ( ) , & transient_tree, u32:: MAX ) ;
397- if base_model. is_empty ( ) || model. is_empty ( ) || transient. is_empty ( ) {
398- //one of them is not already loaded, but that's not really an issue, as now odoo step has been merged
399- //with arch eval step, some files will be odooed before loading the orm fully. In this case we should
400- //ignore this error. Moreover if a base is set on the class, it means that the base has been loaded, so
401- //it is NOT a model.
402- // session.send_notification(ShowMessage::METHOD, ShowMessageParams{
403- // typ: MessageType::ERROR,
404- // message: "Odoo base models are not found. OdooLS will be unable to generate valid diagnostics".to_string()
405- // });
406- return false ;
407- }
408- let base_model = base_model[ 0 ] . clone ( ) ;
409- let model = model[ 0 ] . clone ( ) ;
410- let transient = transient[ 0 ] . clone ( ) ;
411- if Rc :: ptr_eq ( symbol, & base_model) ||
412- Rc :: ptr_eq ( symbol, & model) ||
413- Rc :: ptr_eq ( symbol, & transient) {
414- return false ;
415- }
416- if !sym. as_class_sym ( ) . inherits ( & base_model, & mut None ) {
383+ }
384+ if sym. as_class_sym ( ) . bases . is_empty ( ) {
385+ return false ;
386+ }
387+ let mut base_model_tree = ( vec ! [ Sy !( "odoo" ) , Sy !( "models" ) ] , vec ! [ Sy !( "BaseModel" ) ] ) ;
388+ let mut model_tree = ( vec ! [ Sy !( "odoo" ) , Sy !( "models" ) ] , vec ! [ Sy !( "Model" ) ] ) ;
389+ let mut transient_tree = ( vec ! [ Sy !( "odoo" ) , Sy !( "models" ) ] , vec ! [ Sy !( "TransientModel" ) ] ) ;
390+ if compare_semver ( session. sync_odoo . full_version . as_str ( ) , "18.1" ) >= Ordering :: Equal {
391+ base_model_tree = ( vec ! [ Sy !( "odoo" ) , Sy !( "orm" ) , Sy !( "models" ) ] , vec ! [ Sy !( "BaseModel" ) ] ) ;
392+ model_tree = ( vec ! [ Sy !( "odoo" ) , Sy !( "orm" ) , Sy !( "models" ) ] , vec ! [ Sy !( "Model" ) ] ) ;
393+ transient_tree = ( vec ! [ Sy !( "odoo" ) , Sy !( "orm" ) , Sy !( "models" ) ] , vec ! [ Sy !( "TransientModel" ) ] ) ;
394+ }
395+ if compare_semver ( session. sync_odoo . full_version . as_str ( ) , "18.3" ) >= Ordering :: Equal {
396+ transient_tree = ( vec ! [ Sy !( "odoo" ) , Sy !( "orm" ) , Sy !( "models_transient" ) ] , vec ! [ Sy !( "TransientModel" ) ] ) ;
397+ }
398+ let base_model_syms = session. sync_odoo . get_symbol ( session. sync_odoo . config . odoo_path . as_ref ( ) . unwrap ( ) , & base_model_tree, u32:: MAX ) ;
399+ let model_syms = session. sync_odoo . get_symbol ( session. sync_odoo . config . odoo_path . as_ref ( ) . unwrap ( ) , & model_tree, u32:: MAX ) ;
400+ let transient_syms = session. sync_odoo . get_symbol ( session. sync_odoo . config . odoo_path . as_ref ( ) . unwrap ( ) , & transient_tree, u32:: MAX ) ;
401+ if base_model_syms. is_empty ( ) || model_syms. is_empty ( ) || transient_syms. is_empty ( ) {
402+ //one of them is not already loaded, but that's not really an issue, as now odoo step has been merged
403+ //with arch eval step, some files will be odooed before loading the orm fully. In this case we should
404+ //ignore this error. Moreover if a base is set on the class, it means that the base has been loaded, so
405+ //it is NOT a model.
406+ // session.send_notification(ShowMessage::METHOD, ShowMessageParams{
407+ // typ: MessageType::ERROR,
408+ // message: "Odoo base models are not found. OdooLS will be unable to generate valid diagnostics".to_string()
409+ // });
410+ return false ;
411+ }
412+ if Rc :: ptr_eq ( symbol, & base_model_syms[ 0 ] ) ||
413+ Rc :: ptr_eq ( symbol, & model_syms[ 0 ] ) ||
414+ Rc :: ptr_eq ( symbol, & transient_syms[ 0 ] )
415+ {
416+ return false ;
417+ }
418+ if compare_semver ( session. sync_odoo . full_version . as_str ( ) , "19.1" ) >= Ordering :: Equal {
419+ let cached_model_tree = ( vec ! [ Sy !( "odoo" ) , Sy !( "orm" ) , Sy !( "models_cached" ) ] , vec ! [ Sy !( "CachedModel" ) ] ) ;
420+ let cached_model = session. sync_odoo . get_symbol ( session. sync_odoo . config . odoo_path . as_ref ( ) . unwrap ( ) , & cached_model_tree, u32:: MAX ) ;
421+ if cached_model. is_empty ( ) || Rc :: ptr_eq ( symbol, & cached_model[ 0 ] ) {
417422 return false ;
418423 }
424+
425+ }
426+ if !sym. as_class_sym ( ) . inherits ( & base_model_syms[ 0 ] , & mut None ) {
427+ return false ;
419428 }
420429 sym. as_class_sym_mut ( ) . _model = Some ( ModelData :: new ( ) ) ;
421430 let register = sym. get_symbol ( & ( vec ! [ ] , vec ! [ Sy !( "_register" ) ] ) , u32:: MAX ) ;
0 commit comments