Fixes #922 Pass file contents to go-outline (#929)

* Fixes #922 Pass file contents to go-outline

* Use fork of go-outline

* Fixing broken test

* If test files are dirty, dont run tests
This commit is contained in:
Ramya Rao 2017-04-17 15:54:07 -07:00 коммит произвёл GitHub
Родитель 217446dff8
Коммит a5700fa3f7
8 изменённых файлов: 47 добавлений и 12 удалений

Просмотреть файл

@ -38,7 +38,7 @@ install:
- go get -u -v github.com/rogpeppe/godef
- if [[ "$(go version)" =~ "go version go1.5" ]]; then echo hello; else go get -u -v github.com/zmb3/gogetdoc; fi
- if [[ "$(go version)" =~ "go version go1.5" ]]; then echo cannot get golint; else go get -u -v github.com/golang/lint/golint; fi
- go get -u -v github.com/lukehoban/go-outline
- go get -u -v github.com/ramya-rao-a/go-outline
- go get -u -v sourcegraph.com/sqs/goreturns
- go get -u -v golang.org/x/tools/cmd/gorename
- go get -u -v github.com/tpng/gopkgs

Просмотреть файл

@ -29,6 +29,10 @@ function checkActiveEditor(): vscode.TextEditor {
vscode.window.showInformationMessage('Cannot generate unit tests. File in the editor is not a Go file.');
return;
}
if (editor.document.isDirty) {
vscode.window.showInformationMessage('File has unsaved changes. Save and try again.');
return;
}
return editor;
}

Просмотреть файл

