@@ -488,6 +488,7 @@ impl Module {
488
488
}
489
489
490
490
// Records a possibly-private type definition.
491
+ #[ deriving( Clone ) ]
491
492
struct TypeNsDef {
492
493
is_public : bool , // see note in ImportResolution about how to use this
493
494
module_def : Option < @Module > ,
@@ -505,7 +506,7 @@ struct ValueNsDef {
505
506
// Records the definitions (at most one for each namespace) that a name is
506
507
// bound to.
507
508
struct NameBindings {
508
- type_def : Option < TypeNsDef > , //< Meaning in type namespace.
509
+ type_def : RefCell < Option < TypeNsDef > > , //< Meaning in type namespace.
509
510
value_def : Option < ValueNsDef > , //< Meaning in value namespace.
510
511
}
511
512
@@ -528,22 +529,22 @@ impl NameBindings {
528
529
// Merges the module with the existing type def or creates a new one.
529
530
let module_ = @Module :: new ( parent_link, def_id, kind, external,
530
531
is_public) ;
531
- match self . type_def {
532
+ match self . type_def . get ( ) {
532
533
None => {
533
- self . type_def = Some ( TypeNsDef {
534
+ self . type_def . set ( Some ( TypeNsDef {
534
535
is_public : is_public,
535
536
module_def : Some ( module_) ,
536
537
type_def : None ,
537
538
type_span : Some ( sp)
538
- } ) ;
539
+ } ) ) ;
539
540
}
540
541
Some ( type_def) => {
541
- self . type_def = Some ( TypeNsDef {
542
+ self . type_def . set ( Some ( TypeNsDef {
542
543
is_public : is_public,
543
544
module_def : Some ( module_) ,
544
545
type_span : Some ( sp) ,
545
546
type_def : type_def. type_def
546
- } ) ;
547
+ } ) ) ;
547
548
}
548
549
}
549
550
}
@@ -556,16 +557,16 @@ impl NameBindings {
556
557
external : bool ,
557
558
is_public : bool ,
558
559
_sp : Span ) {
559
- match self . type_def {
560
+ match self . type_def . get ( ) {
560
561
None => {
561
562
let module = @Module :: new ( parent_link, def_id, kind,
562
563
external, is_public) ;
563
- self . type_def = Some ( TypeNsDef {
564
+ self . type_def . set ( Some ( TypeNsDef {
564
565
is_public : is_public,
565
566
module_def : Some ( module) ,
566
567
type_def : None ,
567
568
type_span : None ,
568
- } )
569
+ } ) )
569
570
}
570
571
Some ( type_def) => {
571
572
match type_def. module_def {
@@ -575,12 +576,12 @@ impl NameBindings {
575
576
kind,
576
577
external,
577
578
is_public) ;
578
- self . type_def = Some ( TypeNsDef {
579
+ self . type_def . set ( Some ( TypeNsDef {
579
580
is_public : is_public,
580
581
module_def : Some ( module) ,
581
582
type_def : type_def. type_def ,
582
583
type_span : None ,
583
- } )
584
+ } ) )
584
585
}
585
586
Some ( module_def) => module_def. kind . set ( kind) ,
586
587
}
@@ -591,22 +592,22 @@ impl NameBindings {
591
592
/// Records a type definition.
592
593
fn define_type ( & mut self , def : Def , sp : Span , is_public : bool ) {
593
594
// Merges the type with the existing type def or creates a new one.
594
- match self . type_def {
595
+ match self . type_def . get ( ) {
595
596
None => {
596
- self . type_def = Some ( TypeNsDef {
597
+ self . type_def . set ( Some ( TypeNsDef {
597
598
module_def : None ,
598
599
type_def : Some ( def) ,
599
600
type_span : Some ( sp) ,
600
601
is_public : is_public,
601
- } ) ;
602
+ } ) ) ;
602
603
}
603
604
Some ( type_def) => {
604
- self . type_def = Some ( TypeNsDef {
605
+ self . type_def . set ( Some ( TypeNsDef {
605
606
type_def : Some ( def) ,
606
607
type_span : Some ( sp) ,
607
608
module_def : type_def. module_def ,
608
609
is_public : is_public,
609
- } ) ;
610
+ } ) ) ;
610
611
}
611
612
}
612
613
}
@@ -619,7 +620,8 @@ impl NameBindings {
619
620
620
621
/// Returns the module node if applicable.
621
622
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 ( ) {
623
625
Some ( ref type_def) => ( * type_def) . module_def ,
624
626
None => None
625
627
}
@@ -641,14 +643,14 @@ impl NameBindings {
641
643
642
644
fn defined_in_namespace ( & self , namespace : Namespace ) -> bool {
643
645
match namespace {
644
- TypeNS => return self . type_def . is_some ( ) ,
646
+ TypeNS => return self . type_def . get ( ) . is_some ( ) ,
645
647
ValueNS => return self . value_def . is_some ( )
646
648
}
647
649
}
648
650
649
651
fn defined_in_public_namespace ( & self , namespace : Namespace ) -> bool {
650
652
match namespace {
651
- TypeNS => match self . type_def {
653
+ TypeNS => match self . type_def . get ( ) {
652
654
Some ( def) => def. is_public , None => false
653
655
} ,
654
656
ValueNS => match self . value_def {
@@ -660,10 +662,10 @@ impl NameBindings {
660
662
fn def_for_namespace ( & self , namespace : Namespace ) -> Option < Def > {
661
663
match namespace {
662
664
TypeNS => {
663
- match self . type_def {
665
+ match self . type_def . get ( ) {
664
666
None => None ,
665
- Some ( ref type_def) => {
666
- match ( * type_def) . type_def {
667
+ Some ( type_def) => {
668
+ match type_def. type_def {
667
669
Some ( type_def) => Some ( type_def) ,
668
670
None => {
669
671
match type_def. module_def {
@@ -693,7 +695,7 @@ impl NameBindings {
693
695
if self . defined_in_namespace ( namespace) {
694
696
match namespace {
695
697
TypeNS => {
696
- match self . type_def {
698
+ match self . type_def . get ( ) {
697
699
None => None ,
698
700
Some ( type_def) => type_def. type_span
699
701
}
@@ -713,7 +715,7 @@ impl NameBindings {
713
715
714
716
fn NameBindings ( ) -> NameBindings {
715
717
NameBindings {
716
- type_def : None ,
718
+ type_def : RefCell :: new ( None ) ,
717
719
value_def : None
718
720
}
719
721
}
@@ -1607,7 +1609,7 @@ impl Resolver {
1607
1609
match def {
1608
1610
DefMod ( def_id) | DefForeignMod ( def_id) | DefStruct ( def_id) |
1609
1611
DefTy ( def_id) => {
1610
- match child_name_bindings. type_def {
1612
+ match child_name_bindings. type_def . get ( ) {
1611
1613
Some ( TypeNsDef { module_def : Some ( module_def) , .. } ) => {
1612
1614
debug ! ( "(building reduced graph for external crate) \
1613
1615
already created module") ;
@@ -1799,7 +1801,7 @@ impl Resolver {
1799
1801
// Process the static methods. First,
1800
1802
// create the module.
1801
1803
let type_module;
1802
- match child_name_bindings. type_def {
1804
+ match child_name_bindings. type_def . get ( ) {
1803
1805
Some ( TypeNsDef {
1804
1806
module_def : Some ( module_def) ,
1805
1807
..
@@ -2212,12 +2214,12 @@ impl Resolver {
2212
2214
fn create_name_bindings_from_module ( module : @Module )
2213
2215
-> NameBindings {
2214
2216
NameBindings {
2215
- type_def : Some ( TypeNsDef {
2217
+ type_def : RefCell :: new ( Some ( TypeNsDef {
2216
2218
is_public : false ,
2217
2219
module_def : Some ( module) ,
2218
2220
type_def : None ,
2219
2221
type_span : None
2220
- } ) ,
2222
+ } ) ) ,
2221
2223
value_def : None ,
2222
2224
}
2223
2225
}
@@ -2396,7 +2398,7 @@ impl Resolver {
2396
2398
match type_result {
2397
2399
BoundResult ( target_module, name_bindings) => {
2398
2400
debug ! ( "(resolving single import) found type target: {:?}" ,
2399
- name_bindings. type_def. unwrap( ) . type_def) ;
2401
+ name_bindings. type_def. get ( ) . unwrap( ) . type_def) ;
2400
2402
import_resolution. type_target =
2401
2403
Some ( Target :: new ( target_module, name_bindings) ) ;
2402
2404
import_resolution. type_id = directive. id ;
@@ -2649,7 +2651,7 @@ impl Resolver {
2649
2651
Success ( ( target, used_proxy) ) => {
2650
2652
// Check to see whether there are type bindings, and, if
2651
2653
// so, whether there is a module within.
2652
- match target. bindings . type_def {
2654
+ match target. bindings . type_def . get ( ) {
2653
2655
Some ( type_def) => {
2654
2656
match type_def. module_def {
2655
2657
None => {
@@ -2970,9 +2972,9 @@ impl Resolver {
2970
2972
match resolve_result {
2971
2973
Success ( ( target, _) ) => {
2972
2974
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 {
2976
2978
None => {
2977
2979
error ! ( "!!! (resolving module in lexical \
2978
2980
scope) module wasn't actually a \
0 commit comments