diff --git a/server/src/features/features_utils.rs b/server/src/features/features_utils.rs index fe59572c..3cb3c46b 100644 --- a/server/src/features/features_utils.rs +++ b/server/src/features/features_utils.rs @@ -4,7 +4,7 @@ use ruff_text_size::{Ranged, TextRange, TextSize}; use crate::core::file_mgr::FileMgr; use crate::core::odoo::SyncOdoo; use crate::core::symbols::function_symbol::Argument; -use crate::utils::{compare_semver, PathSanitizer}; +use crate::utils::{MaxTextSize, PathSanitizer, compare_semver}; use std::cmp::Ordering; use std::collections::HashMap; use std::path::PathBuf; @@ -92,7 +92,7 @@ impl FeaturesUtils { from_module: Option>>, field_value: &String, call_expr: &ExprCall, - ) -> Vec>>{ + ) -> Vec>> { let model_name = if let Some(Expr::StringLiteral(expr)) = call_expr.arguments.args.first() { expr.value.to_string() } else { @@ -216,6 +216,7 @@ impl FeaturesUtils { offset: usize, field_range: TextRange, arg_index: usize, + arg_expr: &Expr, ) -> Vec<(Rc>, TextRange)> { let mut arg_symbols: Vec<(Rc>, TextRange)> = vec![]; let callable_evals = Evaluation::eval_from_ast(session, &call_expr.func, scope.clone(), &call_expr.func.range().start(), false, &mut vec![]).0; @@ -230,6 +231,17 @@ impl FeaturesUtils { let Some(callable_sym) = callable.weak.upgrade() else { continue; }; + if callable_sym.borrow().typ() == SymType::CLASS + && callable_sym.borrow().is_specific_field_class(session, &["One2many"]) { + let Some(value) = Evaluation::expr_to_str(session, arg_expr, scope.clone(), &call_expr.range().end(), false, &mut vec![]).0 else { + continue; + }; + arg_symbols.extend( + FeaturesUtils::find_inverse_name_field_symbol(session, from_module.clone(), &value, call_expr) + .into_iter().map(|res| (res, arg_expr.range())) + ); + continue; + } if callable_sym.borrow().typ() != SymType::FUNCTION { continue; } @@ -322,10 +334,10 @@ impl FeaturesUtils { offset: usize, field_range: TextRange, ) -> Vec<(Rc>, TextRange)>{ - if let Some((arg_index, _)) = call_expr.arguments.args.iter().enumerate().find(|(_, arg)| + if let Some((arg_index, arg_expr)) = call_expr.arguments.args.iter().enumerate().find(|(_, arg)| offset > arg.range().start().to_usize() && offset <= arg.range().end().to_usize() ){ - FeaturesUtils::find_positional_argument_symbols(session, scope, from_module, field_name, call_expr, offset, field_range, arg_index) + FeaturesUtils::find_positional_argument_symbols(session, scope, from_module, field_name, call_expr, offset, field_range, arg_index, arg_expr) } else if let Some((_, keyword)) = call_expr.arguments.keywords.iter().enumerate().find(|(_, arg)| offset > arg.range().start().to_usize() && offset <= arg.range().end().to_usize() ){