Skip to content

Commit

Permalink
rustc_lexer: Simplify shebang parsing once more
Browse files Browse the repository at this point in the history
  • Loading branch information
petrochenkov committed Jun 26, 2020
1 parent 9672b5e commit 7b2064f
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 20 deletions.
27 changes: 12 additions & 15 deletions src/librustc_lexer/src/lib.rs
Expand Up @@ -179,21 +179,18 @@ pub enum Base {
/// but shebang isn't a part of rust syntax.
pub fn strip_shebang(input: &str) -> Option<usize> {
// Shebang must start with `#!` literally, without any preceding whitespace.
if input.starts_with("#!") {
let input_tail = &input[2..];
// Shebang must have something non-whitespace after `#!` on the first line.
let first_line_tail = input_tail.lines().next()?;
if first_line_tail.contains(|c| !is_whitespace(c)) {
// Ok, this is a shebang but if the next non-whitespace token is `[` or maybe
// a doc comment (due to `TokenKind::(Line,Block)Comment` ambiguity at lexer level),
// then it may be valid Rust code, so consider it Rust code.
let next_non_whitespace_token = tokenize(input_tail).map(|tok| tok.kind).find(|tok|
!matches!(tok, TokenKind::Whitespace | TokenKind::LineComment | TokenKind::BlockComment { .. })
);
if next_non_whitespace_token != Some(TokenKind::OpenBracket) {
// No other choice than to consider this a shebang.
return Some(2 + first_line_tail.len());
}
// For simplicity we consider any line starting with `#!` a shebang,
// regardless of restrictions put on shebangs by specific platforms.
if let Some(input_tail) = input.strip_prefix("#!") {
// Ok, this is a shebang but if the next non-whitespace token is `[` or maybe
// a doc comment (due to `TokenKind::(Line,Block)Comment` ambiguity at lexer level),
// then it may be valid Rust code, so consider it Rust code.
let next_non_whitespace_token = tokenize(input_tail).map(|tok| tok.kind).find(|tok|
!matches!(tok, TokenKind::Whitespace | TokenKind::LineComment | TokenKind::BlockComment { .. })
);
if next_non_whitespace_token != Some(TokenKind::OpenBracket) {
// No other choice than to consider this a shebang.
return Some(2 + input_tail.lines().next().unwrap_or_default().len());
}
}
None
Expand Down
4 changes: 4 additions & 0 deletions src/test/ui/parser/shebang/shebang-empty.rs
@@ -0,0 +1,4 @@
#!

// check-pass
fn main() {}
5 changes: 5 additions & 0 deletions src/test/ui/parser/shebang/shebang-space.rs
@@ -0,0 +1,5 @@
#!

// check-pass
// ignore-tidy-end-whitespace
fn main() {}
5 changes: 0 additions & 5 deletions src/test/ui/shebang.rs

This file was deleted.

0 comments on commit 7b2064f

Please sign in to comment.