@herb-tools/language-server 0.8.10 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/action_view_helpers.js +19 -0
  2. package/dist/action_view_helpers.js.map +1 -0
  3. package/dist/autofix_service.js +1 -1
  4. package/dist/autofix_service.js.map +1 -1
  5. package/dist/code_action_service.js +3 -6
  6. package/dist/code_action_service.js.map +1 -1
  7. package/dist/comment_ast_utils.js +206 -0
  8. package/dist/comment_ast_utils.js.map +1 -0
  9. package/dist/comment_service.js +175 -0
  10. package/dist/comment_service.js.map +1 -0
  11. package/dist/diagnostics.js +0 -233
  12. package/dist/diagnostics.js.map +1 -1
  13. package/dist/document_highlight_service.js +196 -0
  14. package/dist/document_highlight_service.js.map +1 -0
  15. package/dist/document_save_service.js +16 -6
  16. package/dist/document_save_service.js.map +1 -1
  17. package/dist/folding_range_service.js +209 -0
  18. package/dist/folding_range_service.js.map +1 -0
  19. package/dist/formatting_service.js +4 -4
  20. package/dist/formatting_service.js.map +1 -1
  21. package/dist/herb-language-server.js +152936 -41156
  22. package/dist/herb-language-server.js.map +1 -1
  23. package/dist/hover_service.js +70 -0
  24. package/dist/hover_service.js.map +1 -0
  25. package/dist/index.cjs +1299 -333
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.js +4 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/line_context_collector.js +73 -0
  30. package/dist/line_context_collector.js.map +1 -0
  31. package/dist/linter_service.js +27 -6
  32. package/dist/linter_service.js.map +1 -1
  33. package/dist/parser_service.js +6 -5
  34. package/dist/parser_service.js.map +1 -1
  35. package/dist/range_utils.js +65 -0
  36. package/dist/range_utils.js.map +1 -0
  37. package/dist/rewrite_code_action_service.js +135 -0
  38. package/dist/rewrite_code_action_service.js.map +1 -0
  39. package/dist/server.js +39 -2
  40. package/dist/server.js.map +1 -1
  41. package/dist/service.js +10 -0
  42. package/dist/service.js.map +1 -1
  43. package/dist/types/action_view_helpers.d.ts +5 -0
  44. package/dist/types/comment_ast_utils.d.ts +20 -0
  45. package/dist/types/comment_service.d.ts +14 -0
  46. package/dist/types/diagnostics.d.ts +1 -35
  47. package/dist/types/document_highlight_service.d.ts +28 -0
  48. package/dist/types/document_save_service.d.ts +8 -0
  49. package/dist/types/folding_range_service.d.ts +35 -0
  50. package/dist/types/formatting_service.d.ts +1 -1
  51. package/dist/types/hover_service.d.ts +8 -0
  52. package/dist/types/index.d.ts +4 -0
  53. package/dist/types/line_context_collector.d.ts +19 -0
  54. package/dist/types/linter_service.d.ts +1 -0
  55. package/dist/types/parser_service.d.ts +2 -1
  56. package/dist/types/range_utils.d.ts +16 -0
  57. package/dist/types/rewrite_code_action_service.d.ts +11 -0
  58. package/dist/types/service.d.ts +10 -0
  59. package/dist/types/utils.d.ts +4 -8
  60. package/dist/utils.js +10 -15
  61. package/dist/utils.js.map +1 -1
  62. package/package.json +10 -5
  63. package/src/action_view_helpers.ts +23 -0
  64. package/src/autofix_service.ts +1 -1
  65. package/src/code_action_service.ts +3 -6
  66. package/src/comment_ast_utils.ts +282 -0
  67. package/src/comment_service.ts +228 -0
  68. package/src/diagnostics.ts +1 -305
  69. package/src/document_highlight_service.ts +267 -0
  70. package/src/document_save_service.ts +19 -7
  71. package/src/folding_range_service.ts +287 -0
  72. package/src/formatting_service.ts +4 -4
  73. package/src/hover_service.ts +90 -0
  74. package/src/index.ts +4 -0
  75. package/src/line_context_collector.ts +97 -0
  76. package/src/linter_service.ts +35 -9
  77. package/src/parser_service.ts +9 -10
  78. package/src/range_utils.ts +90 -0
  79. package/src/rewrite_code_action_service.ts +165 -0
  80. package/src/server.ts +54 -2
  81. package/src/service.ts +15 -0
  82. package/src/utils.ts +12 -21
