diff --git a/CHANGELOG.md b/CHANGELOG.md index de8c061b5..0374167fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ ## master +#### :bug: Bug Fix + +- Fix edge case in switch expr completion. https://github.com/rescript-lang/rescript-vscode/pull/1002 + ## 1.52.0 #### :bug: Bug Fix diff --git a/analysis/src/CompletionFrontEnd.ml b/analysis/src/CompletionFrontEnd.ml index 88bbdd2ce..f5957a8ed 100644 --- a/analysis/src/CompletionFrontEnd.ml +++ b/analysis/src/CompletionFrontEnd.ml @@ -584,9 +584,19 @@ let completionWithParser1 ~currentFile ~debug ~offset ~path ~posCursor | Some contextPath -> setResult (CexhaustiveSwitch {contextPath; exprLoc = exp.pexp_loc})) | Pexp_match (_expr, []) -> + (* switch x { } *) if Debug.verbose () && debugTypedCompletionExpr then print_endline "[typedCompletionExpr] No cases, rest"; () + | Pexp_match (expr, [{pc_lhs; pc_rhs}]) + when locHasCursor expr.pexp_loc + && CompletionExpressions.isExprHole pc_rhs + && CompletionPatterns.isPatternHole pc_lhs -> + (* switch x { | } when we're in the switch expr itself. *) + if Debug.verbose () && debugTypedCompletionExpr then + print_endline + "[typedCompletionExpr] No cases (expr and pat holes), rest"; + () | Pexp_match ( exp, [ diff --git a/analysis/tests/src/CompletionExpressions.res b/analysis/tests/src/CompletionExpressions.res index 8dbff050a..d8ce1ebe2 100644 --- a/analysis/tests/src/CompletionExpressions.res +++ b/analysis/tests/src/CompletionExpressions.res @@ -385,3 +385,6 @@ let {name} = hook({ includeName: true, showMore: true, }) + +// switch someTyp. { | } +// ^com diff --git a/analysis/tests/src/expected/CompletionExpressions.res.txt b/analysis/tests/src/expected/CompletionExpressions.res.txt index 938f96191..2d5c7438c 100644 --- a/analysis/tests/src/expected/CompletionExpressions.res.txt +++ b/analysis/tests/src/expected/CompletionExpressions.res.txt @@ -1459,3 +1459,22 @@ Path hook "documentation": {"kind": "markdown", "value": "```rescript\noperator?: [#\"and\" | #or]\n```\n\n```rescript\ntype config = {includeName: bool, operator: option<[#\"and\" | #or]>, showMore: bool}\n```"} }] +Complete src/CompletionExpressions.res 388:18 +posCursor:[388:18] posNoWhite:[388:17] Found expr:[388:3->388:24] +posCursor:[388:18] posNoWhite:[388:17] Found expr:[388:10->388:18] +Pexp_field [388:10->388:17] _:[388:19->388:18] +Completable: Cpath Value[someTyp]."" +Raw opens: 1 CompletionSupport.place holder +Package opens Pervasives.JsxModules.place holder +Resolved opens 2 pervasives CompletionSupport.res +ContextPath Value[someTyp]."" +ContextPath Value[someTyp] +Path someTyp +[{ + "label": "test", + "kind": 5, + "tags": [], + "detail": "bool", + "documentation": {"kind": "markdown", "value": "```rescript\ntest: bool\n```\n\n```rescript\ntype someTyp = {test: bool}\n```"} + }] +