Skip to content
This repository was archived by the owner on Apr 24, 2021. It is now read-only.

Commit de08edf

Browse files
committed
Explore autocomplete for pipe-first.
1 parent ba04994 commit de08edf

File tree

3 files changed

+94
-49
lines changed

3 files changed

+94
-49
lines changed

src/rescript-editor-support/NewCompletions.re

Lines changed: 75 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,30 @@ let getItems =
574574

575575
module J = JsonShort;
576576

577+
let mkItem = (~name, ~kind, ~detail, ~docstring, ~uri, ~pos_lnum) => {
578+
J.o([
579+
("label", J.s(name)),
580+
("kind", J.i(kind)),
581+
("detail", detail |> J.s),
582+
(
583+
"documentation",
584+
J.o([
585+
("kind", J.s("markdown")),
586+
(
587+
"value",
588+
J.s(
589+
(docstring |? "No docs")
590+
++ "\n\n"
591+
++ uri
592+
++ ":"
593+
++ string_of_int(pos_lnum),
594+
),
595+
),
596+
]),
597+
),
598+
]);
599+
};
600+
577601
let computeCompletions = (~full, ~maybeText, ~package, ~pos, ~state) => {
578602
let parameters =
579603
switch (maybeText) {
@@ -582,19 +606,14 @@ let computeCompletions = (~full, ~maybeText, ~package, ~pos, ~state) => {
582606
switch (PartialParser.positionToOffset(text, pos)) {
583607
| None => None
584608
| Some(offset) =>
585-
switch (PartialParser.findCompletable(text, offset)) {
586-
| None => None
587-
| Some(Clabel(_)) =>
588-
/* Not supported yet */
589-
None
590-
| Some(Cpath(parts)) => Some((text, offset, parts))
591-
}
609+
Some((text, offset, PartialParser.findCompletable(text, offset)))
592610
}
593611
};
594612
let items =
595613
switch (parameters) {
596614
| None => []
597-
| Some((text, offset, parts)) =>
615+
616+
| Some((text, offset, Some(Cpath(parts)))) =>
598617
let rawOpens = PartialParser.findOpens(text, offset);
599618
let allModules =
600619
package.TopTypes.localModules @ package.dependencyModules;
@@ -609,45 +628,57 @@ let computeCompletions = (~full, ~maybeText, ~package, ~pos, ~state) => {
609628
~parts,
610629
);
611630
/* TODO(#107): figure out why we're getting duplicates. */
612-
Utils.dedup(items);
631+
items
632+
|> Utils.dedup
633+
|> List.map(
634+
(
635+
(
636+
uri,
637+
{
638+
SharedTypes.name: {txt: name, loc: {loc_start: {pos_lnum}}},
639+
docstring,
640+
item,
641+
},
642+
),
643+
) =>
644+
mkItem(
645+
~name,
646+
~kind=kindToInt(item),
647+
~detail=detail(name, item),
648+
~docstring,
649+
~uri,
650+
~pos_lnum,
651+
)
652+
);
653+
654+
| Some((_text, _offset, Some(Cpipe(s)))) => [
655+
mkItem(
656+
~name="Foo.pipe",
657+
~kind=9,
658+
~detail=s,
659+
~docstring=None,
660+
~uri="uri",
661+
~pos_lnum=0,
662+
),
663+
mkItem(
664+
~name="Foo.pine",
665+
~kind=9,
666+
~detail=s,
667+
~docstring=None,
668+
~uri="uri",
669+
~pos_lnum=0,
670+
),
671+
]
672+
673+
| Some((_, _, Some(Clabel(_)))) =>
674+
// not supported yet
675+
[]
676+
677+
| Some((_, _, None)) => []
613678
};
614679
if (items == []) {
615680
J.null;
616681
} else {
617-
items
618-
|> List.map(
619-
(
620-
(
621-
uri,
622-
{
623-
SharedTypes.name: {txt: name, loc: {loc_start: {pos_lnum}}},
624-
docstring,
625-
item,
626-
},
627-
),
628-
) => {
629-
J.o([
630-
("label", J.s(name)),
631-
("kind", J.i(kindToInt(item))),
632-
("detail", detail(name, item) |> J.s),
633-
(
634-
"documentation",
635-
J.o([
636-
("kind", J.s("markdown")),
637-
(
638-
"value",
639-
J.s(
640-
(docstring |? "No docs")
641-
++ "\n\n"
642-
++ Uri2.toString(uri)
643-
++ ":"
644-
++ string_of_int(pos_lnum),
645-
),
646-
),
647-
]),
648-
),
649-
])
650-
})
651-
|> J.l;
682+
items |> J.l;
652683
};
653684
};

src/rescript-editor-support/PartialParser.re

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,20 +66,31 @@ let rec startOfLident = (text, i) =>
6666

6767
type completable =
6868
| Clabel(string)
69-
| Cpath(list(string));
69+
| Cpath(list(string))
70+
| Cpipe(string);
7071

7172
let findCompletable = (text, offset) => {
7273
let mkPath = s => {
73-
let parts = Str.split(Str.regexp_string("."), s);
74-
let parts = s.[String.length(s) - 1] == '.' ? parts @ [""] : parts;
75-
Cpath(parts);
74+
let len = String.length(s);
75+
let pipeParts = Str.split(Str.regexp_string("->"), s);
76+
if (len > 1
77+
&& s.[len - 2] == '-'
78+
&& s.[len - 1] == '>'
79+
|| List.length(pipeParts) > 1) {
80+
Cpipe(s);
81+
} else {
82+
let parts = Str.split(Str.regexp_string("."), s);
83+
let parts = s.[len - 1] == '.' ? parts @ [""] : parts;
84+
Cpath(parts);
85+
};
7686
};
7787

7888
let rec loop = i => {
7989
i < 0
8090
? Some(mkPath(String.sub(text, i + 1, offset - (i + 1))))
8191
: (
8292
switch (text.[i]) {
93+
| '>' when i > 0 && text.[i - 1] == '-' => loop(i - 2)
8394
| '~' => Some(Clabel(String.sub(text, i + 1, offset - (i + 1))))
8495
| 'a'..'z'
8596
| 'A'..'Z'

src/rescript-editor-support/RescriptEditorSupport.re

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ let capabilities =
55
J.o([
66
("textDocumentSync", J.i(1)),
77
("hoverProvider", J.t),
8-
("completionProvider", J.o([("triggerCharacters", J.l([J.s(".")]))])),
8+
(
9+
"completionProvider",
10+
J.o([("triggerCharacters", J.l([J.s("."), J.s(">")]))]),
11+
),
912
("definitionProvider", J.t),
1013
("typeDefinitionProvider", J.t),
1114
("referencesProvider", J.t),

0 commit comments

Comments
 (0)