Skip to content

Commit 27427a9

Browse files
committed
Merge pull request #2430 from mmeyerho/master
Added support for #! comments. Closes issue 1772.
2 parents ed357af + 4f10c19 commit 27427a9

File tree

4 files changed

+34
-3
lines changed

4 files changed

+34
-3
lines changed

src/librustsyntax/codemap.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export new_filemap;
1212
export new_filemap_w_substr;
1313
export mk_substr_filename;
1414
export lookup_char_pos;
15+
export lookup_char_pos_adj;
1516
export adjust_span;
1617
export span_to_str;
1718
export span_to_filename;

src/librustsyntax/parse/comments.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import io::reader_util;
2+
import io::println;//XXXXXXXXxxx
23
import util::interner;
34
import lexer::{ reader, new_reader, next_token, is_whitespace };
45

@@ -28,7 +29,8 @@ fn read_to_eol(rdr: reader) -> str {
2829

2930
fn read_one_line_comment(rdr: reader) -> str {
3031
let val = read_to_eol(rdr);
31-
assert (val[0] == '/' as u8 && val[1] == '/' as u8);
32+
assert ((val[0] == '/' as u8 && val[1] == '/' as u8) ||
33+
(val[0] == '#' as u8 && val[1] == '!' as u8));
3234
ret val;
3335
}
3436

@@ -53,6 +55,15 @@ fn consume_whitespace_counting_blank_lines(rdr: reader, &comments: [cmnt]) {
5355
}
5456
}
5557

58+
fn read_shebang_comment(rdr: reader, code_to_the_left: bool) -> cmnt {
59+
#debug(">>> shebang comment");
60+
let p = rdr.chpos;
61+
#debug("<<< shebang comment");
62+
ret {style: if code_to_the_left { trailing } else { isolated },
63+
lines: [read_one_line_comment(rdr)],
64+
pos: p};
65+
}
66+
5667
fn read_line_comments(rdr: reader, code_to_the_left: bool) -> cmnt {
5768
#debug(">>> line comments");
5869
let p = rdr.chpos;
@@ -134,8 +145,9 @@ fn read_block_comment(rdr: reader, code_to_the_left: bool) -> cmnt {
134145
}
135146

136147
fn peeking_at_comment(rdr: reader) -> bool {
137-
ret rdr.curr == '/' && rdr.next() == '/' ||
138-
rdr.curr == '/' && rdr.next() == '*';
148+
ret ((rdr.curr == '/' && rdr.next() == '/') ||
149+
(rdr.curr == '/' && rdr.next() == '*')) ||
150+
(rdr.curr == '#' && rdr.next() == '!');
139151
}
140152

141153
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]) {
144156
comments += [read_line_comments(rdr, code_to_the_left)];
145157
} else if rdr.curr == '/' && rdr.next() == '*' {
146158
comments += [read_block_comment(rdr, code_to_the_left)];
159+
} else if rdr.curr == '#' && rdr.next() == '!' {
160+
comments += [read_shebang_comment(rdr, code_to_the_left)];
147161
} else { fail; }
148162
#debug("<<< consume comment");
149163
}

src/librustsyntax/parse/lexer.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,16 @@ fn consume_any_line_comment(rdr: reader) {
119119
'*' { rdr.bump(); rdr.bump(); ret consume_block_comment(rdr); }
120120
_ { ret; }
121121
}
122+
} else if rdr.curr == '#' {
123+
if rdr.next() == '!' {
124+
let cmap = codemap::new_codemap();
125+
(*cmap).files.push(rdr.filemap);
126+
let loc = codemap::lookup_char_pos_adj(cmap, rdr.chpos);
127+
if loc.line == 1u && loc.col == 0u {
128+
while rdr.curr != '\n' && !rdr.is_eof() { rdr.bump(); }
129+
ret consume_whitespace_and_comments(rdr);
130+
}
131+
}
122132
}
123133
}
124134

src/test/run-pass/shebang.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/usr/bin/env rustx
2+
// pp-exact
3+
4+
import io::println;
5+
6+
fn main() { io::println("Hello World"); }

0 commit comments

Comments
 (0)