Skip to content

Commit 5c0a7a6

Browse files
got the tests…
1 parent 4f00abb commit 5c0a7a6

File tree

7 files changed

+372
-172
lines changed

7 files changed

+372
-172
lines changed

crates/pgt_completions/src/complete.rs

+8-120
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::{
55
context::CompletionContext,
66
item::CompletionItem,
77
providers::{complete_columns, complete_functions, complete_tables},
8+
sanitization::SanitizedCompletionParams,
89
};
910

1011
pub const LIMIT: usize = 50;
@@ -21,45 +22,16 @@ pub struct CompletionParams<'a> {
2122
text = params.text,
2223
position = params.position.to_string()
2324
))]
24-
pub fn complete(mut params: CompletionParams) -> Vec<CompletionItem> {
25-
let should_adjust_params = params.tree.is_some()
26-
&& (cursor_inbetween_nodes(params.tree.unwrap(), params.position)
27-
|| cursor_prepared_to_write_token_after_last_node(
28-
params.tree.unwrap(),
29-
params.position,
30-
));
31-
32-
let usable_sql = if should_adjust_params {
33-
let pos: usize = params.position.into();
34-
35-
let mut mutated_sql = String::new();
36-
37-
for (idx, c) in params.text.chars().enumerate() {
38-
if idx == pos {
39-
mutated_sql.push_str("REPLACED_TOKEN ");
40-
}
41-
mutated_sql.push(c);
25+
pub fn complete(params: CompletionParams) -> Vec<CompletionItem> {
26+
let sanitized_params = match SanitizedCompletionParams::try_from(params) {
27+
Ok(p) => p,
28+
Err(err) => {
29+
tracing::warn!("Not possible to get completions: {}", err);
30+
return vec![];
4231
}
43-
44-
mutated_sql
45-
} else {
46-
params.text
4732
};
4833

49-
let usable_tree = if should_adjust_params {
50-
let mut parser = tree_sitter::Parser::new();
51-
parser
52-
.set_language(tree_sitter_sql::language())
53-
.expect("Error loading sql language");
54-
parser.parse(usable_sql.clone(), None)
55-
} else {
56-
tracing::info!("We're reusing the previous tree.");
57-
None
58-
};
59-
60-
params.text = usable_sql;
61-
62-
let ctx = CompletionContext::new(&params, usable_tree.as_ref().or(params.tree));
34+
let ctx = CompletionContext::new(&sanitized_params);
6335

6436
let mut builder = CompletionBuilder::new();
6537

@@ -69,87 +41,3 @@ pub fn complete(mut params: CompletionParams) -> Vec<CompletionItem> {
6941

7042
builder.finish()
7143
}
72-
73-
fn cursor_inbetween_nodes(tree: &tree_sitter::Tree, position: TextSize) -> bool {
74-
let mut cursor = tree.walk();
75-
let mut node = tree.root_node();
76-
77-
loop {
78-
let child_dx = cursor.goto_first_child_for_byte(position.into());
79-
if child_dx.is_none() {
80-
break;
81-
}
82-
node = cursor.node();
83-
}
84-
85-
let byte = position.into();
86-
87-
// Return true if the cursor is NOT within the node's bounds, INCLUSIVE
88-
!(node.start_byte() <= byte && node.end_byte() >= byte)
89-
}
90-
91-
fn cursor_prepared_to_write_token_after_last_node(
92-
tree: &tree_sitter::Tree,
93-
position: TextSize,
94-
) -> bool {
95-
let cursor_pos: usize = position.into();
96-
cursor_pos == tree.root_node().end_byte() + 1
97-
}
98-
99-
#[cfg(test)]
100-
mod tests {
101-
use pgt_text_size::TextSize;
102-
103-
use crate::complete::{cursor_inbetween_nodes, cursor_prepared_to_write_token_after_last_node};
104-
105-
#[test]
106-
fn test_cursor_inbetween_nodes() {
107-
let input = "select from users;";
108-
109-
let mut parser = tree_sitter::Parser::new();
110-
parser
111-
.set_language(tree_sitter_sql::language())
112-
.expect("Error loading sql language");
113-
114-
let mut tree = parser.parse(input.to_string(), None).unwrap();
115-
116-
// select | from users;
117-
assert!(cursor_inbetween_nodes(&mut tree, TextSize::new(7)));
118-
119-
// select |from users;
120-
assert!(!cursor_inbetween_nodes(&mut tree, TextSize::new(8)));
121-
122-
// select| from users;
123-
assert!(!cursor_inbetween_nodes(&mut tree, TextSize::new(6)));
124-
}
125-
126-
#[test]
127-
fn test_cursor_after_nodes() {
128-
let input = "select * from ";
129-
130-
let mut parser = tree_sitter::Parser::new();
131-
parser
132-
.set_language(tree_sitter_sql::language())
133-
.expect("Error loading sql language");
134-
135-
let mut tree = parser.parse(input.to_string(), None).unwrap();
136-
137-
// select * from|; <-- still on previous token
138-
assert!(!cursor_prepared_to_write_token_after_last_node(
139-
&mut tree,
140-
TextSize::new(14)
141-
));
142-
143-
// select * from |; <-- too far off
144-
assert!(!cursor_prepared_to_write_token_after_last_node(
145-
&mut tree,
146-
TextSize::new(16)
147-
));
148-
149-
// select * from |; <-- just right
150-
assert!(cursor_prepared_to_write_token_after_last_node(
151-
&mut tree,
152-
TextSize::new(15)
153-
));
154-
}
155-
}

0 commit comments

Comments
 (0)