From 6967dc5a22cdaa9fe0deadd6f41f332268b44ace Mon Sep 17 00:00:00 2001 From: Myriad-Dreamin <35292584+Myriad-Dreamin@users.noreply.github.com> Date: Thu, 27 Jun 2024 16:31:50 +0800 Subject: [PATCH] fix: bad early return in param_completions (#350) * fix: bad early return in param_completions * dev: update snapshot * dev: filter result --- .../fixtures/completion/half_completion.typ | 3 ++ .../snaps/test@half_completion.typ.snap | 54 +++++++++++++++++++ .../src/upstream/complete/ext.rs | 37 +++++++------ 3 files changed, 78 insertions(+), 16 deletions(-) create mode 100644 crates/tinymist-query/src/fixtures/completion/half_completion.typ create mode 100644 crates/tinymist-query/src/fixtures/completion/snaps/test@half_completion.typ.snap diff --git a/crates/tinymist-query/src/fixtures/completion/half_completion.typ b/crates/tinymist-query/src/fixtures/completion/half_completion.typ new file mode 100644 index 00000000..6f1570c8 --- /dev/null +++ b/crates/tinymist-query/src/fixtures/completion/half_completion.typ @@ -0,0 +1,3 @@ +// contains: font + +#set text(fo /* range -2..0 */) \ No newline at end of file diff --git a/crates/tinymist-query/src/fixtures/completion/snaps/test@half_completion.typ.snap b/crates/tinymist-query/src/fixtures/completion/snaps/test@half_completion.typ.snap new file mode 100644 index 00000000..b5d82880 --- /dev/null +++ b/crates/tinymist-query/src/fixtures/completion/snaps/test@half_completion.typ.snap @@ -0,0 +1,54 @@ +--- +source: crates/tinymist-query/src/completion.rs +description: Completion on o (30..32) +expression: "JsonRepr::new_pure(results)" +input_file: crates/tinymist-query/src/fixtures/completion/half_completion.typ +--- +[ + { + "isIncomplete": false, + "items": [ + { + "kind": 5, + "label": "font", + "sortText": "013", + "textEdit": { + "newText": "font: ${1:}, ", + "range": { + "end": { + "character": 11, + "line": 2 + }, + "start": { + "character": 10, + "line": 2 + } + } + } + } + ] + }, + { + "isIncomplete": false, + "items": [ + { + "kind": 5, + "label": "font", + "sortText": "013", + "textEdit": { + "newText": "font: ${1:}", + "range": { + "end": { + "character": 12, + "line": 2 + }, + "start": { + "character": 10, + "line": 2 + } + } + } + } + ] + } +] diff --git a/crates/tinymist-query/src/upstream/complete/ext.rs b/crates/tinymist-query/src/upstream/complete/ext.rs index e9f136ad..5ae015a0 100644 --- a/crates/tinymist-query/src/upstream/complete/ext.rs +++ b/crates/tinymist-query/src/upstream/complete/ext.rs @@ -585,7 +585,7 @@ pub fn param_completions<'a>( let signature = analyze_dyn_signature(ctx.ctx, func.clone()); let leaf_type = ctx.ctx.literal_type_of_node(ctx.leaf.clone()); - log::info!("pos_param_completion_by_type: {:?}", leaf_type); + log::debug!("pos_param_completion_by_type: {:?}", leaf_type); for arg in args.items() { if let ast::Arg::Named(named) = arg { @@ -595,34 +595,39 @@ pub fn param_completions<'a>( let primary_sig = signature.primary(); - log::debug!("pos_param_completion: {:?}", pos_index); + 'pos_check: { + let mut doc = None; - let mut doc = None; - if let Some(pos_index) = pos_index { - let pos = primary_sig.pos.get(pos_index); - log::debug!("pos_param_completion_to: {:?}", pos); + if let Some(pos_index) = pos_index { + let pos = primary_sig.pos.get(pos_index); + log::debug!("pos_param_completion_to: {:?}", pos); - if let Some(pos) = pos { - if set && !pos.settable { - return; - } + if let Some(pos) = pos { + if set && !pos.settable { + break 'pos_check; + } - doc = Some(plain_docs_sentence(&pos.docs)); + doc = Some(plain_docs_sentence(&pos.docs)); - if pos.positional { - type_completion(ctx, &pos.base_type, doc.as_deref()); + if pos.positional { + type_completion(ctx, &pos.base_type, doc.as_deref()); + } } } - } - if let Some(leaf_type) = leaf_type { - type_completion(ctx, &leaf_type, doc.as_deref()); + if let Some(leaf_type) = leaf_type { + type_completion(ctx, &leaf_type, doc.as_deref()); + } } for (name, param) in &primary_sig.named { if ctx.seen_field(name.as_ref().into()) { continue; } + log::debug!( + "pos_named_param_completion_to({set:?}): {name:?} {:?}", + param.settable + ); if set && !param.settable { continue;