ruby-lsp icon indicating copy to clipboard operation
ruby-lsp copied to clipboard

Wrong syntax highlighting for `<%==` erb syntax

Open Earlopain opened this issue 1 year ago • 1 comments

Description

Ruby LSP Information

Details

VS Code Version

1.95.1

Ruby LSP Extension Version

0.8.14

Ruby LSP Server Version

0.22.1

Ruby LSP Addons

  • Ruby LSP Rails

Ruby Version

3.3.6

Ruby Version Manager

rbenv

Installed Extensions

Click to expand
  • asciidoctor-vscode (3.4.2)
  • gitlens (16.0.4)
  • go (0.42.1)
  • material-icon-theme (5.14.1)
  • remote-containers (0.388.0)
  • ruby-lsp (0.8.14)
  • sorbet-vscode-extension (0.3.37)
  • vscode-github-actions (0.27.0)
  • vscode-rdbg (0.2.2)
  • vscode-wakatime (24.9.1)
  • vscode-yaml (1.15.0)

Ruby LSP Settings

Click to expand
Workspace
{}
User
{
  "enabledFeatures": {
    "codeActions": true,
    "diagnostics": true,
    "documentHighlights": true,
    "documentLink": true,
    "documentSymbols": true,
    "foldingRanges": true,
    "formatting": true,
    "hover": true,
    "inlayHint": true,
    "onTypeFormatting": true,
    "selectionRanges": true,
    "semanticHighlighting": true,
    "completion": true,
    "codeLens": true,
    "definition": true,
    "workspaceSymbol": true,
    "signatureHelp": true,
    "typeHierarchy": true
  },
  "featuresConfiguration": {},
  "addonSettings": {},
  "rubyVersionManager": {
    "identifier": "auto"
  },
  "customRubyCommand": "",
  "formatter": "none",
  "linters": null,
  "bundleGemfile": "",
  "testTimeout": 30,
  "branch": "",
  "pullDiagnosticsOn": "both",
  "useBundlerCompose": false,
  "bypassTypechecker": false,
  "rubyExecutablePath": "",
  "indexing": {},
  "erbSupport": true,
  "useLauncher": false,
  "featureFlags": {}
}

Reproduction steps

A lesser used but valid syntax of erb is <%== which will mark the passed string as html safe. Rails documents it at the bottom of https://guides.rubyonrails.org/active_support_core_extensions.html#safe-strings, although I'm not sure if this is rails specific or not. Could very well be erubi only.

ruby-lsp fails to consider the second equal sign, showing the code like this:

Image

A fix seems rather straightforward but erb highlighting has no tests and I don't really understand these gramar files so I'm not very confident in my change. I can open a PR if it looks reasonable and no tests are fine.

Patch

diff --git a/vscode/grammars/erb.cson.json b/vscode/grammars/erb.cson.json
index 475a9454..fe88bb21 100644
--- a/vscode/grammars/erb.cson.json
+++ b/vscode/grammars/erb.cson.json
@@ -80,7 +80,7 @@
     "tags": {
       "patterns": [
         {
-          "begin": "<%+(?!>)[-=]?(?![^%]*%>)",
+          "begin": "<%+(?!>)[-=]?=?(?![^%]*%>)",
           "beginCaptures": {
             "0": {
               "name": "punctuation.section.embedded.begin.erb"
@@ -113,7 +113,7 @@
           ]
         },
         {
-          "begin": "<%+(?!>)[-=]?",
+          "begin": "<%+(?!>)[-=]?=?",
           "beginCaptures": {
             "0": {
               "name": "punctuation.section.embedded.begin.erb"
diff --git a/vscode/languages/erb.json b/vscode/languages/erb.json
index ae1564fb..f8373735 100644
--- a/vscode/languages/erb.json
+++ b/vscode/languages/erb.json
@@ -5,6 +5,7 @@
   "brackets": [
     ["<%", "%>"],
     ["<%=", "%>"],
+    ["<%==", "%>"],
     ["<%#", "%>"]
   ],
   "autoClosingPairs": [
@@ -35,6 +36,7 @@
   "surroundingPairs": [
     ["<%", "%>"],
     ["<%=", "%>"],
+    ["<%==", "%>"],
     ["<%#", "%>"],
     ["{", "}"],
     ["[", "]"],

Earlopain avatar Nov 25 '24 20:11 Earlopain

Interesting. Seems like bad security risk that you could accidentally mark a string as safe by adding an extra =.

andyw8 avatar Nov 25 '24 20:11 andyw8