Skip to content

Commit 10c5a51

Browse files
committed
---
yaml --- r: 877 b: refs/heads/master c: 896570a h: refs/heads/master i: 875: 0ae3013 v: v3
1 parent 97e6e3b commit 10c5a51

File tree

2 files changed

+36
-26
lines changed

2 files changed

+36
-26
lines changed

[refs]

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: db955d33b7a54df6ba90bef713110bc2f85b2830
2+
refs/heads/master: 896570a3a9fe5c5e4a457f7cfea5917eb547d5ce

trunk/src/boot/me/resolve.ml

+35-25
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ open Common;;
1414
*
1515
*)
1616

17+
exception Resolution_failure of (Ast.name * Ast.name) list
1718

1819
let log cx = Session.log "resolve"
1920
(should_log cx cx.ctxt_sess.Session.sess_log_resolve)
@@ -228,14 +229,6 @@ let all_item_collecting_visitor
228229
Walk.visit_stmt_pre = visit_stmt_pre; }
229230
;;
230231

231-
let report_error (full_name:Ast.name) (unbound_name:Ast.name) =
232-
if full_name = unbound_name then
233-
err None "unbound name '%a'" Ast.sprintf_name full_name
234-
else
235-
err None "unbound name '%a' in name '%a'" Ast.sprintf_name unbound_name
236-
Ast.sprintf_name full_name
237-
;;
238-
239232
let lookup_type_node_by_name
240233
(cx:ctxt)
241234
(scopes:scope list)
@@ -245,7 +238,7 @@ let lookup_type_node_by_name
245238
log cx "lookup_simple_type_by_name %a"
246239
Ast.sprintf_name name);
247240
match lookup_by_name cx [] scopes name with
248-
RES_failed name' -> report_error name name'
241+
RES_failed name' -> raise (Resolution_failure [ name', name ])
249242
| RES_ok (_, id) ->
250243
match htab_search cx.ctxt_all_defns id with
251244
Some (DEFN_item { Ast.decl_item = Ast.MOD_ITEM_type _;
@@ -270,6 +263,24 @@ let push_node r n =
270263
{ recur_all_nodes = n :: r.recur_all_nodes }
271264

272265

266+
let report_resolution_failure type_names =
267+
let rec recur type_names str =
268+
let stringify_pair (part, whole) =
269+
if part = whole then
270+
Printf.sprintf "'%a'" Ast.sprintf_name part
271+
else
272+
Printf.sprintf "'%a' in name '%a'" Ast.sprintf_name part
273+
Ast.sprintf_name whole
274+
in
275+
match type_names with
276+
[] -> bug () "no name in resolution failure"
277+
| [ pair ] -> err None "unbound name %s%s" (stringify_pair pair) str
278+
| pair::pairs ->
279+
recur pairs
280+
(Printf.sprintf " while resolving %s" (stringify_pair pair))
281+
in
282+
recur type_names ""
283+
273284
let rec lookup_type_by_name
274285
?loc:loc
275286
(cx:ctxt)
@@ -281,7 +292,7 @@ let rec lookup_type_by_name
281292
log cx "+++ lookup_type_by_name %a"
282293
Ast.sprintf_name name);
283294
match lookup_by_name cx [] scopes name with
284-
RES_failed name' -> report_error name name'
295+
RES_failed name' -> raise (Resolution_failure [ name', name ])
285296
| RES_ok (scopes', id) ->
286297
let ty, params =
287298
match htab_search cx.ctxt_all_defns id with
@@ -358,15 +369,19 @@ and resolve_type
358369
in
359370
iflog cx (fun _ ->
360371
log cx "resolved type name '%a' to item %d with ty %a"
361-
Ast.sprintf_name name (int_of_node node) Ast.sprintf_ty t);
372+
Ast.sprintf_name name (int_of_node node)
373+
Ast.sprintf_ty t);
362374
if List.mem node recur.recur_all_nodes
363375
then (err (Some node) "infinite recursive type definition: '%a'"
364376
Ast.sprintf_name name)
365377
else
366378
let recur = push_node recur node in
367379
iflog cx (fun _ -> log cx "recursively resolving type %a"
368380
Ast.sprintf_ty t);
369-
resolve_type ?loc:loc cx scopes recur t
381+
try
382+
resolve_type ?loc:loc cx scopes recur t
383+
with Resolution_failure names ->
384+
raise (Resolution_failure ((name, name)::names))
370385
in
371386
let fold =
372387
{ base with
@@ -388,9 +403,11 @@ let type_resolving_visitor
388403

389404
let tinfos = Hashtbl.create 0 in
390405

391-
let resolve_ty (t:Ast.ty) : Ast.ty =
392-
resolve_type ~loc:(id_of_scope (List.hd (!scopes)))
393-
cx (!scopes) empty_recur_info t
406+
let resolve_ty ?(loc=id_of_scope (List.hd (!scopes))) (t:Ast.ty) : Ast.ty =
407+
try
408+
resolve_type ~loc:loc cx (!scopes) empty_recur_info t
409+
with Resolution_failure pairs ->
410+
report_resolution_failure pairs
394411
in
395412

396413
let resolve_slot (s:Ast.slot) : Ast.slot =
@@ -422,19 +439,15 @@ let type_resolving_visitor
422439
let visit_mod_item_pre id params item =
423440
let resolve_and_store_type _ =
424441
let t = ty_of_mod_item item in
425-
let ty =
426-
resolve_type ~loc:item.id cx (!scopes) empty_recur_info t
427-
in
442+
let ty = resolve_ty ~loc:item.id t in
428443
log cx "resolved item %s, type as %a" id Ast.sprintf_ty ty;
429444
htab_put cx.ctxt_all_item_types item.id ty;
430445
in
431446
begin
432447
try
433448
match item.node.Ast.decl_item with
434449
Ast.MOD_ITEM_type (_, ty) ->
435-
let ty =
436-
resolve_type ~loc:item.id cx (!scopes) empty_recur_info ty
437-
in
450+
let ty = resolve_ty ~loc:item.id ty in
438451
log cx "resolved item %s, defining type %a"
439452
id Ast.sprintf_ty ty;
440453
htab_put cx.ctxt_all_type_items item.id ty;
@@ -478,10 +491,7 @@ let type_resolving_visitor
478491
in
479492

480493
let visit_obj_fn_pre obj ident fn =
481-
let fty =
482-
resolve_type ~loc:fn.id cx (!scopes)
483-
empty_recur_info (Ast.TY_fn (ty_fn_of_fn fn.node))
484-
in
494+
let fty = resolve_ty ~loc:fn.id (Ast.TY_fn (ty_fn_of_fn fn.node)) in
485495
log cx "resolved obj fn %s as %a" ident Ast.sprintf_ty fty;
486496
htab_put cx.ctxt_all_item_types fn.id fty;
487497
inner.Walk.visit_obj_fn_pre obj ident fn

0 commit comments

Comments
 (0)