Skip to content

Commit 340592d

Browse files
committed
Improve replace_capture code completion
1 parent 7af5dd9 commit 340592d

File tree

2 files changed

+28
-7
lines changed

2 files changed

+28
-7
lines changed

src/Providers/CompletionItemProvider.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const triggerCharacterSets: { [key: string]: string[]; } = {
1616
scopeName: ['"', '.'],
1717
name: ['"'],
1818
include: ['"', '#', '.', '$'],
19+
replace_capture: ['$', '{'],
1920
scope: ['.', '$'],
2021
scope_new: ['"', ' '],
2122
regex: ['{', '^',/* '\\', '(', '?', '<', '\'' */],
@@ -67,6 +68,7 @@ export const CompletionItemProvider: vscode.CompletionItemProvider = {
6768
(scopeName (value) @scopeName)
6869
(name_display (value) @name)
6970
(include (value) @include)
71+
(name (value (scope (replace_capture) @replace_capture)))
7072
(name (value (scope) @scope))
7173
(name (value) @scope_new)
7274
(contentName (value (scope) @scope))
@@ -395,8 +397,14 @@ export const CompletionItemProvider: vscode.CompletionItemProvider = {
395397
sortText: ` ${scope}`,
396398
});
397399
}
398-
399-
const noOfCaptureGroups = locateRegex(trees, cursorName == 'scope' ? cursorNode.parent.parent : cursorNode.parent);
400+
/* FallThrough */
401+
402+
case 'replace_capture': {
403+
const nameNode =
404+
cursorName == 'replace_capture' ? cursorNode.parent.parent.parent :
405+
cursorName == 'scope' ? cursorNode.parent.parent :
406+
cursorNode.parent;
407+
const noOfCaptureGroups = locateRegex(trees, nameNode);
400408
// vscode.window.showInformationMessage(`noOfCaptureGroups: ${(performance.now() - start).toFixed(3)}ms ${noOfCaptureGroups.length}\n${JSON.stringify(noOfCaptureGroups)}`);
401409
const updowncaseSnippet =
402410
new vscode.SnippetString()
@@ -410,7 +418,7 @@ export const CompletionItemProvider: vscode.CompletionItemProvider = {
410418
label: '${0:/updowncase}',
411419
description: "Transform Capture's Case",
412420
},
413-
range: cursorRange,
421+
range: cursorName == 'replace_capture' ? cursorRange : undefined,
414422
kind: vscode.CompletionItemKind.Function,
415423
insertText: updowncaseSnippet,
416424
documentation: "Converts all the alphabetic characters in a capture to UPPERCASE or lowercase.\nAll leading dots (.) are stripped.",
@@ -421,11 +429,12 @@ export const CompletionItemProvider: vscode.CompletionItemProvider = {
421429
label: '$0',
422430
description: "Capture Replacement",
423431
},
424-
range: cursorRange,
432+
range: cursorName == 'replace_capture' ? cursorRange : undefined,
425433
kind: vscode.CompletionItemKind.Function,
426434
insertText: replaceSnippet,
427435
documentation: "Replaced with the corresponding capture's captured text.\nAll leading dots (.) are stripped.",
428436
});
437+
}
429438

430439
break;
431440
case 'regex':

src/tree-sitter/tree-sitter-json/grammar.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -260,9 +260,21 @@ module.exports = grammar({
260260
),
261261
),
262262
replace_capture: $ => token(
263-
seq(
264-
'$',
265-
/\d+/,
263+
choice(
264+
seq(
265+
'$',
266+
/\d+/,
267+
),
268+
seq(
269+
'${',
270+
/\d+/,
271+
':/',
272+
choice(
273+
'downcase',
274+
'upcase'
275+
),
276+
'}',
277+
),
266278
),
267279
),
268280

0 commit comments

Comments
 (0)