aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Bozanich <[email protected]>2010-07-09 15:23:12 +0800
committerGraydon Hoare <[email protected]>2010-07-16 07:19:14 +0800
commitb096b0e3084079a8cb525e5590b9ab3e512109ea (patch)
tree594a5d0acbee6cd4e6d2421cb24a82053bd11301
parentFix typos in the docs. (diff)
downloadrust-b096b0e3084079a8cb525e5590b9ab3e512109ea.tar.xz
rust-b096b0e3084079a8cb525e5590b9ab3e512109ea.zip
permit use before import. closes #48
-rw-r--r--.gitignore1
-rw-r--r--src/boot/fe/item.ml59
-rw-r--r--src/test/run-pass/use-import-export.rs18
3 files changed, 42 insertions, 36 deletions
diff --git a/.gitignore b/.gitignore
index 3ae62ec0..ecc182e1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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();
+}
+