From 99723b8f3f70c664eb2687158ba66f01be95f9e0 Mon Sep 17 00:00:00 2001 From: Steve Ramage Date: Sun, 21 Jun 2026 13:09:19 -0700 Subject: [PATCH] fix: leave free-form string values at the default color (#467 #342) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The default heuristic mapped RegexTerminal -> IDENTIFIER, so free-form values like Description= and interface names (Bond=) got recoloured, which felt wrong — those should keep the editor's normal value color. Make RegexTerminal uncoloured by default. - defaultRole: RegexTerminal now falls through to null (no coloring). - Drop the Identifier descriptor + tag + demo example from the color settings page, since nothing uses the IDENTIFIER role by default now. The Role and its key are kept for grammars that opt in explicitly via Labeled later (e.g. a single-token User=). Refs #467 #342 Co-Authored-By: Claude Opus 4.8 (1M context) --- .../coloring/settings/UnitFileColorSettings.java | 4 +--- .../semanticdata/optionvalues/grammar/Coloring.kt | 6 ++++-- .../semanticdata/optionvalues/grammar/ColoringTest.kt | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/sjrx/intellij/plugins/systemdunitfiles/coloring/settings/UnitFileColorSettings.java b/src/main/java/net/sjrx/intellij/plugins/systemdunitfiles/coloring/settings/UnitFileColorSettings.java index b1db238..96d39f3 100644 --- a/src/main/java/net/sjrx/intellij/plugins/systemdunitfiles/coloring/settings/UnitFileColorSettings.java +++ b/src/main/java/net/sjrx/intellij/plugins/systemdunitfiles/coloring/settings/UnitFileColorSettings.java @@ -25,7 +25,6 @@ public class UnitFileColorSettings implements ColorSettingsPage { new AttributesDescriptor("Value//Enum (grammar)", UnitFileHighlighter.GRAMMAR_ENUM), new AttributesDescriptor("Value//Literal (grammar)", UnitFileHighlighter.GRAMMAR_LITERAL), new AttributesDescriptor("Value//Operator (grammar)", UnitFileHighlighter.GRAMMAR_OPERATOR), - new AttributesDescriptor("Value//Identifier (grammar)", UnitFileHighlighter.GRAMMAR_IDENTIFIER), }; @Nullable @@ -53,7 +52,7 @@ public String getDemoText() { + "# (at your option) any later version.\n" + "\n" + "[Unit]\n" - + "Description=Reload Configuration from the Real Root\n" + + "Description=Reload Configuration from the Real Root\n" + "DefaultDependencies=no\n" + "Requires=initrd-root-fs.target\n" + "After=initrd-root-fs.target\n" @@ -81,7 +80,6 @@ public Map getAdditionalHighlightingTagToDescriptorMa tags.put("gEnum", UnitFileHighlighter.GRAMMAR_ENUM); tags.put("gLit", UnitFileHighlighter.GRAMMAR_LITERAL); tags.put("gOp", UnitFileHighlighter.GRAMMAR_OPERATOR); - tags.put("gId", UnitFileHighlighter.GRAMMAR_IDENTIFIER); return tags; } diff --git a/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/Coloring.kt b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/Coloring.kt index 9c9cd5d..f209343 100644 --- a/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/Coloring.kt +++ b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/Coloring.kt @@ -37,8 +37,10 @@ fun defaultRole(terminal: TerminalCombinator): Role? = when (terminal) { is IntegerTerminal -> Role.LITERAL is LiteralChoiceTerminal -> if (terminal.choices.allPunctuation()) Role.OPERATOR else Role.ENUM is FlexibleLiteralChoiceTerminal -> if (terminal.choices.allPunctuation()) Role.OPERATOR else Role.ENUM - is RegexTerminal -> Role.IDENTIFIER - else -> null // WhitespaceTerminal, and any future terminal types: uncoloured by default + // RegexTerminal (free-form names/strings: Description=, interface names, ...) and whitespace stay + // uncoloured by default — they keep the editor's normal value colour. The IDENTIFIER role is still + // available for grammars that opt in explicitly via Labeled (e.g. a single-token field like User=). + else -> null } private fun Array.allPunctuation(): Boolean = diff --git a/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/ColoringTest.kt b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/ColoringTest.kt index de899a7..d21e199 100644 --- a/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/ColoringTest.kt +++ b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/ColoringTest.kt @@ -14,7 +14,7 @@ class ColoringTest { assertEquals(Role.ENUM, defaultRole(FlexibleLiteralChoiceTerminal("AF_INET", "AF_INET6"))) assertEquals(Role.OPERATOR, defaultRole(LiteralChoiceTerminal(":"))) assertEquals(Role.OPERATOR, defaultRole(LiteralChoiceTerminal("~"))) - assertEquals(Role.IDENTIFIER, defaultRole(RegexTerminal("[a-z]+", "[a-z]+"))) + assertEquals(null, defaultRole(RegexTerminal("[a-z]+", "[a-z]+"))) // free-form: keeps default value color assertEquals(null, defaultRole(WhitespaceTerminal())) }