Skip to content

Commit 49334ea

Browse files
committed
---
yaml --- r: 14461 b: refs/heads/try c: 893bbea h: refs/heads/master i: 14459: acf3242 v: v3
1 parent 0c2837e commit 49334ea

File tree

2 files changed

+45
-39
lines changed

2 files changed

+45
-39
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
refs/heads/master: 61b1875c16de39c166b0f4d54bba19f9c6777d1a
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
5-
refs/heads/try: 050b8bfdf86fcb1daa1404411cb51fc4a46a1206
5+
refs/heads/try: 893bbea5765a3e9a6a1581c7f8cc1fc02a2cc7ae
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

branches/try/src/comp/middle/resolve.rs

Lines changed: 44 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,15 @@ type env =
146146
// since export restrictions should only be applied for the former.
147147
enum dir { inside, outside, }
148148

149-
// There are two types of ns_value enum: "definitely a enum";
150-
// and "any value". This is so that lookup can behave differently
151-
// when looking up a variable name that's not yet in scope to check
152-
// if it's already bound to a enum.
153-
enum namespace { ns_val(ns_value_type), ns_type, ns_module, }
154-
enum ns_value_type { ns_an_enum, ns_any_value, }
149+
// There are two types of ns_value enum: "definitely a enum"; and "enum or
150+
// other value". This is so that lookup can behave differently when looking up
151+
// a variable name that's not yet in scope to check if it's already bound to a
152+
// enum.
153+
enum namespace { ns_val(enumness), ns_type, ns_module, }
154+
enum enumness {
155+
definite_enum,
156+
value_or_enum
157+
}
155158

