mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-12 05:08:52 +00:00
Add an action to copy an element from the syntax tree view
This commit is contained in:
parent
cb5ce9eaa6
commit
c0f22c7e9d
3 changed files with 55 additions and 0 deletions
|
@ -289,6 +289,12 @@
|
|||
"icon": "$(search)",
|
||||
"category": "rust-analyzer (syntax tree)"
|
||||
},
|
||||
{
|
||||
"command": "rust-analyzer.syntaxTreeCopy",
|
||||
"title": "Copy",
|
||||
"icon": "$(copy)",
|
||||
"category": "rust-analyzer (syntax tree)"
|
||||
},
|
||||
{
|
||||
"command": "rust-analyzer.syntaxTreeHideWhitespace",
|
||||
"title": "Hide Whitespace",
|
||||
|
@ -3370,6 +3376,10 @@
|
|||
"command": "rust-analyzer.syntaxTreeReveal",
|
||||
"when": "false"
|
||||
},
|
||||
{
|
||||
"command": "rust-analyzer.syntaxTreeCopy",
|
||||
"when": "false"
|
||||
},
|
||||
{
|
||||
"command": "rust-analyzer.syntaxTreeHideWhitespace",
|
||||
"when": "false"
|
||||
|
@ -3404,6 +3414,11 @@
|
|||
}
|
||||
],
|
||||
"view/item/context": [
|
||||
{
|
||||
"command": "rust-analyzer.syntaxTreeCopy",
|
||||
"group": "inline",
|
||||
"when": "view == rustSyntaxTree"
|
||||
},
|
||||
{
|
||||
"command": "rust-analyzer.syntaxTreeReveal",
|
||||
"group": "inline",
|
||||
|
|
|
@ -372,6 +372,45 @@ export function syntaxTreeReveal(): Cmd {
|
|||
};
|
||||
}
|
||||
|
||||
function elementToString(
|
||||
activeDocument: vscode.TextDocument,
|
||||
element: SyntaxElement,
|
||||
depth: number = 0,
|
||||
): string {
|
||||
let result = " ".repeat(depth);
|
||||
const start = element.istart ?? element.start;
|
||||
const end = element.iend ?? element.end;
|
||||
|
||||
result += `${element.kind}@${start}..${end}`;
|
||||
|
||||
if (element.type === "Token") {
|
||||
const startPosition = activeDocument.positionAt(element.start);
|
||||
const endPosition = activeDocument.positionAt(element.end);
|
||||
const text = activeDocument.getText(new vscode.Range(startPosition, endPosition));
|
||||
// JSON.stringify quotes and escapes the string for us.
|
||||
result += ` ${JSON.stringify(text)}\n`;
|
||||
} else {
|
||||
result += "\n";
|
||||
for (const child of element.children) {
|
||||
result += elementToString(activeDocument, child, depth + 1);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
export function syntaxTreeCopy(): Cmd {
|
||||
return async (element: SyntaxElement) => {
|
||||
const activeDocument = vscode.window.activeTextEditor?.document;
|
||||
if (!activeDocument) {
|
||||
return;
|
||||
}
|
||||
|
||||
const result = elementToString(activeDocument, element);
|
||||
await vscode.env.clipboard.writeText(result);
|
||||
};
|
||||
}
|
||||
|
||||
export function syntaxTreeHideWhitespace(ctx: CtxInit): Cmd {
|
||||
return async () => {
|
||||
if (ctx.syntaxTreeProvider !== undefined) {
|
||||
|
|
|
@ -199,6 +199,7 @@ function createCommands(): Record<string, CommandFactory> {
|
|||
openLogs: { enabled: commands.openLogs },
|
||||
revealDependency: { enabled: commands.revealDependency },
|
||||
syntaxTreeReveal: { enabled: commands.syntaxTreeReveal },
|
||||
syntaxTreeCopy: { enabled: commands.syntaxTreeCopy },
|
||||
syntaxTreeHideWhitespace: { enabled: commands.syntaxTreeHideWhitespace },
|
||||
syntaxTreeShowWhitespace: { enabled: commands.syntaxTreeShowWhitespace },
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue