Skip to content

Commit dfcc92e

Browse files
committed
Fewer conversions between Names and strings
1 parent 0dcbe20 commit dfcc92e

File tree

7 files changed

+161
-121
lines changed

7 files changed

+161
-121
lines changed

src/model/names.ml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ module type Name = sig
4343

4444
val shadowed_of_ident : Ident.t -> t
4545

46+
val equal_modulo_shadowing : t -> t -> bool
47+
4648
val equal : t -> t -> bool
4749

4850
val compare : t -> t -> int
@@ -93,6 +95,15 @@ module Name : Name = struct
9395

9496
let shadowed_of_ident id = shadowed_of_string (Ident.name id)
9597

98+
let equal_modulo_shadowing (x : t) (y : t) =
99+
match (x, y) with
100+
| Std x, Std y -> x = y
101+
| Hidden x, Std y -> x = y
102+
| Std x, Hidden y -> x = y
103+
| Hidden x, Hidden y -> x = y
104+
| Shadowed (x, i, s), Shadowed (y, j, t) -> x = y && i = j && s = t
105+
| _, _ -> false
106+
96107
let equal (x : t) (y : t) = x = y
97108

98109
let compare = compare

src/model/names.mli

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ module type Name = sig
4343

4444
val shadowed_of_ident : Ident.t -> t
4545

46+
val equal_modulo_shadowing : t -> t -> bool
47+
4648
val equal : t -> t -> bool
4749

4850
val compare : t -> t -> int

src/xref2/find.ml

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -93,23 +93,29 @@ let rec disambiguate = function
9393

9494
let module_in_sig sg name =
9595
find_in_sig sg (function
96-
| Signature.Module (id, _, m) when N.module_ id = name ->
96+
| Signature.Module (id, _, m)
97+
when ModuleName.equal_modulo_shadowing (N.typed_module id) name ->
9798
Some (`FModule (N.typed_module id, Delayed.get m))
9899
| _ -> None)
99100

100101
let module_type_in_sig sg name =
101102
find_in_sig sg (function
102-
| Signature.ModuleType (id, mt) when N.module_type id = name ->
103+
| Signature.ModuleType (id, mt)
104+
when ModuleTypeName.equal_modulo_shadowing (N.typed_module_type id) name
105+
->
103106
Some (`FModuleType (N.typed_module_type id, Delayed.get mt))
104107
| _ -> None)
105108

