@@ -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. *)
@@ -277,6 +280,16 @@ module DT = struct
277
280
let of_component _env t ~parent_ref name = Ok (`Type (parent_ref, name), t)
278
281
279
282
let of_element _env (`Type (id , t )) : t = (`Identifier id, t)
283
+
284
+ let in_env env name =
285
+ env_lookup_by_name Env. s_datatype name env >> = fun e ->
286
+ Ok (of_element env e)
287
+
288
+ let in_signature _env ((parent' , parent_cp , sg ) : signature_lookup_result )
289
+ name =
290
+ let sg = Tools. prefix_signature (parent_cp, sg) in
291
+ find Find. datatype_in_sig sg name >> = function
292
+ | `FType (name , t ) -> Ok (`T (`Type (parent', name), t))
280
293
end
281
294
282
295
module T = struct
@@ -396,6 +409,24 @@ module EX = struct
396
409
Ok (`Exception (parent', name))
397
410
end
398
411
412
+ module FTP = struct
413
+ (* * Fragment type parent *)
414
+
415
+ type t = fragment_type_parent_lookup_result
416
+
417
+ let of_element env : _ -> t ref_result = function
418
+ | `Module _ as e ->
419
+ M. of_element env e |> module_lookup_to_signature_lookup env >> = fun r ->
420
+ Ok (`S r)
421
+ | `ModuleType _ as e ->
422
+ MT. of_element env e |> module_type_lookup_to_signature_lookup env
423
+ >> = fun r -> Ok (`S r)
424
+ | `Type _ as e -> Ok (`T (DT. of_element env e))
425
+
426
+ let in_env env name =
427
+ env_lookup_by_name Env. s_fragment_type_parent name env >> = of_element env
428
+ end
429
+
399
430
module CS = struct
400
431
(* * Constructor *)
401
432
@@ -409,7 +440,7 @@ module CS = struct
409
440
(* Let's pretend we didn't see the field and say we didn't find anything. *)
410
441
Error (`Find_by_name (`Cons , name))
411
442
412
- let in_parent _env (parent : label_parent_lookup_result ) name =
443
+ let in_parent _env (parent : fragment_type_parent_lookup_result ) name =
413
444
let name_s = ConstructorName. to_string name in
414
445
match parent with
415
446
| `S (parent' , parent_cp , sg ) -> (
@@ -423,7 +454,6 @@ module CS = struct
423
454
| `FField _ -> got_a_field name_s
424
455
| `FConstructor _ ->
425
456
Ok (`Constructor ((parent' : Resolved.DataType.t ), name)))
426
- | (`C _ | `CT _ | `P _ ) as r -> wrong_kind_error [ `S ; `T ] r
427
457
428
458
let of_component _env parent name =
429
459
Ok
@@ -444,7 +474,7 @@ module F = struct
444
474
(* Let's pretend we didn't see the constructor and say we didn't find anything. *)
445
475
Error (`Find_by_name (`Field , name))
446
476
447
- let in_parent _env (parent : label_parent_lookup_result ) name =
477
+ let in_parent _env (parent : fragment_type_parent_lookup_result ) name =
448
478
let name_s = FieldName. to_string name in
449
479
match parent with
450
480
| `S (parent' , parent_cp , sg ) -> (
@@ -459,7 +489,6 @@ module F = struct
459
489
find Find. any_in_type t name_s >> = function
460
490
| `FConstructor _ -> got_a_constructor name_s
461
491
| `FField _ -> Ok (`Field ((parent' :> Resolved.FieldParent.t ), name)))
462
- | (`C _ | `CT _ | `P _ ) as r -> wrong_kind_error [ `S ; `T ] r
463
492
464
493
let of_component _env parent name =
465
494
Ok
@@ -591,6 +620,27 @@ let rec resolve_label_parent_reference env r =
591
620
resolve_signature_reference env (`Root (name, `TModule )) >> = fun s ->
592
621
Ok (`S s)
593
622
623
+ and resolve_fragment_type_parent_reference (env : Env.t )
624
+ (r : FragmentTypeParent.t ) : (fragment_type_parent_lookup_result , _ ) result
625
+ =
626
+ let fragment_type_parent_res_of_type_res : datatype_lookup_result -> _ =
627
+ fun r -> Ok (`T r)
628
+ in
629
+ match r with
630
+ | `Resolved _ -> failwith " unimplemented"
631
+ | `Root (name , `TUnknown) -> FTP. in_env env name
632
+ | (`Module _ | `ModuleType _ | `Root (_ , (`TModule | `TModuleType ))) as sr ->
633
+ resolve_signature_reference env sr >> = fun s -> Ok (`S s)
634
+ | `Root (name , `TType) ->
635
+ DT. in_env env name >> = fragment_type_parent_res_of_type_res
636
+ | `Type (parent , name ) ->
637
+ resolve_signature_reference env parent >> = fun p ->
638
+ DT. in_signature env p (TypeName. to_string name)
639
+ | `Dot (parent , name ) ->
640
+ resolve_label_parent_reference env parent
641
+ >> = signature_lookup_result_of_label_parent
642
+ >> = fun p -> DT. in_signature env p name
643
+
594
644
and resolve_signature_reference :
595
645
Env. t -> Signature. t -> signature_lookup_result ref_result =
596
646
fun env' r ->
@@ -778,9 +828,8 @@ let resolve_reference =
778
828
| `Dot (parent , name ) -> resolve_reference_dot env parent name
779
829
| `Root (name , `TConstructor) -> CS. in_env env name >> = resolved1
780
830
| `Constructor (parent , name ) ->
781
- resolve_label_parent_reference env
782
- (parent : FragmentTypeParent.t :> LabelParent.t )
783
- >> = fun p -> CS. in_parent env p name >> = resolved1
831
+ resolve_fragment_type_parent_reference env parent >> = fun p ->
832
+ CS. in_parent env p name >> = resolved1
784
833
| `Root (name , `TException) -> EX. in_env env name >> = resolved1
785
834
| `Exception (parent , name ) ->
786
835
resolve_signature_reference env parent >> = fun p ->
@@ -791,9 +840,8 @@ let resolve_reference =
791
840
EC. in_signature env p name >> = resolved1
792
841
| `Root (name , `TField) -> F. in_env env name >> = resolved1
793
842
| `Field (parent , name ) ->
794
- resolve_label_parent_reference env
795
- (parent : FragmentTypeParent.t :> LabelParent.t )
796
- >> = fun p -> F. in_parent env p name >> = resolved1
843
+ resolve_fragment_type_parent_reference env parent >> = fun p ->
844
+ F. in_parent env p name >> = resolved1
797
845
| `Root (name , `TMethod) -> MM. in_env env name >> = resolved1
798
846
| `Method (parent , name ) ->
799
847
resolve_class_signature_reference env parent >> = fun p ->
0 commit comments