diff options
| author | Adam Bozanich <[email protected]> | 2010-07-09 15:23:12 +0800 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-07-16 07:19:14 +0800 |
| commit | b096b0e3084079a8cb525e5590b9ab3e512109ea (patch) | |
| tree | 594a5d0acbee6cd4e6d2421cb24a82053bd11301 | |
| parent | Fix typos in the docs. (diff) | |
| download | rust-b096b0e3084079a8cb525e5590b9ab3e512109ea.tar.xz rust-b096b0e3084079a8cb525e5590b9ab3e512109ea.zip | |
permit use before import. closes #48
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | src/boot/fe/item.ml | 59 | ||||
| -rw-r--r-- | src/test/run-pass/use-import-export.rs | 18 |
3 files changed, 42 insertions, 36 deletions
@@ -24,6 +24,7 @@ *.toc *.tp *.vr +*.swp .hg/ .hgignore lexer.ml diff --git a/src/boot/fe/item.ml b/src/boot/fe/item.ml index 130909e2..374a3012 100644 --- a/src/boot/fe/item.ml +++ b/src/boot/fe/item.ml @@ -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; (ident, item) end - - - | _ -> raise (unexpected ps) @@ -890,24 +887,19 @@ and parse_mod_items_from_signature : (Ast.mod_view * Ast.mod_items) = let exports = Hashtbl.create 0 in let mis = Hashtbl.create 0 in - let in_view = ref true in expect ps LBRACE; while not (peek ps = RBRACE) do - if !in_view - then - match peek ps with - EXPORT -> - bump ps; - parse_export ps exports; - expect ps SEMI; - | _ -> - in_view := false - else - let (ident, mti) = ctxt "mod items from sig: mod item" - parse_mod_item_from_signature ps - in - Hashtbl.add mis ident mti; + match peek ps with + EXPORT -> + bump ps; + parse_export ps exports; + expect ps SEMI; + | _ -> + let (ident, mti) = ctxt "mod items from sig: mod item" + parse_mod_item_from_signature ps + in + Hashtbl.add mis ident mti; done; if (Hashtbl.length exports) = 0 then Hashtbl.add exports Ast.EXPORT_all_decls (); @@ -1130,27 +1122,22 @@ and parse_mod_items ps.pstate_depth <- ps.pstate_depth + 1; let imports = Hashtbl.create 0 in let exports = Hashtbl.create 0 in - let in_view = ref true in let items = Hashtbl.create 4 in while (not (peek ps = terminal)) do - if !in_view - then - match peek ps with - IMPORT -> - bump ps; - parse_import ps imports; - expect ps SEMI; - | EXPORT -> - bump ps; - parse_export ps exports; - expect ps SEMI; - | _ -> - in_view := false - else - let (ident, item) = parse_mod_item ps in - htab_put items ident item; - expand_tags_to_items ps item items; + match peek ps with + IMPORT -> + bump ps; + parse_import ps imports; + expect ps SEMI; + | EXPORT -> + bump ps; + parse_export ps exports; + expect ps SEMI; + | _ -> + let (ident, item) = parse_mod_item ps in + htab_put items ident item; + expand_tags_to_items ps item items; done; if (Hashtbl.length exports) = 0 then Hashtbl.add exports Ast.EXPORT_all_decls (); diff --git a/src/test/run-pass/use-import-export.rs b/src/test/run-pass/use-import-export.rs new file mode 100644 index 00000000..0b330269 --- /dev/null +++ b/src/test/run-pass/use-import-export.rs @@ -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(); +} + |