@@ -30,6 +30,9 @@ type label_parent_lookup_result =
30
30
| type_lookup_result
31
31
| `P of page_lookup_result ]
32
32
33
+ type fragment_type_parent_lookup_result =
34
+ [ `S of signature_lookup_result | `T of datatype_lookup_result ]
35
+
33
36
type 'a ref_result =
34
37
('a , Errors.Tools_error .reference_lookup_error ) Result .result
35
38
(* * The result type for every functions in this module. *)
@@ -279,6 +282,16 @@ module DT = struct
279
282
let of_component _env t ~parent_ref name = Ok (`Type (parent_ref, name), t)
280
283
281
284
let of_element _env (`Type (id , t )) : t = (`Identifier id, t)
285
+
286
+ let in_env env name =
287
+ env_lookup_by_name Env. s_datatype name env >> = fun e ->
288
+ Ok (of_element env e)
289
+
290
+ let in_signature _env ((parent' , parent_cp , sg ) : signature_lookup_result )
291
+ name =
292
+ let sg = Tools. prefix_signature (parent_cp, sg) in
293
+ find Find. datatype_in_sig sg name >> = function
294
+ | `FType (name , t ) -> Ok (`T (`Type (parent', name), t))
282
295
end
283
296
284
297
module T = struct
@@ -429,6 +442,24 @@ module EX = struct
429
442
Ok (`Exception (parent', name))
430
443
end
431
444
445
+ module FTP = struct
446
+ (* * Fragment type parent *)
447
+
448
+ type t = fragment_type_parent_lookup_result
449
+
450
+ let of_element env : _ -> t ref_result = function
451
+ | `Module _ as e ->
452
+ M. of_element env e |> module_lookup_to_signature_lookup env >> = fun r ->
453
+ Ok (`S r)
454
+ | `ModuleType _ as e ->
455
+ MT. of_element env e |> module_type_lookup_to_signature_lookup env
456
+ >> = fun r -> Ok (`S r)
457
+ | `Type _ as e -> Ok (`T (DT. of_element env e))
458
+
459
+ let in_env env name =
460
+ env_lookup_by_name Env. s_fragment_type_parent name env >> = of_element env
461
+ end
462
+
432
463
module CS = struct
433
464
(* * Constructor *)
434
465
@@ -442,7 +473,7 @@ module CS = struct
442
473
(* Let's pretend we didn't see the field and say we didn't find anything. *)
443
474
Error (`Find_by_name (`Cons , name))
444
475
445
- let in_parent _env (parent : label_parent_lookup_result ) name =
476
+ let in_parent _env (parent : fragment_type_parent_lookup_result ) name =
446
477
let name_s = ConstructorName. to_string name in
447
478
match parent with
448
479
| `S (parent' , parent_cp , sg ) -> (
@@ -456,7 +487,6 @@ module CS = struct
456
487
| `FField _ -> got_a_field name_s
457
488
| `FConstructor _ ->
458
489
Ok (`Constructor ((parent' : Resolved.DataType.t ), name)))
459
- | (`C _ | `CT _ | `P _ ) as r -> wrong_kind_error [ `S ; `T ] r
460
490
461
491
let of_component _env parent name =
462
492
Ok
@@ -477,7 +507,7 @@ module F = struct
477
507
(* Let's pretend we didn't see the constructor and say we didn't find anything. *)
478
508
Error (`Find_by_name (`Field , name))
479
509
480
- let in_parent _env (parent : label_parent_lookup_result ) name =
510
+ let in_parent _env (parent : fragment_type_parent_lookup_result ) name =
481
511
let name_s = FieldName. to_string name in
482
512
match parent with
483
513
| `S (parent' , parent_cp , sg ) -> (
@@ -492,7 +522,6 @@ module F = struct
492
522
find Find. any_in_type t name_s >> = function
493
523
| `FConstructor _ -> got_a_constructor name_s
494
524
| `FField _ -> Ok (`Field ((parent' :> Resolved.FieldParent.t ), name)))
495
- | (`C _ | `CT _ | `P _ ) as r -> wrong_kind_error [ `S ; `T ] r
496
525
497
526
let of_component _env parent name =
498
527
Ok
@@ -624,6 +653,27 @@ let rec resolve_label_parent_reference env r =
624
653
resolve_signature_reference env (`Root (name, `TModule )) >> = fun s ->
625
654
Ok (`S s)
626
655
656
+ and resolve_fragment_type_parent_reference (env : Env.t )
657
+ (r : FragmentTypeParent.t ) : (fragment_type_parent_lookup_result , _ ) result
658
+ =
659
+ let fragment_type_parent_res_of_type_res : datatype_lookup_result -> _ =
660
+ fun r -> Ok (`T r)
661
+ in
662
+ match r with
663
+ | `Resolved _ -> failwith " unimplemented"
664
+ | `Root (name , `TUnknown) -> FTP. in_env env name
665
+ | (`Module _ | `ModuleType _ | `Root (_ , (`TModule | `TModuleType ))) as sr ->
666
+ resolve_signature_reference env sr >> = fun s -> Ok (`S s)
667
+ | `Root (name , `TType) ->
668
+ DT. in_env env name >> = fragment_type_parent_res_of_type_res
669
+ | `Type (parent , name ) ->
670
+ resolve_signature_reference env parent >> = fun p ->
671
+ DT. in_signature env p (TypeName. to_string name)
672
+ | `Dot (parent , name ) ->
673
+ resolve_label_parent_reference env parent
674
+ >> = signature_lookup_result_of_label_parent
675
+ >> = fun p -> DT. in_signature env p name
676
+
627
677
and resolve_signature_reference :
628
678
Env. t -> Signature. t -> signature_lookup_result ref_result =
629
679
fun env' r ->
@@ -812,9 +862,8 @@ let resolve_reference =
812
862
| `Dot (parent , name ) -> resolve_reference_dot env parent name
813
863
| `Root (name , `TConstructor) -> CS. in_env env name >> = resolved1
814
864
| `Constructor (parent , name ) ->
815
- resolve_label_parent_reference env
816
- (parent : FragmentTypeParent.t :> LabelParent.t )
817
- >> = fun p -> CS. in_parent env p name >> = resolved1
865
+ resolve_fragment_type_parent_reference env parent >> = fun p ->
866
+ CS. in_parent env p name >> = resolved1
818
867
| `Root (name , `TException) -> EX. in_env env name >> = resolved1
819
868
| `Exception (parent , name ) ->
820
869
resolve_signature_reference env parent >> = fun p ->
@@ -829,9 +878,8 @@ let resolve_reference =
829
878
ED. in_signature env p name >> = resolved1
830
879
| `Root (name , `TField) -> F. in_env env name >> = resolved1
831
880
| `Field (parent , name ) ->
832
- resolve_label_parent_reference env
833
- (parent : FragmentTypeParent.t :> LabelParent.t )
834
- >> = fun p -> F. in_parent env p name >> = resolved1
881
+ resolve_fragment_type_parent_reference env parent >> = fun p ->
882
+ F. in_parent env p name >> = resolved1
835
883
| `Root (name , `TMethod) -> MM. in_env env name >> = resolved1
836
884
| `Method (parent , name ) ->
837
885
resolve_class_signature_reference env parent >> = fun p ->
0 commit comments