permit use before import. closes #48

This commit is contained in:
Adam Bozanich 2010-07-09 15:23:12 +08:00 committed by Graydon Hoare
parent 6f5ef5815b
commit b096b0e308
3 changed files with 42 additions and 36 deletions

1
.gitignore vendored
View file

@ -24,6 +24,7 @@
*.toc *.toc
*.tp *.tp
*.vr *.vr
*.swp
.hg/ .hg/
.hgignore .hgignore
lexer.ml lexer.ml

View file

@ -879,9 +879,6 @@ and parse_mod_item (ps:pstate) : (Ast.ident * Ast.mod_item) =
note_required_mod ps {lo=apos; hi=bpos} CONV_rust rlib item; note_required_mod ps {lo=apos; hi=bpos} CONV_rust rlib item;
(ident, item) (ident, item)
end end
| _ -> raise (unexpected ps) | _ -> raise (unexpected ps)
@ -890,24 +887,19 @@ and parse_mod_items_from_signature
: (Ast.mod_view * Ast.mod_items) = : (Ast.mod_view * Ast.mod_items) =
let exports = Hashtbl.create 0 in let exports = Hashtbl.create 0 in
let mis = Hashtbl.create 0 in let mis = Hashtbl.create 0 in
let in_view = ref true in
expect ps LBRACE; expect ps LBRACE;
while not (peek ps = RBRACE) while not (peek ps = RBRACE)
do do
if !in_view match peek ps with
then EXPORT ->
match peek ps with bump ps;
EXPORT -> parse_export ps exports;
bump ps; expect ps SEMI;
parse_export ps exports; | _ ->
expect ps SEMI; let (ident, mti) = ctxt "mod items from sig: mod item"
| _ -> parse_mod_item_from_signature ps
in_view := false in
else Hashtbl.add mis ident mti;
let (ident, mti) = ctxt "mod items from sig: mod item"
parse_mod_item_from_signature ps
in
Hashtbl.add mis ident mti;
done; done;
if (Hashtbl.length exports) = 0 if (Hashtbl.length exports) = 0
then Hashtbl.add exports Ast.EXPORT_all_decls (); then Hashtbl.add exports Ast.EXPORT_all_decls ();
@ -1130,27 +1122,22 @@ and parse_mod_items
ps.pstate_depth <- ps.pstate_depth + 1; ps.pstate_depth <- ps.pstate_depth + 1;
let imports = Hashtbl.create 0 in let imports = Hashtbl.create 0 in
let exports = Hashtbl.create 0 in let exports = Hashtbl.create 0 in
let in_view = ref true in
let items = Hashtbl.create 4 in let items = Hashtbl.create 4 in
while (not (peek ps = terminal)) while (not (peek ps = terminal))
do do
if !in_view match peek ps with
then IMPORT ->
match peek ps with bump ps;
IMPORT -> parse_import ps imports;
bump ps; expect ps SEMI;
parse_import ps imports; | EXPORT ->
expect ps SEMI; bump ps;
| EXPORT -> parse_export ps exports;
bump ps; expect ps SEMI;
parse_export ps exports; | _ ->
expect ps SEMI; let (ident, item) = parse_mod_item ps in
| _ -> htab_put items ident item;
in_view := false expand_tags_to_items ps item items;
else
let (ident, item) = parse_mod_item ps in
htab_put items ident item;
expand_tags_to_items ps item items;
done; done;
if (Hashtbl.length exports) = 0 if (Hashtbl.length exports) = 0
then Hashtbl.add exports Ast.EXPORT_all_decls (); then Hashtbl.add exports Ast.EXPORT_all_decls ();

View file

@ -0,0 +1,18 @@
mod foo {
export x;
use std (ver="0.0.1");
fn x() -> int { ret 1; }
}
mod bar {
use std (ver="0.0.1");
export y;
fn y() -> int { ret 1; }
}
fn main() {
foo.x();
bar.y();
}