]> git.lizzy.rs Git - rust.git/commitdiff
Merge branch 'contrib'
authorGraydon Hoare <graydon@mozilla.com>
Thu, 15 Jul 2010 23:49:02 +0000 (16:49 -0700)
committerGraydon Hoare <graydon@mozilla.com>
Thu, 15 Jul 2010 23:49:02 +0000 (16:49 -0700)
1  2 
AUTHORS.txt
src/boot/fe/item.ml

diff --combined AUTHORS.txt
index f3daf18768ca40a17f5c2493d4d56f6d0bcd1b2a,c9738757272525a0fc2828963a32b9e70cd0774d..c9ab6ffd57f8f928b7c2aeefa670ce4ab4bd7b64
@@@ -4,15 -4,13 +4,16 @@@ Graydon Hoare <graydon@mozilla.com
  
  Other authors:
  
+ Adam Bozanich <adam.boz@gmail.com>
  Andreas Gal <gal@mozilla.com>
  Brendan Eich <brendan@mozilla.org>
  Chris Double <chris.double@double.co.nz>
  Dave Herman <dherman@mozilla.com>
 +Jason Orendorff <jorendorff@mozilla.com>
 +Jeff Balogh <jbalogh@mozilla.com>
  Jeff Mulzelaar <jmuizelaar@mozilla.com>
  Matt Brubeck <mbrubeck@limpet.net>
  Michael Bebenita <mbebenita@mozilla.com>
  Patrick Walton <pwalton@mozilla.com>
 +Ralph Giles <giles@thaumas.net>
  Roy Frostig <rfrostig@mozilla.com>
