From f1cea3ce21eb896b0849eca0a8fd9ea4e03ab35f Mon Sep 17 00:00:00 2001 From: Margaret Meyerhofer Date: Tue, 22 May 2012 17:27:20 -0700 Subject: [PATCH 1/4] Changed the lexer to accept #! comments on the first line. --- src/librustsyntax/codemap.rs | 1 + src/librustsyntax/parse/lexer.rs | 11 +++++++++++ 2 files changed, 12 insertions(+) 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/lexer.rs b/src/librustsyntax/parse/lexer.rs index e486355501f5d..91013ca9a7608 100644 --- a/src/librustsyntax/parse/lexer.rs +++ b/src/librustsyntax/parse/lexer.rs @@ -119,6 +119,17 @@ 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 mut 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(); } + loc = codemap::lookup_char_pos_adj(cmap, rdr.chpos); + ret consume_whitespace_and_comments(rdr); + } + } } } From 3177286a248b4ca308fbc6b2b22689123bccaeec Mon Sep 17 00:00:00 2001 From: Margaret Meyerhofer Date: Tue, 22 May 2012 17:49:16 -0700 Subject: [PATCH 2/4] Changed the pretty printer also read #! comments --- src/librustsyntax/parse/comments.rs | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) 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"); } From 6077647878beb8e1df08772a001616b6d4957092 Mon Sep 17 00:00:00 2001 From: Margaret Meyerhofer Date: Tue, 22 May 2012 18:03:26 -0700 Subject: [PATCH 3/4] Added a test for #! comments --- src/test/run-pass/shebang.rs | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/test/run-pass/shebang.rs 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"); } From 507b8e5ae074bd24ac78d155f421f78200a5b400 Mon Sep 17 00:00:00 2001 From: Margaret Meyerhofer Date: Tue, 22 May 2012 18:13:24 -0700 Subject: [PATCH 4/4] cleaned up debugging code --- src/librustsyntax/parse/lexer.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/librustsyntax/parse/lexer.rs b/src/librustsyntax/parse/lexer.rs index 91013ca9a7608..1b1c9491681f9 100644 --- a/src/librustsyntax/parse/lexer.rs +++ b/src/librustsyntax/parse/lexer.rs @@ -123,10 +123,9 @@ fn consume_any_line_comment(rdr: reader) { if rdr.next() == '!' { let cmap = codemap::new_codemap(); (*cmap).files.push(rdr.filemap); - let mut loc = codemap::lookup_char_pos_adj(cmap, rdr.chpos); + 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(); } - loc = codemap::lookup_char_pos_adj(cmap, rdr.chpos); ret consume_whitespace_and_comments(rdr); } }