Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 17 additions & 10 deletions R/vsc.R
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ load_settings <- function() {
vsc.show_object_size = workspaceViewer$showObjectSize,
vsc.rstudioapi = session$emulateRStudioAPI,
vsc.str.max.level = session$levelOfObjectDetail,
vsc.object_length_limit = session$objectLengthLimit,
vsc.globalenv = session$watchGlobalEnvironment,
vsc.plot = session$viewers$viewColumn$plot,
vsc.browser = session$viewers$viewColumn$browser,
Expand Down Expand Up @@ -133,6 +134,8 @@ inspect_env <- function(env, cache) {
is_promise <- rlang::env_binding_are_lazy(env, all_names)
is_active <- rlang::env_binding_are_active(env, all_names)
show_object_size <- getOption("vsc.show_object_size", FALSE)
object_length_limit <- getOption("vsc.object_length_limit", 2000)
str_max_level <- getOption("vsc.str.max.level", 0)
objs <- lapply(all_names, function(name) {
if (is_promise[[name]]) {
info <- list(
Expand All @@ -154,8 +157,7 @@ inspect_env <- function(env, cache) {
info <- list(
class = class(obj),
type = scalar(typeof(obj)),
length = scalar(length(obj)),
str = scalar(trimws(capture_str(obj)))
length = scalar(length(obj))
)

if (show_object_size) {
Expand All @@ -171,14 +173,19 @@ inspect_env <- function(env, cache) {
info$size <- scalar(cobj$size)
}

obj_names <- if (is.object(obj)) {
.DollarNames(obj, pattern = "")
} else if (is.recursive(obj)) {
names(obj)
} else NULL

if (length(obj_names)) {
info$names <- obj_names
if (length(obj) > object_length_limit) {
info$str <- scalar(trimws(capture_str(obj, 0)))
} else {
info$str <- scalar(trimws(capture_str(obj, str_max_level)))
obj_names <- if (is.object(obj)) {
.DollarNames(obj, pattern = "")
} else if (is.recursive(obj)) {
names(obj)
} else NULL

if (length(obj_names)) {
info$names <- obj_names
}
}

if (isS4(obj)) {
Expand Down
5 changes: 5 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -1398,6 +1398,11 @@
"default": true,
"markdownDescription": "Watch the global environment to provide hover, autocompletions, and workspace viewer information. Changes the option `vsc.globalenv` in R. Requires `#r.sessionWatcher#` to be set to `true`."
},
"r.session.objectLengthLimit": {
"type": "integer",
"default": 2000,
"markdownDescription": "The upper limit of object length to show object details in workspace viewer and provide session symbol completion. Decrease this value if you experience significant delay after executing R commands caused by large global objects with many elements. Changes the option `vsc.object_length_limit` in R. Requires `#r.sessionWatcher#` to be set to `true`."
},
"r.session.levelOfObjectDetail": {
"type": "string",
"markdownDescription": "How much of the object to show on hover, autocompletion, and in the workspace viewer? Changes the option `vsc.str.max.level` in R. Requires `#r.sessionWatcher#` to be set to `true`.",
Expand Down
50 changes: 24 additions & 26 deletions src/completions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ export class LiveCompletionItemProvider implements vscode.CompletionItemProvider
const trigger = completionContext.triggerCharacter;

if (trigger === undefined) {
Object.keys(session.globalenv).map((key) => {
Object.keys(session.globalenv).forEach((key) => {
const obj = session.globalenv[key];
const item = new vscode.CompletionItem(
key,
Expand All @@ -114,36 +114,44 @@ export class LiveCompletionItemProvider implements vscode.CompletionItemProvider
const symbol = document.getText(symbolRange);
const doc = new vscode.MarkdownString('Element of `' + symbol + '`');
const obj = session.globalenv[symbol];
let elements: string[];
let names: string[];
if (obj !== undefined) {
if (completionContext.triggerCharacter === '$') {
elements = obj.names;
names = obj.names;
} else if (completionContext.triggerCharacter === '@') {
elements = obj.slots;
names = obj.slots;
}
}
elements.map((key) => {
const item = new vscode.CompletionItem(key, vscode.CompletionItemKind.Field);
item.detail = '[session]';
item.documentation = doc;
items.push(item);
});

if (names) {
items.push(...getCompletionItems(names, vscode.CompletionItemKind.Field, '[session]', doc));
}
}

if (trigger === undefined || trigger === '[' || trigger === ',' || trigger === '"' || trigger === '\'') {
const bracketItems = getBracketCompletionItems(document, position, token);
items.push(...bracketItems);
items.push(...getBracketCompletionItems(document, position, token));
}

if (trigger === undefined || trigger === '(' || trigger === ',') {
const pipelineItems = getPipelineCompletionItems(document, position, token);
items.push(...pipelineItems);
items.push(...getPipelineCompletionItems(document, position, token));
}

return items;
}
}

function getCompletionItems(names: string[], kind: vscode.CompletionItemKind, detail: string, documentation: vscode.MarkdownString): vscode.CompletionItem[] {
const len = names.length.toString().length;
let index = 0;
return names.map((name) => {
const item = new vscode.CompletionItem(name, kind);
item.detail = detail;
item.documentation = documentation;
item.sortText = `0-${index.toString().padStart(len, '0')}`;
index++;
return item;
});
}

function getBracketCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken) {
const items: vscode.CompletionItem[] = [];
Expand Down Expand Up @@ -181,12 +189,7 @@ function getBracketCompletionItems(document: vscode.TextDocument, position: vsco
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);
});
items.push(...getCompletionItems(obj.names, vscode.CompletionItemKind.Field, '[session]', doc));
}
}
return items;
Expand Down Expand Up @@ -231,12 +234,7 @@ function getPipelineCompletionItems(document: vscode.TextDocument, position: vsc
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);
});
items.push(...getCompletionItems(obj.names, vscode.CompletionItemKind.Field, '[session]', doc));
}
}
return items;
Expand Down