Repository: stylelint/vscode-stylelint (ts)

Issue:
[Bug]: hover dialog is only triggered by an area one pixel wide
### How did you encounter this bug?

When I write CSS that triggers a style lint warning, the warning shows up correctly in the problems panel and if I run stylelint from the command line, but I can only trigger the hover dialog on the line of code itself by carefully moving my mouse pointer pixel by pixel horizontally. Only one pixel triggers the hover dialog; a pixel either side does not.

### Code Snippet

_No response_

### Extension Configuration

_No response_

### Actual Behaviour

As above.

### Expected Behaviour

I understand that you can only show a single character at present because of limitations in the information you get from stylelint. However I expected to be able to hover over the entire single character to trigger the hover dialog, not just a single pixel.

### Logs

[Info  - 00:39:13] [language-server] Registering module | module: "auto-fix"
[Info  - 00:39:13] [language-server] Module registered | module: "auto-fix"
[Info  - 00:39:13] [language-server] Registering module | module: "code-action"
[Info  - 00:39:13] [language-server] Module registered | module: "code-action"
[Info  - 00:39:13] [language-server] Registering module | module: "completion"
[Info  - 00:39:13] [language-server] Module registered | module: "completion"
[Info  - 00:39:13] [language-server] Registering module | module: "formatter"
[Info  - 00:39:13] [language-server] Module registered | module: "formatter"
[Info  - 00:39:13] [language-server] Registering module | module: "old-stylelint-warning"
[Info  - 00:39:13] [language-server] Module registered | module: "old-stylelint-warning"
[Info  - 00:39:13] [language-server] Registering module | module: "validator"
[Info  - 00:39:13] [language-server] Module registered | module: "validator"
[Info  - 00:39:13] [language-server] Starting language server
[Info  - 00:39:13] [language-server] Registering handlers
[Debug - 12:39:13 a.m.] [language-server] onInitialize handler registered
[Debug - 12:39:13 a.m.] [language-server] onDidChangeConfiguration handler registered
[Debug - 12:39:13 a.m.] [language-server] Invoking onDidRegisterHandlers
[Debug - 12:39:13 a.m.] [language-server:auto-fix] Registering onExecuteCommand handler
[Debug - 12:39:13 a.m.] [language-server:auto-fix] onExecuteCommand handler registered
[Debug - 12:39:13 a.m.] [language-server] Invoked onDidRegisterHandlers | module: "auto-fix" returnValue: undefined
[Debug - 12:39:13 a.m.] [language-server:code-action] Registering onCodeAction handler
[Debug - 12:39:13 a.m.] [language-server:code-action] onCodeAction handler registered
[Debug - 12:39:13 a.m.] [language-server] Invoked onDidRegisterHandlers | module: "code-action" returnValue: undefined
[Debug - 12:39:13 a.m.] [language-server:completion] Registering onCompletion handler
[Debug - 12:39:13 a.m.] [language-server:completion] onCompletion handler registered
[Debug - 12:39:13 a.m.] [language-server] Invoked onDidRegisterHandlers | module: "completion" returnValue: undefined
[Debug - 12:39:13 a.m.] [language-server:formatter] Registering onDocumentFormatting handler
[Debug - 12:39:13 a.m.] [language-server:formatter] onDocumentFormatting handler registered
[Debug - 12:39:13 a.m.] [language-server] Invoked onDidRegisterHandlers | module: "formatter" returnValue: undefined
[Debug - 12:39:13 a.m.] [language-server:old-stylelint-warning] Registering onDidOpen handler
[Debug - 12:39:13 a.m.] [language-server:old-stylelint-warning] onDidOpen handler registered
[Debug - 12:39:13 a.m.] [language-server] Invoked onDidRegisterHandlers | module: "old-stylelint-warning" returnValue: undefined
[Debug - 12:39:13 a.m.] [language-server:validator] Registering handlers
[Debug - 12:39:13 a.m.] [language-server:validator] onDidChangeWatchedFiles handler registered
[Debug - 12:39:13 a.m.] [language-server:validator] onDidChangeContent handler registered
[Debug - 12:39:13 a.m.] [language-server:validator] onDidClose handler registered
[Debug - 12:39:13 a.m.] [language-server:validator] Handlers registered
[Debug - 12:39:13 a.m.] [language-server] Invoked onDidRegisterHandlers | module: "validator" returnValue: undefined
[Info  - 00:39:13] [language-server] Handlers registered
[Info  - 00:39:13] [language-server] Language server started
[Debug - 12:39:13 a.m.] [language-server] received onInitialize | params: {"processId":72277,"clientInfo":{"name":"Visual Studio Code","version":"1.62.2"},"locale":"en-gb","rootPath":"/Users/redacted/Documents/Projects/redacted","rootUri":"file:///Users/redacted/Documents/Projects/redacted","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional","normalizesLineEndings":true,"changeAnnotationSupport":{"groupsOnLabel":true}},"didChangeConfiguration":{"dynamicRegistration":true},"didChangeWatchedFiles":{"dynamicRegistration":true},"symbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"tagSupport":{"valueSet":[1]}},"codeLens":{"refreshSupport":true},"executeCommand":{"dynamicRegistration":true},"configuration":true,"workspaceFolders":true,"semanticTokens":{"refreshSupport":true},"fileOperations":{"dynamicRegistration":true,"didCreate":true,"didRename":true,"didDelete":true,"willCreate":true,"willRename":true,"willDelete":true}},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]},"codeDescriptionSupport":true,"dataSupport":true},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]},"insertReplaceSupport":true,"resolveSupport":{"properties":["documentation","detail","additionalTextEdits"]},"insertTextModeSupport":{"valueSet":[1,2]}},"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true},"activeParameterSupport":true},"contextSupport":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"hierarchicalDocumentSymbolSupport":true,"tagSupport":{"valueSet":[1]},"labelSupport":true},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"disabledSupport":true,"dataSupport":true,"resolveSupport":{"properties":["edit"]},"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}},"honorsChangeAnnotations":false},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true,"prepareSupportDefaultBehavior":1,"honorsChangeAnnotations":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true,"linkSupport":true},"implementation":{"dynamicRegistration":true,"linkSupport":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true},"declaration":{"dynamicRegistration":true,"linkSupport":true},"selectionRange":{"dynamicRegistration":true},"callHierarchy":{"dynamicRegistration":true},"semanticTokens":{"dynamicRegistration":true,"tokenTypes":["namespace","type","class","enum","interface","struct","typeParameter","parameter","variable","property","enumMember","event","function","method","macro","keyword","modifier","comment","string","number","regexp","operator"],"tokenModifiers":["declaration","definition","readonly","static","deprecated","abstract","async","modification","documentation","defaultLibrary"],"formats":["relative"],"requests":{"range":true,"full":{"delta":true}},"multilineTokenSupport":false,"overlappingTokenSupport":false},"linkedEditingRange":{"dynamicRegistration":true}},"window":{"showMessage":{"messageActionItem":{"additionalPropertiesSupport":true}},"showDocument":{"support":true},"workDoneProgress":true},"general":{"regularExpressions":{"engine":"ECMAScript","version":"ES2020"},"markdown":{"parser":"marked","version":"1.1.0"}}},"trace":"off","workspaceFolders":[{"uri":"file:///Users/redacted/Documents/Projects/redacted","name":"redacted"}]}
[Debug - 12:39:13 a.m.] [language-server] Invoking onInitialize
[Debug - 12:39:13 a.m.] [language-server] Invoked onInitialize | module: "auto-fix" returnValue: {"capabilities":{"executeCommandProvider":{"commands":["stylelint.applyAutoFix"]}}}
[Debug - 12:39:13 a.m.] [language-server] Invoked onInitialize | module: "code-action" returnValue: {"capabilities":{"codeActionProvider":{"codeActionKinds":["quickfix","source.fixAll.stylelint"]}}}
[Debug - 12:39:13 a.m.] [language-server] Invoked onInitialize | module: "completion" returnValue: {"capabilities":{"completionProvider":{}}}
[Debug - 12:39:13 a.m.] [language-server] Invoked onInitialize | module: "formatter" returnValue: {"capabilities":{"documentFormattingProvider":false}}
[Debug - 12:39:13 a.m.] [language-server] Invoked onInitialize | module: "old-stylelint-warning" returnValue: undefined
[Debug - 12:39:13 a.m.] [language-server] Invoked onInitialize | module: "validator" returnValue: undefined
[Debug - 12:39:13 a.m.] [language-server] Returning initialization results | result: {"capabilities":{"textDocumentSync":{"openClose":true,"change":1},"executeCommandProvider":{"commands":["stylelint.applyAutoFix"]},"codeActionProvider":{"codeActionKinds":["quickfix","source.fixAll.stylelint"]},"completionProvider":{},"documentFormattingProvider":false}}
[Debug - 12:39:13 a.m.] [language-server] received onDidChangeConfiguration | params: {"settings":{"stylelint":{"enable":true,"config":null,"configFile":"","configBasedir":"","customSyntax":"","ignoreDisables":false,"reportNeedlessDisables":false,"reportInvalidScopeDisables":false,"stylelintPath":"","packageManager":"npm","validate":["css","less","postcss"],"snippet":["css","less","postcss"]}}}
[Debug - 12:39:13 a.m.] [language-server] Options updated | options: {"config":null,"configBasedir":"","configFile":"","customSyntax":"","ignoreDisables":false,"packageManager":"npm","reportInvalidScopeDisables":false,"reportNeedlessDisables":false,"snippet":["css","less","postcss"],"stylelintPath":"","validate":["css","less","postcss"]}
[Debug - 12:39:13 a.m.] [language-server] Languages that should be validated changed | languages: ["css","less","postcss"] removedLanguages: []
[Debug - 12:39:13 a.m.] [language-server] Invoking onDidChangeValidateLanguages
[Debug - 12:39:13 a.m.] [language-server:formatter] Received onDidChangeValidateLanguages | languages: ["css","less","postcss"]
[Debug - 12:39:13 a.m.] [language-server:formatter] Registering formatter for languages | languages: ["css","less","postcss"]
[Debug - 12:39:13 a.m.] [language-server] Invoked onDidChangeValidateLanguages | module: "formatter" returnValue: {}
[Debug - 12:39:13 a.m.] [language-server:validator] Received onDidChangeValidateLanguages | removedLanguages: []
[Debug - 12:39:13 a.m.] [language-server] Invoked onDidChangeValidateLanguages | module: "validator" returnValue: undefined
[Debug - 12:39:13 a.m.] [language-server] Invoking onDidChangeConfiguration
[Debug - 12:39:13 a.m.] [language-server:validator] Received onDidChangeConfiguration
[Debug - 12:39:13 a.m.] [language-server] Invoked onDidChangeConfiguration | module: "validator" returnValue: {}
[Debug - 12:39:13 a.m.] [language-server] Linting document | uri: "file:///Users/redacted/Documents/Projects/redacted/src/App.module.css" linterOptions: {}
[Debug - 12:39:13 a.m.] [language-server:code-action] Received onCodeAction | uri: "file:///Users/redacted/Documents/Projects/redacted/src/App.module.css" context: {"diagnostics":[]}
[Debug - 12:39:13 a.m.] [language-server:code-action] Unsupported code action kind, ignoring | kind: undefined
[Debug - 12:39:13 a.m.] [language-server:formatter] Formatter registered
[Debug - 12:39:13 a.m.] [language-server] Resolving Stylelint | uri: "file:///Users/redacted/Documents/Projects/redacted/src/App.module.css"
[Debug - 12:39:13 a.m.] [language-server] npm returned global node_modules path. | path: "/Users/redacted/.nvm/versions/node/v16.13.0/lib/node_modules"
[Debug - 12:39:13 a.m.] [language-server] npm returned global node_modules path. | path: "/Users/redacted/.nvm/versions/node/v16.13.0/lib/node_modules"
[Debug - 12:39:13 a.m.] [language-server] Could not find a Yarn lockfile | cwd: "/Users/redacted/Documents/Projects/redacted/src"
[Debug - 12:39:13 a.m.] [language-server] NODE_PATH value is: /Users/redacted/.nvm/versions/node/v16.13.0/lib/node_modules | verbose: undefined
[Debug - 12:39:13 a.m.] [language-server] Could not find a Yarn lockfile | cwd: "/Users/redacted/Documents/Projects/redacted/src"
[Debug - 12:39:13 a.m.] [language-server] NODE_PATH value is: /Users/redacted/.nvm/versions/node/v16.13.0/lib/node_modules | verbose: undefined
[Debug - 12:39:13 a.m.] [language-server] Resolved Stylelint from node_modules | path: "/Users/redacted/Documents/Projects/redacted/node_modules/stylelint/lib/index.js"
[Debug - 12:39:13 a.m.] [language-server] Stylelint resolved | uri: "file:///Users/redacted/Documents/Projects/redacted/src/App.module.css" resolvedPath: "/Users/redacted/Documents/Projects/redacted/node_modules/stylelint/lib/index.js"
[Debug - 12:39:13 a.m.] [language-server] Resolved Stylelint from node_modules | path: "/Users/redacted/Documents/Projects/redacted/node_modules/stylelint/lib/index.js"
[Debug - 12:39:14 a.m.] [language-server] Running Stylelint | options: {"ignoreDisables":false,"reportNeedlessDisables":false,"reportInvalidScopeDisables":false,"ignorePath":"/Users/redacted/Documents/Projects/redacted/.stylelintignore","code":"...","codeFilename":"/Users/redacted/Documents/Projects/redacted/src/App.module.css"}
[Debug - 12:39:14 a.m.] [language-server] Lint run complete | uri: "file:///Users/redacted/Documents/Projects/redacted/src/App.module.css" results: {"diagnostics":[{"range":{"start":{"line":11,"character":0},"end":{"line":11,"character":0}},"message":"Expected selector \".logo\" to come before selector \".app .logo\" (no-descending-specificity)","severity":1,"code":"no-descending-specificity","source":"Stylelint","codeDescription":{"href":"https://stylelint.io/user-guide/rules/no-descending-specificity"}},{"range":{"start":{"line":5,"character":0},"end":{"line":5,"character":0}},"message":"Unexpected duplicate selector \".app\", first used at line 1 (no-duplicate-selectors)","severity":1,"code":"no-duplicate-selectors","source":"Stylelint","codeDescription":{"href":"https://stylelint.io/user-guide/rules/no-duplicate-selectors"}}]}
[Debug - 12:39:14 a.m.] [language-server:validator] Sending diagnostics | uri: "file:///Users/redacted/Documents/Projects/redacted/src/App.module.css" result: {"diagnostics":[{"range":{"start":{"line":11,"character":0},"end":{"line":11,"character":0}},"message":"Expected selector \".logo\" to come before selector \".app .logo\" (no-descending-specificity)","severity":1,"code":"no-descending-specificity","source":"Stylelint","codeDescription":{"href":"https://stylelint.io/user-guide/rules/no-descending-specificity"}},{"range":{"start":{"line":5,"character":0},"end":{"line":5,"character":0}},"message":"Unexpected duplicate selector \".app\", first used at line 1 (no-duplicate-selectors)","severity":1,"code":"no-duplicate-selectors","source":"Stylelint","codeDescription":{"href":"https://stylelint.io/user-guide/rules/no-duplicate-selectors"}}]}
[Debug - 12:39:14 a.m.] [language-server:validator] Diagnostics sent | uri: "file:///Users/redacted/Documents/Projects/redacted/src/App.module.css"
[Debug - 12:39:14 a.m.] [language-server:code-action] Received onCodeAction | uri: "file:///Users/redacted/Documents/Projects/redacted/src/App.module.css" context: {"diagnostics":[]}
[Debug - 12:39:14 a.m.] [language-server:code-action] Unsupported code action kind, ignoring | kind: undefined
[Debug - 12:39:26 a.m.] [language-server:code-action] Received onCodeAction | uri: "file:///Users/redacted/Documents/Projects/redacted/src/App.module.css" context: {"diagnostics":[{"range":{"start":{"line":11,"character":0},"end":{"line":11,"character":0}},"message":"Expected selector \".logo\" to come before selector \".app .logo\" (no-descending-specificity)","code":"no-descending-specificity","codeDescription":{"href":"https://stylelint.io/user-guide/rules/no-descending-specificity"},"severity":1,"source":"Stylelint"}],"only":["quickfix"]}
[Debug - 12:39:26 a.m.] [language-server:code-action] Unsupported code action kind, ignoring | kind: "quickfix"
[Debug - 12:39:45 a.m.] [language-server:code-action] Received onCodeAction | uri: "file:///Users/redacted/Documents/Projects/redacted/src/App.module.css" context: {"diagnostics":[{"range":{"start":{"line":5,"character":0},"end":{"line":5,"character":0}},"message":"Unexpected duplicate selector \".app\", first used at line 1 (no-duplicate-selectors)","code":"no-duplicate-selectors","codeDescription":{"href":"https://stylelint.io/user-guide/rules/no-duplicate-selectors"},"severity":1,"source":"Stylelint"}],"only":["quickfix"]}
[Debug - 12:39:45 a.m.] [language-server:code-action] Unsupported code action kind, ignoring | kind: "quickfix"