106109
let type_in_sig sg name =
107110
find_in_sig sg (function
108-
| Signature.Type (id, _, m) when N.type_ id = name ->
109-
Some (`FType (N.type' id, Delayed.get m))
110-
| Class (id, _, c) when N.class_ id = name ->
111+
| Signature.Type (id, _, m)
112+
when TypeName.equal_modulo_shadowing (N.typed_type id) name ->
113+
Some (`FType (N.typed_type id, Delayed.get m))
114+
| Class (id, _, c)
115+
when TypeName.equal_modulo_shadowing (N.typed_class id) name ->
111116
Some (`FClass (N.class' id, c))
112-
| ClassType (id, _, c) when N.class_type id = name ->
117+
| ClassType (id, _, c)
118+
when TypeName.equal_modulo_shadowing (N.typed_class_type id) name ->
113119
Some (`FClassType (N.class_type' id, c))
114120
| _ -> None)
115121

@@ -127,7 +133,8 @@ type careful_class = [ class_ | removed_type ]
127133

128134
let careful_module_in_sig sg name =
129135
let removed_module = function
130-
| Signature.RModule (id, p) when ModuleName.to_string id = name ->
136+
| Signature.RModule (id, p) when ModuleName.equal_modulo_shadowing id name
137+
->
131138
Some (`FModule_removed p)
132139
| _ -> None
133140
in
@@ -137,7 +144,8 @@ let careful_module_in_sig sg name =
137144

138145
let careful_module_type_in_sig sg name =
139146
let removed_module_type = function
140-
| Signature.RModuleType (id, p) when ModuleTypeName.to_string id = name ->
147+
| Signature.RModuleType (id, p)
148+
when ModuleTypeName.equal_modulo_shadowing id name ->
141149
Some (`FModuleType_removed p)
142150
| _ -> None
143151
in
@@ -147,7 +155,7 @@ let careful_module_type_in_sig sg name =
147155

148156
let removed_type_in_sig sg name =
149157
let removed_type = function
150-
| Signature.RType (id, p, eq) when TypeName.to_string id = name ->
158+
| Signature.RType (id, p, eq) when id = name ->
151159
Some (`FType_removed (id, p, eq))
152160
| _ -> None
153161
in
@@ -160,15 +168,18 @@ let careful_type_in_sig sg name =
160168

161169
let datatype_in_sig sg name =
162170
find_in_sig sg (function
163-
| Signature.Type (id, _, t) when N.type_ id = name ->
171+
| Signature.Type (id, _, t)
172+
when TypeName.equal_modulo_shadowing (N.typed_type id) name ->
164173
Some (`FType (N.type' id, Component.Delayed.get t))
165174
| _ -> None)
166175

167176
let class_in_sig sg name =
168177
filter_in_sig sg (function
169-
| Signature.Class (id, _, c) when N.class_ id = name ->
178+
| Signature.Class (id, _, c)
179+
when TypeName.equal_modulo_shadowing (N.typed_class id) name ->
170180
Some (`FClass (N.class' id, c))
171-
| Signature.ClassType (id, _, c) when N.class_type id = name ->
181+
| Signature.ClassType (id, _, c)
182+
when TypeName.equal_modulo_shadowing (N.typed_class_type id) name ->
172183
Some (`FClassType (N.class_type' id, c))
173184
| _ -> None)
174185

@@ -226,7 +237,7 @@ let any_in_comment d name =
226237
match xs with
227238
| elt :: rest -> (
228239
match elt.Odoc_model.Location_.value with
229-
| `Heading lbl when Ident.Name.label lbl.Label.label = name ->
240+
| `Heading lbl when Ident.Name.typed_label lbl.Label.label = name ->
230241
Some (`FLabel lbl)
231242
| _ -> inner rest)
232243
| [] -> None
@@ -258,7 +269,7 @@ let any_in_sig sg name =
258269
| Some r -> Some (`In_type (N.type' id, typ, r))
259270
| None -> None)
260271
| TypExt typext -> any_in_typext typext name
261-
| Comment (`Docs d) -> any_in_comment d name
272+
| Comment (`Docs d) -> any_in_comment d (LabelName.make_std name)
262273
| _ -> None)
263274

264275
let signature_in_sig sg name =
@@ -271,35 +282,39 @@ let signature_in_sig sg name =
271282

272283
let module_type_in_sig sg name =
273284
find_in_sig sg (function
274-
| Signature.ModuleType (id, m) when N.module_type id = name ->
285+
| Signature.ModuleType (id, m)
286+
when ModuleTypeName.equal_modulo_shadowing (N.typed_module_type id) name
287+
->
275288
Some (`FModuleType (N.typed_module_type id, Delayed.get m))
276289
| _ -> None)
277290

278291
let value_in_sig sg name =
279-
filter_in_sig sg (function
292+
find_in_sig sg (function
280293
| Signature.Value (id, m)
281-
when N.value id = name || N.value id = "(" ^ name ^ ")" ->
294+
when ValueName.equal_modulo_shadowing (N.typed_value id) name
295+
|| ValueName.to_string (N.typed_value id)
296+
= "(" ^ ValueName.to_string name ^ ")" ->
282297
(* For operator, the value will have name [(<op>)]. We match that even
283298
with name [<op>]. *)
284299
Some (`FValue (N.typed_value id, Delayed.get m))
285300
| _ -> None)
286301

287-
let value_in_sig_unambiguous sg name = disambiguate (value_in_sig sg name)
288-
289302
let label_in_sig sg name =
290303
filter_in_sig sg (function
291304
| Signature.Comment (`Docs d) -> any_in_comment d name
292305
| _ -> None)
293306

294307
let exception_in_sig sg name =
295308
find_in_sig sg (function
296-
| Signature.Exception (id, e) when N.exception_ id = name ->
309+
| Signature.Exception (id, e) when N.typed_exception id = name ->
297310
Some (`FExn (N.typed_exception id, e))
298311
| _ -> None)
299312

300313
let extension_in_sig sg name =
301314
let rec inner t = function
302-
| ec :: _ when ec.Extension.Constructor.name = name -> Some (`FExt (t, ec))
315+
| ec :: _ when ec.Extension.Constructor.name = ExtensionName.to_string name
316+
->
317+
Some (`FExt (t, ec))
303318
| _ :: tl -> inner t tl
304319
| [] -> None
305320
in
@@ -355,13 +370,13 @@ let any_in_class_signature cs name =
355370

356371
let method_in_class_signature cs name =
357372
find_in_class_signature cs (function
358-
| ClassSignature.Method (id, m) when N.method_ id = name ->
359-
Some (`FMethod (N.typed_method id, m))
373+
| ClassSignature.Method (id, m) when N.typed_method id = name ->
374+
Some (`FMethod (name, m))
360375
| _ -> None)
361376

362377
let instance_variable_in_class_signature cs name =
363378
find_in_class_signature cs (function
364379
| ClassSignature.InstanceVariable (id, iv)
365-
when N.instance_variable id = name ->
366-
Some (`FInstance_variable (N.typed_instance_variable id, iv))
380+
when N.typed_instance_variable id = name ->
381+
Some (`FInstance_variable (name, iv))
367382
| _ -> None)

src/xref2/find.mli

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -59,36 +59,37 @@ type any_in_class_sig = [ instance_variable | method_ ]
5959

6060
(** Lookup by name, unambiguous *)
6161

62-
val module_in_sig : Signature.t -> string -> module_ option
62+
val module_in_sig : Signature.t -> ModuleName.t -> module_ option
6363

64-
val type_in_sig : Signature.t -> string -> type_ option
64+
val type_in_sig : Signature.t -> TypeName.t -> type_ option
6565

66-
val datatype_in_sig : Signature.t -> string -> datatype option
66+
val datatype_in_sig : Signature.t -> TypeName.t -> datatype option
6767

68-
val module_type_in_sig : Signature.t -> string -> module_type option
68+
val module_type_in_sig : Signature.t -> ModuleTypeName.t -> module_type option
6969

70-
val exception_in_sig : Signature.t -> string -> exception_ option
70+
val exception_in_sig : Signature.t -> ExceptionName.t -> exception_ option
7171

72-
val extension_in_sig : Signature.t -> string -> extension option
72+
val extension_in_sig : Signature.t -> ExtensionName.t -> extension option
7373

7474
val any_in_type : TypeDecl.t -> string -> any_in_type option
7575

7676
val any_in_typext : Extension.t -> string -> extension option
7777

78-
val method_in_class_signature : ClassSignature.t -> string -> method_ option
78+
val value_in_sig : Signature.t -> ValueName.t -> value option
79+
80+
val method_in_class_signature :
81+
ClassSignature.t -> MethodName.t -> method_ option
7982

8083
val instance_variable_in_class_signature :
81-
ClassSignature.t -> string -> instance_variable option
84+
ClassSignature.t -> InstanceVariableName.t -> instance_variable option
8285

8386
(** Maybe ambiguous *)
8487

85-
val class_in_sig : Signature.t -> string -> class_ list
88+
val class_in_sig : Signature.t -> TypeName.t -> class_ list
8689

8790
val signature_in_sig : Signature.t -> string -> signature list
8891

89-
val value_in_sig : Signature.t -> string -> value list
90-
91-
val label_in_sig : Signature.t -> string -> label list
92+
val label_in_sig : Signature.t -> LabelName.t -> label list
9293

9394
val label_parent_in_sig : Signature.t -> string -> label_parent list
9495

@@ -100,9 +101,7 @@ val any_in_class_signature : ClassSignature.t -> string -> any_in_class_sig list
100101

101102
(** Disambiguated lookups, returns the last match. *)
102103

103-
val class_in_sig_unambiguous : Signature.t -> string -> class_ option
104-
105-
val value_in_sig_unambiguous : Signature.t -> string -> value option
104+
val class_in_sig_unambiguous : Signature.t -> TypeName.t -> class_ option
106105

107106
(** Lookup removed items *)
108107

@@ -118,11 +117,11 @@ type careful_type = [ type_ | removed_type ]
118117

119118
type careful_class = [ class_ | removed_type ]
120119

121-
val careful_module_in_sig : Signature.t -> string -> careful_module option
120+
val careful_module_in_sig : Signature.t -> ModuleName.t -> careful_module option
122121

123122
val careful_module_type_in_sig :
124-
Signature.t -> string -> careful_module_type option
123+
Signature.t -> ModuleTypeName.t -> careful_module_type option
125124

126-
val careful_type_in_sig : Signature.t -> string -> careful_type option
125+
val careful_type_in_sig : Signature.t -> TypeName.t -> careful_type option
127126

128-
val careful_class_in_sig : Signature.t -> string -> careful_class option
127+
val careful_class_in_sig : Signature.t -> TypeName.t -> careful_class option

0 commit comments

Comments
 (0)