From 75d406a59b409d0ea48fdb0e91b81c6220d43568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20B=C3=B8hnsdalen?= Date: Fri, 30 Jun 2023 09:12:50 +0200 Subject: [PATCH] Added symbolProvider to give outline on rule names --- yara/src/extension.ts | 4 ++++ yara/src/lib/symbolProvider.ts | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 yara/src/lib/symbolProvider.ts diff --git a/yara/src/extension.ts b/yara/src/extension.ts index f99331e..90df8b5 100644 --- a/yara/src/extension.ts +++ b/yara/src/extension.ts @@ -8,6 +8,7 @@ import { YaraDefinitionProvider } from './lib/definitionProvider'; import { YaraReferenceProvider } from './lib/referenceProvider'; import { YaraSnippetCompletionItemProvider } from './lib/snippetProvider'; import { YaraHexStringHoverProvider } from './lib/hoverProvider'; +import { YaraDocumentSymbolProvider } from "./lib/symbolProvider"; export function activate(context: vscode.ExtensionContext): void { @@ -39,6 +40,9 @@ export function activate(context: vscode.ExtensionContext): void { } }); context.subscriptions.push(configWatcher); + const symbolDisposable: vscode.Disposable = vscode.languages.registerDocumentSymbolProvider(YARA, new YaraDocumentSymbolProvider()); + context.subscriptions.push(symbolDisposable); + if (debug) { log('Registered configuration watcher'); } } diff --git a/yara/src/lib/symbolProvider.ts b/yara/src/lib/symbolProvider.ts new file mode 100644 index 0000000..018d7ac --- /dev/null +++ b/yara/src/lib/symbolProvider.ts @@ -0,0 +1,25 @@ +'use strict'; + +import vscode = require('vscode'); + +export class YaraDocumentSymbolProvider implements vscode.DocumentSymbolProvider { + public provideDocumentSymbols( + document: vscode.TextDocument, + token: vscode.CancellationToken): Promise { + return new Promise((resolve, reject) => { + const symbols: vscode.DocumentSymbol[] = []; + for (let i = 0; i < document.lineCount; i++) { + const line = document.lineAt(i); + if (line.text.startsWith("rule")) { + const name = line.text.split(" ")[1] + const symbol = new vscode.DocumentSymbol( + name, 'Rule', + vscode.SymbolKind.Class, + line.range, line.range) + symbols.push(symbol) + } + } + resolve(symbols); + }); + } +} \ No newline at end of file