diff --git a/src/librustsyntax/codemap.rs b/src/librustsyntax/codemap.rs index 976a5ee23eb47..808fb2dffe092 100644 --- a/src/librustsyntax/codemap.rs +++ b/src/librustsyntax/codemap.rs @@ -12,6 +12,7 @@ export new_filemap; export new_filemap_w_substr; export mk_substr_filename; export lookup_char_pos; +export lookup_char_pos_adj; export adjust_span; export span_to_str; export span_to_filename; diff --git a/src/librustsyntax/parse/comments.rs b/src/librustsyntax/parse/comments.rs index 493ed7b369b4f..9fa4a4c3e8c18 100644 --- a/src/librustsyntax/parse/comments.rs +++ b/src/librustsyntax/parse/comments.rs @@ -1,4 +1,5 @@ import io::reader_util; +import io::println;//XXXXXXXXxxx import util::interner; import lexer::{ reader, new_reader, next_token, is_whitespace }; @@ -28,7 +29,8 @@ fn read_to_eol(rdr: reader) -> str { fn read_one_line_comment(rdr: reader) -> str { let val = read_to_eol(rdr); - assert (val[0] == '/' as u8 && val[1] == '/' as u8); + assert ((val[0] == '/' as u8 && val[1] == '/' as u8) || + (val[0] == '#' as u8 && val[1] == '!' as u8)); ret val; } @@ -53,6 +55,15 @@ fn consume_whitespace_counting_blank_lines(rdr: reader, &comments: [cmnt]) { } } +fn read_shebang_comment(rdr: reader, code_to_the_left: bool) -> cmnt { + #debug(">>> shebang comment"); + let p = rdr.chpos; + #debug("<<< shebang comment"); + ret {style: if code_to_the_left { trailing } else { isolated }, + lines: [read_one_line_comment(rdr)], + pos: p}; +} + fn read_line_comments(rdr: reader, code_to_the_left: bool) -> cmnt { #debug(">>> line comments"); let p = rdr.chpos; @@ -134,8 +145,9 @@ fn read_block_comment(rdr: reader, code_to_the_left: bool) -> cmnt { } fn peeking_at_comment(rdr: reader) -> bool { - ret rdr.curr == '/' && rdr.next() == '/' || - rdr.curr == '/' && rdr.next() == '*'; + ret ((rdr.curr == '/' && rdr.next() == '/') || + (rdr.curr == '/' && rdr.next() == '*')) || + (rdr.curr == '#' && rdr.next() == '!'); } fn consume_comment(rdr: reader, code_to_the_left: bool, &comments: [cmnt]) { @@ -144,6 +156,8 @@ fn consume_comment(rdr: reader, code_to_the_left: bool, &comments: [cmnt]) { comments += [read_line_comments(rdr, code_to_the_left)]; } else if rdr.curr == '/' && rdr.next() == '*' { comments += [read_block_comment(rdr, code_to_the_left)]; + } else if rdr.curr == '#' && rdr.next() == '!' { + comments += [read_shebang_comment(rdr, code_to_the_left)]; } else { fail; } #debug("<<< consume comment"); } diff --git a/src/librustsyntax/parse/lexer.rs b/src/librustsyntax/parse/lexer.rs index dd1d624d1cf5e..b95b10fc33e80 100644 --- a/src/librustsyntax/parse/lexer.rs +++ b/src/librustsyntax/parse/lexer.rs @@ -119,6 +119,16 @@ fn consume_any_line_comment(rdr: reader) { '*' { rdr.bump(); rdr.bump(); ret consume_block_comment(rdr); } _ { ret; } } + } else if rdr.curr == '#' { + if rdr.next() == '!' { + let cmap = codemap::new_codemap(); + (*cmap).files.push(rdr.filemap); + let loc = codemap::lookup_char_pos_adj(cmap, rdr.chpos); + if loc.line == 1u && loc.col == 0u { + while rdr.curr != '\n' && !rdr.is_eof() { rdr.bump(); } + ret consume_whitespace_and_comments(rdr); + } + } } } diff --git a/src/test/run-pass/shebang.rs b/src/test/run-pass/shebang.rs new file mode 100644 index 0000000000000..5354dde741008 --- /dev/null +++ b/src/test/run-pass/shebang.rs @@ -0,0 +1,6 @@ +#!/usr/bin/env rustx +// pp-exact + +import io::println; + +fn main() { io::println("Hello World"); }