import * as vscode from 'vscode'; /** * CodelensProvider */ export class CodelensProvider implements vscode.CodeLensProvider { private codeLenses: vscode.CodeLens[] = []; private regex: RegExp; private _onDidChangeCodeLenses: vscode.EventEmitter = new vscode.EventEmitter(); public readonly onDidChangeCodeLenses: vscode.Event = this._onDidChangeCodeLenses.event; constructor() { this.regex = /(.+)/g; vscode.workspace.onDidChangeConfiguration((_) => { this._onDidChangeCodeLenses.fire(); }); } public provideCodeLenses(document: vscode.TextDocument, _token: vscode.CancellationToken): vscode.CodeLens[] | Thenable { if (vscode.workspace.getConfiguration("codelens-sample").get("enableCodeLens", true)) { this.codeLenses = []; const regex = new RegExp(this.regex); const text = document.getText(); let matches; while ((matches = regex.exec(text)) !== null) { const line = document.lineAt(document.positionAt(matches.index).line); const indexOf = line.text.indexOf(matches[0]); const position = new vscode.Position(line.lineNumber, indexOf); const range = document.getWordRangeAtPosition(position, new RegExp(this.regex)); if (range) { this.codeLenses.push(new vscode.CodeLens(range)); } } return this.codeLenses; } return []; } public resolveCodeLens(codeLens: vscode.CodeLens, _token: vscode.CancellationToken) { if (vscode.workspace.getConfiguration("codelens-sample").get("enableCodeLens", true)) { codeLens.command = { title: "Codelens provided by sample extension", tooltip: "Tooltip provided by sample extension", command: "codelens-sample.codelensAction", arguments: ["Argument 1", false] }; return codeLens; } return null; } }