### Stylelint Version

14.0.1

### vscode-stylelint Version

v1.1.0

### Node.js Version

v16.13.0

### Operating System

macOS 12.0.1

### Windows Subsystem for Linux

_No response_

### Code of Conduct

- [X] I agree to follow vscode-stylelint's Code of Conduct

Pull request:
fix: make hovering over problems more reliable
Fixes #323

Adjusts diagnostic creation to send [start, end) ranges instead of [start, end]. Works around VS Code's inconsistent behaviour in which problems that are displayed for a single character may have a smaller hover region than the underline visual.

Patch:
diff --git a/src/utils/stylelint/warning-to-diagnostic.ts b/src/utils/stylelint/warning-to-diagnostic.ts
index 1e19c86..ea53760 100644
--- a/src/utils/stylelint/warning-to-diagnostic.ts
+++ b/src/utils/stylelint/warning-to-diagnostic.ts
@@ -45,13 +45,14 @@ export function warningToDiagnostic(
 	warning: stylelint.Warning,
 	rules?: { [name: string]: stylelint.Rule },
 ): Diagnostic {
-	const position = Position.create(warning.line - 1, warning.column - 1);
+	const start = Position.create(warning.line - 1, warning.column - 1);
+	const end = Position.create(warning.line - 1, warning.column);
 
 	const ruleDocUrl =
 		rules?.[warning.rule] && `https://stylelint.io/user-guide/rules/${warning.rule}`;
 
 	const diagnostic = Diagnostic.create(
-		Range.create(position, position),
+		Range.create(start, end),
 		warning.text,
 		DiagnosticSeverity[warning.severity === 'warning' ? 'Warning' : 'Error'],
 		warning.rule,


Test patch:
diff --git a/src/utils/stylelint/__tests__/__snapshots__/process-linter-result.ts.snap b/src/utils/stylelint/__tests__/__snapshots__/process-linter-result.ts.snap
index 38801a1..b7eb18e 100644
--- a/src/utils/stylelint/__tests__/__snapshots__/process-linter-result.ts.snap
+++ b/src/utils/stylelint/__tests__/__snapshots__/process-linter-result.ts.snap
@@ -11,7 +11,7 @@ Object {
       "message": "unit-no-unknown",
       "range": Object {
         "end": Object {
-          "character": 0,
+          "character": 1,
           "line": 0,
         },
         "start": Object {
@@ -30,7 +30,7 @@ Object {
       "message": "at-rule-no-unknown",
       "range": Object {
         "end": Object {
-          "character": 0,
+          "character": 1,
           "line": 0,
         },
         "start": Object {
@@ -46,7 +46,7 @@ Object {
       "message": "alpha-value-notation",
       "range": Object {
         "end": Object {
-          "character": 0,
+          "character": 1,
           "line": 0,
         },
         "start": Object {
@@ -72,7 +72,7 @@ Object {
       "message": "unit-no-unknown",
       "range": Object {
         "end": Object {
-          "character": 0,
+          "character": 1,
           "line": 0,
         },
         "start": Object {
diff --git a/src/utils/stylelint/__tests__/__snapshots__/stylelint-runner.ts.snap b/src/utils/stylelint/__tests__/__snapshots__/stylelint-runner.ts.snap
index bb5ac38..e47d96a 100644
--- a/src/utils/stylelint/__tests__/__snapshots__/stylelint-runner.ts.snap
+++ b/src/utils/stylelint/__tests__/__snapshots__/stylelint-runner.ts.snap
@@ -30,7 +30,7 @@ Object {
       "message": "Unexpected empty block (block-no-empty)",
       "range": Object {
         "end": Object {
-          "character": 2,
+          "character": 3,
           "line": 0,
         },
         "start": Object {
@@ -53,7 +53,7 @@ Object {
       "message": "Unclosed block (CssSyntaxError)",
       "range": Object {
         "end": Object {
-          "character": 0,
+          "character": 1,
           "line": 0,
         },
         "start": Object {
diff --git a/src/utils/stylelint/__tests__/__snapshots__/warning-to-diagnostic.ts.snap b/src/utils/stylelint/__tests__/__snapshots__/warning-to-diagnostic.ts.snap
index 0a733b4..b634bed 100644
--- a/src/utils/stylelint/__tests__/__snapshots__/warning-to-diagnostic.ts.snap
+++ b/src/utils/stylelint/__tests__/__snapshots__/warning-to-diagnostic.ts.snap
@@ -9,7 +9,7 @@ Object {
   "message": "Expected \\"#AAA\\" to be \\"#aaa\\" (color-hex-case)",
   "range": Object {
     "end": Object {
-      "character": 11,
+      "character": 12,
       "line": 1,
     },
     "start": Object {
@@ -28,7 +28,7 @@ Object {
   "message": "Expected \\"#AAA\\" to be \\"#aaa\\" (color-hex-case)",
   "range": Object {
     "end": Object {
-      "character": 11,
+      "character": 12,
       "line": 1,
     },
     "start": Object {
@@ -47,7 +47,7 @@ Object {
   "message": "Expected \\"#bbbbbb\\" to be \\"#bbb\\" (color-hex-length)",
   "range": Object {
     "end": Object {
-      "character": 18,
+      "character": 19,
       "line": 2,
     },
     "start": Object {
diff --git a/test/e2e/__tests__/__snapshots__/config-basedir.ts.snap b/test/e2e/__tests__/__snapshots__/config-basedir.ts.snap
index 692b09a..0e760b2 100644
--- a/test/e2e/__tests__/__snapshots__/config-basedir.ts.snap
+++ b/test/e2e/__tests__/__snapshots__/config-basedir.ts.snap
@@ -10,7 +10,7 @@ Array [
     "message": "Expected \\"#fff\\" to be \\"#FFF\\" (color-hex-case)",
     "range": Object {
       "end": Object {
-        "character": 9,
+        "character": 10,
         "line": 1,
       },
       "start": Object {
@@ -29,7 +29,7 @@ Array [
     "message": "Expected indentation of 8 spaces (indentation)",
     "range": Object {
       "end": Object {
-        "character": 2,
+        "character": 3,
         "line": 1,
       },
       "start": Object {
diff --git a/test/e2e/__tests__/__snapshots__/config-file.ts.snap b/test/e2e/__tests__/__snapshots__/config-file.ts.snap
index 95a5c5b..d39f18f 100644
--- a/test/e2e/__tests__/__snapshots__/config-file.ts.snap
+++ b/test/e2e/__tests__/__snapshots__/config-file.ts.snap
@@ -10,7 +10,7 @@ Array [
     "message": "Unexpected empty block (block-no-empty)",
     "range": Object {
       "end": Object {
-        "character": 2,
+        "character": 3,
         "line": 0,
       },
       "start": Object {
diff --git a/test/e2e/__tests__/__snapshots__/ignore-disables.ts.snap b/test/e2e/__tests__/__snapshots__/ignore-disables.ts.snap
index a13bf59..b59647d 100644
--- a/test/e2e/__tests__/__snapshots__/ignore-disables.ts.snap
+++ b/test/e2e/__tests__/__snapshots__/ignore-disables.ts.snap
@@ -10,7 +10,7 @@ Array [
     "message": "Expected \\"#fff\\" to be \\"#FFF\\" (color-hex-case)",
     "range": Object {
       "end": Object {
-        "character": 9,
+        "character": 10,
         "line": 3,
       },
       "start": Object {
@@ -29,7 +29,7 @@ Array [
     "message": "Expected indentation of 4 spaces (indentation)",
     "range": Object {
       "end": Object {
-        "character": 2,
+        "character": 3,
         "line": 3,
       },
       "start": Object {
diff --git a/test/e2e/__tests__/__snapshots__/lint.ts.snap b/test/e2e/__tests__/__snapshots__/lint.ts.snap
index a8f312c..2ae3651 100644
--- a/test/e2e/__tests__/__snapshots__/lint.ts.snap
+++ b/test/e2e/__tests__/__snapshots__/lint.ts.snap
@@ -7,7 +7,7 @@ Array [
     "message": "Bar (plugin/foo-bar)",
     "range": Object {
       "end": Object {
-        "character": 5,
+        "character": 6,
         "line": 0,
       },
       "start": Object {
@@ -26,7 +26,7 @@ Array [
     "message": "Unexpected invalid hex color \\"#y3\\" (color-no-invalid-hex)",
     "range": Object {
       "end": Object {
-        "character": 11,
+        "character": 12,
         "line": 6,
       },
       "start": Object {
@@ -45,7 +45,7 @@ Array [
     "message": "Expected indentation of 4 spaces (indentation)",
     "range": Object {
       "end": Object {
-        "character": 2,
+        "character": 3,
         "line": 2,
       },
       "start": Object {
@@ -69,7 +69,7 @@ Array [
     "message": "Expected indentation of 4 spaces (indentation)",
     "range": Object {
       "end": Object {
-        "character": 2,
+        "character": 3,
         "line": 2,
       },
       "start": Object {
diff --git a/test/e2e/__tests__/__snapshots__/report-invalid-scope-disables.ts.snap b/test/e2e/__tests__/__snapshots__/report-invalid-scope-disables.ts.snap
index 073da6c..e2b55ee 100644
--- a/test/e2e/__tests__/__snapshots__/report-invalid-scope-disables.ts.snap
+++ b/test/e2e/__tests__/__snapshots__/report-invalid-scope-disables.ts.snap
@@ -7,7 +7,7 @@ Array [
     "message": "Rule \\"foo\\" isn't enabled",
     "range": Object {
       "end": Object {
-        "character": 0,
+        "character": 1,
         "line": 0,
       },
       "start": Object {
@@ -23,7 +23,7 @@ Array [
     "message": "Rule \\"foo\\" isn't enabled",
     "range": Object {
       "end": Object {
-        "character": 0,
+        "character": 1,
         "line": 2,
       },
       "start": Object {
@@ -39,7 +39,7 @@ Array [
     "message": "Rule \\"foo\\" isn't enabled",
     "range": Object {
       "end": Object {
-        "character": 0,
+        "character": 1,
         "line": 4,
       },
       "start": Object {
diff --git a/test/e2e/__tests__/__snapshots__/report-needless-disables.ts.snap b/test/e2e/__tests__/__snapshots__/report-needless-disables.ts.snap
index 6ed66c4..5bf7aa0 100644
--- a/test/e2e/__tests__/__snapshots__/report-needless-disables.ts.snap
+++ b/test/e2e/__tests__/__snapshots__/report-needless-disables.ts.snap
@@ -7,7 +7,7 @@ Array [
     "message": "Needless disable for \\"indentation\\"",
     "range": Object {
       "end": Object {
-        "character": 2,
+        "character": 3,
         "line": 2,
       },
       "start": Object {
@@ -23,7 +23,7 @@ Array [
     "message": "Needless disable for \\"indentation\\"",
     "range": Object {
       "end": Object {
-        "character": 0,
+        "character": 1,
         "line": 6,
       },
       "start": Object {
@@ -39,7 +39,7 @@ Array [
     "message": "Needless disable for \\"indentation\\"",
     "range": Object {
       "end": Object {
-        "character": 16,
+        "character": 17,
         "line": 14,
       },
       "start": Object {
@@ -55,7 +55,7 @@ Array [
     "message": "Needless disable for \\"indentation\\"",
     "range": Object {
       "end": Object {
-        "character": 0,
+        "character": 1,
         "line": 17,
       },
       "start": Object {
@@ -71,7 +71,7 @@ Array [
     "message": "Needless disable for \\"unknown\\"",
     "range": Object {
       "end": Object {
-        "character": 2,
+        "character": 3,
         "line": 2,
       },
       "start": Object {
diff --git a/test/e2e/__tests__/__snapshots__/stylelint-resolution.ts.snap b/test/e2e/__tests__/__snapshots__/stylelint-resolution.ts.snap
index 046082b..e2c1b08 100644
--- a/test/e2e/__tests__/__snapshots__/stylelint-resolution.ts.snap
+++ b/test/e2e/__tests__/__snapshots__/stylelint-resolution.ts.snap
@@ -7,7 +7,7 @@ Array [
     "message": "Fake result",
     "range": Object {
       "end": Object {
-        "character": 0,
+        "character": 1,
         "line": 0,
       },
       "start": Object {
@@ -28,7 +28,7 @@ Array [
     "message": "Fake result from yarn-pnp",
     "range": Object {
       "end": Object {
-        "character": 0,
+        "character": 1,
         "line": 0,
       },
       "start": Object {
@@ -49,7 +49,7 @@ Array [
     "message": "Fake result from yarn-2-pnp",
     "range": Object {
       "end": Object {
-        "character": 0,
+        "character": 1,
         "line": 0,
       },
       "start": Object {
@@ -70,7 +70,7 @@ Array [
     "message": "Fake result from resolve-local",
     "range": Object {
       "end": Object {
-        "character": 0,
+        "character": 1,
         "line": 0,
       },
       "start": Object {
diff --git a/test/e2e/__tests__/__snapshots__/validate.ts.snap b/test/e2e/__tests__/__snapshots__/validate.ts.snap
index c0279a4..8827f0d 100644
--- a/test/e2e/__tests__/__snapshots__/validate.ts.snap
+++ b/test/e2e/__tests__/__snapshots__/validate.ts.snap
@@ -10,7 +10,7 @@ Array [
     "message": "Expected indentation of 4 spaces (indentation)",
     "range": Object {
       "end": Object {
-        "character": 2,
+        "character": 3,
         "line": 2,
       },
       "start": Object {
diff --git a/test/integration/stylelint-vscode/__snapshots__/test.ts.snap b/test/integration/stylelint-vscode/__snapshots__/test.ts.snap
index 898341e..6d70696 100644
--- a/test/integration/stylelint-vscode/__snapshots__/test.ts.snap
+++ b/test/integration/stylelint-vscode/__snapshots__/test.ts.snap
@@ -10,7 +10,7 @@ Array [
     "message": "Expected single quotes (string-quotes)",
     "range": Object {
       "end": Object {
-        "character": 7,
+        "character": 8,
         "line": 0,
       },
       "start": Object {
@@ -29,7 +29,7 @@ Array [
     "message": "Expected indentation of 0 tabs (indentation)",
     "range": Object {
       "end": Object {
-        "character": 2,
+        "character": 3,
         "line": 0,
       },
       "start": Object {
@@ -50,7 +50,7 @@ Array [
     "message": "Unknown rule this-rule-does-not-exist.",
     "range": Object {
       "end": Object {
-        "character": 0,
+        "character": 1,
         "line": 0,
       },
       "start": Object {
@@ -66,7 +66,7 @@ Array [
     "message": "Unknown rule this-rule-also-does-not-exist.",
     "range": Object {
       "end": Object {
-        "character": 0,
+        "character": 1,
         "line": 0,
       },
       "start": Object {
@@ -87,7 +87,7 @@ Array [
     "message": "Unclosed block (CssSyntaxError)",
     "range": Object {
       "end": Object {
-        "character": 10,
+        "character": 11,
         "line": 0,
       },
       "start": Object {
@@ -108,7 +108,7 @@ Array [
     "message": "Unclosed bracket (CssSyntaxError)",
     "range": Object {
       "end": Object {
-        "character": 12,
+        "character": 13,
         "line": 0,
       },
       "start": Object {
@@ -129,7 +129,7 @@ Array [
     "message": "At-rule without name (CssSyntaxError)",
     "range": Object {
       "end": Object {
-        "character": 0,
+        "character": 1,
         "line": 0,
       },
       "start": Object {
@@ -155,7 +155,7 @@ Array [
     "message": "Unclosed string (CssSyntaxError)",
     "range": Object {
       "end": Object {
-        "character": 9,
+        "character": 10,
         "line": 0,
       },
       "start": Object {
@@ -179,7 +179,7 @@ Array [
     "message": "Expected numeric font-weight notation (font-weight-notation)",
     "range": Object {
       "end": Object {
-        "character": 29,
+        "character": 30,
         "line": 2,
       },
       "start": Object {
@@ -198,7 +198,7 @@ Array [
     "message": "Expected numeric font-weight notation (font-weight-notation)",
     "range": Object {
       "end": Object {
-        "character": 6,
+        "character": 7,
         "line": 4,
       },
       "start": Object {
@@ -222,7 +222,7 @@ Array [
     "message": "Unexpected unit (length-zero-no-unit)",
     "range": Object {
       "end": Object {
-        "character": 10,
+        "character": 11,
         "line": 3,
       },
       "start": Object {
@@ -247,7 +247,7 @@ Object {
       "message": "Unexpected unknown type selector \\"unknown\\" (selector-type-no-unknown)",
       "range": Object {
         "end": Object {
-          "character": 0,
+          "character": 1,
           "line": 1,
         },
         "start": Object {
@@ -303,7 +303,7 @@ Object {
       "message": "Expected indentation of 2 spaces (indentation)",
       "range": Object {
         "end": Object {
-          "character": 3,
+          "character": 4,
           "line": 1,
         },
         "start": Object {
@@ -326,7 +326,7 @@ Object {
       "message": "Rule \\"foo\\" isn't enabled",
       "range": Object {
         "end": Object {
-          "character": 0,
+          "character": 1,
           "line": 1,
         },
         "start": Object {
@@ -342,7 +342,7 @@ Object {
       "message": "Rule \\"foo\\" isn't enabled",
       "range": Object {
         "end": Object {
-          "character": 0,
+          "character": 1,
           "line": 3,
         },
         "start": Object {
@@ -358,7 +358,7 @@ Object {
       "message": "Rule \\"foo\\" isn't enabled",
       "range": Object {
         "end": Object {
-          "character": 0,
+          "character": 1,
           "line": 5,
         },
         "start": Object {
@@ -384,7 +384,7 @@ Object {
       "message": "Expected indentation of 4 spaces (indentation)",
       "range": Object {
         "end": Object {
-          "character": 2,
+          "character": 3,
           "line": 2,
         },
         "start": Object {
@@ -400,7 +400,7 @@ Object {
       "message": "Needless disable for \\"indentation\\"",
       "range": Object {
         "end": Object {
-          "character": 2,
+          "character": 3,
           "line": 2,
         },
         "start": Object {
@@ -416,7 +416,7 @@ Object {
       "message": "Needless disable for \\"indentation\\"",
       "range": Object {
         "end": Object {
-          "character": 0,
+          "character": 1,
           "line": 6,
         },
         "start": Object {
@@ -432,7 +432,7 @@ Object {
       "message": "Needless disable for \\"indentation\\"",
       "range": Object {
         "end": Object {
-          "character": 16,
+          "character": 17,
           "line": 13,
         },
         "start": Object {
@@ -448,7 +448,7 @@ Object {
       "message": "Needless disable for \\"indentation\\"",
       "range": Object {
         "end": Object {
-          "character": 0,
+          "character": 1,
           "line": 16,
         },
         "start": Object {
@@ -471,7 +471,7 @@ Object {
       "message": "Fake result",
       "range": Object {
         "end": Object {
-          "character": 0,
+          "character": 1,
           "line": 0,
         },
         "start": Object {
@@ -497,7 +497,7 @@ Object {
       "message": "Expected indentation of 2 spaces (indentation)",
       "range": Object {
         "end": Object {
-          "character": 3,
+          "character": 4,
           "line": 1,
         },
         "start": Object {