11use  text_size:: TextSize ; 
22
33use  crate :: { 
4-  builder:: CompletionBuilder ,  context:: CompletionContext ,  item:: CompletionItem , 
5-  providers:: complete_tables, 
4+  builder:: CompletionBuilder , 
5+  context:: CompletionContext , 
6+  item:: CompletionItem , 
7+  providers:: { complete_functions,  complete_tables} , 
68} ; 
79
810pub  const  LIMIT :  usize  = 50 ; 
@@ -11,7 +13,7 @@ pub const LIMIT: usize = 50;
1113pub  struct  CompletionParams < ' a >  { 
1214 pub  position :  TextSize , 
1315 pub  schema :  & ' a  pg_schema_cache:: SchemaCache , 
14-  pub  text :  & ' a   str , 
16+  pub  text :  String , 
1517 pub  tree :  Option < & ' a  tree_sitter:: Tree > , 
1618} 
1719
@@ -34,192 +36,7 @@ pub fn complete(params: CompletionParams) -> CompletionResult {
3436 let  mut  builder = CompletionBuilder :: new ( ) ; 
3537
3638 complete_tables ( & ctx,  & mut  builder) ; 
39+  complete_functions ( & ctx,  & mut  builder) ; 
3740
3841 builder. finish ( ) 
3942} 
40- 
41- #[ cfg( test) ]  
42- mod  tests { 
43-  use  pg_schema_cache:: SchemaCache ; 
44-  use  pg_test_utils:: test_database:: * ; 
45- 
46-  use  sqlx:: Executor ; 
47- 
48-  use  crate :: { complete,  CompletionParams } ; 
49- 
50-  #[ tokio:: test]  
51-  async  fn  autocompletes_simple_table ( )  { 
52-  let  test_db = get_new_test_db ( ) . await ; 
53- 
54-  let  setup = r#" 
55-  create table users ( 
56-  id serial primary key, 
57-  name text, 
58-  password text 
59-  ); 
60-  "# ; 
61- 
62-  test_db
63-  . execute ( setup) 
64-  . await 
65-  . expect ( "Failed to execute setup query" ) ; 
66- 
67-  let  input = "select * from u" ; 
68- 
69-  let  mut  parser = tree_sitter:: Parser :: new ( ) ; 
70-  parser
71-  . set_language ( tree_sitter_sql:: language ( ) ) 
72-  . expect ( "Error loading sql language" ) ; 
73- 
74-  let  tree = parser. parse ( input,  None ) . unwrap ( ) ; 
75-  let  schema_cache = SchemaCache :: load ( & test_db) 
76-  . await 
77-  . expect ( "Couldn't load Schema Cache" ) ; 
78- 
79-  let  p = CompletionParams  { 
80-  position :  ( ( input. len ( )  - 1 )  as  u32 ) . into ( ) , 
81-  schema :  & schema_cache, 
82-  text :  input, 
83-  tree :  Some ( & tree) , 
84-  } ; 
85- 
86-  let  result = complete ( p) ; 
87- 
88-  assert ! ( !result. items. is_empty( ) ) ; 
89- 
90-  let  best_match = & result. items [ 0 ] ; 
91- 
92-  assert_eq ! ( 
93-  best_match. label,  "users" , 
94-  "Does not return the expected table to autocomplete: {}" , 
95-  best_match. label
96-  ) 
97-  } 
98- 
99-  #[ tokio:: test]  
100-  async  fn  autocompletes_table_alphanumerically ( )  { 
101-  let  test_db = get_new_test_db ( ) . await ; 
102- 
103-  let  setup = r#" 
104-  create table addresses ( 
105-  id serial primary key 
106-  ); 
107- 
108-  create table users ( 
109-  id serial primary key 
110-  ); 
111- 
112-  create table emails ( 
113-  id serial primary key 
114-  ); 
115-  "# ; 
116- 
117-  test_db
118-  . execute ( setup) 
119-  . await 
120-  . expect ( "Failed to execute setup query" ) ; 
121- 
122-  let  schema_cache = SchemaCache :: load ( & test_db) 
123-  . await 
124-  . expect ( "Couldn't load Schema Cache" ) ; 
125- 
126-  let  mut  parser = tree_sitter:: Parser :: new ( ) ; 
127-  parser
128-  . set_language ( tree_sitter_sql:: language ( ) ) 
129-  . expect ( "Error loading sql language" ) ; 
130- 
131-  let  test_cases = vec ! [ 
132-  ( "select * from us" ,  "users" ) , 
133-  ( "select * from em" ,  "emails" ) , 
134-  ( "select * from " ,  "addresses" ) , 
135-  ] ; 
136- 
137-  for  ( input,  expected_label)  in  test_cases { 
138-  let  tree = parser. parse ( input,  None ) . unwrap ( ) ; 
139- 
140-  let  p = CompletionParams  { 
141-  position :  ( ( input. len ( )  - 1 )  as  u32 ) . into ( ) , 
142-  schema :  & schema_cache, 
143-  text :  input, 
144-  tree :  Some ( & tree) , 
145-  } ; 
146- 
147-  let  result = complete ( p) ; 
148- 
149-  assert ! ( !result. items. is_empty( ) ) ; 
150- 
151-  let  best_match = & result. items [ 0 ] ; 
152- 
153-  assert_eq ! ( 
154-  best_match. label,  expected_label, 
155-  "Does not return the expected table to autocomplete: {}" , 
156-  best_match. label
157-  ) 
158-  } 
159-  } 
160- 
161-  #[ tokio:: test]  
162-  async  fn  autocompletes_table_with_schema ( )  { 
163-  let  test_db = get_new_test_db ( ) . await ; 
164- 
165-  let  setup = r#" 
166-  create schema customer_support; 
167-  create schema private; 
168- 
169-  create table private.user_z ( 
170-  id serial primary key, 
171-  name text, 
172-  password text 
173-  ); 
174- 
175-  create table customer_support.user_y ( 
176-  id serial primary key, 
177-  request text, 
178-  send_at timestamp with time zone 
179-  ); 
180-  "# ; 
181- 
182-  test_db
183-  . execute ( setup) 
184-  . await 
185-  . expect ( "Failed to execute setup query" ) ; 
186- 
187-  let  schema_cache = SchemaCache :: load ( & test_db) 
188-  . await 
189-  . expect ( "Couldn't load SchemaCache" ) ; 
190- 
191-  let  mut  parser = tree_sitter:: Parser :: new ( ) ; 
192-  parser
193-  . set_language ( tree_sitter_sql:: language ( ) ) 
194-  . expect ( "Error loading sql language" ) ; 
195- 
196-  let  test_cases = vec ! [ 
197-  ( "select * from u" ,  "user_y" ) ,  // user_y is preferred alphanumerically 
198-  ( "select * from private.u" ,  "user_z" ) , 
199-  ( "select * from customer_support.u" ,  "user_y" ) , 
200-  ] ; 
201- 
202-  for  ( input,  expected_label)  in  test_cases { 
203-  let  tree = parser. parse ( input,  None ) . unwrap ( ) ; 
204- 
205-  let  p = CompletionParams  { 
206-  position :  ( ( input. len ( )  - 1 )  as  u32 ) . into ( ) , 
207-  schema :  & schema_cache, 
208-  text :  input, 
209-  tree :  Some ( & tree) , 
210-  } ; 
211- 
212-  let  result = complete ( p) ; 
213- 
214-  assert ! ( !result. items. is_empty( ) ) ; 
215- 
216-  let  best_match = & result. items [ 0 ] ; 
217- 
218-  assert_eq ! ( 
219-  best_match. label,  expected_label, 
220-  "Does not return the expected table to autocomplete: {}" , 
221-  best_match. label
222-  ) 
223-  } 
224-  } 
225- } 
0 commit comments