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

fix: #2309 use goimports instead of goreturns when using modules #2338

Closed
wants to merge 3 commits into from
Closed
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
57 changes: 35 additions & 22 deletions src/goFormat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import vscode = require('vscode');
import cp = require('child_process');
import path = require('path');
import { promptForMissingTool, promptForUpdatingTool } from './goInstallTools';
import { isModSupported } from './goModules';
import { sendTelemetryEvent, getBinPath, getToolsEnvVars, killTree } from './util';

export class GoDocumentFormattingEditProvider implements vscode.DocumentFormattingEditProvider {
Expand All @@ -20,33 +21,45 @@ export class GoDocumentFormattingEditProvider implements vscode.DocumentFormatti

let filename = document.fileName;
let goConfig = vscode.workspace.getConfiguration('go', document.uri);
let formatTool = goConfig['formatTool'] || 'goreturns';
let formatFlags = goConfig['formatFlags'].slice() || [];

// We ignore the -w flag that updates file on disk because that would break undo feature
if (formatFlags.indexOf('-w') > -1) {
formatFlags.splice(formatFlags.indexOf('-w'), 1);
}

// Fix for https://github.com/Microsoft/vscode-go/issues/613 and https://github.com/Microsoft/vscode-go/issues/630
if (formatTool === 'goimports' || formatTool === 'goreturns') {
formatFlags.push('-srcdir', filename);
}

// Since goformat supports the style flag, set tabsize if user has not passed any flags
if (formatTool === 'goformat' && formatFlags.length === 0 && options.insertSpaces) {
formatFlags.push('-style=indent=' + options.tabSize);
}
return this.getFormatTool(goConfig, document.uri)
.then((formatTool) => {
// We ignore the -w flag that updates file on disk because that would break undo feature
if (formatFlags.indexOf('-w') > -1) {
formatFlags.splice(formatFlags.indexOf('-w'), 1);
}

return this.runFormatter(formatTool, formatFlags, document, token).then(edits => edits, err => {
if (typeof err === 'string' && err.startsWith('flag provided but not defined: -srcdir')) {
promptForUpdatingTool(formatTool);
return Promise.resolve([]);
// Fix for https://github.com/Microsoft/vscode-go/issues/613 and https://github.com/Microsoft/vscode-go/issues/630
if (formatTool === 'goimports' || formatTool === 'goreturns') {
formatFlags.push('-srcdir', filename);
}
if (err) {
console.log(err);
return Promise.reject('Check the console in dev tools to find errors when formatting.');

// Since goformat supports the style flag, set tabsize if user has not passed any flags
if (formatTool === 'goformat' && formatFlags.length === 0 && options.insertSpaces) {
formatFlags.push('-style=indent=' + options.tabSize);
}

return this.runFormatter(formatTool, formatFlags, document, token).then(edits => edits, err => {
if (typeof err === 'string' && err.startsWith('flag provided but not defined: -srcdir')) {
promptForUpdatingTool(formatTool);
return Promise.resolve([]);
}
if (err) {
console.log(err);
return Promise.reject('Check the console in dev tools to find errors when formatting.');
}
});
});
}

private getFormatTool(goConfig: vscode.WorkspaceConfiguration, fileUri: vscode.Uri): Thenable<string> {
let formatTool = goConfig['formatTool'] || 'goreturns';
if (formatTool === 'gofmt' || formatTool === 'goimports') {
return Promise.resolve(formatTool);
}
return isModSupported(fileUri).then(isMod => {
return isMod ? 'goimports' : formatTool;
});
}

Expand Down