@@ -40,6 +40,7 @@ use tower_lsp::lsp_types::Range;
40
40
use tower_lsp:: lsp_types:: TextEdit ;
41
41
use tree_sitter:: Node ;
42
42
43
+ use crate :: lsp:: completions:: parameter_hints:: ParameterHints ;
43
44
use crate :: lsp:: completions:: types:: CompletionData ;
44
45
use crate :: lsp:: completions:: types:: PromiseStrategy ;
45
46
use crate :: lsp:: document_context:: DocumentContext ;
@@ -169,6 +170,7 @@ pub(super) unsafe fn completion_item_from_package(
169
170
pub ( super ) fn completion_item_from_function (
170
171
name : & str ,
171
172
package : Option < & str > ,
173
+ parameter_hints : ParameterHints ,
172
174
) -> Result < CompletionItem > {
173
175
let label = format ! ( "{}" , name) ;
174
176
let mut item = completion_item ( label, CompletionData :: Function {
@@ -182,17 +184,23 @@ pub(super) fn completion_item_from_function(
182
184
item. label_details = Some ( label_details) ;
183
185
184
186
let insert_text = sym_quote_invalid ( name) ;
185
- item. insert_text_format = Some ( InsertTextFormat :: SNIPPET ) ;
186
- item. insert_text = Some ( format ! ( "{insert_text}($0)" ) ) ;
187
187
188
- // provide parameter completions after completing function
189
- item. command = Some ( Command {
190
- title : "Trigger Parameter Hints" . to_string ( ) ,
191
- command : "editor.action.triggerParameterHints" . to_string ( ) ,
192
- ..Default :: default ( )
193
- } ) ;
188
+ if parameter_hints. is_enabled ( ) {
189
+ item. insert_text_format = Some ( InsertTextFormat :: SNIPPET ) ;
190
+ item. insert_text = Some ( format ! ( "{insert_text}($0)" ) ) ;
194
191
195
- return Ok ( item) ;
192
+ // provide parameter completions after completing function
193
+ item. command = Some ( Command {
194
+ title : "Trigger Parameter Hints" . to_string ( ) ,
195
+ command : "editor.action.triggerParameterHints" . to_string ( ) ,
196
+ ..Default :: default ( )
197
+ } ) ;
198
+ } else {
199
+ item. insert_text_format = Some ( InsertTextFormat :: PLAIN_TEXT ) ;
200
+ item. insert_text = Some ( insert_text) ;
201
+ }
202
+
203
+ Ok ( item)
196
204
}
197
205
198
206
fn item_details ( package : Option < & str > ) -> CompletionItemLabelDetails {
@@ -245,9 +253,17 @@ pub(super) unsafe fn completion_item_from_object(
245
253
envir : SEXP ,
246
254
package : Option < & str > ,
247
255
promise_strategy : PromiseStrategy ,
256
+ parameter_hints : ParameterHints ,
248
257
) -> Result < CompletionItem > {
249
258
if r_typeof ( object) == PROMSXP {
250
- return completion_item_from_promise ( name, object, envir, package, promise_strategy) ;
259
+ return completion_item_from_promise (
260
+ name,
261
+ object,
262
+ envir,
263
+ package,
264
+ promise_strategy,
265
+ parameter_hints,
266
+ ) ;
251
267
}
252
268
253
269
// TODO: For some functions (e.g. S4 generics?) the help file might be
@@ -256,7 +272,7 @@ pub(super) unsafe fn completion_item_from_object(
256
272
// In other words, when creating a completion item for these functions,
257
273
// we should also figure out where we can receive the help from.
258
274
if Rf_isFunction ( object) != 0 {
259
- return completion_item_from_function ( name, package) ;
275
+ return completion_item_from_function ( name, package, parameter_hints ) ;
260
276
}
261
277
262
278
let mut item = completion_item ( name, CompletionData :: Object {
@@ -287,12 +303,20 @@ pub(super) unsafe fn completion_item_from_promise(
287
303
envir : SEXP ,
288
304
package : Option < & str > ,
289
305
promise_strategy : PromiseStrategy ,
306
+ parameter_hints : ParameterHints ,
290
307
) -> Result < CompletionItem > {
291
308
if r_promise_is_forced ( object) {
292
309
// Promise has already been evaluated before.
293
310
// Generate completion item from underlying value.
294
311
let object = PRVALUE ( object) ;
295
- return completion_item_from_object ( name, object, envir, package, promise_strategy) ;
312
+ return completion_item_from_object (
313
+ name,
314
+ object,
315
+ envir,
316
+ package,
317
+ promise_strategy,
318
+ parameter_hints,
319
+ ) ;
296
320
}
297
321
298
322
if promise_strategy == PromiseStrategy :: Force && r_promise_is_lazy_load_binding ( object) {
@@ -302,7 +326,14 @@ pub(super) unsafe fn completion_item_from_promise(
302
326
// important for functions, where we also set a `CompletionItem::command()`
303
327
// to display function signature help after the completion.
304
328
let object = r_promise_force_with_rollback ( object) ?;
305
- return completion_item_from_object ( name, object. sexp , envir, package, promise_strategy) ;
329
+ return completion_item_from_object (
330
+ name,
331
+ object. sexp ,
332
+ envir,
333
+ package,
334
+ promise_strategy,
335
+ parameter_hints,
336
+ ) ;
306
337
}
307
338
308
339
// Otherwise we never want to force promises, so we return a fairly
@@ -342,19 +373,28 @@ pub(super) unsafe fn completion_item_from_namespace(
342
373
name : & str ,
343
374
namespace : SEXP ,
344
375
package : & str ,
376
+ parameter_hints : ParameterHints ,
345
377
) -> Result < CompletionItem > {
346
378
// First, look in the namespace itself.
347
- if let Some ( item) =
348
- completion_item_from_symbol ( name, namespace, Some ( package) , PromiseStrategy :: Force )
349
- {
379
+ if let Some ( item) = completion_item_from_symbol (
380
+ name,
381
+ namespace,
382
+ Some ( package) ,
383
+ PromiseStrategy :: Force ,
384
+ parameter_hints,
385
+ ) {
350
386
return item;
351
387
}
352
388
353
389
// Otherwise, try the imports environment.
354
390
let imports = ENCLOS ( namespace) ;
355
- if let Some ( item) =
356
- completion_item_from_symbol ( name, imports, Some ( package) , PromiseStrategy :: Force )
357
- {
391
+ if let Some ( item) = completion_item_from_symbol (
392
+ name,
393
+ imports,
394
+ Some ( package) ,
395
+ PromiseStrategy :: Force ,
396
+ parameter_hints,
397
+ ) {
358
398
return item;
359
399
}
360
400
@@ -376,7 +416,10 @@ pub(super) unsafe fn completion_item_from_lazydata(
376
416
// long time to load.
377
417
let promise_strategy = PromiseStrategy :: Simple ;
378
418
379
- match completion_item_from_symbol ( name, env, Some ( package) , promise_strategy) {
419
+ // Lazydata objects are never functions, so this doesn't really matter
420
+ let parameter_hints = ParameterHints :: Enabled ;
421
+
422
+ match completion_item_from_symbol ( name, env, Some ( package) , promise_strategy, parameter_hints) {
380
423
Some ( item) => item,
381
424
None => {
382
425
// Should be impossible, but we'll be extra safe
@@ -390,6 +433,7 @@ pub(super) unsafe fn completion_item_from_symbol(
390
433
envir : SEXP ,
391
434
package : Option < & str > ,
392
435
promise_strategy : PromiseStrategy ,
436
+ parameter_hints : ParameterHints ,
393
437
) -> Option < Result < CompletionItem > > {
394
438
let symbol = r_symbol ! ( name) ;
395
439
@@ -422,6 +466,7 @@ pub(super) unsafe fn completion_item_from_symbol(
422
466
envir,
423
467
package,
424
468
promise_strategy,
469
+ parameter_hints,
425
470
) )
426
471
}
427
472
0 commit comments