156159
fn resolve_crate(sess: session, amap: ast_map::map, crate: @ast::crate) ->
157160
{def_map: def_map, exp_map: exp_map, impl_map: impl_map} {
@@ -372,7 +375,7 @@ fn check_unused_imports(e: @env) {
372375

373376
fn resolve_capture_item(e: @env, sc: scopes, &&cap_item: @ast::capture_item) {
374377
let dcur = lookup_in_scope_strict(
375-
*e, sc, cap_item.span, cap_item.name, ns_val(ns_any_value));
378+
*e, sc, cap_item.span, cap_item.name, ns_val(value_or_enum));
376379
maybe_insert(e, cap_item.id, dcur);
377380
}
378381

@@ -409,7 +412,7 @@ fn resolve_names(e: @env, c: @ast::crate) {
409412
ast::expr_path(p) {
410413
maybe_insert(e, exp.id,
411414
lookup_path_strict(*e, sc, exp.span, p.node,
412-
ns_val(ns_any_value)));
415+
ns_val(value_or_enum)));
413416
}
414417
ast::expr_fn(_, _, _, cap_clause) {
415418
let rci = bind resolve_capture_item(e, sc, _);
@@ -446,14 +449,14 @@ fn resolve_names(e: @env, c: @ast::crate) {
446449
fn walk_constr(e: @env, p: @ast::path, sp: span, id: node_id, sc: scopes,
447450
_v: vt<scopes>) {
448451
maybe_insert(e, id, lookup_path_strict(*e, sc,
449-
sp, p.node, ns_val(ns_any_value)));
452+
sp, p.node, ns_val(value_or_enum)));
450453
}
451454
fn walk_pat(e: @env, pat: @ast::pat, sc: scopes, v: vt<scopes>) {
452455
visit::visit_pat(pat, sc, v);
453456
alt pat.node {
454457
ast::pat_enum(p, _) {
455458
alt lookup_path_strict(*e, sc, p.span, p.node,
456-
ns_val(ns_any_value)) {
459+
ns_val(value_or_enum)) {
457460
some(fnd@ast::def_variant(_,_)) {
458461
e.def_map.insert(pat.id, fnd);
459462
}
@@ -468,7 +471,7 @@ fn resolve_names(e: @env, c: @ast::crate) {
468471
variable a refers to a nullary enum. */
469472
ast::pat_ident(p, none) {
470473
alt lookup_in_scope(*e, sc, p.span, path_to_ident(p),
471-
ns_val(ns_an_enum)) {
474+
ns_val(definite_enum)) {
472475
some(fnd@ast::def_variant(_,_)) {
473476
e.def_map.insert(pat.id, fnd);
474477
}
@@ -624,11 +627,11 @@ fn visit_local_with_scope(e: @env, loc: @local, sc:scopes, v:vt<scopes>) {
624627
// a single identifier unambiguous (does the pattern "foo" refer
625628
// to enum foo, or is it binding a new name foo?)
626629
alt loc.node.pat.node {
627-
pat_ident(an_ident, _) {
628-
// Be sure to pass ns_an_enum to lookup_in_scope so that
630+
pat_ident(an_ident,_) {
631+
// Be sure to pass definite_enum to lookup_in_scope so that
629632
// if this is a name that's being shadowed, we don't die
630633
alt lookup_in_scope(*e, sc, loc.span,
631-
path_to_ident(an_ident), ns_val(ns_an_enum)) {
634+
path_to_ident(an_ident), ns_val(definite_enum)) {
632635
some(ast::def_variant(enum_id,variant_id)) {
633636
// Declaration shadows a enum that's in scope.
634637
// That's an error.
@@ -676,7 +679,7 @@ fn follow_import(e: env, sc: scopes, path: [ident], sp: span) ->
676679

677680
fn resolve_constr(e: @env, c: @ast::constr, sc: scopes, _v: vt<scopes>) {
678681
alt lookup_path_strict(*e, sc, c.span, c.node.path.node,
679-
ns_val(ns_any_value)) {
682+
ns_val(value_or_enum)) {
680683
some(d@ast::def_fn(_,ast::pure_fn)) {
681684
e.def_map.insert(c.node.id, d);
682685
}
@@ -694,7 +697,7 @@ fn resolve_import(e: env, defid: ast::def_id, name: ast::ident,
694697
fn register(e: env, id: node_id, cx: ctxt, sp: codemap::span,
695698
name: ast::ident, lookup: fn(namespace) -> option<def>,
696699
impls: [@_impl]) {
697-
let val = lookup(ns_val(ns_any_value)), typ = lookup(ns_type),
700+
let val = lookup(ns_val(value_or_enum)), typ = lookup(ns_type),
698701
md = lookup(ns_module);
699702
if is_none(val) && is_none(typ) && is_none(md) &&
700703
vec::len(impls) == 0u {
@@ -806,8 +809,8 @@ fn ns_name(ns: namespace) -> str {
806809
ns_type { "typename" }
807810
ns_val(v) {
808811
alt (v) {
809-
ns_any_value { "name" }
810-
ns_an_enum { "enum" }
812+
value_or_enum { "name" }
813+
definite_enum { "enum" }
811814
}
812815
}
813816
ns_module { "modulename" }
@@ -1007,11 +1010,11 @@ fn lookup_in_scope(e: env, sc: scopes, sp: span, name: ident, ns: namespace)
10071010
if ns == ns_type {
10081011
ret lookup_in_ty_params(e, name, tps);
10091012
}
1010-
if ns == ns_val(ns_any_value) && name == it.ident {
1013+
if ns == ns_val(value_or_enum) && name == it.ident {
10111014
ret some(ast::def_fn(local_def(ctor_id),
10121015
ast::impure_fn));
10131016
}
1014-
if ns == ns_val(ns_any_value) {
1017+
if ns == ns_val(value_or_enum) {
10151018
ret lookup_in_class(local_def(it.id),
10161019
members, name);
10171020
}
@@ -1022,7 +1025,7 @@ fn lookup_in_scope(e: env, sc: scopes, sp: span, name: ident, ns: namespace)
10221025
}
10231026
}
10241027
scope_method(id, tps) {
1025-
if (name == "self" && ns == ns_val(ns_any_value)) {
1028+
if (name == "self" && ns == ns_val(value_or_enum)) {
10261029
ret some(ast::def_self(local_def(id)));
10271030
} else if ns == ns_type {
10281031
ret lookup_in_ty_params(e, name, tps);
@@ -1044,7 +1047,7 @@ fn lookup_in_scope(e: env, sc: scopes, sp: span, name: ident, ns: namespace)
10441047
ret lookup_in_fn(e, name, decl, ty_params, ns);
10451048
}
10461049
scope_loop(local) {
1047-
if ns == ns_val(ns_any_value) {
1050+
if ns == ns_val(value_or_enum) {
10481051
alt lookup_in_pat(e, name, local.node.pat) {
10491052
some(did) { ret some(ast::def_binding(did)); }
10501053
_ { }
@@ -1055,7 +1058,7 @@ fn lookup_in_scope(e: env, sc: scopes, sp: span, name: ident, ns: namespace)
10551058
ret lookup_in_block(e, name, sp, b.node, *pos, *loc, ns);
10561059
}
10571060
scope_arm(a) {
1058-
if ns == ns_val(ns_any_value) {
1061+
if ns == ns_val(value_or_enum) {
10591062
alt lookup_in_pat(e, name, a.pats[0]) {
10601063
some(did) { ret some(ast::def_binding(did)); }
10611064
_ { ret none; }
@@ -1089,7 +1092,7 @@ fn lookup_in_scope(e: env, sc: scopes, sp: span, name: ident, ns: namespace)
10891092
/* If we were looking for a enum, at this point
10901093
we know it's bound to a non-enum value, and
10911094
we can return none instead of failing */
1092-
ns_an_enum { ret none; }
1095+
definite_enum { ret none; }
10931096
_ { "attempted dynamic environment-capture" }
10941097
}
10951098
}
@@ -1150,7 +1153,7 @@ fn lookup_in_fn(e: env, name: ident, decl: ast::fn_decl,
11501153
ty_params: [ast::ty_param],
11511154
ns: namespace) -> option<def> {
11521155
alt ns {
1153-
ns_val(ns_any_value) {
1156+
ns_val(value_or_enum) {
11541157
for a: ast::arg in decl.inputs {
11551158
if str::eq(a.ident, name) {
11561159
ret some(ast::def_arg(local_def(a.id), a.mode));
@@ -1202,7 +1205,7 @@ fn lookup_in_block(e: env, name: ident, sp: span, b: ast::blk_, pos: uint,
12021205
while j > 0u {
12031206
j -= 1u;
12041207
let loc = locs[j];
1205-
if ns == ns_val(ns_any_value)
1208+
if ns == ns_val(value_or_enum)
12061209
&& (i < pos || j < loc_pos) {
12071210
alt lookup_in_pat(e, name, loc.node.pat) {
12081211
some(did) {
@@ -1292,11 +1295,11 @@ fn lookup_in_block(e: env, name: ident, sp: span, b: ast::blk_, pos: uint,
12921295
fn found_def_item(i: @ast::item, ns: namespace) -> option<def> {
12931296
alt i.node {
12941297
ast::item_const(_, _) {
1295-
if ns == ns_val(ns_any_value) {
1298+
if ns == ns_val(value_or_enum) {
12961299
ret some(ast::def_const(local_def(i.id))); }
12971300
}
12981301
ast::item_fn(decl, _, _) {
1299-
if ns == ns_val(ns_any_value) {
1302+
if ns == ns_val(value_or_enum) {
13001303
ret some(ast::def_fn(local_def(i.id), decl.purity));
13011304
}
13021305
}
@@ -1311,7 +1314,7 @@ fn found_def_item(i: @ast::item, ns: namespace) -> option<def> {
13111314
}
13121315
ast::item_res(_, _, _, _, ctor_id) {
13131316
alt ns {
1314-
ns_val(ns_any_value) {
1317+
ns_val(value_or_enum) {
13151318
ret some(ast::def_fn(local_def(ctor_id), ast::impure_fn));
13161319
}
13171320
ns_type { ret some(ast::def_ty(local_def(i.id))); }
@@ -1470,7 +1473,7 @@ fn lookup_in_globs(e: env, globs: [glob_imp_def], sp: span, id: ident,
14701473
if vec::len(matches) == 0u {
14711474
ret none;
14721475
}
1473-
else if vec::len(matches) == 1u || ns == ns_val(ns_an_enum) {
1476+
else if vec::len(matches) == 1u || ns == ns_val(definite_enum) {
14741477
ret some(matches[0].def);
14751478
} else {
14761479
for match: glob_imp_def in matches {
@@ -1489,8 +1492,11 @@ fn lookup_glob_in_mod(e: env, info: @indexed_mod, sp: span, id: ident,
14891492
if !info.glob_imported_names.contains_key(id) {
14901493
info.glob_imported_names.insert(id, glob_resolving(sp));
14911494
// kludge
1492-
let val_ns = if wanted_ns == ns_val(ns_an_enum) { ns_val(ns_an_enum) }
1493-
else { ns_val(ns_any_value) };
1495+
let val_ns = if wanted_ns == ns_val(definite_enum) {
1496+
ns_val(definite_enum)
1497+
} else {
1498+
ns_val(value_or_enum)
1499+
};
14941500
let globs = info.glob_imports;
14951501
let val = lookup_in_globs(e, globs, sp, id, val_ns, dr);
14961502
let typ = lookup_in_globs(e, globs, sp, id, ns_type, dr);
@@ -1532,7 +1538,7 @@ fn lookup_in_mie(e: env, mie: mod_index_entry, ns: namespace) ->
15321538
mie_native_item(native_item) {
15331539
alt native_item.node {
15341540
ast::native_item_fn(decl, _) {
1535-
if ns == ns_val(ns_any_value) {
1541+
if ns == ns_val(value_or_enum) {
15361542
ret some(ast::def_fn(local_def(native_item.id),
15371543
decl.purity));
15381544
}
@@ -1655,12 +1661,12 @@ fn index_nmod(md: ast::native_mod) -> mod_index {
16551661
// External lookups
16561662
fn ns_for_def(d: def) -> namespace {
16571663
alt d {
1658-
ast::def_variant(_, _) { ns_val(ns_an_enum) }
1664+
ast::def_variant(_, _) { ns_val(definite_enum) }
16591665
ast::def_fn(_, _) | ast::def_self(_) |
16601666
ast::def_const(_) | ast::def_arg(_, _) | ast::def_local(_) |
16611667
ast::def_upvar(_, _, _) | ast::def_self(_) |
16621668
ast::def_class_field(_,_) | ast::def_class_method(_,_)
1663-
{ ns_val(ns_any_value) }
1669+
{ ns_val(value_or_enum) }
16641670
ast::def_mod(_) | ast::def_native_mod(_) { ns_module }
16651671
ast::def_ty(_) | ast::def_binding(_) | ast::def_use(_) |
16661672
ast::def_ty_param(_, _) | ast::def_prim_ty(_) | ast::def_class(_)
@@ -1672,7 +1678,7 @@ fn ns_for_def(d: def) -> namespace {
16721678
// a enum
16731679
fn ns_ok(wanted:namespace, actual:namespace) -> bool {
16741680
alt actual {
1675-
ns_val(ns_an_enum) {
1681+
ns_val(definite_enum) {
16761682
alt wanted {
16771683
ns_val(_) { true }
16781684
_ { false }
@@ -1720,7 +1726,7 @@ fn check_mod_name(e: env, name: ident, entries: list<mod_index_entry>) {
17201726
while true {
17211727
alt entries {
17221728
cons(entry, rest) {
1723-
if !is_none(lookup_in_mie(e, entry, ns_val(ns_any_value))) {
1729+
if !is_none(lookup_in_mie(e, entry, ns_val(value_or_enum))) {
17241730
if saw_value {
17251731
dup(e, mie_span(entry), "", name);
17261732
} else { saw_value = true; }
@@ -1921,7 +1927,7 @@ fn check_exports(e: @env) {
19211927
let lookup =
19221928
bind lookup_glob_in_mod(*e, info, sp, ident, _, inside);
19231929
let (m, v, t) = (lookup(ns_module),
1924-
lookup(ns_val(ns_any_value)),
1930+
lookup(ns_val(value_or_enum)),
19251931
lookup(ns_type));
19261932
let full_path = path + ident;
19271933
maybe_add_reexport(e, full_path, m);

0 commit comments

Comments
 (0)