@@ -5,6 +5,7 @@ use crate::{
5
5
context:: CompletionContext ,
6
6
item:: CompletionItem ,
7
7
providers:: { complete_columns, complete_functions, complete_tables} ,
8
+ sanitization:: SanitizedCompletionParams ,
8
9
} ;
9
10
10
11
pub const LIMIT : usize = 50 ;
@@ -21,45 +22,16 @@ pub struct CompletionParams<'a> {
21
22
text = params. text,
22
23
position = params. position. to_string( )
23
24
) ) ]
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 ! [ ] ;
42
31
}
43
-
44
- mutated_sql
45
- } else {
46
- params. text
47
32
} ;
48
33
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) ;
63
35
64
36
let mut builder = CompletionBuilder :: new ( ) ;
65
37
@@ -69,87 +41,3 @@ pub fn complete(mut params: CompletionParams) -> Vec<CompletionItem> {
69
41
70
42
builder. finish ( )
71
43
}
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