@@ -491,7 +491,6 @@ let getItems =
491
491
let localModuleNames =
492
492
allModules
493
493
|> Utils . filterMap(name =>
494
- /* Log.log("Checking " ++ name); */
495
494
Utils . startsWith(name, suffix) && ! String . contains(name, '-' )
496
495
? Some ((
497
496
env. file. uri,
@@ -610,40 +609,78 @@ let mkItem = (~name, ~kind, ~detail, ~deprecated, ~docstring, ~uri, ~pos_lnum) =
610
609
611
610
let processCompletable =
612
611
(
612
+ ~findItems,
613
613
~full,
614
614
~package,
615
- ~state,
616
615
~pos,
617
616
~rawOpens,
618
- ~allModules,
619
617
completable: PartialParser . completable ,
620
618
) =>
621
619
switch (completable) {
622
- | Cjsx (componentName , id ) =>
623
- [ "first" , "second" ]
624
- |> List . map(name =>
625
- mkItem(
626
- ~name= name ++ " " ++ componentName ++ " " ++ id,
627
- ~kind= 4 ,
628
- ~deprecated= None ,
629
- ~detail= "" ,
630
- ~docstring= [] ,
631
- ~uri= full. file. uri,
632
- ~pos_lnum= fst(pos),
633
- )
634
- )
620
+ | Cjsx (componentPath , prefix ) =>
621
+ let items = findItems(~exact= true , componentPath @ [ "make" ] );
622
+ let labels = {
623
+ switch (items) {
624
+ | [ (_uri , {SharedTypes . item: Value (typ )}), ... _ ] =>
625
+ let rec getFields = (texp: Types . type_expr ) =>
626
+ switch (texp. desc) {
627
+ | Tfield (name , _ , t1 , t2 ) =>
628
+ let fields = t2 |> getFields;
629
+ [ (name, t1), ... fields] ;
630
+
631
+ | Tlink (te ) => te |> getFields
632
+ | Tvar (None ) => []
633
+ | _ => []
634
+ };
635
+ let rec getLabels = (t: Types . type_expr ) =>
636
+ switch (t. desc) {
637
+ | Tlink (t1 )
638
+ | Tsubst (t1 ) => getLabels(t1)
639
+ | Tarrow (
640
+ Nolabel ,
641
+ {
642
+ desc:
643
+ Tconstr /* Js.t */ (_ , [ {desc: Tobject (tObj , _ )}] , _ ) |
644
+ Tobject (tObj , _ ),
645
+ },
646
+ _ ,
647
+ _ ,
648
+ ) =>
649
+ getFields(tObj)
650
+ | _ => []
651
+ };
652
+ typ |> getLabels;
653
+ | _ => []
654
+ };
655
+ };
635
656
636
- | Cpath (parts ) =>
637
- let items =
638
- getItems(
639
- ~full,
640
- ~package,
641
- ~rawOpens,
642
- ~getModule= State . fileForModule(state, ~package),
643
- ~allModules,
644
- ~pos,
645
- ~parts,
657
+ let mkLabel_ = (name, typString) =>
658
+ mkItem(
659
+ ~name,
660
+ ~kind= 4 ,
661
+ ~deprecated= None ,
662
+ ~detail= typString,
663
+ ~docstring= [] ,
664
+ ~uri= full. file. uri,
665
+ ~pos_lnum= fst(pos),
646
666
);
667
+ let mkLabel = ((name, typ)) =>
668
+ mkLabel_(name, typ |> Shared . typeToString);
669
+ let keyLabel = mkLabel_("key" , "string" );
670
+
671
+ if (labels == [] ) {
672
+ [] ;
673
+ } else {
674
+ [
675
+ keyLabel,
676
+ ... labels
677
+ |> List . filter(((name, _t)) => Utils . startsWith(name, prefix))
678
+ |> List . map(mkLabel),
679
+ ] ;
680
+ };
681
+
682
+ | Cpath (parts ) =>
683
+ let items = parts |> findItems(~exact= false );
647
684
/* TODO(#107): figure out why we're getting duplicates. */
648
685
items
649
686
|> Utils . dedup
@@ -671,19 +708,8 @@ let processCompletable =
671
708
);
672
709
673
710
| Cpipe (s ) =>
674
- let getItems = parts =>
675
- getItems(
676
- ~full,
677
- ~package,
678
- ~rawOpens,
679
- ~getModule= State . fileForModule(state, ~package),
680
- ~allModules,
681
- ~pos,
682
- ~parts,
683
- );
684
-
685
711
let getLhsType = (~lhs, ~partialName) => {
686
- switch (getItems( [ lhs] )) {
712
+ switch ([ lhs] |> findItems(~exact = true )) {
687
713
| [ (_uri , {SharedTypes . item: Value (t )}), ... _ ] =>
688
714
Some ((t, partialName))
689
715
| _ => None
@@ -701,7 +727,7 @@ let processCompletable =
701
727
702
728
let removePackageOpens = modulePath =>
703
729
switch (modulePath) {
704
- | [ toplevel , ... rest ] when package. opens |> List . mem(toplevel) => rest
730
+ | [ toplevel , ... rest ] when package. TopTypes . opens |> List . mem(toplevel) => rest
705
731
| _ => modulePath
706
732
};
707
733
@@ -756,7 +782,7 @@ let processCompletable =
756
782
modulePathMinusOpens == ""
757
783
? name : modulePathMinusOpens ++ "." ++ name;
758
784
let parts = modulePath @ [ partialName] ;
759
- let items = getItems( parts);
785
+ let items = parts |> findItems(~exact = false );
760
786
items
761
787
|> List . filter(((_, {item})) =>
762
788
switch (item) {
@@ -839,19 +865,8 @@ let processCompletable =
839
865
|> List . map(mkDecorator);
840
866
841
867
| Clabel (funPath , prefix ) =>
842
- let getItems = parts =>
843
- getItems(
844
- ~full,
845
- ~package,
846
- ~rawOpens,
847
- ~getModule= State . fileForModule(state, ~package),
848
- ~allModules,
849
- ~pos,
850
- ~parts,
851
- );
852
-
853
868
let labels = {
854
- switch (getItems( funPath)) {
869
+ switch (funPath |> findItems(~exact = true )) {
855
870
| [ (_uri , {SharedTypes . item: Value (typ )}), ... _ ] =>
856
871
let rec getLabels = (t: Types . type_expr ) =>
857
872
switch (t. desc) {
@@ -899,15 +914,28 @@ let computeCompletions = (~full, ~maybeText, ~package, ~pos, ~state) => {
899
914
let rawOpens = PartialParser . findOpens(text, offset);
900
915
let allModules =
901
916
package. TopTypes . localModules @ package. dependencyModules;
917
+ let findItems = (~exact, parts) => {
918
+ let items =
919
+ getItems(
920
+ ~full,
921
+ ~package,
922
+ ~rawOpens,
923
+ ~getModule= State . fileForModule(state, ~package),
924
+ ~allModules,
925
+ ~pos,
926
+ ~parts,
927
+ );
928
+ switch (parts |> List . rev) {
929
+ | [ last , ... _ ] when exact =>
930
+ items
931
+ |> List . filter(((_uri, {SharedTypes . name: {txt}})) =>
932
+ txt == last
933
+ )
934
+ | _ => items
935
+ };
936
+ };
902
937
completable
903
- |> processCompletable(
904
- ~full,
905
- ~package,
906
- ~state,
907
- ~pos,
908
- ~rawOpens,
909
- ~allModules,
910
- );
938
+ |> processCompletable(~findItems, ~full, ~package, ~pos, ~rawOpens);
911
939
}
912
940
}
913
941
};
0 commit comments