diff --combined src/boot/fe/item.ml
index 0b5efd6736b022f4f6f7051b770a333f67ff2e2d,87604cb0ac6139fca5b7610892603746e693187c..d0042ebf2574edb66a84a198ffec84838daa0323
@@@ -369,18 -369,17 +369,18 @@@ and parse_stmts (ps:pstate) : Ast.stmt 
                    let inner ps =
                      let slot = (parse_identified_slot_and_ident false ps) in
                      let _    = (expect ps IN) in
 -                    let lval = (parse_lval ps) in
 -                      (slot, lval) in
 -                  let (slot, seq) =
 +                      (slot, (parse_lval ps))
 +                  in
 +                  let (slot, (stmts, lval)) =
                      ctxt "stmts: for head" (bracketed LPAREN RPAREN inner) ps
                    in
                    let body_block = ctxt "stmts: for body" parse_block ps in
                    let bpos = lexpos ps in
 -                    [| span ps apos bpos
 -                         (Ast.STMT_for
 +                    Array.append stmts
 +                      [| span ps apos bpos
 +                           (Ast.STMT_for
                              { Ast.for_slot = slot;
 -                              Ast.for_seq = seq;
 +                              Ast.for_seq = lval;
                                Ast.for_body = body_block; }) |]
            end
  
              expect ps SEMI;
              spans ps stmts apos (Ast.STMT_join lval)
  
 -      | MOD | OBJ | TYPE | FN | USE | NATIVE ->
 +      | IO | STATE | UNSAFE | MOD | OBJ | TYPE | FN | USE | NATIVE ->
            let (ident, item) = ctxt "stmt: decl" parse_mod_item ps in
            let decl = Ast.DECL_mod_item (ident, item) in
            let stmts = expand_tags_to_stmts ps item in
@@@ -775,7 -774,6 +775,6 @@@ and parse_type_ite
    let item = Ast.MOD_ITEM_type (effect, ty) in
      (ident, span ps apos bpos (decl params item))
  
  and parse_mod_item (ps:pstate) : (Ast.ident * Ast.mod_item) =
    let apos = lexpos ps in
    let parse_lib_name ident =
                  note_required_mod ps {lo=apos; hi=bpos} conv rlib item;
                  (ident, item)
            end
-       | USE ->
-           begin
-             bump ps;
-             let ident = ctxt "use mod: ident" Pexp.parse_ident ps in
-             let meta =
-               ctxt "use mod: meta" parse_optional_meta_pat ps ident
-             in
-             let bpos = lexpos ps in
-             let id = (span ps apos bpos ()).id in
-             let (path, items) =
-               ps.pstate_get_mod meta id ps.pstate_node_id ps.pstate_opaque_id
-             in
-             let bpos = lexpos ps in
-               expect ps SEMI;
-               let rlib =
-                 REQUIRED_LIB_rust { required_libname = path;
-                                     required_prefix = ps.pstate_depth }
-               in
-                 iflog ps
-                   begin
-                     fun _ ->
-                       log ps "extracted mod from %s (binding to %s)"
-                         path ident;
-                       log ps "%a" Ast.sprintf_mod_items items;
-                   end;
-                 let item = decl [||] (Ast.MOD_ITEM_mod (empty_view, items)) in
-                 let item = span ps apos bpos item in
-                   note_required_mod ps {lo=apos; hi=bpos} CONV_rust rlib item;
-                   (ident, item)
-           end
        | _ -> raise (unexpected ps)
  
+ and parse_mod_items_header_from_signature (ps:pstate) : Ast.mod_view =
+   let exports = Hashtbl.create 0 in
+     while (peek ps = EXPORT)
+     do
+       bump ps;
+       parse_export ps exports;
+       expect ps SEMI;
+     done;
+     if (Hashtbl.length exports) = 0
+     then htab_put exports Ast.EXPORT_all_decls ();
+     {empty_view with Ast.view_exports = exports}
  
  and parse_mod_items_from_signature
      (ps:pstate)
      : (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;
+   expect ps LBRACE;
+   let view  = parse_mod_items_header_from_signature ps in
+   let items = Hashtbl.create 0 in
      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;
+       let (ident,item) = ctxt "mod items from sig: mod item"
+               parse_mod_item_from_signature ps
+       in
+         htab_put items ident item;
      done;
-     if (Hashtbl.length exports) = 0
-     then Hashtbl.add exports Ast.EXPORT_all_decls ();
      expect ps RBRACE;
-     ({empty_view with Ast.view_exports = exports}, mis)
+     (view,items)
  
  and parse_mod_item_from_signature (ps:pstate)
      : (Ast.ident * Ast.mod_item) =
@@@ -1032,7 -993,6 +994,6 @@@ and expand_tags_to_stmt
                (Ast.DECL_mod_item (ident, tag_item))))
        id_items
  
  and expand_tags_to_items
      (ps:pstate)
      (item:Ast.mod_item)
        (fun (ident, item) -> htab_put items ident item)
        id_items
  
  and note_required_mod
      (ps:pstate)
      (sp:span)
@@@ -1123,48 -1082,89 +1083,89 @@@ and parse_expor
    in
      Hashtbl.add exports e ()
  
+ and parse_use
+     (ps:pstate)
+     : (Ast.ident * Ast.mod_item) = 
+   bump ps;
+   let ident = ctxt "use mod: ident" Pexp.parse_ident ps in
+   let meta =
+     ctxt "use mod: meta" parse_optional_meta_pat ps ident
+   in
+   let apos = lexpos ps in
+   let bpos = lexpos ps in
+   let id = (span ps apos bpos ()).id in
+   let (path, items) =
+     ps.pstate_get_mod meta id ps.pstate_node_id ps.pstate_opaque_id
+   in
+   let bpos = lexpos ps in
+     expect ps SEMI;
+     let rlib =
+       REQUIRED_LIB_rust { required_libname = path;
+                           required_prefix = ps.pstate_depth }
+     in
+       iflog ps
+         begin
+           fun _ ->
+             log ps "extracted mod from %s (binding to %s)"
+               path ident;
+             log ps "%a" Ast.sprintf_mod_items items;
+         end;
+       let item = decl [||] (Ast.MOD_ITEM_mod (empty_view, items)) in
+       let item = span ps apos bpos item in
+         note_required_mod ps {lo=apos; hi=bpos} CONV_rust rlib item;
+         (ident, item)
+ and parse_item_decl ps items fn =
+   let (ident, item) = fn ps in
+     htab_put items ident item;
+     expand_tags_to_items ps item items
+ and parse_mod_header (ps:pstate)
+                      : (Ast.mod_view * Ast.mod_items) =
+   let imports = Hashtbl.create 0 in
+   let exports = Hashtbl.create 0 in
+   let items   = Hashtbl.create 4 in
+   let rec loop () =
+     match peek ps with
+         IMPORT ->
+           bump ps;
+           parse_import ps imports;
+           expect ps SEMI;
+           loop ()
+       | EXPORT ->
+           bump ps;
+           parse_export ps exports;
+           expect ps SEMI;
+           loop ()
+       | USE ->
+           parse_item_decl ps items parse_use;
+           loop ()
+       | _ -> ()
+   in
+     loop ();
+     if (Hashtbl.length exports) = 0
+     then Hashtbl.add exports Ast.EXPORT_all_decls ();
+     let view = { Ast.view_imports = imports;
+                  Ast.view_exports = exports }
+     in
+       (view, items)
  
  and parse_mod_items
      (ps:pstate)
      (terminal:token)
      : (Ast.mod_view * Ast.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
+   let (view, items) = parse_mod_header ps 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;
+       parse_item_decl ps items parse_mod_item;
      done;
-     if (Hashtbl.length exports) = 0
-     then Hashtbl.add exports Ast.EXPORT_all_decls ();
      expect ps terminal;
      ps.pstate_depth <- ps.pstate_depth - 1;
-     let view = { Ast.view_imports = imports;
-                  Ast.view_exports = exports }
-     in
-       (view, items)
+     (view, items)
  ;;
  
  
  (*
   * Local Variables:
   * fill-column: 78;