diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index 074d0a8743eef..a07cf141c04f1 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -1562,6 +1562,45 @@ impure fn parse_optional_meta(parser p) { } } +impure fn parse_rest_import_name(parser p, ast.ident id) { + while (p.peek() != token.SEMI) { + expect(p, token.DOT); + parse_ident(p); + } +} + +impure fn parse_full_import_name(parser p) { + alt (p.peek()) { + case (token.IDENT(?ident)) { + p.bump(); + parse_rest_import_name(p, ident); + } + case (_) { + p.err("expecting an identifier"); + } + } +} + +impure fn parse_import(parser p) { + alt (p.peek()) { + case (token.IDENT(?ident)) { + p.bump(); + alt (p.peek()) { + case (token.EQ) { + p.bump(); + parse_full_import_name(p); + } + case (_) { + parse_rest_import_name(p, ident); + } + } + } + case (_) { + p.err("expecting an identifier"); + } + } +} + impure fn parse_use_and_imports(parser p) { while (true) { alt (p.peek()) { @@ -1570,6 +1609,10 @@ impure fn parse_use_and_imports(parser p) { auto ident = parse_ident(p); parse_optional_meta(p); expect(p, token.SEMI); + } case (token.IMPORT) { + p.bump(); + parse_import(p); + expect(p, token.SEMI); } case (_) { ret; diff --git a/src/test/run-pass/use.rs b/src/test/run-pass/use.rs index ab3e5e4397872..8638d609b16cf 100644 --- a/src/test/run-pass/use.rs +++ b/src/test/run-pass/use.rs @@ -3,11 +3,18 @@ use libc(); use zed(name = "std"); use bar(name = "std", ver = "0.0.1"); +import std._str; +import x = std._str; + + mod baz { use std; use libc(); use zed(name = "std"); use bar(name = "std", ver = "0.0.1"); + + import std._str; + import x = std._str; } fn main() {