src/goDoctor.ts (71 lines of code) (raw):

/* eslint-disable @typescript-eslint/no-unused-vars */ /*--------------------------------------------------------- * Copyright (C) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See LICENSE in the project root for license information. *--------------------------------------------------------*/ 'use strict'; import cp = require('child_process'); import { dirname, isAbsolute } from 'path'; import { toolExecutionEnvironment } from './goEnv'; import { promptForMissingTool } from './goInstallTools'; import { getBinPath } from './util'; import vscode = require('vscode'); /** * Extracts function out of current selection and replaces the current selection with a call to the extracted function. */ export function extractFunction() { return () => extract('extract'); } /** * Extracts expression out of current selection into a var in the local scope and * replaces the current selection with the new var. */ export function extractVariable() { return () => extract('var'); } type typeOfExtraction = 'var' | 'extract'; async function extract(type: typeOfExtraction): Promise<void> { const activeEditor = vscode.window.activeTextEditor; if (!activeEditor) { vscode.window.showInformationMessage('No editor is active.'); return; } if (activeEditor.selections.length !== 1) { vscode.window.showInformationMessage( `You need to have a single selection for extracting ${type === 'var' ? 'variable' : 'method'}` ); return; } const newName = await vscode.window.showInputBox({ placeHolder: `Please enter a name for the extracted ${type === 'var' ? 'variable' : 'method'}.` }); if (!newName) { return; } runGoDoctor(newName, activeEditor.selection, activeEditor.document.fileName, type); } /** * @param newName name for the extracted method * @param selection the editor selection from which method is to be extracted * @param activeEditor the editor that will be used to apply the changes from godoctor * @returns errorMessage in case the method fails, null otherwise */ function runGoDoctor( newName: string, selection: vscode.Selection, fileName: string, type: typeOfExtraction ): Thenable<void> { const godoctor = getBinPath('godoctor'); return new Promise((resolve, reject) => { if (!isAbsolute(godoctor)) { promptForMissingTool('godoctor'); return resolve(); } cp.execFile( godoctor, [ '-w', '-pos', `${selection.start.line + 1},${selection.start.character + 1}:${selection.end.line + 1},${ selection.end.character }`, '-file', fileName, type, newName ], { env: toolExecutionEnvironment(), cwd: dirname(fileName) }, (err, stdout, stderr) => { if (err) { vscode.window.showErrorMessage(stderr || err.message); } } ); }); }