@ -23,7 +23,7 @@ function getTools(goVersion: SemVersion): { [key: string]: string } {
let tools: { [key: string]: string } = {
'gocode': 'github.com/nsf/gocode',
'gopkgs': 'github.com/tpng/gopkgs',
'go-outline': 'github.com/lukehoban/go-outline',
'go-outline': 'github.com/ramya-rao-a/go-outline',
'go-symbols': 'github.com/acroca/go-symbols',
'guru': 'golang.org/x/tools/cmd/guru',
'gorename': 'golang.org/x/tools/cmd/gorename',

Просмотреть файл

@ -6,7 +6,7 @@
'use strict';
import vscode = require('vscode');
import { byteOffsetAt, getBinPath } from './util';
import { byteOffsetAt, getBinPath, getFileArchive } from './util';
import cp = require('child_process');
import { promptForMissingTool } from './goInstallTools';
@ -125,8 +125,7 @@ function getTagsAndOptions(config: GoTagsConfig, commandArgs: GoTagsConfig): The
function runGomodifytags(args: string[]) {
let gomodifytags = getBinPath('gomodifytags');
let editor = vscode.window.activeTextEditor;
let fileContents = editor.document.getText();
let input = editor.document.fileName + '\n' + Buffer.byteLength(fileContents, 'utf8') + '\n' + fileContents;
let input = getFileArchive(editor.document);
let p = cp.execFile(gomodifytags, args, (err, stdout, stderr) => {
if (err && (<any>err).code === 'ENOENT') {
promptForMissingTool('gomodifytags');

Просмотреть файл

@ -8,10 +8,10 @@
import vscode = require('vscode');
import cp = require('child_process');
import path = require('path');
import { getBinPath, sendTelemetryEvent } from './util';
import { getBinPath, getFileArchive } from './util';
import { promptForMissingTool, promptForUpdatingTool } from './goInstallTools';
// Keep in sync with https://github.com/lukehoban/go-outline
// Keep in sync with https://github.com/ramya-rao-a/go-outline
export interface GoOutlineRange {
start: number;
end: number;
@ -30,8 +30,20 @@ export interface GoOutlineDeclaration {
}
export interface GoOutlineOptions {
/**
* Path of the file for which outline is needed
*/
fileName: string;
/**
* If true, then the file will be parsed only till imports are collected
*/
importsOnly?: boolean;
/**
* Document to be parsed. If not provided, saved contents of the given fileName is used
*/
document?: vscode.TextDocument;
}
export function documentSymbols(options: GoOutlineOptions): Promise<GoOutlineDeclaration[]> {
@ -41,15 +53,24 @@ export function documentSymbols(options: GoOutlineOptions): Promise<GoOutlineDec
if (options.importsOnly) {
gooutlineFlags.push('-imports-only');
}
if (options.document) {
gooutlineFlags.push('-modified');
}
// Spawn `go-outline` process
let p = cp.execFile(gooutline, gooutlineFlags, {}, (err, stdout, stderr) => {
try {
if (err && (<any>err).code === 'ENOENT') {
promptForMissingTool('go-outline');
}
if (stderr && stderr.startsWith('flag provided but not defined: -imports-only')) {
if (stderr && stderr.startsWith('flag provided but not defined: ')) {
promptForUpdatingTool('go-outline');
if (stderr.startsWith('flag provided but not defined: -imports-only')) {
options.importsOnly = false;
}
if (stderr.startsWith('flag provided but not defined: -modified')) {
options.document = null;
}
return documentSymbols(options).then(results => {
return resolve(results);
});
@ -62,6 +83,9 @@ export function documentSymbols(options: GoOutlineOptions): Promise<GoOutlineDec
reject(e);
}
});
if (options.document) {
p.stdin.end(getFileArchive(options.document));
}
});
}
@ -78,7 +102,6 @@ export class GoDocumentSymbolProvider implements vscode.DocumentSymbolProvider {
private convertToCodeSymbols(document: vscode.TextDocument, decls: GoOutlineDeclaration[], symbols: vscode.SymbolInformation[], containerName: string): void {
let gotoSymbolConfig = vscode.workspace.getConfiguration('go')['gotoSymbol'];
let includeImports = gotoSymbolConfig ? gotoSymbolConfig['includeImports'] : false;
sendTelemetryEvent('file-symbols', { includeImports: includeImports + '' });
decls.forEach(decl => {
if (!includeImports && decl.type === 'import') return;
let label = decl.label;
@ -104,7 +127,7 @@ export class GoDocumentSymbolProvider implements vscode.DocumentSymbolProvider {
}
public provideDocumentSymbols(document: vscode.TextDocument, token: vscode.CancellationToken): Thenable<vscode.SymbolInformation[]> {
let options = { fileName: document.fileName };
let options = { fileName: document.fileName, document: document };
return documentSymbols(options).then(decls => {
let symbols: vscode.SymbolInformation[] = [];
this.convertToCodeSymbols(document, decls, symbols, '');

Просмотреть файл

@ -65,6 +65,10 @@ export function testAtCursor(goConfig: vscode.WorkspaceConfiguration, args: any)
vscode.window.showInformationMessage('No tests found. Current file is not a test file.');
return;
}
if (editor.document.isDirty) {
vscode.window.showInformationMessage('File has unsaved changes. Save and try again.');
return;
}
getTestFunctions(editor.document).then(testFunctions => {
let testFunction: vscode.SymbolInformation;
// Find any test function containing the cursor.

Просмотреть файл

@ -281,3 +281,8 @@ export function getCurrentGoWorkspaceFromGOPATH(currentFileDirPath: string): str
}
return currentWorkspace;
}
export function getFileArchive(document: vscode.TextDocument): string {
let fileContents = document.getText();
return document.fileName + '\n' + Buffer.byteLength(fileContents, 'utf8') + '\n' + fileContents;
}

Просмотреть файл

@ -665,7 +665,7 @@ It returns the number of bytes written and any write error encountered.
// will fail and will have to be replaced with any other go project with vendor packages
let vendorSupportPromise = isVendorSupported();
let filePath = path.join(process.env['GOPATH'], 'src', 'github.com', 'lukehoban', 'go-outline', 'main.go');
let filePath = path.join(process.env['GOPATH'], 'src', 'github.com', 'ramya-rao-a', 'go-outline', 'main.go');
let vendorPkgs = [
'github.com/rogpeppe/godef/vendor/9fans.net/go/acme',
'github.com/rogpeppe/godef/vendor/9fans.net/go/plan9',