From b760eef0bab388c32dacdf9ab4e257a8a315a007 Mon Sep 17 00:00:00 2001 From: Valentin Krasontovitsch Date: Wed, 25 Feb 2026 13:57:40 +0100 Subject: [PATCH] fix(dockerfile): correct bash syntax highlighting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit when a dockerfile contains several RUN statements, the syntax highlighting would sometimes run over and encompass dockerfile statements after the RUN command (typically everything between the first and last RUN statement, though the bash syntax bleed can be broken by terminating a RUN statement with a semicolon, or a space 🙄) we fix this by using a slightly different approach to recognizing / grouping (the content of) RUN commands: - instead of having shell_command at the top level of the block we changed, we're using run_instruction - so parsing happens per `RUN` statement, which is really what we want - inseade of `injection.combined`, we use `injection.include-children`, which combines all the shell fragments (the text parts of a shell command, including after newline continuations), which is really what we want, as that's all the text of a RUN statement that fixes the highlight bleed, and preserves correct highlighting for each RUN statement. we also add a regression test for highlighting. Closes #6530, #6975 --- runtime/queries/dockerfile/injections.scm | 6 +++--- ...sh-bleed-across-runs-regression.dockerfile | 21 +++++++++++++++++++ .../bash-on-run-instructions.dockerfile | 5 +++++ 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 tests/query/highlights/dockerfile/bash-bleed-across-runs-regression.dockerfile diff --git a/runtime/queries/dockerfile/injections.scm b/runtime/queries/dockerfile/injections.scm index 5d3bbffb7..7db92804b 100644 --- a/runtime/queries/dockerfile/injections.scm +++ b/runtime/queries/dockerfile/injections.scm @@ -1,10 +1,10 @@ ((comment) @injection.content (#set! injection.language "comment")) -((shell_command - (shell_fragment) @injection.content) +((run_instruction + (shell_command) @injection.content) (#set! injection.language "bash") - (#set! injection.combined)) + (#set! injection.include-children)) ((run_instruction (heredoc_block) @injection.content) diff --git a/tests/query/highlights/dockerfile/bash-bleed-across-runs-regression.dockerfile b/tests/query/highlights/dockerfile/bash-bleed-across-runs-regression.dockerfile new file mode 100644 index 000000000..024c43ebd --- /dev/null +++ b/tests/query/highlights/dockerfile/bash-bleed-across-runs-regression.dockerfile @@ -0,0 +1,21 @@ +FROM python AS base +# <- @keyword + +RUN pip install requests && \ +# <- @keyword +# ^^^ @function.call +# ^^^ @variable.parameter + echo all done +# ^^^^ @function.call + +FROM alpine +# <- @keyword +# <- @!variable.parameter + +RUN apk add openssh-client +# <- @keyword +# ^^^ @function.call + +CMD ["/usr/bin/sh"] +# <- @keyword +# <- @!variable.parameter diff --git a/tests/query/injections/dockerfile/bash-on-run-instructions.dockerfile b/tests/query/injections/dockerfile/bash-on-run-instructions.dockerfile index 00621f1a3..68eb5c5b6 100644 --- a/tests/query/injections/dockerfile/bash-on-run-instructions.dockerfile +++ b/tests/query/injections/dockerfile/bash-on-run-instructions.dockerfile @@ -1,6 +1,11 @@ FROM foo RUN bar # ^ @bash +FROM haha +# ^ @!bash RUN \ baz # ^ @bash + +COPY apt apt +# ^ @!bash