Skip to content

Commit

Permalink
Auto merge of rust-lang#12545 - jeremyBanks:shebangs, r=Veykril
Browse files Browse the repository at this point in the history
fix: inserted imports must come after a shebang if present

The current `insert_use` logic adds the first `use` item near the beginning of the file, only skipping past comments and whitespace. However, it does not skip leading [shebang lines](https://en.wikipedia.org/wiki/Shebang_\(Unix\)). This can produce a syntax error, as shebangs are only accepted (ignored) on the first line of the file.

### Before Insertion (valid syntax)

```rust
#!/usr/bin/env rust

fn main() {}
```

### After Insertion (invalid syntax)

```rust
use foo::bar::Baz;

#!/usr/bin/env rust

fn main() {}
```

Rust analyzer's grammar is already shebang-aware, so this PR just adds that to the array of SyntaxKinds that are skipped past when looking for an insertion location, and adds a corresponding test case.
  • Loading branch information
bors committed Jun 15, 2022
2 parents d39d520 + c32f133 commit 519d748
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 1 deletion.
3 changes: 2 additions & 1 deletion crates/ide-db/src/imports/insert_use.rs
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,8 @@ fn insert_use_(
.take_while(|child| match child {
NodeOrToken::Node(node) => is_inner_attribute(node.clone()),
NodeOrToken::Token(token) => {
[SyntaxKind::WHITESPACE, SyntaxKind::COMMENT].contains(&token.kind())
[SyntaxKind::WHITESPACE, SyntaxKind::COMMENT, SyntaxKind::SHEBANG]
.contains(&token.kind())
}
})
.filter(|child| child.as_token().map_or(true, |t| t.kind() != SyntaxKind::WHITESPACE))
Expand Down
11 changes: 11 additions & 0 deletions crates/ide-db/src/imports/insert_use/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,17 @@ use foo::bar::Baz;"#,
);
}

#[test]
fn inserts_after_shebang() {
check_none(
"foo::bar::Baz",
"#!/usr/bin/env rust",
r#"#!/usr/bin/env rust
use foo::bar::Baz;"#,
);
}

#[test]
fn inserts_after_multiple_single_line_comments() {
check_none(
Expand Down

0 comments on commit 519d748

Please sign in to comment.