@@ -429,7 +429,7 @@ impl PythonValidator {
429429 }
430430 let Some ( field_type) = symbol
431431 . borrow ( )
432- . get_member_symbol ( session, & S ! ( "type" ) , None , false , false , false , false )
432+ . get_member_symbol ( session, & S ! ( "type" ) , None , false , false , false , false , false )
433433 . 0 . first ( )
434434 . and_then ( |field_type_var| field_type_var. borrow ( ) . evaluations ( ) . cloned ( ) )
435435 . and_then ( |evals| evals. first ( ) . cloned ( ) )
@@ -452,7 +452,7 @@ impl PythonValidator {
452452 } ;
453453 let found = related_field_class_sym
454454 . borrow ( )
455- . get_member_symbol ( session, & S ! ( "type" ) , None , false , false , false , false )
455+ . get_member_symbol ( session, & S ! ( "type" ) , None , false , false , false , false , false )
456456 . 0 . first ( )
457457 . and_then ( |field_type_var| field_type_var. borrow ( ) . evaluations ( ) . cloned ( ) )
458458 . and_then ( |evals| evals. first ( ) . cloned ( ) )
@@ -574,7 +574,42 @@ impl PythonValidator {
574574 ..diagnostic_base. clone ( )
575575 } ) ;
576576 }
577-
577+ } else {
578+ // Check if we have a many2one field pointing to the comodel with another name than the current model
579+ let mut comodel_eval_weaks = Vec :: new ( ) ;
580+ for sym in symbols. iter ( ) {
581+ let sym_ref = sym. borrow ( ) ;
582+ let evals = sym_ref. evaluations ( ) . as_ref ( ) . unwrap ( ) . iter ( ) ;
583+ for eval in evals {
584+ let followed = Symbol :: follow_ref (
585+ & eval. symbol . get_symbol ( session, & mut None , & mut vec ! [ ] , None ) ,
586+ session,
587+ & mut None ,
588+ true ,
589+ false ,
590+ None ,
591+ ) ;
592+ comodel_eval_weaks. extend ( followed) ;
593+ }
594+ }
595+ for comodel_eval_weak in comodel_eval_weaks {
596+ let Some ( model_name) = comodel_eval_weak. as_weak ( ) . context . get ( & S ! ( "comodel_name" ) ) . map ( |ctx_val| ctx_val. as_string ( ) ) else {
597+ continue ;
598+ } ;
599+ if model_name == model_data. name . to_string ( ) { // valid
600+ continue ;
601+ }
602+ let Some ( arg_range) = eval_weak. as_weak ( ) . context . get ( & format ! ( "inverse_name_arg_range" ) ) . map ( |ctx_val| ctx_val. as_text_range ( ) ) else {
603+ continue ;
604+ } ;
605+ if let Some ( diagnostic_base) = create_diagnostic ( & session, DiagnosticCode :: OLS03023 , & [ & inverse_name, & model_data. name , & model_name] ) {
606+ self . diagnostics . push ( Diagnostic {
607+ range : Range :: new ( Position :: new ( arg_range. start ( ) . to_u32 ( ) , 0 ) , Position :: new ( arg_range. end ( ) . to_u32 ( ) , 0 ) ) ,
608+ ..diagnostic_base. clone ( )
609+ } ) ;
610+ break ;
611+ }
612+ }
578613 }
579614 }
580615 }
0 commit comments