Skip to content

Commit b637501

Browse files
committed
do not look for class when resolving a fragment_type_parent
This changes the error message, from "wrong type", to unresolved. Signed-off-by: Paul-Elliot <[email protected]>
1 parent c2228c0 commit b637501

File tree

8 files changed

+73
-17
lines changed

8 files changed

+73
-17
lines changed

src/model/paths_types.ml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -583,8 +583,7 @@ module rec Reference : sig
583583

584584
type tag_datatype = [ `TUnknown | `TType ]
585585

586-
type tag_parent =
587-
[ `TUnknown | `TModule | `TModuleType | `TClass | `TClassType | `TType ]
586+
type tag_parent = [ `TUnknown | `TModule | `TModuleType | `TType ]
588587

589588
type tag_label_parent =
590589
[ `TUnknown

src/xref2/component.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,8 @@ module Element = struct
529529

530530
type label_parent = [ signature | type_ | page ]
531531

532+
type fragment_type_parent = [ signature | datatype ]
533+
532534
type any =
533535
[ signature
534536
| value

src/xref2/component.mli

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,8 @@ module Element : sig
493493

494494
type label_parent = [ signature | type_ | page ]
495495

496+
type fragment_type_parent = [ signature | datatype ]
497+
496498
type any =
497499
[ signature
498500
| value

src/xref2/env.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,11 @@ let s_label_parent : Component.Element.label_parent scope =
592592
| #Component.Element.label_parent as r -> Some r
593593
| _ -> None)
594594

595+
let s_fragment_type_parent : Component.Element.fragment_type_parent scope =
596+
make_scope ~root:lookup_root_module_fallback (function
597+
| #Component.Element.fragment_type_parent as r -> Some r
598+
| _ -> None)
599+
595600
let len = ref 0
596601

597602
let n = ref 0

src/xref2/env.mli

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ val s_field : Component.Element.field scope
144144

145145
val s_label_parent : Component.Element.label_parent scope
146146

147+
val s_fragment_type_parent : Component.Element.fragment_type_parent scope
148+
147149
(* val open_component_signature :
148150
Paths_types.Identifier.signature -> Component.Signature.t -> t -> t *)
149151

src/xref2/ref_tools.ml

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ type label_parent_lookup_result =
3030
| type_lookup_result
3131
| `P of page_lookup_result ]
3232

33+
type fragment_type_parent_lookup_result =
34+
[ `S of signature_lookup_result | `T of datatype_lookup_result ]
35+
3336
type 'a ref_result =
3437
('a, Errors.Tools_error.reference_lookup_error) Result.result
3538
(** The result type for every functions in this module. *)
@@ -279,6 +282,16 @@ module DT = struct
279282
let of_component _env t ~parent_ref name = Ok (`Type (parent_ref, name), t)
280283

281284
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))
282295
end
283296

284297
module T = struct
@@ -429,6 +442,24 @@ module EX = struct
429442
Ok (`Exception (parent', name))
430443
end
431444

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+
432463
module CS = struct
433464
(** Constructor *)
434465

@@ -442,7 +473,7 @@ module CS = struct
442473
(* Let's pretend we didn't see the field and say we didn't find anything. *)
443474
Error (`Find_by_name (`Cons, name))
444475

445-
let in_parent _env (parent : label_parent_lookup_result) name =
476+
let in_parent _env (parent : fragment_type_parent_lookup_result) name =
446477
let name_s = ConstructorName.to_string name in
447478
match parent with
448479
| `S (parent', parent_cp, sg) -> (
@@ -456,7 +487,6 @@ module CS = struct
456487
| `FField _ -> got_a_field name_s
457488
| `FConstructor _ ->
458489
Ok (`Constructor ((parent' : Resolved.DataType.t), name)))
459-
| (`C _ | `CT _ | `P _) as r -> wrong_kind_error [ `S; `T ] r
460490

461491
let of_component _env parent name =
462492
Ok
@@ -477,7 +507,7 @@ module F = struct
477507
(* Let's pretend we didn't see the constructor and say we didn't find anything. *)
478508
Error (`Find_by_name (`Field, name))
479509

480-
let in_parent _env (parent : label_parent_lookup_result) name =
510+
let in_parent _env (parent : fragment_type_parent_lookup_result) name =
481511
let name_s = FieldName.to_string name in
482512
match parent with
483513
| `S (parent', parent_cp, sg) -> (
@@ -492,7 +522,6 @@ module F = struct
492522
find Find.any_in_type t name_s >>= function
493523
| `FConstructor _ -> got_a_constructor name_s
494524
| `FField _ -> Ok (`Field ((parent' :> Resolved.FieldParent.t), name)))
495-
| (`C _ | `CT _ | `P _) as r -> wrong_kind_error [ `S; `T ] r
496525

497526
let of_component _env parent name =
498527
Ok
@@ -624,6 +653,27 @@ let rec resolve_label_parent_reference env r =
624653
resolve_signature_reference env (`Root (name, `TModule)) >>= fun s ->
625654
Ok (`S s)
626655

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+
627677
and resolve_signature_reference :
628678
Env.t -> Signature.t -> signature_lookup_result ref_result =
629679
fun env' r ->
@@ -812,9 +862,8 @@ let resolve_reference =
812862
| `Dot (parent, name) -> resolve_reference_dot env parent name
813863
| `Root (name, `TConstructor) -> CS.in_env env name >>= resolved1
814864
| `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
818867
| `Root (name, `TException) -> EX.in_env env name >>= resolved1
819868
| `Exception (parent, name) ->
820869
resolve_signature_reference env parent >>= fun p ->
@@ -829,9 +878,8 @@ let resolve_reference =
829878
ED.in_signature env p name >>= resolved1
830879
| `Root (name, `TField) -> F.in_env env name >>= resolved1
831880
| `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
835883
| `Root (name, `TMethod) -> MM.in_env env name >>= resolved1
836884
| `Method (parent, name) ->
837885
resolve_class_signature_reference env parent >>= fun p ->

test/xref2/github_issue_447.t/run.t

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ faulty reference.
1010

1111
$ odoc link a.odoc
1212
File "a.mli", line 15, characters 4-22:
13-
Warning: Failed to resolve reference unresolvedroot(t).A is of kind class but expected signature or type
13+
Warning: Failed to resolve reference unresolvedroot(t).A Couldn't find "t"
1414

1515
Let's now check that the reference point to the right page/anchor:
1616

test/xref2/refs/refs.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2683,11 +2683,9 @@ Failure
26832683
Exception:
26842684
Failure "resolve_reference: is of kind type but expected class or class type".
26852685
# resolve_ref "c.constructor-C" (* Type in env but find class (parent of constructor is "parent") *) ;;
2686-
Exception:
2687-
Failure "resolve_reference: is of kind class but expected signature or type".
2686+
Exception: Failure "resolve_reference: Couldn't find \"c\"".
26882687
# resolve_ref "c.field-f" (* Field in class (parent of field is "label_parent") *) ;;
2689-
Exception:
2690-
Failure "resolve_reference: is of kind class but expected signature or type".
2688+
Exception: Failure "resolve_reference: Couldn't find \"c\"".
26912689
```
26922690

26932691
## Ambiguous references

0 commit comments

Comments
 (0)