@@ -53,7 +53,7 @@ pub struct NameSupply {
53
53
impl NameSupply {
54
54
55
55
pub fn new ( ) -> NameSupply {
56
- NameSupply { unique_id : 0 }
56
+ NameSupply { unique_id : 1 }
57
57
}
58
58
///Create a unique Name which are anonymous
59
59
pub fn anonymous ( & mut self ) -> Name {
@@ -75,6 +75,11 @@ impl NameSupply {
75
75
76
76
///The renamer has methods which turns the ASTs identifiers from simple strings
77
77
///into unique Names
78
+ ///Currently there is some constraints on what the unique ids should be.
79
+ ///Each module gets one uid which it uses for a top level declarations (bindings, types, etc)
80
+ ///All functions which are in a class or an instance gets the same id as the class has,
81
+ ///this is to allow the compiler to find the specific instance/class functions when it constructs dictionaries
82
+ ///All uid's of the other names can have any uid (as long as it introduces no name collisions)
78
83
struct Renamer {
79
84
///Mapping of strings into the unique name
80
85
uniques : ScopedMap < InternedStr , Name > ,
@@ -88,27 +93,19 @@ impl Renamer {
88
93
Renamer { uniques : ScopedMap :: new ( ) , name_supply : NameSupply :: new ( ) , errors : Errors :: new ( ) }
89
94
}
90
95
91
- fn insert_globals ( & mut self , module : & Module < InternedStr > ) {
92
- for ctor in module. dataDefinitions . iter ( ) . flat_map ( |data| data. constructors . iter ( ) ) {
93
- self . make_unique ( ctor. name . clone ( ) ) ;
94
- }
95
- for newtype in module. newtypes . iter ( ) {
96
- self . make_unique ( newtype. constructor_name . clone ( ) ) ;
97
- }
98
- for bind in module. instances . iter ( ) . flat_map ( |instance| binding_groups ( instance. bindings . as_slice ( ) ) ) {
99
- self . make_unique ( bind[ 0 ] . name . clone ( ) ) ;
100
- }
101
- for class in module. classes . iter ( ) {
102
- self . make_unique ( class. name ) ;
103
- for decl in class. declarations . iter ( ) {
104
- self . make_unique ( decl. name . clone ( ) ) ;
105
- }
106
- for bind in binding_groups ( class. bindings ) {
107
- self . make_unique ( bind[ 0 ] . name . clone ( ) ) ;
108
- }
109
- }
110
- for bind in binding_groups ( module. bindings . as_slice ( ) ) {
111
- self . make_unique ( bind[ 0 ] . name . clone ( ) ) ;
96
+ fn insert_globals ( & mut self , module : & Module < InternedStr > , uid : uint ) {
97
+ let mut names = module. dataDefinitions . iter ( )
98
+ . flat_map ( |data| data. constructors . iter ( ) . map ( |ctor| ctor. name ) )
99
+ . chain ( module. newtypes . iter ( ) . map ( |newtype| newtype. constructor_name ) )
100
+ . chain ( module. instances . iter ( )
101
+ . flat_map ( |instance| binding_groups ( instance. bindings . as_slice ( ) ) . map ( |binds| binds[ 0 ] . name ) ) )
102
+ . chain ( module. classes . iter ( ) . flat_map ( |class|
103
+ Some ( class. name ) . move_iter ( )
104
+ . chain ( class. declarations . iter ( ) . map ( |decl| decl. name ) )
105
+ . chain ( binding_groups ( class. bindings ) . map ( |binds| binds[ 0 ] . name ) ) ) )
106
+ . chain ( binding_groups ( module. bindings . as_slice ( ) ) . map ( |binds| binds[ 0 ] . name ) ) ;
107
+ for name in names {
108
+ self . declare_global ( name, uid) ;
112
109
}
113
110
}
114
111
@@ -269,6 +266,12 @@ impl Renamer {
269
266
u
270
267
}
271
268
}
269
+ fn declare_global ( & mut self , s : InternedStr , module_id : uint ) -> Name {
270
+ self . make_unique ( s) ;
271
+ let name = self . uniques . find_mut ( & s) . unwrap ( ) ;
272
+ name. uid = module_id;
273
+ * name
274
+ }
272
275
}
273
276
274
277
pub fn rename_expr ( expr : TypedExpr < InternedStr > ) -> TypedExpr < Name > {
@@ -281,9 +284,14 @@ pub fn rename_module(module: Module<InternedStr>) -> Module<Name> {
281
284
rename_module_ ( & mut renamer, module)
282
285
}
283
286
pub fn rename_module_ ( renamer : & mut Renamer , module : Module < InternedStr > ) -> Module < Name > {
284
- renamer. insert_globals ( & module) ;
287
+ let mut name = renamer. make_unique ( module. name ) ;
288
+ if name. as_slice ( ) == "Prelude" {
289
+ renamer. uniques . find_mut ( & name. name ) . unwrap ( ) . uid = 0 ;
290
+ name. uid = 0 ;
291
+ }
292
+ renamer. insert_globals ( & module, name. uid ) ;
285
293
let Module {
286
- name : name ,
294
+ name : _ ,
287
295
imports : imports,
288
296
classes : classes,
289
297
dataDefinitions : data_definitions,
@@ -405,7 +413,7 @@ pub fn rename_module_(renamer: &mut Renamer, module: Module<InternedStr>) -> Mod
405
413
. collect ( ) ;
406
414
407
415
Module {
408
- name : renamer . make_unique ( name) ,
416
+ name : name,
409
417
imports : FromVec :: from_vec ( imports2) ,
410
418
classes : FromVec :: from_vec ( classes2) ,
411
419
dataDefinitions : FromVec :: from_vec ( data_definitions2) ,
0 commit comments