Skip to content

Commit 459d889

Browse files
committed
[IMP] add filter_on_tree to follow_ref
1 parent 46ce69f commit 459d889

File tree

11 files changed

+98
-36
lines changed

11 files changed

+98
-36
lines changed

server/src/core/evaluation.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ impl Evaluation {
452452
EvaluationSymbolPtr::WEAK(_) => {
453453
//take the weak by get_symbol instead of the match
454454
let symbol_eval = self.symbol.get_symbol(session, &mut None, &mut vec![], Some(function.clone()));
455-
let out_of_scope = Symbol::follow_ref(&symbol_eval, session, &mut None, false, false, Some(function.clone()));
455+
let out_of_scope = Symbol::follow_ref(&symbol_eval, session, &mut None, false, false, None, Some(function.clone()));
456456
for sym in out_of_scope {
457457
if !sym.is_expired_if_weak() {
458458
res.push(Evaluation {
@@ -481,7 +481,7 @@ impl Evaluation {
481481
if eval_symbol.is_expired_if_weak() {
482482
return None;
483483
}
484-
let evals = Symbol::follow_ref(&eval_symbol, session, context, false, true, None);
484+
let evals = Symbol::follow_ref(&eval_symbol, session, context, false, true, None, None);
485485
if evals.len() == 1 {
486486
let eval = &evals[0];
487487
match eval {
@@ -785,7 +785,7 @@ impl Evaluation {
785785
}
786786
let base_eval_ptrs: Vec<EvaluationSymbolPtr> = base_evals.iter().map(|base_eval| {
787787
let base_sym_weak_eval_base = base_eval.symbol.get_symbol_weak_transformed(session, context, &mut diagnostics, None);
788-
Symbol::follow_ref(&base_sym_weak_eval_base, session, context, true, false, None)
788+
Symbol::follow_ref(&base_sym_weak_eval_base, session, context, true, false, None, None)
789789
}).flatten().collect();
790790

791791
let parent_file_or_func = parent.clone().borrow().parent_file_or_function().as_ref().unwrap().upgrade().unwrap();
@@ -817,7 +817,7 @@ impl Evaluation {
817817
let res = class_sym_weak_eval.weak.upgrade().and_then(|class_sym|{
818818
let class_sym_weak_eval = &Symbol::follow_ref(&&EvaluationSymbolPtr::WEAK(EvaluationSymbolWeak::new(
819819
Rc::downgrade(&class_sym), None, false
820-
)), session, &mut None, false, false, None)[0];
820+
)), session, &mut None, false, false, None, None)[0];
821821
if class_sym_weak_eval.upgrade_weak().unwrap().borrow().typ() != SymType::CLASS{
822822
return None;
823823
}
@@ -846,7 +846,7 @@ impl Evaluation {
846846
let object_or_type_weak_eval = &Symbol::follow_ref(
847847
&object_or_type_eval[0].symbol.get_symbol(
848848
session, context, &mut diagnostics, Some(parent.clone())),
849-
session, &mut None, false, false, None)[0];
849+
session, &mut None, false, false, None, None)[0];
850850
if object_or_type_weak_eval.is_weak() {
851851
is_instance = Some(object_or_type_weak_eval.as_weak().instance.unwrap_or(default_instance));
852852
} else {
@@ -1050,7 +1050,7 @@ impl Evaluation {
10501050
if base_ref.is_expired_if_weak() {
10511051
return AnalyzeAstResult::from_only_diagnostics(diagnostics);
10521052
}
1053-
let bases = Symbol::follow_ref(&base_ref, session, context, false, false, None);
1053+
let bases = Symbol::follow_ref(&base_ref, session, context, false, false, None, None);
10541054
for ibase in bases.iter() {
10551055
let base_loc = ibase.upgrade_weak();
10561056
if let Some(base_loc) = base_loc {
@@ -1172,7 +1172,7 @@ impl Evaluation {
11721172
if base.is_expired_if_weak() {
11731173
return AnalyzeAstResult::from_only_diagnostics(diagnostics);
11741174
}
1175-
let bases = Symbol::follow_ref(&base, session, &mut None, false, false, None);
1175+
let bases = Symbol::follow_ref(&base, session, &mut None, false, false, None, None);
11761176
let value = Evaluation::expr_to_str(session, &sub.slice, parent.clone(), max_infer, false, &mut diagnostics);
11771177
diagnostics.extend(value.1);
11781178
for base in bases.iter() {
@@ -1284,7 +1284,7 @@ impl Evaluation {
12841284
diagnostics.extend(diags);
12851285
for base in bases.into_iter(){
12861286
let base_sym_weak_eval= base.symbol.get_symbol_weak_transformed(session, context, &mut diagnostics, None);
1287-
let base_eval_ptrs = Symbol::follow_ref(&base_sym_weak_eval, session, context, true, false, None);
1287+
let base_eval_ptrs = Symbol::follow_ref(&base_sym_weak_eval, session, context, true, false, None, None);
12881288
for base_eval_ptr in base_eval_ptrs.iter() {
12891289
let EvaluationSymbolPtr::WEAK(base_sym_weak_eval) = base_eval_ptr else {continue};
12901290
let Some(base_sym) = base_sym_weak_eval.weak.upgrade() else {continue};

server/src/core/python_arch_builder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ impl PythonArchBuilder {
184184
if let Some(all) = import_symbol.borrow().get_content_symbol("__all__", u32::MAX).symbols.first().cloned() {
185185
let all_value = Symbol::follow_ref(&EvaluationSymbolPtr::WEAK(EvaluationSymbolWeak::new(
186186
Rc::downgrade(&all), None, false
187-
)), session, &mut None, false, true, None);
187+
)), session, &mut None, false, true, None, None);
188188
if let Some(all_value_first) = all_value.get(0) {
189189
if !all_value_first.is_expired_if_weak() {
190190
let all_upgraded = all_value_first.upgrade_weak();

server/src/core/python_arch_eval.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ impl PythonArchEval {
362362
let sym_ref_cl = sym_ref.clone();
363363
let syms_followed = Symbol::follow_ref(&EvaluationSymbolPtr::WEAK(EvaluationSymbolWeak::new(
364364
Rc::downgrade(&sym_ref_cl), None, false
365-
)), session, &mut None, false, false, None);
365+
)), session, &mut None, false, false, None, None);
366366
for sym in syms_followed.iter() {
367367
let sym = sym.upgrade_weak();
368368
if let Some(sym) = sym {
@@ -658,7 +658,7 @@ impl PythonArchEval {
658658
}
659659
let eval_base = &eval_base[0];
660660
let eval_symbol = eval_base.symbol.get_symbol(session, &mut None, &mut vec![], None);
661-
let ref_sym = Symbol::follow_ref(&eval_symbol, session, &mut None, false, true, None);
661+
let ref_sym = Symbol::follow_ref(&eval_symbol, session, &mut None, false, true, None, None);
662662
if ref_sym.len() > 1 {
663663
if let Some(diagnostic) = create_diagnostic(&session, DiagnosticCode::OLS01003, &[&AstUtils::flatten_expr(base)]) {
664664
self.diagnostics.push(Diagnostic {
@@ -821,7 +821,7 @@ impl PythonArchEval {
821821
let eval = &eval_iter_node[0];
822822
let eval_symbol = eval.symbol.get_symbol(session, &mut None, &mut vec![], None);
823823
if !eval_symbol.is_expired_if_weak() {
824-
let symbol_eval = Symbol::follow_ref(&eval_symbol, session, &mut None, false, false, None);
824+
let symbol_eval = Symbol::follow_ref(&eval_symbol, session, &mut None, false, false, None, None);
825825
if symbol_eval.len() == 1 && symbol_eval[0].upgrade_weak().is_some() {
826826
let symbol_type_rc = symbol_eval[0].upgrade_weak().unwrap();
827827
let symbol_type = symbol_type_rc.borrow();
@@ -1001,7 +1001,7 @@ impl PythonArchEval {
10011001
diagnostics.extend(diags);
10021002
// Check for type annotation `typing.Self`, if so, return a `self` evaluation
10031003
let final_evaluations = evaluations.into_iter().map(|eval|{
1004-
let sym_ptrs = Symbol::follow_ref(&eval.symbol.get_symbol(session, &mut None, diagnostics, None), session, &mut None, false, false, None);
1004+
let sym_ptrs = Symbol::follow_ref(&eval.symbol.get_symbol(session, &mut None, diagnostics, None), session, &mut None, false, false, None, None);
10051005
for sym_ptr in sym_ptrs.iter(){
10061006
let EvaluationSymbolPtr::WEAK(sym_weak) = sym_ptr else {continue};
10071007
let Some(sym_rc) = sym_weak.weak.upgrade() else {continue};

server/src/core/python_arch_eval_hooks.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -718,7 +718,7 @@ impl PythonArchEvalHooks {
718718
diagnostics.extend(diags);
719719
let mut followed_evals = vec![];
720720
for eval in dec_evals {
721-
followed_evals.extend(Symbol::follow_ref(&eval.symbol.get_symbol(session, &mut None, &mut vec![], None), session, &mut None, true, false, None));
721+
followed_evals.extend(Symbol::follow_ref(&eval.symbol.get_symbol(session, &mut None, &mut vec![], None), session, &mut None, true, false, None, None));
722722
}
723723
for decorator_eval in followed_evals {
724724
let EvaluationSymbolPtr::WEAK(decorator_eval_sym_weak) = decorator_eval else {

server/src/core/python_odoo_builder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ impl PythonOdooBuilder {
448448
};
449449
for eval in evals.iter() {
450450
let eval_sym_ptr = eval.symbol.get_symbol(session, &mut None, &mut vec![], None);
451-
let eval_ptrs = Symbol::follow_ref(&eval_sym_ptr, session, &mut None, true, false, None);
451+
let eval_ptrs = Symbol::follow_ref(&eval_sym_ptr, session, &mut None, true, false, None, None);
452452
for eval_ptr in eval_ptrs.iter() {
453453
let eval_weak = match &eval_ptr {
454454
EvaluationSymbolPtr::WEAK(w) => w,

server/src/core/python_validator.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ impl PythonValidator {
406406
};
407407
for eval in evals.iter() {
408408
let symbol = eval.symbol.get_symbol(session, &mut None, &mut vec![], None);
409-
let eval_weaks = Symbol::follow_ref(&symbol, session, &mut None, true, false, None);
409+
let eval_weaks = Symbol::follow_ref(&symbol, session, &mut None, true, false, None, None);
410410
for eval_weak in eval_weaks.iter() {
411411
let Some(symbol) = eval_weak.upgrade_weak() else {continue};
412412
if !symbol.borrow().is_field_class(session){
@@ -445,7 +445,7 @@ impl PythonValidator {
445445
Rc::downgrade(&sym),
446446
None,
447447
false,
448-
)), session, &mut None, true, true, None);
448+
)), session, &mut None, true, true, None, None);
449449
related_eval_weaks.iter().any(|related_eval_weak|{
450450
let Some(related_field_class_sym) = related_eval_weak.upgrade_weak() else {
451451
return false
@@ -587,6 +587,7 @@ impl PythonValidator {
587587
true,
588588
false,
589589
None,
590+
None,
590591
);
591592
comodel_eval_weaks.extend(followed);
592593
}

server/src/core/symbols/symbol.rs

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use weak_table::PtrWeakHashSet;
2121
use std::path::PathBuf;
2222
use std::rc::{Rc, Weak};
2323
use std::cell::RefCell;
24-
use std::vec;
24+
use std::{u32, vec};
2525
use lsp_types::{Diagnostic, DiagnosticTag, Position, Range, SymbolKind};
2626

2727
use crate::core::symbols::function_symbol::FunctionSymbol;
@@ -2196,12 +2196,22 @@ impl Symbol {
21962196
/*
21972197
Follow evaluation of current symbol until type, value or end of the chain, depending or the parameters.
21982198
If a symbol in the chain is a descriptor, return the __get__ return evaluation.
2199+
If filter_on_tree is set, stop following when one of the symbols in the chain is in the tree, and only return those symbols.
21992200
*/
2200-
pub fn follow_ref(evaluation: &EvaluationSymbolPtr, session: &mut SessionInfo, context: &mut Option<Context>, stop_on_type: bool, stop_on_value: bool, max_scope: Option<Rc<RefCell<Symbol>>>) -> Vec<EvaluationSymbolPtr> {
2201+
pub fn follow_ref(evaluation: &EvaluationSymbolPtr, session: &mut SessionInfo, context: &mut Option<Context>, stop_on_type: bool, stop_on_value: bool, filter_on_tree: Option<Tree>, max_scope: Option<Rc<RefCell<Symbol>>>) -> Vec<EvaluationSymbolPtr> {
2202+
let default_result = match filter_on_tree.as_ref() {
2203+
Some(_) => vec![],
2204+
None => vec![evaluation.clone()],
2205+
};
2206+
let stop_on_tree_syms = filter_on_tree.map(|tree| session.sync_odoo.get_symbol("", &tree, u32::MAX));
2207+
if matches!(stop_on_tree_syms.as_ref(), Some(syms) if syms.is_empty()) {
2208+
// can't find the tree symbol, stop here
2209+
return default_result;
2210+
}
22012211
match evaluation {
22022212
EvaluationSymbolPtr::WEAK(w) => {
22032213
let Some(symbol) = w.weak.upgrade() else {
2204-
return vec![evaluation.clone()];
2214+
return default_result;
22052215
};
22062216
if stop_on_value {
22072217
if let Some(evals) = symbol.borrow().evaluations() {
@@ -2215,7 +2225,7 @@ impl Symbol {
22152225
//return a list of all possible evaluation: a weak ptr to the final symbol, and a bool indicating if this is an instance or not
22162226
let mut results = Symbol::next_refs(session, symbol.clone(), context, &w.context, stop_on_type, &mut vec![]);
22172227
if results.is_empty() {
2218-
return vec![evaluation.clone()];
2228+
return default_result;
22192229
}
22202230
if w.instance.is_some_and(|v| v) {
22212231
//if the previous evaluation was set to True, we want to keep it
@@ -2262,6 +2272,11 @@ impl Symbol {
22622272
if max_scope.is_some() && !sym.has_rc_in_parents(max_scope.as_ref().unwrap().clone(), true) {
22632273
continue;
22642274
}
2275+
if let Some(stop_on_tree_syms) = stop_on_tree_syms.as_ref() {
2276+
if stop_on_tree_syms.iter().any(|s| Rc::ptr_eq(s, &sym_rc)) {
2277+
continue;
2278+
}
2279+
}
22652280
}
22662281
if sym_rc.borrow().as_variable().evaluations.is_empty() && sym_rc.borrow().name() != "__all__" && can_eval_external {
22672282
//no evaluation? let's check that the file has been evaluated
@@ -2307,6 +2322,20 @@ impl Symbol {
23072322
_ => {}
23082323
}
23092324
}
2325+
if let Some(stop_on_tree_syms) = stop_on_tree_syms.as_ref() {
2326+
results.retain(|r| {
2327+
match r {
2328+
EvaluationSymbolPtr::WEAK(weak) => {
2329+
if let Some(sym_rc) = weak.weak.upgrade() {
2330+
stop_on_tree_syms.iter().any(|s| Rc::ptr_eq(s, &sym_rc))
2331+
} else {
2332+
false
2333+
}
2334+
},
2335+
_ => false
2336+
}
2337+
});
2338+
}
23102339
Vec::from(results) // :'( a whole copy?
23112340
},
23122341
_ => {
@@ -2606,7 +2635,7 @@ impl Symbol {
26062635
if let Some(evals) = self.evaluations().as_ref() {
26072636
for eval in evals.iter() {
26082637
let symbol = eval.symbol.get_symbol(session, &mut None, &mut vec![], None);
2609-
let eval_weaks = Symbol::follow_ref(&symbol, session, &mut None, true, false, None);
2638+
let eval_weaks = Symbol::follow_ref(&symbol, session, &mut None, true, false, None, None);
26102639
for eval_weak in eval_weaks.iter() {
26112640
if let Some(symbol) = eval_weak.upgrade_weak() {
26122641
if symbol.borrow().is_field_class(session){
@@ -2629,7 +2658,7 @@ impl Symbol {
26292658
if let Some(evals) = self.evaluations().as_ref() {
26302659
for eval in evals.iter() {
26312660
let symbol = eval.symbol.get_symbol(session, &mut None, &mut vec![], None);
2632-
let eval_weaks = Symbol::follow_ref(&symbol, session, &mut None, true, false, None);
2661+
let eval_weaks = Symbol::follow_ref(&symbol, session, &mut None, true, false, None, None);
26332662
for eval_weak in eval_weaks.iter() {
26342663
if let Some(symbol) = eval_weak.upgrade_weak() {
26352664
if symbol.borrow().typ() == SymType::FUNCTION {
@@ -2742,7 +2771,7 @@ impl Symbol {
27422771
if let Some(evals) = self.evaluations().as_ref() {
27432772
for eval in evals.iter() {
27442773
let symbol = eval.symbol.get_symbol(session, &mut None, &mut vec![], None);
2745-
let eval_weaks = Symbol::follow_ref(&symbol, session, &mut None, true, false, None);
2774+
let eval_weaks = Symbol::follow_ref(&symbol, session, &mut None, true, false, None, None);
27462775
for eval_weak in eval_weaks.iter() {
27472776
if let Some(symbol) = eval_weak.upgrade_weak() {
27482777
if symbol.borrow().is_specific_field_class(session, field_names){

server/src/core/symbols/variable_symbol.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ impl VariableSymbol {
6767
context = Some(HashMap::new());
6868
context.as_mut().unwrap().insert(S!("base_attr"), ContextValue::SYMBOL(parent.clone()));
6969
}
70-
let eval_weaks = Symbol::follow_ref(&symbol, session, &mut context, false, false, None);
70+
let eval_weaks = Symbol::follow_ref(&symbol, session, &mut context, false, false, None, None);
7171
for eval_weak in eval_weaks.iter() {
7272
if let Some(symbol) = eval_weak.upgrade_weak() {
7373
if ["Many2one", "One2many", "Many2many"].contains(&symbol.borrow().name().as_str()) {

0 commit comments

Comments
 (0)