@@ -1,6 +1,3 @@
1
- import { DiagnosticSeverity, DiagnosticTag } from "vscode-languageserver/node";
2
- import { Visitor } from "@herb-tools/core";
3
- import { isHTMLTextNode } from "@herb-tools/core";
4
1
  export class Diagnostics {
5
2
  constructor(connection, documentService, parserService, linterService, configService) {
6
3
  this.diagnostics = new Map();
@@ -18,21 +15,14 @@ export class Diagnostics {
18
15
  else {
19
16
  const parseResult = this.parserService.parseDocument(textDocument);
20
17
  const lintResult = await this.linterService.lintDocument(textDocument);
21
- const unreachableCodeDiagnostics = this.getUnreachableCodeDiagnostics(parseResult.document);
22
18
  allDiagnostics = [
23
19
  ...parseResult.diagnostics,
24
20
  ...lintResult.diagnostics,
25
- ...unreachableCodeDiagnostics,
26
21
  ];
27
22
  }
28
23
  this.diagnostics.set(textDocument, allDiagnostics);
29
24
  this.sendDiagnosticsFor(textDocument);
30
25
  }
31
- getUnreachableCodeDiagnostics(document) {
32
- const collector = new UnreachableCodeCollector();
33
- collector.visit(document);
34
- return collector.diagnostics;
35
- }
36
26
  async refreshDocument(document) {
37
27
  await this.validate(document);
38
28
  }
@@ -49,227 +39,4 @@ export class Diagnostics {
49
39
  this.diagnostics.delete(textDocument);
50
40
  }
51
41
  }
52
- export class UnreachableCodeCollector extends Visitor {
53
- constructor() {
54
- super(...arguments);
55
- this.diagnostics = [];
56
- this.processedIfNodes = new Set();
57
- this.processedElseNodes = new Set();
58
- }
59
- visitERBCaseNode(node) {
60
- this.checkUnreachableChildren(node.children);
61
- this.checkAndMarkElseClause(node.else_clause);
62
- this.visitChildNodes(node);
63
- }
64
- visitERBCaseMatchNode(node) {
65
- this.checkUnreachableChildren(node.children);
66
- this.checkAndMarkElseClause(node.else_clause);
67
- this.visitChildNodes(node);
68
- }
69
- visitERBIfNode(node) {
70
- if (this.processedIfNodes.has(node)) {
71
- return;
72
- }
73
- this.markIfChainAsProcessed(node);
74
- this.markElseNodesInIfChain(node);
75
- const entireChainEmpty = this.isEntireIfChainEmpty(node);
76
- if (entireChainEmpty) {
77
- this.checkEmptyStatements(node, node.statements, "if");
78
- }
79
- else {
80
- this.checkIfChainParts(node);
81
- }
82
- this.visitChildNodes(node);
83
- }
84
- visitERBElseNode(node) {
85
- if (this.processedElseNodes.has(node)) {
86
- this.visitChildNodes(node);
87
- return;
88
- }
89
- this.checkEmptyStatements(node, node.statements, "else");
90
- this.visitChildNodes(node);
91
- }
92
- visitERBUnlessNode(node) {
93
- const unlessHasContent = this.statementsHaveContent(node.statements);
94
- const elseHasContent = node.else_clause && this.statementsHaveContent(node.else_clause.statements);
95
- if (node.else_clause) {
96
- this.processedElseNodes.add(node.else_clause);
97
- }
98
- const entireBlockEmpty = !unlessHasContent && !elseHasContent;
99
- if (entireBlockEmpty) {
100
- this.checkEmptyStatements(node, node.statements, "unless");
101
- }
102
- else {
103
- if (!unlessHasContent) {
104
- this.checkEmptyStatementsWithEndLocation(node, node.statements, "unless", node.else_clause);
105
- }
106
- if (node.else_clause && !elseHasContent) {
107
- this.checkEmptyStatements(node.else_clause, node.else_clause.statements, "else");
108
- }
109
- }
110
- this.visitChildNodes(node);
111
- }
112
- visitERBForNode(node) {
113
- this.checkEmptyStatements(node, node.statements, "for");
114
- this.visitChildNodes(node);
115
- }
116
- visitERBWhileNode(node) {
117
- this.checkEmptyStatements(node, node.statements, "while");
118
- this.visitChildNodes(node);
119
- }
120
- visitERBUntilNode(node) {
121
- this.checkEmptyStatements(node, node.statements, "until");
122
- this.visitChildNodes(node);
123
- }
124
- visitERBWhenNode(node) {
125
- if (!node.then_keyword) {
126
- this.checkEmptyStatements(node, node.statements, "when");
127
- }
128
- this.visitChildNodes(node);
129
- }
130
- visitERBBeginNode(node) {
131
- this.checkEmptyStatements(node, node.statements, "begin");
132
- this.visitChildNodes(node);
133
- }
134
- visitERBRescueNode(node) {
135
- this.checkEmptyStatements(node, node.statements, "rescue");
136
- this.visitChildNodes(node);
137
- }
138
- visitERBEnsureNode(node) {
139
- this.checkEmptyStatements(node, node.statements, "ensure");
140
- this.visitChildNodes(node);
141
- }
142
- visitERBBlockNode(node) {
143
- this.checkEmptyStatements(node, node.body, "block");
144
- this.visitChildNodes(node);
145
- }
146
- visitERBInNode(node) {
147
- if (!node.then_keyword) {
148
- this.checkEmptyStatements(node, node.statements, "in");
149
- }
150
- this.visitChildNodes(node);
151
- }
152
- checkUnreachableChildren(children) {
153
- for (const child of children) {
154
- if (isHTMLTextNode(child) && child.content.trim() === "") {
155
- continue;
156
- }
157
- this.addDiagnostic(child.location, "Unreachable code: content between case and when/in is never executed");
158
- }
159
- }
160
- checkEmptyStatements(node, statements, blockType) {
161
- this.checkEmptyStatementsWithEndLocation(node, statements, blockType, null);
162
- }
163
- checkEmptyStatementsWithEndLocation(node, statements, blockType, subsequentNode) {
164
- if (this.statementsHaveContent(statements)) {
165
- return;
166
- }
167
- const startLocation = node.location.start;
168
- const endLocation = subsequentNode
169
- ? subsequentNode.location.start
170
- : node.location.end;
171
- this.addDiagnostic({ start: startLocation, end: endLocation }, `Empty ${blockType} block: this control flow statement has no content`);
172
- }
173
- addDiagnostic(location, message) {
174
- const diagnostic = {
175
- range: {
176
- start: {
177
- line: this.toZeroBased(location.start.line),
178
- character: location.start.column
179
- },
180
- end: {
181
- line: this.toZeroBased(location.end.line),
182
- character: location.end.column
183
- }
184
- },
185
- message,
186
- severity: DiagnosticSeverity.Hint,
187
- tags: [DiagnosticTag.Unnecessary],
188
- source: "Herb Language Server"
189
- };
190
- this.diagnostics.push(diagnostic);
191
- }
192
- statementsHaveContent(statements) {
193
- return statements.some(statement => {
194
- if (isHTMLTextNode(statement)) {
195
- return statement.content.trim() !== "";
196
- }
197
- return true;
198
- });
199
- }
200
- checkAndMarkElseClause(elseClause) {
201
- if (!elseClause) {
202
- return;
203
- }
204
- this.processedElseNodes.add(elseClause);
205
- if (!this.statementsHaveContent(elseClause.statements)) {
206
- this.checkEmptyStatements(elseClause, elseClause.statements, "else");
207
- }
208
- }
209
- markIfChainAsProcessed(node) {
210
- this.processedIfNodes.add(node);
211
- this.traverseSubsequentNodes(node.subsequent, (current) => {
212
- if (current.type === 'AST_ERB_IF_NODE') {
213
- this.processedIfNodes.add(current);
214
- }
215
- });
216
- }
217
- markElseNodesInIfChain(node) {
218
- this.traverseSubsequentNodes(node.subsequent, (current) => {
219
- if (current.type === 'AST_ERB_ELSE_NODE') {
220
- this.processedElseNodes.add(current);
221
- }
222
- });
223
- }
224
- traverseSubsequentNodes(startNode, callback) {
225
- let current = startNode;
226
- while (current) {
227
- callback(current);
228
- if ('subsequent' in current) {
229
- current = current.subsequent;
230
- }
231
- else {
232
- break;
233
- }
234
- }
235
- }
236
- checkIfChainParts(node) {
237
- if (!this.statementsHaveContent(node.statements)) {
238
- this.checkEmptyStatementsWithEndLocation(node, node.statements, "if", node.subsequent);
239
- }
240
- this.traverseSubsequentNodes(node.subsequent, (current) => {
241
- if (!('statements' in current) || !Array.isArray(current.statements)) {
242
- return;
243
- }
244
- if (this.statementsHaveContent(current.statements)) {
245
- return;
246
- }
247
- const blockType = current.type === 'AST_ERB_IF_NODE' ? 'elsif' : 'else';
248
- const nextSubsequent = 'subsequent' in current ? current.subsequent : null;
249
- if (nextSubsequent) {
250
- this.checkEmptyStatementsWithEndLocation(current, current.statements, blockType, nextSubsequent);
251
- }
252
- else {
253
- this.checkEmptyStatements(current, current.statements, blockType);
254
- }
255
- });
256
- }
257
- isEntireIfChainEmpty(node) {
258
- if (this.statementsHaveContent(node.statements)) {
259
- return false;
260
- }
261
- let hasContent = false;
262
- this.traverseSubsequentNodes(node.subsequent, (current) => {
263
- if ('statements' in current && Array.isArray(current.statements)) {
264
- if (this.statementsHaveContent(current.statements)) {
265
- hasContent = true;
266
- }
267
- }
268
- });
269
- return !hasContent;
270
- }
271
- toZeroBased(line) {
272
- return line - 1;
273
- }
274
- }
275
42
  //# sourceMappingURL=diagnostics.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,WAAW;IAQtB,YACE,UAAsB,EACtB,eAAgC,EAChC,aAA4B,EAC5B,aAA4B,EAC5B,aAA4B;QAPtB,gBAAW,GAAoC,IAAI,GAAG,EAAE,CAAA;QAS9D,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;QACtC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,YAA0B;QACvC,IAAI,cAAc,GAAiB,EAAE,CAAA;QAErC,IAAI,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,cAAc,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAA;QAC1E,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,YAAY,CAAC,CAAA;YAClE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,YAAY,CAAC,CAAA;YAEtE,cAAc,GAAG;gBACf,GAAG,WAAW,CAAC,WAAW;gBAC1B,GAAG,UAAU,CAAC,WAAW;aAC1B,CAAA;QACH,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,CAAA;QAClD,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,QAAsB;QAC1C,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAA;QAC/C,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC9E,CAAC;IAEO,kBAAkB,CAAC,YAA0B;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAA;QAE5D,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAC9B,GAAG,EAAE,YAAY,CAAC,GAAG;YACrB,WAAW;SACZ,CAAC,CAAA;QAEF,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IACvC,CAAC;CACF"}
@@ -0,0 +1,196 @@
1
+ import { DocumentHighlight, DocumentHighlightKind } from "vscode-languageserver/node";
2
+ import { Visitor } from "@herb-tools/core";
3
+ import { isERBIfNode, isERBElseNode, isHTMLOpenTagNode } from "@herb-tools/core";
4
+ import { erbTagToRange, tokenToRange, nodeToRange, openTagRanges, isPositionInRange, rangeSize } from "./range_utils";
5
+ export class DocumentHighlightCollector extends Visitor {
6
+ constructor() {
7
+ super(...arguments);
8
+ this.groups = [];
9
+ this.processedIfNodes = new Set();
10
+ }
11
+ visitERBNode(node) {
12
+ if ('end_node' in node && node.end_node) {
13
+ this.addGroup([erbTagToRange(node), erbTagToRange(node.end_node)]);
14
+ }
15
+ }
16
+ visitERBContentNode(node) {
17
+ this.addGroup([tokenToRange(node.tag_opening), tokenToRange(node.tag_closing)]);
18
+ this.visitChildNodes(node);
19
+ }
20
+ visitHTMLCommentNode(node) {
21
+ this.addGroup([tokenToRange(node.comment_start), tokenToRange(node.comment_end)]);
22
+ this.visitChildNodes(node);
23
+ }
24
+ visitHTMLElementNode(node) {
25
+ const ranges = [];
26
+ if (node.open_tag && isHTMLOpenTagNode(node.open_tag)) {
27
+ ranges.push(...openTagRanges(node.open_tag));
28
+ }
29
+ else if (node.open_tag) {
30
+ ranges.push(nodeToRange(node.open_tag));
31
+ }
32
+ if (node.close_tag) {
33
+ ranges.push(nodeToRange(node.close_tag));
34
+ }
35
+ this.addGroup(ranges);
36
+ this.visitChildNodes(node);
37
+ }
38
+ visitHTMLAttributeNode(node) {
39
+ const ranges = [];
40
+ if (node.name) {
41
+ ranges.push(nodeToRange(node.name));
42
+ }
43
+ if (node.equals) {
44
+ ranges.push(tokenToRange(node.equals));
45
+ }
46
+ if (node.value) {
47
+ ranges.push(nodeToRange(node.value));
48
+ }
49
+ this.addGroup(ranges);
50
+ this.visitChildNodes(node);
51
+ }
52
+ visitHTMLConditionalElementNode(node) {
53
+ const ranges = [];
54
+ if (node.open_conditional) {
55
+ ranges.push(erbTagToRange(node.open_conditional));
56
+ }
57
+ if (node.open_tag) {
58
+ ranges.push(...openTagRanges(node.open_tag));
59
+ }
60
+ if (node.close_tag) {
61
+ ranges.push(nodeToRange(node.close_tag));
62
+ }
63
+ if (node.close_conditional) {
64
+ ranges.push(erbTagToRange(node.close_conditional));
65
+ }
66
+ this.addGroup(ranges);
67
+ this.visitChildNodes(node);
68
+ }
69
+ visitERBIfNode(node) {
70
+ if (this.processedIfNodes.has(node)) {
71
+ this.visitChildNodes(node);
72
+ return;
73
+ }
74
+ this.markIfChainAsProcessed(node);
75
+ const ranges = [];
76
+ ranges.push(erbTagToRange(node));
77
+ let current = node.subsequent;
78
+ while (current) {
79
+ if (isERBIfNode(current)) {
80
+ ranges.push(erbTagToRange(current));
81
+ current = current.subsequent;
82
+ }
83
+ else if (isERBElseNode(current)) {
84
+ ranges.push(erbTagToRange(current));
85
+ break;
86
+ }
87
+ else {
88
+ break;
89
+ }
90
+ }
91
+ if (node.end_node) {
92
+ ranges.push(erbTagToRange(node.end_node));
93
+ }
94
+ this.addGroup(ranges);
95
+ this.visitChildNodes(node);
96
+ }
97
+ visitERBUnlessNode(node) {
98
+ const ranges = [];
99
+ ranges.push(erbTagToRange(node));
100
+ if (node.else_clause) {
101
+ ranges.push(erbTagToRange(node.else_clause));
102
+ }
103
+ if (node.end_node) {
104
+ ranges.push(erbTagToRange(node.end_node));
105
+ }
106
+ this.addGroup(ranges);
107
+ this.visitChildNodes(node);
108
+ }
109
+ visitERBCaseNode(node) {
110
+ this.visitERBAnyCaseNode(node);
111
+ }
112
+ visitERBCaseMatchNode(node) {
113
+ this.visitERBAnyCaseNode(node);
114
+ }
115
+ visitERBAnyCaseNode(node) {
116
+ const ranges = [];
117
+ ranges.push(erbTagToRange(node));
118
+ for (const condition of node.conditions) {
119
+ ranges.push(erbTagToRange(condition));
120
+ }
121
+ if (node.else_clause) {
122
+ ranges.push(erbTagToRange(node.else_clause));
123
+ }
124
+ if (node.end_node) {
125
+ ranges.push(erbTagToRange(node.end_node));
126
+ }
127
+ this.addGroup(ranges);
128
+ this.visitChildNodes(node);
129
+ }
130
+ visitERBBeginNode(node) {
131
+ const ranges = [];
132
+ ranges.push(erbTagToRange(node));
133
+ let rescue = node.rescue_clause;
134
+ while (rescue) {
135
+ ranges.push(erbTagToRange(rescue));
136
+ rescue = rescue.subsequent;
137
+ }
138
+ if (node.else_clause) {
139
+ ranges.push(erbTagToRange(node.else_clause));
140
+ }
141
+ if (node.ensure_clause) {
142
+ ranges.push(erbTagToRange(node.ensure_clause));
143
+ }
144
+ if (node.end_node) {
145
+ ranges.push(erbTagToRange(node.end_node));
146
+ }
147
+ this.addGroup(ranges);
148
+ this.visitChildNodes(node);
149
+ }
150
+ markIfChainAsProcessed(node) {
151
+ this.processedIfNodes.add(node);
152
+ let current = node.subsequent;
153
+ while (current) {
154
+ if (isERBIfNode(current)) {
155
+ this.processedIfNodes.add(current);
156
+ current = current.subsequent;
157
+ }
158
+ else {
159
+ break;
160
+ }
161
+ }
162
+ }
163
+ addGroup(ranges) {
164
+ const filtered = ranges.filter((r) => r !== null);
165
+ if (filtered.length >= 2) {
166
+ this.groups.push(filtered);
167
+ }
168
+ }
169
+ }
170
+ export class DocumentHighlightService {
171
+ constructor(parserService) {
172
+ this.parserService = parserService;
173
+ }
174
+ getDocumentHighlights(textDocument, position) {
175
+ const parseResult = this.parserService.parseDocument(textDocument);
176
+ const collector = new DocumentHighlightCollector();
177
+ collector.visit(parseResult.document);
178
+ let bestGroup = null;
179
+ let bestSize = Infinity;
180
+ for (const group of collector.groups) {
181
+ const matchingRange = group.find(range => isPositionInRange(position, range));
182
+ if (matchingRange) {
183
+ const size = rangeSize(matchingRange);
184
+ if (size < bestSize) {
185
+ bestSize = size;
186
+ bestGroup = group;
187
+ }
188
+ }
189
+ }
190
+ if (bestGroup) {
191
+ return bestGroup.map(range => DocumentHighlight.create(range, DocumentHighlightKind.Text));
192
+ }
193
+ return [];
194
+ }
195
+ }
196
+ //# sourceMappingURL=document_highlight_service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document_highlight_service.js","sourceRoot":"","sources":["../src/document_highlight_service.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,13 @@
1
1
  export class DocumentSaveService {
2
2
  constructor(connection, settings, autofixService, formattingService) {
3
+ /**
4
+ * Tracks documents that were recently autofixed via applyFixesAndFormatting
5
+ * (triggered by onDocumentFormatting). When editor.formatOnSave is enabled,
6
+ * onDocumentFormatting fires BEFORE willSaveWaitUntil. If applyFixesAndFormatting
7
+ * already applied autofix, applyFixes must skip to avoid conflicting edits
8
+ * (since this.documents hasn't been updated between the two events).
9
+ */
10
+ this.recentlyAutofixedViaFormatting = new Set();
3
11
  this.connection = connection;
4
12
  this.settings = settings;
5
13
  this.autofixService = autofixService;
@@ -16,6 +24,10 @@ export class DocumentSaveService {
16
24
  this.connection.console.log(`[DocumentSave] applyFixes fixOnSave=${fixOnSave}`);
17
25
  if (!fixOnSave)
18
26
  return [];
27
+ if (this.recentlyAutofixedViaFormatting.delete(document.uri)) {
28
+ this.connection.console.log(`[DocumentSave] applyFixes skipping: already autofixed via formatting`);
29
+ return [];
30
+ }
19
31
  return this.autofixService.autofix(document);
20
32
  }
21
33
  /**
@@ -31,18 +43,16 @@ export class DocumentSaveService {
31
43
  let autofixEdits = [];
32
44
  if (fixOnSave) {
33
45
  autofixEdits = await this.autofixService.autofix(document);
46
+ if (autofixEdits.length > 0) {
47
+ this.recentlyAutofixedViaFormatting.add(document.uri);
48
+ }
34
49
  }
35
50
  if (!formatterEnabled)
36
51
  return autofixEdits;
37
52
  if (autofixEdits.length === 0) {
38
53
  return this.formattingService.formatOnSave(document, reason);
39
54
  }
40
- const autofixedDocument = {
41
- ...document,
42
- uri: document.uri,
43
- getText: () => autofixEdits[0].newText,
44
- };
45
- return this.formattingService.formatOnSave(autofixedDocument, reason);
55
+ return this.formattingService.formatOnSave(document, reason, autofixEdits[0].newText);
46
56
  }
47
57
  }
48
58
  //# sourceMappingURL=document_save_service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"document_save_service.js","sourceRoot":"","sources":["../src/document_save_service.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,mBAAmB;IAM9B,YAAY,UAAsB,EAAE,QAAkB,EAAE,cAA8B,EAAE,iBAAoC;QAC1H,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAA;QACpC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAA;IAC5C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,QAAsB;;QACrC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACtE,MAAM,SAAS,GAAG,CAAA,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,0CAAE,SAAS,MAAK,KAAK,CAAA;QAEvD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,uCAAuC,SAAS,EAAE,CAAC,CAAA;QAE/E,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAA;QAEzB,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC9C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,uBAAuB,CAAC,QAAsB,EAAE,MAA8B;;QAClF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACtE,MAAM,SAAS,GAAG,CAAA,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,0CAAE,SAAS,MAAK,KAAK,CAAA;QACvD,MAAM,gBAAgB,GAAG,MAAA,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,SAAS,0CAAE,OAAO,mCAAI,KAAK,CAAA;QAE9D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,oDAAoD,SAAS,sBAAsB,gBAAgB,EAAE,CAAC,CAAA;QAElI,IAAI,YAAY,GAAe,EAAE,CAAA;QAEjC,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAC5D,CAAC;QAED,IAAI,CAAC,gBAAgB;YAAE,OAAO,YAAY,CAAA;QAE1C,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC9D,CAAC;QAED,MAAM,iBAAiB,GAAiB;YACtC,GAAG,QAAQ;YACX,GAAG,EAAE,QAAQ,CAAC,GAAG;YACjB,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO;SACvC,CAAA;QAED,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;IACvE,CAAC;CACF"}
1
+ {"version":3,"file":"document_save_service.js","sourceRoot":"","sources":["../src/document_save_service.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,mBAAmB;IAe9B,YAAY,UAAsB,EAAE,QAAkB,EAAE,cAA8B,EAAE,iBAAoC;QAT5H;;;;;;WAMG;QACK,mCAA8B,GAAG,IAAI,GAAG,EAAU,CAAA;QAGxD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAA;QACpC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAA;IAC5C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,QAAsB;;QACrC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACtE,MAAM,SAAS,GAAG,CAAA,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,0CAAE,SAAS,MAAK,KAAK,CAAA;QAEvD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,uCAAuC,SAAS,EAAE,CAAC,CAAA;QAE/E,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAA;QAEzB,IAAI,IAAI,CAAC,8BAA8B,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAA;YACnG,OAAO,EAAE,CAAA;QACX,CAAC;QAED,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC9C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,uBAAuB,CAAC,QAAsB,EAAE,MAA8B;;QAClF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACtE,MAAM,SAAS,GAAG,CAAA,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,0CAAE,SAAS,MAAK,KAAK,CAAA;QACvD,MAAM,gBAAgB,GAAG,MAAA,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,SAAS,0CAAE,OAAO,mCAAI,KAAK,CAAA;QAE9D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,oDAAoD,SAAS,sBAAsB,gBAAgB,EAAE,CAAC,CAAA;QAElI,IAAI,YAAY,GAAe,EAAE,CAAA;QAEjC,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;YAE1D,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,8BAA8B,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;YACvD,CAAC;QACH,CAAC;QAED,IAAI,CAAC,gBAAgB;YAAE,OAAO,YAAY,CAAA;QAE1C,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC9D,CAAC;QAED,OAAO,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IACvF,CAAC;CACF"}