Skip to content

Commit b1f8292

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 <peada@free.fr>
1 parent d3aedc9 commit b1f8292

File tree

7 files changed

+71
-13
lines changed

7 files changed

+71
-13
lines changed

src/model/paths_types.ml

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

501501
type tag_datatype = [ `TUnknown | `TType ]
502502

503-
type tag_parent =
504-
[ `TUnknown | `TModule | `TModuleType | `TClass | `TClassType | `TType ]
503+
type tag_parent = [ `TUnknown | `TModule | `TModuleType | `TType ]
505504

506505
type tag_label_parent =
507506
[ `TUnknown

src/xref2/component.ml

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

520520
type label_parent = [ signature | type_ | page ]
521521

522+
type fragment_type_parent = [ signature | datatype ]
523+
522524
type any =
523525
[ signature
524526
| value

src/xref2/component.mli

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

488488
type label_parent = [ signature | type_ | page ]
489489

490+
type fragment_type_parent = [ signature | datatype ]
491+
490492
type any =
491493
[ signature
492494
| value

src/xref2/env.ml

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

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

598603
let n = ref 0

src/xref2/env.mli

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

149149
val s_label_parent : Component.Element.label_parent scope
150150

151+
val s_fragment_type_parent : Component.Element.fragment_type_parent scope
152+
151153
(* val open_component_signature :
152154
Paths_types.Identifier.signature -> Component.Signature.t -> t -> t *)
153155

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. *)
@@ -277,6 +280,16 @@ module DT = struct
277280
let of_component _env t ~parent_ref name = Ok (`Type (parent_ref, name), t)
278281

279282
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))
280293
end
281294

282295
module T = struct
@@ -396,6 +409,24 @@ module EX = struct
396409
Ok (`Exception (parent', name))
397410
end
398411

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+
399430
module CS = struct
400431
(** Constructor *)
401432

@@ -409,7 +440,7 @@ module CS = struct
409440
(* Let's pretend we didn't see the field and say we didn't find anything. *)
410441
Error (`Find_by_name (`Cons, name))
411442

412-
let in_parent _env (parent : label_parent_lookup_result) name =
443+
let in_parent _env (parent : fragment_type_parent_lookup_result) name =
413444
let name_s = ConstructorName.to_string name in
414445
match parent with
415446
| `S (parent', parent_cp, sg) -> (
@@ -423,7 +454,6 @@ module CS = struct
423454
| `FField _ -> got_a_field name_s
424455
| `FConstructor _ ->
425456
Ok (`Constructor ((parent' : Resolved.DataType.t), name)))
426-
| (`C _ | `CT _ | `P _) as r -> wrong_kind_error [ `S; `T ] r
427457

428458
let of_component _env parent name =
429459
Ok
@@ -444,7 +474,7 @@ module F = struct
444474
(* Let's pretend we didn't see the constructor and say we didn't find anything. *)
445475
Error (`Find_by_name (`Field, name))
446476

447-
let in_parent _env (parent : label_parent_lookup_result) name =
477+
let in_parent _env (parent : fragment_type_parent_lookup_result) name =
448478
let name_s = FieldName.to_string name in
449479
match parent with
450480
| `S (parent', parent_cp, sg) -> (
@@ -459,7 +489,6 @@ module F = struct
459489
find Find.any_in_type t name_s >>= function
460490
| `FConstructor _ -> got_a_constructor name_s
461491
| `FField _ -> Ok (`Field ((parent' :> Resolved.FieldParent.t), name)))
462-
| (`C _ | `CT _ | `P _) as r -> wrong_kind_error [ `S; `T ] r
463492

464493
let of_component _env parent name =
465494
Ok
@@ -591,6 +620,27 @@ let rec resolve_label_parent_reference env r =
591620
resolve_signature_reference env (`Root (name, `TModule)) >>= fun s ->
592621
Ok (`S s)
593622

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+
594644
and resolve_signature_reference :
595645
Env.t -> Signature.t -> signature_lookup_result ref_result =
596646
fun env' r ->
@@ -778,9 +828,8 @@ let resolve_reference =
778828
| `Dot (parent, name) -> resolve_reference_dot env parent name
779829
| `Root (name, `TConstructor) -> CS.in_env env name >>= resolved1
780830
| `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
784833
| `Root (name, `TException) -> EX.in_env env name >>= resolved1
785834
| `Exception (parent, name) ->
786835
resolve_signature_reference env parent >>= fun p ->
@@ -791,9 +840,8 @@ let resolve_reference =
791840
EC.in_signature env p name >>= resolved1
792841
| `Root (name, `TField) -> F.in_env env name >>= resolved1
793842
| `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
797845
| `Root (name, `TMethod) -> MM.in_env env name >>= resolved1
798846
| `Method (parent, name) ->
799847
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

0 commit comments

Comments
 (0)