Skip to content
This repository has been archived by the owner on Jul 15, 2023. It is now read-only.

Add item documentation to completions #2054

Merged
merged 5 commits into from
Nov 1, 2018
Merged
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
55 changes: 53 additions & 2 deletions src/goSuggest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,16 @@ function vscodeKindFromGoCodeClass(kind: string, type: string): vscode.Completio

interface GoCodeSuggestion {
class: string;
package?: string;
name: string;
type: string;
}

class ExtendedCompletionItem extends vscode.CompletionItem {
package?: string;
fileName: string;
}

const lineCommentRegex = /^\s*\/\/\s+/;
const exportedMemberRegex = /(const|func|type|var)(\s+\(.*\))?\s+([A-Z]\w*)/;
const gocodeNoSupportForgbMsgKey = 'dontshowNoSupportForgb';
Expand Down Expand Up @@ -75,6 +81,49 @@ export class GoCompletionItemProvider implements vscode.CompletionItemProvider {
});
}

public resolveCompletionItem(item: vscode.CompletionItem, token: vscode.CancellationToken): vscode.ProviderResult<vscode.CompletionItem> {
const goRuntimePath = getBinPath('go');
if (!goRuntimePath || !(item instanceof ExtendedCompletionItem)) {
return;
}

if (typeof item.package === 'undefined') {
promptForUpdatingTool('gocode');
return;
}

const env = getToolsEnvVars();
const cwd = path.dirname(item.fileName);

return new Promise<vscode.CompletionItem>(resolve => {
const args = ['doc', '-c', '-cmd', '-u'];
if (item.package) {
args.push(item.package, item.label);
} else {
// item.package would be empty for symbols from the current package
args.push(item.label);
}

cp.execFile(goRuntimePath, args, { cwd, env }, (err, stdout) => {
if (err) {
console.log(err);
return resolve(item);
}

let doc = '';
const goDocLines = stdout.toString().split('\n');
// i = 1 to skip the func signature line
for (let i = 1; i < goDocLines.length && goDocLines[i].startsWith(' '); i++) {
doc += goDocLines[i].substring(4) + '\n';
}

item.documentation = doc;
resolve(item);
});
});

}

public provideCompletionItemsInternal(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, config: vscode.WorkspaceConfiguration): Thenable<vscode.CompletionItem[] | vscode.CompletionList> {
return this.ensureGoCodeConfigured(document.uri).then(() => {
return new Promise<vscode.CompletionItem[] | vscode.CompletionList>((resolve, reject) => {
Expand Down Expand Up @@ -228,9 +277,11 @@ export class GoCompletionItemProvider implements vscode.CompletionItemProvider {
if (results && results[1]) {
for (let suggest of results[1]) {
if (inString && suggest.class !== 'import') continue;
let item = new vscode.CompletionItem(suggest.name);
let item = new ExtendedCompletionItem(suggest.name);
item.kind = vscodeKindFromGoCodeClass(suggest.class, suggest.type);
item.detail = suggest.type;
item.package = suggest.package;
item.fileName = document.fileName;
if (inString && suggest.class === 'import') {
item.textEdit = new vscode.TextEdit(
new vscode.Range(
Expand Down Expand Up @@ -454,4 +505,4 @@ export class GoCompletionItemProvider implements vscode.CompletionItemProvider {
});
return matchingPackages;
}
}
}