Skip to content

Commit c45c9a5

Browse files
committed
librustc: De-@mut NameBindings::type_def
1 parent bc1ea78 commit c45c9a5

File tree

1 file changed

+35
-33
lines changed

1 file changed

+35
-33
lines changed

src/librustc/middle/resolve.rs

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,7 @@ impl Module {
488488
}
489489

490490
// Records a possibly-private type definition.
491+
#[deriving(Clone)]
491492
struct TypeNsDef {
492493
is_public: bool, // see note in ImportResolution about how to use this
493494
module_def: Option<@Module>,
@@ -505,7 +506,7 @@ struct ValueNsDef {
505506
// Records the definitions (at most one for each namespace) that a name is
506507
// bound to.
507508
struct NameBindings {
508-
type_def: Option<TypeNsDef>, //< Meaning in type namespace.
509+
type_def: RefCell<Option<TypeNsDef>>, //< Meaning in type namespace.
509510
value_def: Option<ValueNsDef>, //< Meaning in value namespace.
510511
}
511512

@@ -528,22 +529,22 @@ impl NameBindings {
528529
// Merges the module with the existing type def or creates a new one.
529530
let module_ = @Module::new(parent_link, def_id, kind, external,
530531
is_public);
531-
match self.type_def {
532+
match self.type_def.get() {
532533
None => {
533-
self.type_def = Some(TypeNsDef {
534+
self.type_def.set(Some(TypeNsDef {
534535
is_public: is_public,
535536
module_def: Some(module_),
536537
type_def: None,
537538
type_span: Some(sp)
538-
});
539+
}));
539540
}
540541
Some(type_def) => {
541-
self.type_def = Some(TypeNsDef {
542+
self.type_def.set(Some(TypeNsDef {
542543
is_public: is_public,
543544
module_def: Some(module_),
544545
type_span: Some(sp),
545546
type_def: type_def.type_def
546-
});
547+
}));
547548
}
548549
}
549550
}
@@ -556,16 +557,16 @@ impl NameBindings {
556557
external: bool,
557558
is_public: bool,
558559
_sp: Span) {
559-
match self.type_def {
560+
match self.type_def.get() {
560561
None => {
561562
let module = @Module::new(parent_link, def_id, kind,
562563
external, is_public);
563-
self.type_def = Some(TypeNsDef {
564+
self.type_def.set(Some(TypeNsDef {
564565
is_public: is_public,
565566
module_def: Some(module),
566567
type_def: None,
567568
type_span: None,
568-
})
569+
}))
569570
}
570571
Some(type_def) => {
571572
match type_def.module_def {
@@ -575,12 +576,12 @@ impl NameBindings {
575576
kind,
576577
external,
577578
is_public);
578-
self.type_def = Some(TypeNsDef {
579+
self.type_def.set(Some(TypeNsDef {
579580
is_public: is_public,
580581
module_def: Some(module),
581582
type_def: type_def.type_def,
582583
type_span: None,
583-
})
584+
}))
584585
}
585586
Some(module_def) => module_def.kind.set(kind),
586587
}
@@ -591,22 +592,22 @@ impl NameBindings {
591592
/// Records a type definition.
592593
fn define_type(&mut self, def: Def, sp: Span, is_public: bool) {
593594
// Merges the type with the existing type def or creates a new one.
594-
match self.type_def {
595+
match self.type_def.get() {
595596
None => {
596-
self.type_def = Some(TypeNsDef {
597+
self.type_def.set(Some(TypeNsDef {
597598
module_def: None,
598599
type_def: Some(def),
599600
type_span: Some(sp),
600601
is_public: is_public,
601-
});
602+
}));
602603
}
603604
Some(type_def) => {
604-
self.type_def = Some(TypeNsDef {
605+
self.type_def.set(Some(TypeNsDef {
605606
type_def: Some(def),
606607
type_span: Some(sp),
607608
module_def: type_def.module_def,
608609
is_public: is_public,
609-
});
610+
}));
610611
}
611612
}
612613
}
@@ -619,7 +620,8 @@ impl NameBindings {
619620

620621
/// Returns the module node if applicable.
621622
fn get_module_if_available(&self) -> Option<@Module> {
622-
match self.type_def {
623+
let type_def = self.type_def.borrow();
624+
match *type_def.get() {
623625
Some(ref type_def) => (*type_def).module_def,
624626
None => None
625627
}
@@ -641,14 +643,14 @@ impl NameBindings {
641643

642644
fn defined_in_namespace(&self, namespace: Namespace) -> bool {
643645
match namespace {
644-
TypeNS => return self.type_def.is_some(),
646+
TypeNS => return self.type_def.get().is_some(),
645647
ValueNS => return self.value_def.is_some()
646648
}
647649
}
648650

649651
fn defined_in_public_namespace(&self, namespace: Namespace) -> bool {
650652
match namespace {
651-
TypeNS => match self.type_def {
653+
TypeNS => match self.type_def.get() {
652654
Some(def) => def.is_public, None => false
653655
},
654656
ValueNS => match self.value_def {
@@ -660,10 +662,10 @@ impl NameBindings {
660662
fn def_for_namespace(&self, namespace: Namespace) -> Option<Def> {
661663
match namespace {
662664
TypeNS => {
663-
match self.type_def {
665+
match self.type_def.get() {
664666
None => None,
665-
Some(ref type_def) => {
666-
match (*type_def).type_def {
667+
Some(type_def) => {
668+
match type_def.type_def {
667669
Some(type_def) => Some(type_def),
668670
None => {
669671
match type_def.module_def {
@@ -693,7 +695,7 @@ impl NameBindings {
693695
if self.defined_in_namespace(namespace) {
694696
match namespace {
695697
TypeNS => {
696-
match self.type_def {
698+
match self.type_def.get() {
697699
None => None,
698700
Some(type_def) => type_def.type_span
699701
}
@@ -713,7 +715,7 @@ impl NameBindings {
713715

714716
fn NameBindings() -> NameBindings {
715717
NameBindings {
716-
type_def: None,
718+
type_def: RefCell::new(None),
717719
value_def: None
718720
}
719721
}
@@ -1607,7 +1609,7 @@ impl Resolver {
16071609
match def {
16081610
DefMod(def_id) | DefForeignMod(def_id) | DefStruct(def_id) |
16091611
DefTy(def_id) => {
1610-
match child_name_bindings.type_def {
1612+
match child_name_bindings.type_def.get() {
16111613
Some(TypeNsDef { module_def: Some(module_def), .. }) => {
16121614
debug!("(building reduced graph for external crate) \
16131615
already created module");
@@ -1799,7 +1801,7 @@ impl Resolver {
17991801
// Process the static methods. First,
18001802
// create the module.
18011803
let type_module;
1802-
match child_name_bindings.type_def {
1804+
match child_name_bindings.type_def.get() {
18031805
Some(TypeNsDef {
18041806
module_def: Some(module_def),
18051807
..
@@ -2212,12 +2214,12 @@ impl Resolver {
22122214
fn create_name_bindings_from_module(module: @Module)
22132215
-> NameBindings {
22142216
NameBindings {
2215-
type_def: Some(TypeNsDef {
2217+
type_def: RefCell::new(Some(TypeNsDef {
22162218
is_public: false,
22172219
module_def: Some(module),
22182220
type_def: None,
22192221
type_span: None
2220-
}),
2222+
})),
22212223
value_def: None,
22222224
}
22232225
}
@@ -2396,7 +2398,7 @@ impl Resolver {
23962398
match type_result {
23972399
BoundResult(target_module, name_bindings) => {
23982400
debug!("(resolving single import) found type target: {:?}",
2399-
name_bindings.type_def.unwrap().type_def);
2401+
name_bindings.type_def.get().unwrap().type_def);
24002402
import_resolution.type_target =
24012403
Some(Target::new(target_module, name_bindings));
24022404
import_resolution.type_id = directive.id;
@@ -2649,7 +2651,7 @@ impl Resolver {
26492651
Success((target, used_proxy)) => {
26502652
// Check to see whether there are type bindings, and, if
26512653
// so, whether there is a module within.
2652-
match target.bindings.type_def {
2654+
match target.bindings.type_def.get() {
26532655
Some(type_def) => {
26542656
match type_def.module_def {
26552657
None => {
@@ -2970,9 +2972,9 @@ impl Resolver {
29702972
match resolve_result {
29712973
Success((target, _)) => {
29722974
let bindings = &mut *target.bindings;
2973-
match bindings.type_def {
2974-
Some(ref type_def) => {
2975-
match (*type_def).module_def {
2975+
match bindings.type_def.get() {
2976+
Some(type_def) => {
2977+
match type_def.module_def {
29762978
None => {
29772979
error!("!!! (resolving module in lexical \
29782980
scope) module wasn't actually a \

0 commit comments

Comments
 (0)