Ignore shebang at start of file (#5702)

This commit is contained in:
T0mstone 2025-01-23 14:05:12 +01:00 committed by GitHub
parent ce299d5832
commit b7546bace7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 24 additions and 1 deletions

View File

@ -287,6 +287,7 @@ pub fn highlight(node: &LinkedNode) -> Option<Tag> {
SyntaxKind::Destructuring => None,
SyntaxKind::DestructAssignment => None,
SyntaxKind::Shebang => Some(Tag::Comment),
SyntaxKind::LineComment => Some(Tag::Comment),
SyntaxKind::BlockComment => Some(Tag::Comment),
SyntaxKind::Error => Some(Tag::Error),

View File

@ -9,6 +9,8 @@ pub enum SyntaxKind {
/// An invalid sequence of characters.
Error,
/// A shebang: `#! ...`
Shebang,
/// A line comment: `// ...`.
LineComment,
/// A block comment: `/* ... */`.
@ -357,7 +359,11 @@ impl SyntaxKind {
pub fn is_trivia(self) -> bool {
matches!(
self,
Self::LineComment | Self::BlockComment | Self::Space | Self::Parbreak
Self::Shebang
| Self::LineComment
| Self::BlockComment
| Self::Space
| Self::Parbreak
)
}
@ -371,6 +377,7 @@ impl SyntaxKind {
match self {
Self::End => "end of tokens",
Self::Error => "syntax error",
Self::Shebang => "shebang",
Self::LineComment => "line comment",
Self::BlockComment => "block comment",
Self::Markup => "markup",

View File

@ -103,6 +103,7 @@ impl Lexer<'_> {
self.newline = false;
let kind = match self.s.eat() {
Some(c) if is_space(c, self.mode) => self.whitespace(start, c),
Some('#') if start == 0 && self.s.eat_if('!') => self.shebang(),
Some('/') if self.s.eat_if('/') => self.line_comment(),
Some('/') if self.s.eat_if('*') => self.block_comment(),
Some('*') if self.s.eat_if('/') => {
@ -151,6 +152,11 @@ impl Lexer<'_> {
}
}
fn shebang(&mut self) -> SyntaxKind {
self.s.eat_until(is_newline);
SyntaxKind::Shebang
}
fn line_comment(&mut self) -> SyntaxKind {
self.s.eat_until(is_newline);
SyntaxKind::LineComment

View File

@ -93,6 +93,8 @@ fn markup_expr(p: &mut Parser, at_start: bool, nesting: &mut usize) {
p.hint("try using a backslash escape: \\]");
}
SyntaxKind::Shebang => p.eat(),
SyntaxKind::Text
| SyntaxKind::Linebreak
| SyntaxKind::Escape

View File

@ -0,0 +1,7 @@
// Test shebang support.
--- shebang ---
#!typst compile
// Error: 2-3 the character `!` is not valid in code
#!not-a-shebang