diff --git a/src/lexer.rs b/src/lexer.rs index bfaf55c4d2..322648f22c 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -832,11 +832,6 @@ impl<'src> Lexer<'src> { /// Cooked string: "[^"]*" # also processes escape sequences /// Raw string: '[^']*' fn lex_string(&mut self, format_string_kind: Option) -> CompileResult<'src> { - let format = format_string_kind.is_some() - || self.tokens.last().is_some_and(|token| { - token.kind == TokenKind::Identifier && token.lexeme() == Keyword::F.lexeme() - }); - let kind = if let Some(kind) = format_string_kind { self.presume_str(Self::INTERPOLATION_END)?; kind @@ -849,6 +844,12 @@ impl<'src> Lexer<'src> { kind }; + let format = format_string_kind.is_some() + || kind.delimiter != StringDelimiter::Backtick + && self.tokens.last().is_some_and(|token| { + token.kind == TokenKind::Identifier && token.lexeme() == Keyword::F.lexeme() + }); + let mut escape = false; loop { diff --git a/tests/format_string.rs b/tests/format_string.rs index 1ba51b16c9..2d9c0e9b7b 100644 --- a/tests/format_string.rs +++ b/tests/format_string.rs @@ -327,3 +327,19 @@ fn mismatched_closing_delimiter_in_format_string() { ) .failure(); } + +#[test] +fn format_backticks_are_forbidden() { + Test::new() + .justfile("foo := f`echo {{ arch() }}`") + .stderr( + " + error: expected '&&', '!=', '!~', '||', comment, end of file, end of line, '==', '=~', '(', '+', '++', or '/', but found backtick + ——▶ justfile:1:9 + │ + 1 │ foo := f`echo {{ arch() }}` + │ ^^^^^^^^^^^^^^^^^^^ + ", + ) + .failure(); +}