Skip to content

Commit 2b84cfb

Browse files
committed
Incrementally reparse regex nodes
1 parent 3bf3d91 commit 2b84cfb

File tree

7 files changed

+180
-121
lines changed

7 files changed

+180
-121
lines changed

src/DiagnosticCollection.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ function Diagnostics(document: vscode.TextDocument) {
163163
type == ',' ?
164164
new vscode.Range(
165165
toPosition(node.previousSibling.endPosition),
166-
toPosition(node.previousSibling.endPosition)
166+
toPosition(node.previousSibling.endPosition),
167167
)
168168
: range,
169169
message: `'${parentType}' is missing character${type.length > 1 ? 's' : ''} '${type}'`,
@@ -184,8 +184,13 @@ function Diagnostics(document: vscode.TextDocument) {
184184
// vscode.window.showInformationMessage(JSON.stringify("diagnostics Regex"));
185185
// const start = performance.now();
186186
const regexTrees = trees.regexTrees;
187-
for (const id in regexTrees) {
188-
const tree = regexTrees[id];
187+
for (const tree of regexTrees.values()) {
188+
// diagnostics.push({
189+
// range: toRange(tree.rootNode),
190+
// message: tree.rootNode.text,
191+
// severity: vscode.DiagnosticSeverity.Information,
192+
// source: 'regex',
193+
// });
189194
// vscode.window.showInformationMessage(JSON.stringify(tree.rootNode.toString()));
190195

191196
const queryString = `;scm
@@ -303,11 +308,11 @@ function Diagnostics(document: vscode.TextDocument) {
303308
// const start = performance.now();
304309
const regexNodes = trees.regexNodes;
305310

306-
for (const id in regexNodes) {
307-
const regexNode = regexNodes[id];
311+
for (const regexNode of regexNodes.values()) {
308312
const text = regexNode.text;
309313
const key = regexNode.previousNamedSibling;
310314
if (!key) { // `previousNamedSibling` is broken on 0width nodes
315+
vscode.window.showInformationMessage("0width broken!!");
311316
continue;
312317
}
313318

src/Providers/CodeActionsProvider.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export const CodeActionsProvider: vscode.CodeActionProvider = {
1414
provideCodeActions(document: vscode.TextDocument, range: vscode.Range | vscode.Selection, context: vscode.CodeActionContext, token: vscode.CancellationToken): vscode.CodeAction[] {
1515
// vscode.window.showInformationMessage(JSON.stringify("CodeActions"));
1616
// vscode.window.showInformationMessage(JSON.stringify(context));
17+
// const start = performance.now();
1718

1819
const codeActions: vscode.CodeAction[] = [];
1920
let codeAction: CodeAction;
@@ -87,15 +88,14 @@ export const CodeActionsProvider: vscode.CodeActionProvider = {
8788

8889
const trees = getTrees(document);
8990
const regexNodes = trees.regexNodes;
90-
for (const key in regexNodes) {
91-
const regexNode = regexNodes[key];
91+
for (const regexNode of regexNodes.values()) {
9292
const parentRange = toRange(trueParent(regexNode));
9393
if (parentRange.intersection(range)) {
9494
codeAction = {
9595
title: `Minify Regex`,
9696
kind: vscode.CodeActionKind.RefactorRewrite.append("minify"),
9797
document: document,
98-
nodeId: <number><unknown>key, // why?
98+
nodeId: regexNode.id,
9999
};
100100
codeActions.push(codeAction);
101101
minifyRegex = true;
@@ -112,10 +112,12 @@ export const CodeActionsProvider: vscode.CodeActionProvider = {
112112
}
113113

114114
// vscode.window.showInformationMessage(JSON.stringify(codeActions));
115+
// vscode.window.showInformationMessage(`codeActions ${performance.now() - start}ms`);
115116
return codeActions;
116117
},
117118
resolveCodeAction(codeAction: CodeAction, token: vscode.CancellationToken): vscode.CodeAction {
118119
// vscode.window.showInformationMessage(JSON.stringify(codeAction));
120+
// const start = performance.now();
119121
const document = codeAction.document;
120122
const uri = document.uri;
121123

@@ -126,24 +128,23 @@ export const CodeActionsProvider: vscode.CodeActionProvider = {
126128
const id = codeAction.nodeId;
127129

128130
if (id == -1) {
129-
for (const key in regexTrees) {
130-
const regexTree = regexTrees[key];
131+
for (const regexTree of regexTrees.values()) {
131132
const rootNode = regexTree.rootNode;
132133
rootNodes.push(rootNode);
133134
}
134135
}
135136
else {
136137
const regexNodes = trees.regexNodes;
137-
const jsonNode = regexNodes[id];
138-
const regexTree = regexTrees[jsonNode.id];
138+
const jsonNode = regexNodes.get(id);
139+
const regexTree = regexTrees.get(jsonNode.id);
139140
const rootNode = regexTree.rootNode;
140141
rootNodes.push(rootNode);
141142
}
142143

143144
const edit = new vscode.WorkspaceEdit;
144145

145146
for (const rootNode of rootNodes) {
146-
const minifyQuery = `
147+
const minifyQuery = `;scm
147148
(backslash) @backslash
148149
(comment_group) @comment
149150
(comment_extended) @comment
@@ -300,6 +301,7 @@ export const CodeActionsProvider: vscode.CodeActionProvider = {
300301

301302
// vscode.window.showInformationMessage(JSON.stringify(edit));
302303
codeAction.edit = edit;
304+
// vscode.window.showInformationMessage(`codeAction ${performance.now() - start}ms`);
303305
return codeAction;
304306
},
305307
};

src/Providers/CompletionItemProvider.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export const CompletionItemProvider: vscode.CompletionItemProvider = {
2727
const rootNode = tree.rootNode;
2828
const point = toPoint(position);
2929

30-
const cursorQuery = `
30+
const cursorQuery = `;scm
3131
(schema (value) @schema)
3232
(scopeName (value) @scopeName)
3333
(name_display (value) @name)
@@ -319,7 +319,7 @@ export const CompletionItemProvider: vscode.CompletionItemProvider = {
319319
}
320320

321321
const scopes: string[] = [];
322-
const scopeQuery = `
322+
const scopeQuery = `;scm
323323
(name (value (scope) @scope (.not-match? @scope "^(\\\\$0*[0-9]{1,3})+$")))
324324
(contentName (value (scope) @scope (.not-match? @scope "^(\\\\$0*[0-9]{1,3})+$")))
325325
`;
@@ -359,9 +359,9 @@ export const CompletionItemProvider: vscode.CompletionItemProvider = {
359359

360360
break;
361361
case 'regex':
362-
const regexRootNode = trees.regexTrees[cursorNode.id].rootNode;
362+
const regexRootNode = trees.regexTrees.get(cursorNode.id).rootNode;
363363

364-
const regexQuery = `
364+
const regexQuery = `;scm
365365
(character_property (character_property_name) @property)
366366
`;
367367
const regexCapture = queryNode(regexRootNode, regexQuery, point);

src/Providers/DefinitionProvider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ function pushDefinitionLink(definitions: vscode.LocationLink[], node: SyntaxNode
377377

378378
function getCaptureRefs(trees: trees, node: SyntaxNode, position: vscode.Position) {
379379
const regexTrees = trees.regexTrees;
380-
const regexNode = regexTrees[node.id]?.rootNode;
380+
const regexNode = regexTrees.get(node.id)?.rootNode;
381381

382382
const captureGroupQuery = `;scm
383383
(capture_group) @group
@@ -439,7 +439,7 @@ function getRegexGroup(trees: trees, parentNode: SyntaxNode, captureNode: Syntax
439439
}
440440
const regexTrees = trees.regexTrees;
441441
const id = node.childForFieldName('regex').id;
442-
const regexNode = regexTrees[id]?.rootNode;
442+
const regexNode = regexTrees.get(id)?.rootNode;
443443

444444
const index = parseInt(captureNode.text.replace('$', '')); // Ignores random characters after the first numerics, just like VSCode TextMate
445445
if (index == 0) {

src/Providers/HoverProvider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export const HoverProvider: vscode.HoverProvider = {
1616

1717
if (node.type == 'regex') {
1818
const regexTrees = getTrees(document).regexTrees;
19-
const regexTree = regexTrees[node.id];
19+
const regexTree = regexTrees.get(node.id);
2020
const regexNode = regexTree.rootNode.descendantForPosition(point);
2121
const parentNode = regexNode.parent;
2222
const markdownString = new vscode.MarkdownString();
@@ -46,4 +46,4 @@ export const HoverProvider: vscode.HoverProvider = {
4646
return hover;
4747
}
4848
}
49-
}
49+
}

0 commit comments

Comments
 (0)