Skip to content

Commit 5ede711

Browse files
committed
[FIX] fix duplicate references and order in tests
1 parent 8ab3068 commit 5ede711

File tree

5 files changed

+61
-53
lines changed

5 files changed

+61
-53
lines changed

server/src/core/evaluation.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use std::rc::{Rc, Weak};
1212
use std::cell::RefCell;
1313
use crate::core::diagnostics::{create_diagnostic, DiagnosticCode};
1414
use crate::utils::NoHashBuilder;
15-
use crate::{constants::*, Sy};
15+
use crate::{Sy, constants::*, oyarn};
1616
use crate::core::odoo::SyncOdoo;
1717
use crate::threads::SessionInfo;
1818
use crate::S;
@@ -1394,7 +1394,7 @@ impl Evaluation {
13941394
let class_bw = evaluation_search.borrow();
13951395
let class = class_bw.as_class_sym();
13961396
if let Some(model_data) = class._model.as_ref() {
1397-
if s.value.to_str() == model_data.name {
1397+
if oyarn!("{}", s.value.to_str()) == model_data.name {
13981398
let file = parent.borrow().get_file().unwrap().upgrade().unwrap();
13991399
let file_info = session.sync_odoo.get_file_mgr().borrow().get_file_info(&file.borrow().paths()[0]);
14001400
if let Some(file_info) = file_info {

server/src/features/references.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::{cell::RefCell, path::PathBuf, rc::Rc};
44
use lsp_types::{Location, Range};
55
use ruff_python_ast::{Alias, Expr, Identifier, Stmt, StmtAnnAssign, StmtAssert, StmtAssign, StmtAugAssign, StmtClassDef, StmtIf, StmtMatch, StmtRaise, StmtReturn, StmtTry, StmtTypeAlias, StmtWith};
66
use ruff_text_size::{Ranged, TextRange, TextSize};
7-
use tracing::error;
7+
use tracing::{error, warn};
88
use weak_table::PtrWeakHashSet;
99

1010
use crate::S;
@@ -36,7 +36,6 @@ impl ReferenceFeature {
3636
let mut to_check: PtrWeakHashSet<Weak<RefCell<Symbol>>> = PtrWeakHashSet::new();
3737
let symbol_name = target_symbol.borrow().name().to_string();
3838

39-
locations.extend(ReferenceFeature::references_in_file(session, file_symbol, file_info, &symbol_name, &target_symbol));
4039
to_check.insert(file_symbol.clone());
4140

4241
//take arch and arch_eval dependents
@@ -60,14 +59,18 @@ impl ReferenceFeature {
6059
}
6160
}
6261
}
62+
let mut files_to_check: PtrWeakHashSet<Weak<RefCell<Symbol>>> = PtrWeakHashSet::new(); //only iter on files
6363
for sym in to_check.iter() {
6464
let Some(Some(file)) = sym.borrow().get_file().map(|x| x.upgrade()) else { //to be sure we are on a file
6565
continue;
6666
};
67+
files_to_check.insert(file.clone());
68+
}
69+
for file in files_to_check.iter() {
6770
let Some(dep_file_info) = session.sync_odoo.get_file_mgr().borrow().get_file_info(&file.borrow().paths()[0]) else {
6871
continue;
6972
};
70-
locations.extend(ReferenceFeature::references_in_file(session, &sym, &dep_file_info, &symbol_name, &target_symbol));
73+
locations.extend(ReferenceFeature::references_in_file(session, &file, &dep_file_info, &symbol_name, &target_symbol));
7174
}
7275
},
7376
_ => continue,
@@ -333,14 +336,6 @@ impl ReferenceVisitor {
333336
}
334337

335338
fn visit_assign(&mut self, session: &mut SessionInfo, assign: &StmtAssign) {
336-
match *assign.value {
337-
Expr::StringLiteral(ref s) => {
338-
if s.value.to_str() == "pygls.tests.base_test_model" {
339-
error!("here");
340-
}
341-
},
342-
_=> {}
343-
}
344339
self.visit_expr(session, &assign.value, &assign.range.start());
345340
}
346341

server/tests/data/addons/module_1/models/base_test_models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,6 @@ def _get_partner_id(self):
4646
return_funcBase2 = baseInstance2.get_test_int()
4747

4848
class NoBaseModel(models.Model):
49-
_inherit = "module_1.no_base_model"
49+
_inherit = "module_1.no_base_model"
50+
51+
basic_var = 42

server/tests/data/addons/module_1/models/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
from odoo import models, fields
2+
from .base_test_models import basic_var
3+
4+
print(basic_var)
25

36
class model_model(models.Model):
47
pass

server/tests/test_references.rs

Lines changed: 47 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -18,51 +18,59 @@ fn test_references() {
1818

1919
let test_file = test_addons_path.join("module_1").join("models").join("base_test_models.py").sanitize();
2020
//1. reference of a model
21-
let references = get_references(&mut session, &test_file, Position::new(4, 29));
22-
for r in references.iter() {
23-
error!("Reference found at {}:{}:{}", r.uri.as_str(), r.range.start.line, r.range.start.character);
24-
}
25-
assert!(references.len() >= 10, "Expected at least 10 references, got {}", references.len());
26-
for i in 0..9 {
27-
assert!(references[i].uri.as_str().ends_with("base_test_models.py"), "Expected reference in base_test_models.py, got {}", references[i].uri.as_str());
28-
}
29-
assert!(references[0].range.start.line == 4 && references[0].range.start.character == 12, "Expected 1th reference at line 4, character 12, got line {}, character {}", references[0].range.start.line, references[0].range.start.character);
30-
assert!(references[1].range.start.line == 15 && references[1].range.start.character == 8, "Expected 2nd reference at line 15, character 8, got line {}, character {}", references[1].range.start.line, references[1].range.start.character);
31-
assert!(references[2].range.start.line == 32 && references[2].range.start.character == 17, "Expected 3th reference at line 32, character 17, got line {}, character {}", references[2].range.start.line, references[2].range.start.character);
32-
assert!(references[3].range.start.line == 33 && references[3].range.start.character == 8, "Expected 4th reference at line 33, character 8, got line {}, character {}", references[3].range.start.line, references[3].range.start.character);
33-
assert!(references[4].range.start.line == 34 && references[4].range.start.character == 18, "Expected 5th reference at line 34, character 18, got line {}, character {}", references[4].range.start.line, references[4].range.start.character);
34-
assert!(references[5].range.start.line == 40 && references[5].range.start.character == 16, "Expected 6th reference at line 40, character 16, got line {}, character {}", references[5].range.start.line, references[5].range.start.character);
35-
assert!(references[6].range.start.line == 41 && references[6].range.start.character == 16, "Expected 7th reference at line 41, character 16, got line {}, character {}", references[6].range.start.line, references[6].range.start.character);
36-
assert!(references[7].range.start.line == 42 && references[7].range.start.character == 16, "Expected 8th reference at line 42, character 16, got line {}, character {}", references[7].range.start.line, references[7].range.start.character);
37-
assert!(references[8].range.start.line == 43 && references[8].range.start.character == 16, "Expected 9th reference at line 43, character 16, got line {}, character {}", references[8].range.start.line, references[8].range.start.character);
38-
assert!(references[9].uri.as_str().ends_with("module_2/models/base_test_models.py"), "Expected reference 10 to be in module2/base_test_models.py, got {}", references[9].uri.as_str());
39-
assert!(references[10].range.start.line == 44 && references[10].range.start.character == 16, "Expected ninth reference at line 44, character 16, got line {}, character {}", references[10].range.start.line, references[10].range.start.character);
40-
assert!(references.len() == 11, "Expected only 10 references, got unexpected additional references: {}",
41-
references.iter().skip(11).map(|r| format!("{}:{}:{}", r.uri.as_str(), r.range.start.line, r.range.start.character)).collect::<Vec<String>>().join(", ")
21+
let mut references = get_references(&mut session, &test_file, Position::new(4, 29));
22+
//as order is not guaranteed (usage of set), check if the expected reference is somewhere in the result list.
23+
assert_in_result(&mut references, "module_1/models/base_test_models.py", 4, 12);
24+
assert_in_result(&mut references, "module_1/models/base_test_models.py", 15, 8);
25+
assert_in_result(&mut references, "module_1/models/base_test_models.py", 32, 17);
26+
assert_in_result(&mut references, "module_1/models/base_test_models.py", 33, 8);
27+
assert_in_result(&mut references, "module_1/models/base_test_models.py", 34, 18);
28+
assert_in_result(&mut references, "module_1/models/base_test_models.py", 40, 16);
29+
assert_in_result(&mut references, "module_1/models/base_test_models.py", 41, 16);
30+
assert_in_result(&mut references, "module_1/models/base_test_models.py", 42, 16);
31+
assert_in_result(&mut references, "module_1/models/base_test_models.py", 43, 16);
32+
assert_in_result(&mut references, "module_1/models/diagnostics.py", 9, 34);
33+
assert_in_result(&mut references, "module_1/models/diagnostics.py", 17, 34);
34+
assert_in_result(&mut references, "module_1/models/diagnostics.py", 18, 34);
35+
assert_in_result(&mut references, "module_1/models/diagnostics.py", 19, 34);
36+
assert_in_result(&mut references, "module_1/models/diagnostics.py", 20, 34);
37+
assert_in_result(&mut references, "module_1/models/diagnostics.py", 22, 34);
38+
assert_in_result(&mut references, "module_2/models/base_test_models.py", 5, 15);
39+
assert!(references.len() == 0, "Some references were not expected: {}",
40+
references.iter().map(|r| format!("{}:{}:{}", r.uri.as_str(), r.range.start.line, r.range.start.character)).collect::<Vec<String>>().join(", ")
4241
);
4342

4443
// reference of an attribute
45-
let references = get_references(&mut session, &test_file, Position::new(9, 8));
46-
for r in references.iter() {
47-
error!("Reference found at {}:{}:{}", r.uri.as_str(), r.range.start.line, r.range.start.character);
48-
}
49-
assert!(references.len() >= 8, "Expected at least 8 references, got {}", references.len());
50-
for i in 0..8 {
51-
assert!(references[i].uri.as_str().ends_with("base_test_models.py"), "Expected reference in base_test_models.py, got {}", references[i].uri.as_str());
52-
}
53-
assert!(references[0].range.start.line == 15 && references[0].range.start.character == 8, "Expected first reference at line 15, character 8, got line {}, character {}", references[0].range.start.line, references[0].range.start.character);
54-
assert!(references[1].range.start.line == 32 && references[1].range.start.character == 8, "Expected second reference at line 32, character 8, got line {}, character {}", references[1].range.start.line, references[1].range.start.character);
55-
assert!(references[2].range.start.line == 33 && references[2].range.start.character == 8, "Expected third reference at line 33, character 8, got line {}, character {}", references[2].range.start.line, references[2].range.start.character);
56-
assert!(references[3].range.start.line == 34 && references[3].range.start.character == 18, "Expected fourth reference at line 34, character 18, got line {}, character {}", references[3].range.start.line, references[3].range.start.character);
57-
assert!(references[4].range.start.line == 40 && references[4].range.start.character == 16, "Expected fifth reference at line 40, character 16, got line {}, character {}", references[4].range.start.line, references[4].range.start.character);
58-
assert!(references[5].range.start.line == 41 && references[5].range.start.character == 16, "Expected sixth reference at line 41, character 16, got line {}, character {}", references[5].range.start.line, references[5].range.start.character);
59-
assert!(references[6].range.start.line == 42 && references[6].range.start.character == 16, "Expected seventh reference at line 42, character 16, got line {}, character {}", references[6].range.start.line, references[6].range.start.character);
60-
assert!(references[7].range.start.line == 43 && references[7].range.start.character == 16, "Expected eighth reference at line 43, character 16, got line {}, character {}", references[7].range.start.line, references[7].range.start.character);
61-
assert!(references.len() == 8, "Expected only 8 references, got unexpected additional references: {}",
62-
references.iter().skip(8).map(|r| format!("{}:{}:{}", r.uri.as_str(), r.range.start.line, r.range.start.character)).collect::<Vec<String>>().join(", ")
44+
let mut references = get_references(&mut session, &test_file, Position::new(9, 8));
45+
assert_in_result(&mut references, "module_1/models/base_test_models.py", 37, 18);
46+
assert!(references.len() == 0, "Some references were not expected: {}",
47+
references.iter().map(|r| format!("{}:{}:{}", r.uri.as_str(), r.range.start.line, r.range.start.character)).collect::<Vec<String>>().join(", ")
6348
);
6449

6550
//reference of a simple variable
51+
let mut references = get_references(&mut session, &test_file, Position::new(50, 4));
52+
assert_in_result(&mut references, "module_1/models/models.py", 1, 30);
53+
assert!(references.len() == 0, "Some references were not expected: {}",
54+
references.iter().map(|r| format!("{}:{}:{}", r.uri.as_str(), r.range.start.line, r.range.start.character)).collect::<Vec<String>>().join(", ")
55+
);
56+
57+
// for r in references.iter() {
58+
// error!("Reference found at {}:{}:{}", r.uri.as_str(), r.range.start.line, r.range.start.character);
59+
// }
60+
}
61+
62+
fn assert_in_result(references: &mut Vec<Location>, end_path: &str, line: u32, character: u32) {
63+
let mut index = None;
64+
for (i, r) in references.iter().enumerate() {
65+
if r.uri.as_str().ends_with(end_path) && r.range.start.line == line && r.range.start.character == character {
66+
index = Some(i);
67+
}
68+
}
69+
if let Some(i) = index {
70+
references.remove(i);
71+
} else {
72+
assert!(false, "Expected reference not found: {}:{}:{}", end_path, line, character);
73+
}
6674
}
6775

6876
fn get_references(session: &mut SessionInfo, path: &String, position: Position)-> Vec<Location> {

0 commit comments

Comments
 (0)