From 3f9cfe8a22f0ce651ced14e4d0b9e4b9ee4d58b2 Mon Sep 17 00:00:00 2001 From: Kun Ren Date: Thu, 21 Jan 2021 12:23:05 +0800 Subject: [PATCH 1/4] Add initial pipeline completion support --- src/completions.ts | 56 +++++++++++++++++++++++++++++++++++++++++++++- src/extension.ts | 2 +- src/lineCache.ts | 2 +- 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/src/completions.ts b/src/completions.ts index c2b7c4e80..c8c873553 100644 --- a/src/completions.ts +++ b/src/completions.ts @@ -9,6 +9,9 @@ import * as vscode from 'vscode'; import * as session from './session'; +import { extendSelection } from './selection'; +import { cleanLine } from './lineCache'; + // Get with names(roxygen2:::default_tags()) const roxygenTagCompletionItems = [ @@ -93,11 +96,16 @@ export class LiveCompletionItemProvider implements vscode.CompletionItemProvider }); } - if (trigger === undefined || trigger === '"' || trigger === '\'') { + if (trigger === undefined || trigger === ',' || trigger === '"' || trigger === '\'') { const bracketItems = getBracketCompletionItems(document, position, token); items.push(...bracketItems); } + if (trigger === undefined || trigger === ',') { + const pipelineItems = getPipelineCompletionItems(document, position, token); + items.push(...pipelineItems); + } + return items; } } @@ -149,3 +157,49 @@ function getBracketCompletionItems(document: vscode.TextDocument, position: vsco } return items; } + + +function getPipelineCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken) { + const items: vscode.CompletionItem[] = []; + const range = extendSelection(position.line, (x) => document.lineAt(x).text, document.lineCount); + let symbol: string; + + for (let i = range.startLine; i <= range.endLine; i++) { + if (token.isCancellationRequested) { + break; + } + + const line = document.lineAt(i); + if (line.isEmptyOrWhitespace) { + continue; + } + + const cleanedLine = cleanLine(line.text); + if (cleanedLine.length === 0) { + continue; + } + + const symbolPosition = new vscode.Position(i, line.firstNonWhitespaceCharacterIndex); + const symbolRange = document.getWordRangeAtPosition(symbolPosition); + + if (symbolRange !== undefined) { + symbol = document.getText(symbolRange); + } + + break; + } + + if (!token.isCancellationRequested && symbol !== undefined) { + const obj = session.globalenv[symbol]; + if (obj !== undefined && obj.names !== undefined) { + const doc = new vscode.MarkdownString('Element of `' + symbol + '`'); + obj.names.map((name: string) => { + const item = new vscode.CompletionItem(name, vscode.CompletionItemKind.Field); + item.detail = '[session]'; + item.documentation = doc; + items.push(item); + }); + } + } + return items; +} diff --git a/src/extension.ts b/src/extension.ts index a6cdbc5a2..2632ea372 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -164,7 +164,7 @@ export async function activate(context: vscode.ExtensionContext): Promise Date: Thu, 21 Jan 2021 13:18:08 +0800 Subject: [PATCH 2/4] Update completion triggers --- src/completions.ts | 4 ++-- src/extension.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/completions.ts b/src/completions.ts index c8c873553..d54dd9224 100644 --- a/src/completions.ts +++ b/src/completions.ts @@ -96,12 +96,12 @@ export class LiveCompletionItemProvider implements vscode.CompletionItemProvider }); } - if (trigger === undefined || trigger === ',' || trigger === '"' || trigger === '\'') { + if (trigger === undefined || trigger === '[' || trigger === ',' || trigger === '"' || trigger === '\'') { const bracketItems = getBracketCompletionItems(document, position, token); items.push(...bracketItems); } - if (trigger === undefined || trigger === ',') { + if (trigger === undefined || trigger === '(' || trigger === ',') { const pipelineItems = getPipelineCompletionItems(document, position, token); items.push(...pipelineItems); } diff --git a/src/extension.ts b/src/extension.ts index 2632ea372..5a2111cb7 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -164,7 +164,7 @@ export async function activate(context: vscode.ExtensionContext): Promise Date: Sun, 24 Jan 2021 18:07:25 +0800 Subject: [PATCH 3/4] Improve getPipelineCompletionItems --- src/completions.ts | 8 ++++++-- src/selection.ts | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/completions.ts b/src/completions.ts index d54dd9224..bcb000cab 100644 --- a/src/completions.ts +++ b/src/completions.ts @@ -158,7 +158,6 @@ function getBracketCompletionItems(document: vscode.TextDocument, position: vsco return items; } - function getPipelineCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken) { const items: vscode.CompletionItem[] = []; const range = extendSelection(position.line, (x) => document.lineAt(x).text, document.lineCount); @@ -179,7 +178,12 @@ function getPipelineCompletionItems(document: vscode.TextDocument, position: vsc continue; } - const symbolPosition = new vscode.Position(i, line.firstNonWhitespaceCharacterIndex); + const pipeSymbolIndex = line.text.search(/([\w_.]+|`.+`)\s*(%.+%|\|>)/); + if (pipeSymbolIndex < 0) { + break; + } + + const symbolPosition = new vscode.Position(i, pipeSymbolIndex); const symbolRange = document.getWordRangeAtPosition(symbolPosition); if (symbolRange !== undefined) { diff --git a/src/selection.ts b/src/selection.ts index bb4218a30..95cf144d1 100644 --- a/src/selection.ts +++ b/src/selection.ts @@ -190,8 +190,8 @@ export function extendSelection(line: number, getLine: (line: number) => string, endLine: number; } { const lc = new LineCache(getLine, lineCount); - const getLineFromCache = (x) => lc.getLineFromCache(x); - const getEndsInOperatorFromCache = (x) => lc.getEndsInOperatorFromCache(x); + const getLineFromCache = (x: number) => lc.getLineFromCache(x); + const getEndsInOperatorFromCache = (x: number) => lc.getEndsInOperatorFromCache(x); let lookingForward = true; /* poss[1] is the farthest point reached looking forward from line, and poss[0] is the farthest point reached looking backward from line. */ From 8a7fe4f61e2ea0ad62790c4ab865008003b84aa3 Mon Sep 17 00:00:00 2001 From: Kun Ren Date: Mon, 25 Jan 2021 01:10:12 +0800 Subject: [PATCH 4/4] Update getWordRangeAtPosition not work with backtick --- src/completions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/completions.ts b/src/completions.ts index bcb000cab..d4feab044 100644 --- a/src/completions.ts +++ b/src/completions.ts @@ -178,7 +178,7 @@ function getPipelineCompletionItems(document: vscode.TextDocument, position: vsc continue; } - const pipeSymbolIndex = line.text.search(/([\w_.]+|`.+`)\s*(%.+%|\|>)/); + const pipeSymbolIndex = line.text.search(/([\w_.]+)\s*(%.+%|\|>)/); if (pipeSymbolIndex < 0) { break; }