@@ -691,165 +691,156 @@ let addForPathParent ~env ~extra path loc =
691
691
in
692
692
addLocItem extra loc locType
693
693
694
- let getIterator ~env ~(extra : extra ) ~(file : File.t ) =
695
- let getTypeAtPath ~env path =
696
- match fromCompilerPath ~env path with
697
- | `GlobalMod _ -> `Not_found
698
- | `Global (moduleName , path ) -> `Global (moduleName, path)
699
- | `Not_found -> `Not_found
700
- | `Exported (env , name ) -> (
701
- match Exported. find env.exported Exported. Type name with
702
- | None -> `Not_found
703
- | Some stamp -> (
704
- let declaredType = Stamps. findType env.file.stamps stamp in
705
- match declaredType with
706
- | Some declaredType -> `Local declaredType
707
- | None -> `Not_found ))
708
- | `Stamp stamp -> (
694
+ let getTypeAtPath ~env path =
695
+ match fromCompilerPath ~env path with
696
+ | `GlobalMod _ -> `Not_found
697
+ | `Global (moduleName , path ) -> `Global (moduleName, path)
698
+ | `Not_found -> `Not_found
699
+ | `Exported (env , name ) -> (
700
+ match Exported. find env.exported Exported. Type name with
701
+ | None -> `Not_found
702
+ | Some stamp -> (
709
703
let declaredType = Stamps. findType env.file.stamps stamp in
710
704
match declaredType with
711
705
| Some declaredType -> `Local declaredType
712
- | None -> `Not_found )
713
- in
706
+ | None -> `Not_found ))
707
+ | `Stamp stamp -> (
708
+ let declaredType = Stamps. findType env.file.stamps stamp in
709
+ match declaredType with
710
+ | Some declaredType -> `Local declaredType
711
+ | None -> `Not_found )
714
712
715
- let handleConstructor txt =
716
- match txt with
717
- | Longident. Lident name -> name
718
- | Ldot (_left , name ) -> name
719
- | Lapply (_ , _ ) -> assert false
720
- in
713
+ let handleConstructor txt =
714
+ match txt with
715
+ | Longident. Lident name -> name
716
+ | Ldot (_left , name ) -> name
717
+ | Lapply (_ , _ ) -> assert false
721
718
722
- let addForField recordType fieldType {Asttypes. txt; loc} =
723
- match (Shared. dig recordType).desc with
724
- | Tconstr (path , _args , _memo ) ->
725
- let t = getTypeAtPath ~env path in
726
- let name = handleConstructor txt in
727
- let nameLoc = Utils. endOfLocation loc (String. length name) in
728
- let locType =
729
- match t with
730
- | `Local {stamp; item = {kind = Record fields } } -> (
731
- match fields |> List. find_opt (fun f -> f.fname.txt = name) with
732
- | Some {stamp = astamp } ->
733
- addReference ~extra astamp nameLoc;
734
- LocalReference (stamp, Field name)
735
- | None -> NotFound )
736
- | `Global (moduleName , path ) ->
737
- addExternalReference ~extra moduleName path (Field name) nameLoc;
738
- GlobalReference (moduleName, path, Field name)
739
- | _ -> NotFound
740
- in
741
- addLocItem extra nameLoc (Typed (name, fieldType, locType))
742
- | _ -> ()
743
- in
719
+ let addForField ~env ~extra recordType fieldType {Asttypes. txt; loc} =
720
+ match (Shared. dig recordType).desc with
721
+ | Tconstr (path , _args , _memo ) ->
722
+ let t = getTypeAtPath ~env path in
723
+ let name = handleConstructor txt in
724
+ let nameLoc = Utils. endOfLocation loc (String. length name) in
725
+ let locType =
726
+ match t with
727
+ | `Local {stamp; item = {kind = Record fields } } -> (
728
+ match fields |> List. find_opt (fun f -> f.fname.txt = name) with
729
+ | Some {stamp = astamp } ->
730
+ addReference ~extra astamp nameLoc;
731
+ LocalReference (stamp, Field name)
732
+ | None -> NotFound )
733
+ | `Global (moduleName , path ) ->
734
+ addExternalReference ~extra moduleName path (Field name) nameLoc;
735
+ GlobalReference (moduleName, path, Field name)
736
+ | _ -> NotFound
737
+ in
738
+ addLocItem extra nameLoc (Typed (name, fieldType, locType))
739
+ | _ -> ()
744
740
745
- let addForRecord recordType items =
746
- match (Shared. dig recordType).desc with
747
- | Tconstr (path , _args , _memo ) ->
748
- let t = getTypeAtPath ~env path in
749
- items
750
- |> List. iter (fun ({Asttypes. txt; loc} , {Types. lbl_res} , _ ) ->
751
- (* let name = Longident.last(txt); *)
752
- let name = handleConstructor txt in
753
- let nameLoc = Utils. endOfLocation loc (String. length name) in
754
- let locType =
755
- match t with
756
- | `Local {stamp; item = {kind = Record fields } } -> (
757
- match
758
- fields |> List. find_opt (fun f -> f.fname.txt = name)
759
- with
760
- | Some {stamp = astamp } ->
761
- addReference ~extra astamp nameLoc;
762
- LocalReference (stamp, Field name)
763
- | None -> NotFound )
764
- | `Global (moduleName , path ) ->
765
- addExternalReference ~extra moduleName path (Field name)
766
- nameLoc;
767
- GlobalReference (moduleName, path, Field name)
768
- | _ -> NotFound
769
- in
770
- addLocItem extra nameLoc (Typed (name, lbl_res, locType)))
771
- | _ -> ()
772
- in
741
+ let addForRecord ~env ~extra recordType items =
742
+ match (Shared. dig recordType).desc with
743
+ | Tconstr (path , _args , _memo ) ->
744
+ let t = getTypeAtPath ~env path in
745
+ items
746
+ |> List. iter (fun ({Asttypes. txt; loc} , {Types. lbl_res} , _ ) ->
747
+ (* let name = Longident.last(txt); *)
748
+ let name = handleConstructor txt in
749
+ let nameLoc = Utils. endOfLocation loc (String. length name) in
750
+ let locType =
751
+ match t with
752
+ | `Local {stamp; item = {kind = Record fields } } -> (
753
+ match fields |> List. find_opt (fun f -> f.fname.txt = name) with
754
+ | Some {stamp = astamp } ->
755
+ addReference ~extra astamp nameLoc;
756
+ LocalReference (stamp, Field name)
757
+ | None -> NotFound )
758
+ | `Global (moduleName , path ) ->
759
+ addExternalReference ~extra moduleName path (Field name) nameLoc;
760
+ GlobalReference (moduleName, path, Field name)
761
+ | _ -> NotFound
762
+ in
763
+ addLocItem extra nameLoc (Typed (name, lbl_res, locType)))
764
+ | _ -> ()
773
765
774
- let addForConstructor constructorType {Asttypes. txt; loc} { Types. cstr_name} =
775
- match ( Shared. dig constructorType).desc with
776
- | Tconstr ( path , _args , _memo ) ->
777
- let name = handleConstructor txt in
778
- let nameLoc = Utils. endOfLocation loc ( String. length name) in
779
- let t = getTypeAtPath ~env path in
780
- let locType =
781
- match t with
782
- | `Local {stamp; item = { kind = Variant constructors } } -> (
783
- match
784
- constructors
785
- |> List. find_opt ( fun c -> c. Constructor. cname.txt = cstr_name)
786
- with
787
- | Some { stamp = cstamp } ->
788
- addReference ~extra cstamp nameLoc;
789
- LocalReference (stamp, Constructor name)
790
- | None -> NotFound )
791
- | `Global ( moduleName , path ) ->
792
- addExternalReference ~extra moduleName path ( Constructor name) nameLoc;
793
- GlobalReference ( moduleName, path, Constructor name)
794
- | _ -> NotFound
795
- in
796
- addLocItem extra nameLoc ( Typed (name, constructorType, locType))
797
- | _ -> ( )
798
- in
766
+ let addForConstructor ~ env ~ extra constructorType {Asttypes. txt; loc}
767
+ { Types. cstr_name} =
768
+ match ( Shared. dig constructorType).desc with
769
+ | Tconstr ( path , _args , _memo ) ->
770
+ let name = handleConstructor txt in
771
+ let nameLoc = Utils. endOfLocation loc ( String. length name) in
772
+ let t = getTypeAtPath ~env path in
773
+ let locType =
774
+ match t with
775
+ | `Local {stamp; item = { kind = Variant constructors } } -> (
776
+ match
777
+ constructors
778
+ |> List. find_opt ( fun c -> c. Constructor. cname.txt = cstr_name)
779
+ with
780
+ | Some { stamp = cstamp } ->
781
+ addReference ~extra cstamp nameLoc;
782
+ LocalReference (stamp, Constructor name )
783
+ | None -> NotFound )
784
+ | `Global ( moduleName , path ) ->
785
+ addExternalReference ~extra moduleName path ( Constructor name) nameLoc;
786
+ GlobalReference (moduleName, path, Constructor name)
787
+ | _ -> NotFound
788
+ in
789
+ addLocItem extra nameLoc ( Typed (name, constructorType, locType) )
790
+ | _ -> ()
799
791
800
- let rec lidIsComplex (lid : Longident.t ) =
801
- match lid with
802
- | Lapply _ -> true
803
- | Ldot (lid , _ ) -> lidIsComplex lid
804
- | _ -> false
805
- in
792
+ let rec lidIsComplex (lid : Longident.t ) =
793
+ match lid with
794
+ | Lapply _ -> true
795
+ | Ldot (lid , _ ) -> lidIsComplex lid
796
+ | _ -> false
806
797
807
- let rec addForLongident top (path : Path.t ) (txt : Longident.t ) loc =
808
- if (not loc.Location. loc_ghost) && not (lidIsComplex txt) then (
809
- let idLength =
810
- String. length (String. concat " ." (Longident. flatten txt))
811
- in
812
- let reportedLength = loc.loc_end.pos_cnum - loc.loc_start.pos_cnum in
813
- let isPpx = idLength <> reportedLength in
814
- if isPpx then
815
- match top with
816
- | Some (t , tip ) -> addForPath ~env ~extra path txt loc t tip
817
- | None -> addForPathParent ~env ~extra path loc
818
- else
819
- let l = Utils. endOfLocation loc (String. length (Longident. last txt)) in
820
- (match top with
821
- | Some (t , tip ) -> addForPath ~env ~extra path txt l t tip
822
- | None -> addForPathParent ~env ~extra path l);
823
- match (path, txt) with
824
- | Pdot (pinner , _pname , _ ), Ldot (inner , name ) ->
825
- addForLongident None pinner inner
826
- (Utils. chopLocationEnd loc (String. length name + 1 ))
827
- | Pident _ , Lident _ -> ()
828
- | _ -> () )
829
- in
798
+ let rec addForLongident ~env ~extra top (path : Path.t ) (txt : Longident.t ) loc
799
+ =
800
+ if (not loc.Location. loc_ghost) && not (lidIsComplex txt) then (
801
+ let idLength = String. length (String. concat " ." (Longident. flatten txt)) in
802
+ let reportedLength = loc.loc_end.pos_cnum - loc.loc_start.pos_cnum in
803
+ let isPpx = idLength <> reportedLength in
804
+ if isPpx then
805
+ match top with
806
+ | Some (t , tip ) -> addForPath ~env ~extra path txt loc t tip
807
+ | None -> addForPathParent ~env ~extra path loc
808
+ else
809
+ let l = Utils. endOfLocation loc (String. length (Longident. last txt)) in
810
+ (match top with
811
+ | Some (t , tip ) -> addForPath ~env ~extra path txt l t tip
812
+ | None -> addForPathParent ~env ~extra path l);
813
+ match (path, txt) with
814
+ | Pdot (pinner , _pname , _ ), Ldot (inner , name ) ->
815
+ addForLongident ~env ~extra None pinner inner
816
+ (Utils. chopLocationEnd loc (String. length name + 1 ))
817
+ | Pident _ , Lident _ -> ()
818
+ | _ -> () )
830
819
831
- let rec handle_module_expr expr =
832
- match expr with
833
- | Tmod_constraint (expr , _ , _ , _ ) -> handle_module_expr expr.mod_desc
834
- | Tmod_ident ( path , {txt; loc} ) ->
835
- if not (lidIsComplex txt) then
836
- Log. log ( " Ident!! " ^ String. concat " . " ( Longident. flatten txt));
837
- addForLongident None path txt loc
838
- | Tmod_functor ( _ident , _argName , _maybeType , resultExpr ) ->
839
- handle_module_expr resultExpr.mod_desc
840
- | Tmod_apply ( obj , arg , _ ) ->
841
- handle_module_expr obj.mod_desc;
842
- handle_module_expr arg .mod_desc
843
- | _ -> ()
844
- in
820
+ let rec handle_module_expr ~ env ~ extra expr =
821
+ match expr with
822
+ | Tmod_constraint (expr , _ , _ , _ ) ->
823
+ handle_module_expr ~env ~extra expr.mod_desc
824
+ | Tmod_ident ( path , { txt; loc} ) ->
825
+ if not (lidIsComplex txt) then
826
+ Log. log ( " Ident!! " ^ String. concat " . " ( Longident. flatten txt));
827
+ addForLongident ~env ~extra None path txt loc
828
+ | Tmod_functor ( _ident , _argName , _maybeType , resultExpr ) ->
829
+ handle_module_expr ~env ~extra resultExpr.mod_desc
830
+ | Tmod_apply ( obj , arg , _ ) ->
831
+ handle_module_expr ~env ~extra obj .mod_desc;
832
+ handle_module_expr ~env ~extra arg.mod_desc
833
+ | _ -> ()
845
834
835
+ let getIterator ~env ~(extra : extra ) ~(file : File.t ) =
846
836
let enter_structure_item item =
847
837
match item.str_desc with
848
- | Tstr_include {incl_mod = expr } -> handle_module_expr expr.mod_desc
849
- | Tstr_module {mb_expr} -> handle_module_expr mb_expr.mod_desc
838
+ | Tstr_include {incl_mod = expr } ->
839
+ handle_module_expr ~env ~extra expr.mod_desc
840
+ | Tstr_module {mb_expr} -> handle_module_expr ~env ~extra mb_expr.mod_desc
850
841
| Tstr_open {open_path; open_txt = {txt; loc} } ->
851
842
(* Log.log("Have an open here"); *)
852
- addForLongident None open_path txt loc;
843
+ addForLongident ~env ~extra None open_path txt loc;
853
844
Hashtbl. replace extra.opens loc ()
854
845
| _ -> ()
855
846
in
@@ -873,7 +864,7 @@ let getIterator ~env ~(extra : extra) ~(file : File.t) =
873
864
let enter_core_type {ctyp_type; ctyp_desc} =
874
865
match ctyp_desc with
875
866
| Ttyp_constr (path , {txt; loc} , _args ) ->
876
- addForLongident (Some (ctyp_type, Type )) path txt loc
867
+ addForLongident ~env ~extra (Some (ctyp_type, Type )) path txt loc
877
868
| _ -> ()
878
869
in
879
870
@@ -891,9 +882,9 @@ let getIterator ~env ~(extra : extra) ~(file : File.t) =
891
882
in
892
883
(* Log.log("Entering pattern " ++ Utils.showLocation(pat_loc)); *)
893
884
match pat_desc with
894
- | Tpat_record (items , _ ) -> addForRecord pat_type items
885
+ | Tpat_record (items , _ ) -> addForRecord ~env ~extra pat_type items
895
886
| Tpat_construct (lident , constructor , _ ) ->
896
- addForConstructor pat_type lident constructor
887
+ addForConstructor ~env ~extra pat_type lident constructor
897
888
| Tpat_alias (_inner , ident , name ) ->
898
889
let stamp = Ident. binding_time ident in
899
890
addForPattern stamp name
@@ -912,9 +903,11 @@ let getIterator ~env ~(extra : extra) ~(file : File.t) =
912
903
| _ -> () );
913
904
match expression.exp_desc with
914
905
| Texp_ident (path , {txt; loc} , _ ) ->
915
- addForLongident (Some (expression.exp_type, Value )) path txt loc
906
+ addForLongident ~env ~extra
907
+ (Some (expression.exp_type, Value ))
908
+ path txt loc
916
909
| Texp_record {fields} ->
917
- addForRecord expression.exp_type
910
+ addForRecord ~env ~extra expression.exp_type
918
911
(fields |> Array. to_list
919
912
|> Utils. filterMap (fun (desc , item ) ->
920
913
match item with
@@ -927,9 +920,9 @@ let getIterator ~env ~(extra : extra) ~(file : File.t) =
927
920
when loc.loc_end.pos_cnum - loc.loc_start.pos_cnum <> 2 ->
928
921
()
929
922
| Texp_construct (lident , constructor , _args ) ->
930
- addForConstructor expression.exp_type lident constructor
923
+ addForConstructor ~env ~extra expression.exp_type lident constructor
931
924
| Texp_field (inner , lident , _label_description ) ->
932
- addForField inner.exp_type expression.exp_type lident
925
+ addForField ~env ~extra inner.exp_type expression.exp_type lident
933
926
| _ -> ()
934
927
in
935
928
0 commit comments