@@ -88,12 +88,33 @@ struct Renamer {
88
88
errors : Errors < String >
89
89
}
90
90
91
+
91
92
impl Renamer {
92
93
fn new ( ) -> Renamer {
93
94
Renamer { uniques : ScopedMap :: new ( ) , name_supply : NameSupply :: new ( ) , errors : Errors :: new ( ) }
94
95
}
95
96
96
- fn insert_globals ( & mut self , module : & Module < InternedStr > , uid : uint ) {
97
+ fn import_globals ( & mut self , module : & Module < Name > ) {
98
+ let mut names = module. dataDefinitions . iter ( )
99
+ . flat_map ( |data| data. constructors . iter ( ) . map ( |ctor| ctor. name ) )
100
+ . chain ( module. newtypes . iter ( ) . map ( |newtype| newtype. constructor_name ) )
101
+ . chain ( module. classes . iter ( ) . flat_map ( |class|
102
+ Some ( class. name ) . move_iter ( )
103
+ . chain ( class. declarations . iter ( ) . map ( |decl| decl. name ) )
104
+ . chain ( binding_groups ( class. bindings ) . map ( |binds| binds[ 0 ] . name ) ) ) )
105
+ . chain ( binding_groups ( module. bindings . as_slice ( ) ) . map ( |binds| binds[ 0 ] . name ) ) ;
106
+ for name in names {
107
+ self . declare_global ( name. name , name. uid ) ;
108
+ }
109
+ for instance in module. instances . iter ( ) {
110
+ let class_uid = self . get_name ( instance. classname . name ) . uid ;
111
+ for binds in binding_groups ( instance. bindings . as_slice ( ) ) {
112
+ self . declare_global ( binds[ 0 ] . name . name , class_uid) ;
113
+ }
114
+ }
115
+ }
116
+
117
+ fn insert_globals ( & mut self , module_env : & [ Module < Name > ] , module : & Module < InternedStr > , uid : uint ) {
97
118
let mut names = module. dataDefinitions . iter ( )
98
119
. flat_map ( |data| data. constructors . iter ( ) . map ( |ctor| ctor. name ) )
99
120
. chain ( module. newtypes . iter ( ) . map ( |newtype| newtype. constructor_name ) )
@@ -111,6 +132,22 @@ impl Renamer {
111
132
self . declare_global ( binds[ 0 ] . name , class_uid) ;
112
133
}
113
134
}
135
+ for import in module. imports . iter ( ) {
136
+ let imported_module = module_env. iter ( )
137
+ . find ( |m| m. name . name == import. module )
138
+ . unwrap_or_else ( || fail ! ( "Module {} is not defined" , import. module) ) ;
139
+ let uid = imported_module. name . uid ;
140
+ match import. imports {
141
+ Some ( ref imports) => {
142
+ for & imported_str in imports. iter ( ) {
143
+ self . declare_global ( imported_str, uid) ;
144
+ }
145
+ }
146
+ None => { //Import everything
147
+ self . import_globals ( imported_module)
148
+ }
149
+ }
150
+ }
114
151
}
115
152
116
153
fn rename_bindings ( & mut self , bindings : ~[ Binding < InternedStr > ] , is_global : bool ) -> ~[ Binding < Name > ] {
@@ -285,15 +322,16 @@ pub fn rename_expr(expr: TypedExpr<InternedStr>) -> TypedExpr<Name> {
285
322
286
323
pub fn rename_module ( module : Module < InternedStr > ) -> Module < Name > {
287
324
let mut renamer = Renamer :: new ( ) ;
288
- rename_module_ ( & mut renamer, module)
325
+ rename_module_ ( & mut renamer, & [ ] , module)
289
326
}
290
- pub fn rename_module_ ( renamer : & mut Renamer , module : Module < InternedStr > ) -> Module < Name > {
327
+ pub fn rename_module_ ( renamer : & mut Renamer , module_env : & [ Module < Name > ] , module : Module < InternedStr > ) -> Module < Name > {
291
328
let mut name = renamer. make_unique ( module. name ) ;
292
329
if name. as_slice ( ) == "Prelude" {
293
330
renamer. uniques . find_mut ( & name. name ) . unwrap ( ) . uid = 0 ;
294
331
name. uid = 0 ;
295
332
}
296
- renamer. insert_globals ( & module, name. uid ) ;
333
+ renamer. uniques . enter_scope ( ) ;
334
+ renamer. insert_globals ( module_env, & module, name. uid ) ;
297
335
let Module {
298
336
name : _,
299
337
imports : imports,
@@ -307,10 +345,13 @@ pub fn rename_module_(renamer: &mut Renamer, module: Module<InternedStr>) -> Mod
307
345
} = module;
308
346
309
347
let imports2: Vec < Import < Name > > = imports. move_iter ( ) . map ( |import| {
310
- let imports: Vec < Name > = import. imports . iter ( )
311
- . map ( |& x| renamer. make_unique ( x) )
312
- . collect ( ) ;
313
- Import { module : import. module , imports : FromVec :: from_vec ( imports) }
348
+ let imports = import. imports . as_ref ( ) . map ( |x| {
349
+ let is: Vec < Name > = x. iter ( )
350
+ . map ( |& x| renamer. get_name ( x) )
351
+ . collect ( ) ;
352
+ FromVec :: from_vec ( is)
353
+ } ) ;
354
+ Import { module : import. module , imports : imports }
314
355
} ) . collect ( ) ;
315
356
316
357
let data_definitions2 : Vec < DataDefinition < Name > > = data_definitions. move_iter ( ) . map ( |data| {
@@ -415,13 +456,14 @@ pub fn rename_module_(renamer: &mut Renamer, module: Module<InternedStr>) -> Mod
415
456
}
416
457
} )
417
458
. collect ( ) ;
418
-
459
+ let decls2 = renamer. rename_type_declarations ( typeDeclarations) ;
460
+ renamer. uniques . exit_scope ( ) ;
419
461
Module {
420
462
name : name,
421
463
imports : FromVec :: from_vec ( imports2) ,
422
464
classes : FromVec :: from_vec ( classes2) ,
423
465
dataDefinitions : FromVec :: from_vec ( data_definitions2) ,
424
- typeDeclarations : renamer . rename_type_declarations ( typeDeclarations ) ,
466
+ typeDeclarations : decls2 ,
425
467
bindings : bindings2,
426
468
instances : FromVec :: from_vec ( instances2) ,
427
469
newtypes : FromVec :: from_vec ( newtypes2) ,
@@ -437,9 +479,11 @@ pub fn prelude_name(s: &str) -> Name {
437
479
///If any errors are encounterd while renaming, an error message is output and fail is called
438
480
pub fn rename_modules ( modules : Vec < Module < InternedStr > > ) -> Vec < Module < Name > > {
439
481
let mut renamer = Renamer :: new ( ) ;
440
- let ms = modules. move_iter ( ) . map ( |module| {
441
- rename_module_ ( & mut renamer, module)
442
- } ) . collect ( ) ;
482
+ let mut ms = Vec :: new ( ) ;
483
+ for module in modules. move_iter ( ) {
484
+ let m = rename_module_ ( & mut renamer, ms. as_slice ( ) , module) ;
485
+ ms. push ( m) ;
486
+ }
443
487
if renamer. errors . has_errors ( ) {
444
488
renamer. errors . report_errors ( "Renamer" ) ;
445
489
fail ! ( ) ;
@@ -461,4 +505,24 @@ main = 2".chars());
461
505
let module = parser. module ( ) ;
462
506
rename_modules ( vec ! ( module) ) ;
463
507
}
508
+ #[ test]
509
+ fn import_binding ( ) {
510
+ let file =
511
+ r"
512
+ import Prelude (id)
513
+ main = id" ;
514
+ let modules = parse_string ( file)
515
+ . unwrap_or_else ( |err| fail ! ( err) ) ;
516
+ rename_modules ( modules) ;
517
+ }
518
+ #[ test]
519
+ #[ should_fail]
520
+ fn missing_import ( ) {
521
+ let mut parser = Parser :: new (
522
+ r"
523
+ import Prelude ()
524
+ main = id" . chars ( ) ) ;
525
+ let module = parser. module ( ) ;
526
+ rename_modules ( vec ! ( module) ) ;
527
+ }
464
528
}
0 commit comments