From 5d6b2337f8f2867ae420d7d33993335841216e63 Mon Sep 17 00:00:00 2001 From: Gabriel Nordeborn Date: Wed, 11 Jan 2023 19:49:21 +0100 Subject: [PATCH 1/3] let ppat_any trigger completion in patterns. better ergonomics --- analysis/src/CompletionFrontEnd.ml | 3 +- analysis/tests/src/CompletionPattern.res | 3 ++ .../src/expected/CompletionPattern.res.txt | 33 +++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/analysis/src/CompletionFrontEnd.ml b/analysis/src/CompletionFrontEnd.ml index d42f8f448..9aa9146ba 100644 --- a/analysis/src/CompletionFrontEnd.ml +++ b/analysis/src/CompletionFrontEnd.ml @@ -681,7 +681,7 @@ let completionWithParser1 ~currentFile ~debug ~offset ~path ~posCursor ~text = if locHasCursor pat.Parsetree.ppat_loc then Some v else None in match pat.ppat_desc with - | Ppat_any | Ppat_constant _ | Ppat_interval _ -> None + | Ppat_constant _ | Ppat_interval _ -> None | Ppat_lazy p | Ppat_constraint (p, _) | Ppat_alias (p, _) @@ -695,6 +695,7 @@ let completionWithParser1 ~currentFile ~debug ~offset ~path ~posCursor ~text = match orPatWithItem with | None when isPatternHole p1 || isPatternHole p2 -> Some ("", patternPath) | v -> v) + | Ppat_any -> someIfHasCursor ("", patternPath) | Ppat_var {txt} -> someIfHasCursor (txt, patternPath) | Ppat_construct ({txt = Lident "()"}, None) -> (* switch s { | () }*) diff --git a/analysis/tests/src/CompletionPattern.res b/analysis/tests/src/CompletionPattern.res index 26cba1167..749569099 100644 --- a/analysis/tests/src/CompletionPattern.res +++ b/analysis/tests/src/CompletionPattern.res @@ -191,3 +191,6 @@ let s = (true, Some(true), [false]) // switch b { | #one | #three({test: true}, true | ) } // ^com + +// switch s { | (true, _, []) } +// ^com diff --git a/analysis/tests/src/expected/CompletionPattern.res.txt b/analysis/tests/src/expected/CompletionPattern.res.txt index a1e346ef3..8aef02425 100644 --- a/analysis/tests/src/expected/CompletionPattern.res.txt +++ b/analysis/tests/src/expected/CompletionPattern.res.txt @@ -871,3 +871,36 @@ Completable: Cpattern Value[b]->polyvariantPayload::three($1) "documentation": null }] +Complete src/CompletionPattern.res 194:24 +posCursor:[194:24] posNoWhite:[194:23] Found expr:[194:3->194:31] +posCursor:[194:24] posNoWhite:[194:23] Found pattern:[194:16->194:29] +posCursor:[194:24] posNoWhite:[194:23] Found pattern:[194:23->194:24] +Completable: Cpattern Value[s]->tuple($1) +[{ + "label": "None", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "Some(_)", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null, + "insertText": "Some(${1:_})", + "insertTextFormat": 2 + }, { + "label": "Some(true)", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }, { + "label": "Some(false)", + "kind": 4, + "tags": [], + "detail": "bool", + "documentation": null + }] + From 17f0ee7f267d4eb00416d87d5050a958ee377520 Mon Sep 17 00:00:00 2001 From: Gabriel Nordeborn Date: Wed, 11 Jan 2023 19:53:18 +0100 Subject: [PATCH 2/3] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a054d487c..1d69e3756 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ - Complete for `React.element` creator functions (`React.string` etc) when in JSX context. https://github.com/rescript-lang/rescript-vscode/pull/681 - Handle optional record fields in expression/pattern completion. https://github.com/rescript-lang/rescript-vscode/pull/691 - Expand options in completion to make working with options a bit more ergonomic. https://github.com/rescript-lang/rescript-vscode/pull/690 +- Let `_` trigger completion in patterns. https://github.com/rescript-lang/rescript-vscode/pull/692 #### :nail_care: Polish From b8ae91d72cb4f11ff389ba5c8f1e3d62c7be9931 Mon Sep 17 00:00:00 2001 From: Gabriel Nordeborn Date: Thu, 12 Jan 2023 20:23:20 +0100 Subject: [PATCH 3/3] comment --- analysis/src/CompletionFrontEnd.ml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/analysis/src/CompletionFrontEnd.ml b/analysis/src/CompletionFrontEnd.ml index 9aa9146ba..60f67658e 100644 --- a/analysis/src/CompletionFrontEnd.ml +++ b/analysis/src/CompletionFrontEnd.ml @@ -695,7 +695,12 @@ let completionWithParser1 ~currentFile ~debug ~offset ~path ~posCursor ~text = match orPatWithItem with | None when isPatternHole p1 || isPatternHole p2 -> Some ("", patternPath) | v -> v) - | Ppat_any -> someIfHasCursor ("", patternPath) + | Ppat_any -> + (* We treat any `_` as an empty completion. This is mainly because we're + inserting `_` in snippets and automatically put the cursor there. So + letting it trigger an empty completion improves the ergonomics by a + lot. *) + someIfHasCursor ("", patternPath) | Ppat_var {txt} -> someIfHasCursor (txt, patternPath) | Ppat_construct ({txt = Lident "()"}, None) -> (* switch s { | () }*)