Skip to content
This repository was archived by the owner on Apr 14, 2020. It is now read-only.

Commit 512ae12

Browse files
committed
Added handling of imported names in renamer.rs
1 parent b806c15 commit 512ae12

File tree

3 files changed

+87
-20
lines changed

3 files changed

+87
-20
lines changed

module.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ pub struct Module<Ident = InternedStr> {
2121
#[deriving(Clone)]
2222
pub struct Import<Ident> {
2323
pub module: InternedStr,
24-
pub imports: ~[Ident]
24+
//None if 'import Name'
25+
//Some(names) if 'import Name (names)'
26+
pub imports: Option<~[Ident]>
2527
}
2628

2729
#[deriving(Clone)]

parser.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,18 +138,19 @@ fn import(&mut self) -> Import<InternedStr> {
138138
let module_name = self.require_next(NAME).value;
139139
let imports = if self.lexer.peek().token == LPARENS {
140140
self.lexer.next();
141-
if self.lexer.peek().token == RPARENS {
141+
let x = if self.lexer.peek().token == RPARENS {
142142
self.lexer.next();
143143
box []
144144
}
145145
else {
146146
let imports = self.sep_by_1(|this| this.require_next(NAME).value, COMMA);
147147
self.require_next(RPARENS);
148148
imports
149-
}
149+
};
150+
Some(x)
150151
}
151152
else {
152-
box []
153+
None
153154
};
154155
Import { module: module_name, imports: imports }
155156
}
@@ -1308,11 +1309,11 @@ import Prelude (id, sum)
13081309
let module = parser.module();
13091310

13101311
assert_eq!(module.imports[0].module.as_slice(), "Hello");
1311-
assert_eq!(module.imports[0].imports, box []);
1312+
assert_eq!(module.imports[0].imports, None);
13121313
assert_eq!(module.imports[1].module.as_slice(), "World");
1313-
assert_eq!(module.imports[1].imports, box []);
1314+
assert_eq!(module.imports[1].imports, Some(box []));
13141315
assert_eq!(module.imports[2].module.as_slice(), "Prelude");
1315-
assert_eq!(module.imports[2].imports, box [intern("id"), intern("sum")]);
1316+
assert_eq!(module.imports[2].imports, Some(box [intern("id"), intern("sum")]));
13161317
}
13171318
#[test]
13181319
fn parse_module_imports() {

renamer.rs

Lines changed: 77 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,33 @@ struct Renamer {
8888
errors: Errors<String>
8989
}
9090

91+
9192
impl Renamer {
9293
fn new() -> Renamer {
9394
Renamer { uniques: ScopedMap::new(), name_supply: NameSupply::new(), errors: Errors::new() }
9495
}
9596

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) {
97118
let mut names = module.dataDefinitions.iter()
98119
.flat_map(|data| data.constructors.iter().map(|ctor| ctor.name))
99120
.chain(module.newtypes.iter().map(|newtype| newtype.constructor_name))
@@ -111,6 +132,22 @@ impl Renamer {
111132
self.declare_global(binds[0].name, class_uid);
112133
}
113134
}
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+
}
114151
}
115152

116153
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> {
285322

286323
pub fn rename_module(module: Module<InternedStr>) -> Module<Name> {
287324
let mut renamer = Renamer::new();
288-
rename_module_(&mut renamer, module)
325+
rename_module_(&mut renamer, &[], module)
289326
}
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> {
291328
let mut name = renamer.make_unique(module.name);
292329
if name.as_slice() == "Prelude" {
293330
renamer.uniques.find_mut(&name.name).unwrap().uid = 0;
294331
name.uid = 0;
295332
}
296-
renamer.insert_globals(&module, name.uid);
333+
renamer.uniques.enter_scope();
334+
renamer.insert_globals(module_env, &module, name.uid);
297335
let Module {
298336
name: _,
299337
imports: imports,
@@ -307,10 +345,13 @@ pub fn rename_module_(renamer: &mut Renamer, module: Module<InternedStr>) -> Mod
307345
} = module;
308346

309347
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 }
314355
}).collect();
315356

316357
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
415456
}
416457
})
417458
.collect();
418-
459+
let decls2 = renamer.rename_type_declarations(typeDeclarations);
460+
renamer.uniques.exit_scope();
419461
Module {
420462
name: name,
421463
imports: FromVec::from_vec(imports2),
422464
classes : FromVec::from_vec(classes2),
423465
dataDefinitions: FromVec::from_vec(data_definitions2),
424-
typeDeclarations: renamer.rename_type_declarations(typeDeclarations),
466+
typeDeclarations: decls2,
425467
bindings : bindings2,
426468
instances: FromVec::from_vec(instances2),
427469
newtypes: FromVec::from_vec(newtypes2),
@@ -437,9 +479,11 @@ pub fn prelude_name(s: &str) -> Name {
437479
///If any errors are encounterd while renaming, an error message is output and fail is called
438480
pub fn rename_modules(modules: Vec<Module<InternedStr>>) -> Vec<Module<Name>> {
439481
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+
}
443487
if renamer.errors.has_errors() {
444488
renamer.errors.report_errors("Renamer");
445489
fail!();
@@ -461,4 +505,24 @@ main = 2".chars());
461505
let module = parser.module();
462506
rename_modules(vec!(module));
463507
}
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+
}
464528
}

0 commit comments

Comments
 (0)