diff options
Diffstat (limited to '.config/coc/extensions/node_modules/coc-go/lib')
19 files changed, 983 insertions, 0 deletions
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/binaries.js b/.config/coc/extensions/node_modules/coc-go/lib/binaries.js new file mode 100644 index 0000000..d67ffd5 --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/binaries.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TOOLS = exports.IMPL = exports.GOPLAY = exports.GOTESTS = exports.GOMODIFYTAGS = exports.GOPLS = void 0; +exports.GOPLS = 'golang.org/x/tools/gopls'; +exports.GOMODIFYTAGS = 'github.com/fatih/gomodifytags'; +exports.GOTESTS = "github.com/cweill/gotests/..."; +exports.GOPLAY = "github.com/haya14busa/goplay/cmd/goplay"; +exports.IMPL = "github.com/josharian/impl"; +exports.TOOLS = [ + exports.GOPLS, + exports.GOMODIFYTAGS, + exports.GOTESTS, + exports.GOPLAY, + exports.IMPL, +]; +//# sourceMappingURL=binaries.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/commands.js b/.config/coc/extensions/node_modules/coc-go/lib/commands.js new file mode 100644 index 0000000..f77d866 --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/commands.js @@ -0,0 +1,125 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.installTools = exports.installImpl = exports.installGoplay = exports.installGotests = exports.installGomodifytags = exports.checkGopls = exports.installGopls = exports.version = void 0; +const tslib_1 = require("tslib"); +const path_1 = tslib_1.__importDefault(require("path")); +const fs_1 = tslib_1.__importDefault(require("fs")); +const coc_nvim_1 = require("coc.nvim"); +const tools_1 = require("./utils/tools"); +const checktag_1 = tslib_1.__importDefault(require("./utils/checktag")); +const ui_1 = require("./utils/ui"); +const config_1 = require("./utils/config"); +const binaries_1 = require("./binaries"); +const versions_1 = require("./utils/versions"); +async function version() { + const v1 = await pkgVersion(); + const v2 = await goplsVersion() || 'unknown'; + coc_nvim_1.window.showMessage(`Version: coc-go ${v1}; gopls ${v2}`, 'more'); +} +exports.version = version; +async function installGopls(client) { + await (0, tools_1.installGoBin)(binaries_1.GOPLS, true, goplsVersion); + if (client.needsStop()) { + await client.stop(); + client.restart(); + } +} +exports.installGopls = installGopls; +const checkInterval = 24 * 60 * 60 * 1000; +async function shouldCheckGopls() { + const now = new Date().getTime(); + const last = await (0, config_1.getState)('gopls:last-check'); + if (last - (now - checkInterval) < 0) { + await (0, config_1.setState)('gopls:last-check', new Date().getTime()); + return true; + } + return false; +} +async function checkGopls(client, mode) { + try { + if (!(await shouldCheckGopls())) { + return; + } + let install = false; + await (0, ui_1.withProgress)('Checking for new gopls version', async () => { + const [current, latest] = await Promise.all([ + goplsVersion(), + (0, checktag_1.default)("golang/tools", /^gopls\//), + ]); + if (!(0, versions_1.isValidVersion)(current) || !(0, versions_1.isValidVersion)(latest)) { + coc_nvim_1.window.showMessage('checking for a new gopls version failed', 'warning'); + return; + } + switch ((0, versions_1.compareVersions)(latest, current)) { + case 0: + coc_nvim_1.window.showMessage(`[gopls] up-to-date: ${current}`, 'more'); + break; + case 1: + switch (mode) { + case 'install': + install = true; + break; + case 'ask': + install = await coc_nvim_1.window.showPrompt(`[gopls] Install update? ${current} => ${latest}`); + break; + case 'inform': + coc_nvim_1.window.showMessage(`[gopls] update available: ${current} => ${latest}`); + break; + } + break; + case -1: + coc_nvim_1.window.showMessage(`[gopls] current: ${current} | latest: ${latest}`, 'more'); + break; + } + }); + if (install) { + await installGopls(client); + } + } + catch (e) { + coc_nvim_1.window.showMessage(e.toString(), 'error'); + } +} +exports.checkGopls = checkGopls; +async function pkgVersion() { + try { + const pkgPath = path_1.default.resolve(__dirname, '..', 'package.json'); + const pkgContent = await fs_1.default.promises.readFile(pkgPath, 'utf8'); + return JSON.parse(pkgContent).version; + } + catch (err) { + console.error(err); + } + return ''; +} +async function goplsVersion() { + const [, versionOut] = await (0, tools_1.runGoTool)("gopls", ["version"]); + const m = versionOut.trim().match(/\s{4}golang\.org\/x\/tools\/gopls@(v?\d+\.\d+\.\d+) .*/); + if (m && (0, versions_1.isValidVersion)(m[1])) { + return m[1].replace(/^v/, ''); + } + return ''; +} +async function installGomodifytags() { + await (0, tools_1.installGoBin)(binaries_1.GOMODIFYTAGS, true); +} +exports.installGomodifytags = installGomodifytags; +async function installGotests() { + await (0, tools_1.installGoBin)(binaries_1.GOTESTS, true); +} +exports.installGotests = installGotests; +async function installGoplay() { + await (0, tools_1.installGoBin)(binaries_1.GOPLAY, true); +} +exports.installGoplay = installGoplay; +async function installImpl() { + await (0, tools_1.installGoBin)(binaries_1.IMPL, true); +} +exports.installImpl = installImpl; +async function installTools() { + for (const tool of binaries_1.TOOLS) { + await (0, tools_1.installGoBin)(tool, true); + } +} +exports.installTools = installTools; +//# sourceMappingURL=commands.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/editor.js b/.config/coc/extensions/node_modules/coc-go/lib/editor.js new file mode 100644 index 0000000..9985957 --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/editor.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.activeTextDocument = void 0; +const coc_nvim_1 = require("coc.nvim"); +async function activeTextDocument() { + const doc = await coc_nvim_1.workspace.document; + if (doc.filetype != 'go') { + throw "Not a go document"; + } + return doc.textDocument; +} +exports.activeTextDocument = activeTextDocument; +//# sourceMappingURL=editor.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/extension.js b/.config/coc/extensions/node_modules/coc-go/lib/extension.js new file mode 100644 index 0000000..4558e0c --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/extension.js @@ -0,0 +1,121 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.activate = void 0; +const tslib_1 = require("tslib"); +const coc_nvim_1 = require("coc.nvim"); +const child_process_1 = require("child_process"); +const os_1 = tslib_1.__importDefault(require("os")); +const tools_1 = require("./utils/tools"); +const commands_1 = require("./commands"); +const modify_tags_1 = require("./utils/modify-tags"); +const config_1 = require("./utils/config"); +const editor_1 = require("./editor"); +const binaries_1 = require("./binaries"); +const tests_1 = require("./utils/tests"); +const playground_1 = require("./utils/playground"); +const impl_1 = require("./utils/impl"); +const lspcommands_1 = require("./utils/lspcommands"); +const restartConfigs = [ + 'go.goplsArgs', + 'go.goplsOptions', + 'go.goplsPath', + 'go.goplsUseDaemon', +]; +async function activate(context) { + (0, config_1.setStoragePath)(context.storagePath); + if ((0, config_1.getConfig)().enable === false) { + return; + } + registerGeneral(context); + registerGopls(context); + registerTest(context); + registerTags(context); + registerPlaygroud(context); + registerGoImpl(context); + registerTools(context); + registerLspCommands(context); +} +exports.activate = activate; +async function registerGeneral(context) { + context.subscriptions.push(coc_nvim_1.commands.registerCommand("go.version", () => (0, commands_1.version)())); +} +async function registerGopls(context) { + const config = (0, config_1.getConfig)(); + const command = await goplsPath(config.goplsPath); + if (!command) { + return; + } + const args = config.goplsArgs ? [...config.goplsArgs] : []; + if (config.goplsUseDaemon !== false && !args.find(arg => arg.startsWith('-remote'))) { + // Use daemon by default + args.push('-remote=auto'); + } + // TMPDIR needs to be resetted, because its altered by coc.nvim, which breaks + // the automatic deamon launching of gopls. + // See: https://github.com/neoclide/coc.nvim/commit/bdd9a9e1401fe6fdd57a9bd078e3651ecf1e0202 + const tmpdir = await coc_nvim_1.workspace.nvim.eval('$TMPDIR'); + const server = () => { + return new Promise(resolve => { + resolve((0, child_process_1.spawn)(command, args, { + cwd: coc_nvim_1.workspace.cwd, + env: Object.assign(Object.assign(Object.assign({}, process.env), { TMPDIR: tmpdir }), config.goplsEnv), + })); + }); + }; + // https://github.com/neoclide/coc.nvim/blob/master/src/language-client/client.ts#L684 + const clientOptions = { + documentSelector: ['go', 'gomod', 'gowork'], + initializationOptions: () => (0, config_1.getConfig)().goplsOptions, + disableWorkspaceFolders: config.disable.workspaceFolders, + disableDiagnostics: config.disable.diagnostics, + disableCompletion: config.disable.completion, + // TODO disableSnippetCompletion: config.disable.snippetCompletion, + }; + const client = new coc_nvim_1.LanguageClient('go', 'gopls', server, clientOptions); + if (config.checkForUpdates !== 'disabled' && !config.goplsPath) { + await (0, commands_1.checkGopls)(client, config.checkForUpdates); + } + context.subscriptions.push(coc_nvim_1.services.registLanguageClient(client), + // restart gopls if options changed + coc_nvim_1.workspace.onDidChangeConfiguration(async (e) => { + if (restartConfigs.find(k => e.affectsConfiguration(k))) { + await client.stop(); + client.restart(); + } + }), coc_nvim_1.commands.registerCommand("go.install.gopls", () => (0, commands_1.installGopls)(client))); +} +async function goplsPath(goplsPath) { + if (goplsPath) { + if (goplsPath.startsWith('~')) { + goplsPath = os_1.default.homedir() + goplsPath.slice(1); + } + if (!await (0, tools_1.commandExists)(goplsPath)) { + coc_nvim_1.window.showMessage(`goplsPath is configured ("${goplsPath}"), but does not exist!`, 'error'); + return null; + } + return goplsPath; + } + if (!await (0, tools_1.installGoBin)(binaries_1.GOPLS)) { + return; + } + return (0, tools_1.goBinPath)(binaries_1.GOPLS); +} +async function registerGoImpl(context) { + context.subscriptions.push(coc_nvim_1.commands.registerCommand("go.install.impl", () => (0, commands_1.installImpl)()), coc_nvim_1.commands.registerCommand("go.impl.cursor", async () => (0, impl_1.generateImplStubs)(await (0, editor_1.activeTextDocument)()))); +} +async function registerTest(context) { + context.subscriptions.push(coc_nvim_1.commands.registerCommand("go.install.gotests", () => (0, commands_1.installGotests)()), coc_nvim_1.commands.registerCommand("go.test.generate.file", async () => (0, tests_1.generateTestsAll)(await (0, editor_1.activeTextDocument)())), coc_nvim_1.commands.registerCommand("go.test.generate.exported", async () => (0, tests_1.generateTestsExported)(await (0, editor_1.activeTextDocument)())), coc_nvim_1.commands.registerCommand("go.test.generate.function", async () => (0, tests_1.generateTestsFunction)(await (0, editor_1.activeTextDocument)())), coc_nvim_1.commands.registerCommand("go.test.toggle", async () => (0, tests_1.toogleTests)(await (0, editor_1.activeTextDocument)()))); +} +async function registerTags(context) { + context.subscriptions.push(coc_nvim_1.commands.registerCommand("go.install.gomodifytags", () => (0, commands_1.installGomodifytags)()), coc_nvim_1.commands.registerCommand("go.tags.add", async (...tags) => (0, modify_tags_1.addTags)(await (0, editor_1.activeTextDocument)(), { tags })), coc_nvim_1.commands.registerCommand("go.tags.add.line", async (...tags) => (0, modify_tags_1.addTags)(await (0, editor_1.activeTextDocument)(), { tags, selection: "line" })), coc_nvim_1.commands.registerCommand("go.tags.add.prompt", async () => (0, modify_tags_1.addTags)(await (0, editor_1.activeTextDocument)(), { prompt: true })), coc_nvim_1.commands.registerCommand("go.tags.remove", async (...tags) => (0, modify_tags_1.removeTags)(await (0, editor_1.activeTextDocument)(), { tags })), coc_nvim_1.commands.registerCommand("go.tags.remove.line", async (...tags) => (0, modify_tags_1.removeTags)(await (0, editor_1.activeTextDocument)(), { tags, selection: "line" })), coc_nvim_1.commands.registerCommand("go.tags.remove.prompt", async () => (0, modify_tags_1.removeTags)(await (0, editor_1.activeTextDocument)(), { prompt: true })), coc_nvim_1.commands.registerCommand("go.tags.clear", async () => (0, modify_tags_1.clearTags)(await (0, editor_1.activeTextDocument)())), coc_nvim_1.commands.registerCommand("go.tags.clear.line", async () => (0, modify_tags_1.clearTags)(await (0, editor_1.activeTextDocument)(), { selection: "line" }))); +} +async function registerPlaygroud(context) { + context.subscriptions.push(coc_nvim_1.commands.registerCommand("go.install.goplay", () => (0, commands_1.installGoplay)()), coc_nvim_1.commands.registerCommand("go.playground", async () => (0, playground_1.openPlayground)(await (0, editor_1.activeTextDocument)()))); +} +async function registerTools(context) { + context.subscriptions.push(coc_nvim_1.commands.registerCommand("go.install.tools", () => (0, commands_1.installTools)())); +} +async function registerLspCommands(context) { + context.subscriptions.push(coc_nvim_1.commands.registerCommand("go.gopls.tidy", lspcommands_1.goplsTidy)); +} +//# sourceMappingURL=extension.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/checktag.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/checktag.js new file mode 100644 index 0000000..053604a --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/checktag.js @@ -0,0 +1,23 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const request_1 = require("./request"); +const releaseFilter = /^v\d+\.\d+\.\d+$/; +async function checkLatestTag(repo, prefixFilter) { + const data = await (0, request_1.getJSON)(`https://api.github.com/repos/${repo}/tags`); + if (!Array.isArray(data)) { + return ''; + } + let tags = data.map(t => t.name); + if (prefixFilter) { + tags = tags + .filter(t => t.match(prefixFilter)) + .map(t => t.replace(prefixFilter, '')); + } + tags = tags + .filter(t => t.match(releaseFilter)); + return tags.length > 0 + ? tags[0].replace(/^v/, '') + : ''; +} +exports.default = checkLatestTag; +//# sourceMappingURL=checktag.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/config.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/config.js new file mode 100644 index 0000000..d60955c --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/config.js @@ -0,0 +1,57 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.setState = exports.getState = exports.configDir = exports.setStoragePath = exports.getConfig = void 0; +const tslib_1 = require("tslib"); +const path_1 = tslib_1.__importDefault(require("path")); +const os_1 = tslib_1.__importDefault(require("os")); +const fs_1 = tslib_1.__importDefault(require("fs")); +const coc_nvim_1 = require("coc.nvim"); +const fs_2 = require("./fs"); +const state = {}; +function getConfig() { + return coc_nvim_1.workspace.getConfiguration().get("go"); +} +exports.getConfig = getConfig; +function setStoragePath(dir) { + state.storagePath = dir; +} +exports.setStoragePath = setStoragePath; +async function configDir(...names) { + const storage = state.storagePath || path_1.default.join(os_1.default.homedir(), ".config", "coc", "go"); + const dir = path_1.default.join(storage, ...names); + return new Promise((resolve) => { + (0, fs_2.createDir)(dir); + resolve(dir); + }); +} +exports.configDir = configDir; +async function stateFile() { + return path_1.default.join(await configDir(), 'state.json'); +} +async function getStateData() { + try { + const f = await stateFile(); + const d = JSON.parse(await fs_1.default.promises.readFile(f, 'utf-8')); + return d || {}; + } + catch (err) { /* mute */ } + return {}; +} +async function setStateData(data) { + try { + await fs_1.default.promises.writeFile(await stateFile(), JSON.stringify(data, null, ' ')); + } + catch (err) { /* mute */ } +} +async function getState(key) { + const d = await getStateData(); + return d[key] || ''; +} +exports.getState = getState; +async function setState(key, value) { + const d = await getStateData(); + d[key] = value; + await setStateData(d); +} +exports.setState = setState; +//# sourceMappingURL=config.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/fs.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/fs.js new file mode 100644 index 0000000..899b1fd --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/fs.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createDir = void 0; +const tslib_1 = require("tslib"); +const fs_1 = tslib_1.__importDefault(require("fs")); +const path_1 = tslib_1.__importDefault(require("path")); +function createDir(dirPath) { + if (fs_1.default.existsSync(dirPath)) { + return; + } + createDir(path_1.default.dirname(dirPath)); + fs_1.default.mkdirSync(dirPath); +} +exports.createDir = createDir; +//# sourceMappingURL=fs.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/fs.test.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/fs.test.js new file mode 100644 index 0000000..28c3ec9 --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/fs.test.js @@ -0,0 +1,29 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = require("tslib"); +const tmp_1 = tslib_1.__importDefault(require("tmp")); +const assert_1 = tslib_1.__importDefault(require("assert")); +const path_1 = tslib_1.__importDefault(require("path")); +const fs_1 = tslib_1.__importDefault(require("fs")); +const fs_2 = require("./fs"); +describe('createDir()', () => { + let tmpDir; + const joinPath = (...parts) => path_1.default.join(tmpDir.name, ...parts); + beforeEach(() => tmpDir = tmp_1.default.dirSync({ unsafeCleanup: true })); + afterEach(() => tmpDir.removeCallback()); + it('should create a directory', () => { + const dirPath = joinPath('test'); + (0, fs_2.createDir)(dirPath); + assert_1.default.ok(fs_1.default.existsSync(dirPath)); + }); + it('should create nested directories', () => { + const dirPath = joinPath('test', 'foo', 'bar'); + (0, fs_2.createDir)(dirPath); + assert_1.default.ok(fs_1.default.existsSync(dirPath)); + }); + it('should not fail if directory exists', () => { + (0, fs_2.createDir)(tmpDir.name); + assert_1.default.ok(fs_1.default.existsSync(tmpDir.name)); + }); +}); +//# sourceMappingURL=fs.test.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/impl.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/impl.js new file mode 100644 index 0000000..f616827 --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/impl.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.generateImplStubs = void 0; +const coc_nvim_1 = require("coc.nvim"); +const binaries_1 = require("../binaries"); +const tools_1 = require("./tools"); +const interfaceRegex = /^(\w+ \*?\w+ )?([\w./-]+)$/; +async function generateImplStubs(document) { + try { + const implInput = await coc_nvim_1.window.requestInput("Enter receiver and interface [f *File io.Closer]"); + if (implInput == null) { + coc_nvim_1.window.showMessage("No input detected! Aborting.", "warning"); + return; + } + const matches = implInput.match(interfaceRegex); + if (!matches) { + throw Error(`Cannot parse input: ${implInput}`); + } + const edit = await runGoImpl(document, [matches[1], matches[2]]); + await coc_nvim_1.workspace.applyEdit({ changes: { [document.uri]: [edit] } }); + } + catch (error) { + coc_nvim_1.window.showMessage(error, "error"); + } +} +exports.generateImplStubs = generateImplStubs; +async function runGoImpl(document, args) { + const stdout = await (0, tools_1.execTool)(binaries_1.IMPL, args); + const { line } = await coc_nvim_1.window.getCursorPosition(); + const insertPos = { line: line + 1, character: 0 }; + const lineText = await coc_nvim_1.workspace.getLine(document.uri, line); + const newText = lineText.trim() === '' + ? stdout + : `\n${stdout}`; + return { + range: { + start: insertPos, + end: insertPos + }, + newText + }; +} +//# sourceMappingURL=impl.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/lspcommands.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/lspcommands.js new file mode 100644 index 0000000..8e5b4c6 --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/lspcommands.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.goplsTidy = void 0; +const coc_nvim_1 = require("coc.nvim"); +async function goplsTidy() { + const doc = await coc_nvim_1.workspace.document; + await coc_nvim_1.commands.executeCommand('gopls.tidy', { URIs: [doc.uri] }); +} +exports.goplsTidy = goplsTidy; +//# sourceMappingURL=lspcommands.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/modify-tags.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/modify-tags.js new file mode 100644 index 0000000..ca80186 --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/modify-tags.js @@ -0,0 +1,113 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.clearTags = exports.removeTags = exports.addTags = void 0; +const coc_nvim_1 = require("coc.nvim"); +const vscode_uri_1 = require("vscode-uri"); +const tools_1 = require("./tools"); +const binaries_1 = require("../binaries"); +//////////////////////////////////////////////////////////////////////////////// +async function addTags(document, params = {}) { + const config = coc_nvim_1.workspace.getConfiguration().get('go.tags', {}); + let tags = (params.tags && params.tags.length > 0) + ? params.tags.join(',') + : (config.tags || 'json'); + let options = (config.options || config.options === "") + ? config.options + : 'json=omitempty'; + const transform = (config.transform || "snakecase"); + const skipUnexported = config.skipUnexported; + let cursor; + if (params.prompt) { + cursor = await coc_nvim_1.window.getCursorPosition(); + tags = await coc_nvim_1.window.requestInput('Enter comma separated tag names', tags); + if (!tags) { + return; + } + options = await coc_nvim_1.window.requestInput('Enter comma separated options', options); + } + const args = [ + '-add-tags', tags.replace(/ +/g, ''), + '-override', + '-add-options', (options || ""), + '-transform', transform, + ...(await offsetArgs(document, (params.selection || "struct"), cursor)) + ]; + if (skipUnexported) { + args.push('--skip-unexported'); + } + await runGomodifytags(document, args); +} +exports.addTags = addTags; +async function removeTags(document, params = {}) { + const config = coc_nvim_1.workspace.getConfiguration().get('go.tags', {}); + let tags = (params.tags && params.tags.length > 0) + ? params.tags.join(',') + : (config.tags || 'json'); + let cursor; + if (params.prompt) { + cursor = await coc_nvim_1.window.getCursorPosition(); + tags = await coc_nvim_1.window.requestInput('Enter comma separated tag names', tags); + if (!tags) { + return; + } + } + await runGomodifytags(document, [ + '-remove-tags', (tags || "json"), + '-clear-options', + ...(await offsetArgs(document, (params.selection || "struct"), cursor)) + ]); +} +exports.removeTags = removeTags; +async function clearTags(document, params = {}) { + await runGomodifytags(document, [ + '-clear-tags', + '-clear-options', + ...(await offsetArgs(document, (params.selection || "struct"))) + ]); +} +exports.clearTags = clearTags; +//////////////////////////////////////////////////////////////////////////////// +async function runGomodifytags(document, args) { + const fileName = vscode_uri_1.URI.parse(document.uri).fsPath; + args.push('-modified', '-file', fileName, '-format', 'json'); + const input = fileArchive(fileName, document.getText()); + const edit = await execGomodifytags(args, input); + await coc_nvim_1.workspace.applyEdit({ changes: { [document.uri]: [edit] } }); +} +async function execGomodifytags(args, input) { + try { + const stdout = await (0, tools_1.execTool)(binaries_1.GOMODIFYTAGS, args, input); + const mods = JSON.parse(stdout); + return { + range: { + start: { line: mods.start - 1, character: 0 }, + end: { line: mods.end, character: 0 } + }, + newText: mods.lines.join("\n") + "\n" + }; + } + catch (err) { + coc_nvim_1.window.showMessage(`Cannot modify tags: ${err}`, 'error'); + throw err; + } +} +function fileArchive(fileName, fileContents) { + return fileName + '\n' + Buffer.byteLength(fileContents, 'utf8') + '\n' + fileContents; +} +// https://github.com/golang/vscode-go/blob/master/src/util.ts#L84 +function byteOffsetAt(document, position) { + const offset = document.offsetAt(position); + const text = document.getText(); + return Buffer.byteLength(text.substr(0, offset)).toString(); +} +async function offsetArgs(document, selection, cursor = null) { + cursor = cursor || await coc_nvim_1.window.getCursorPosition(); + coc_nvim_1.window.showMessage(`selection = ${selection}`); + switch (selection) { + case "struct": + return ['-offset', byteOffsetAt(document, cursor)]; + case "line": + return ['-line', String(cursor.line + 1)]; + } +} +//# sourceMappingURL=modify-tags.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/playground.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/playground.js new file mode 100644 index 0000000..9fef796 --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/playground.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.openPlayground = void 0; +const coc_nvim_1 = require("coc.nvim"); +const tools_1 = require("./tools"); +const binaries_1 = require("../binaries"); +async function openPlayground(document) { + return runGoplay(document.getText()); +} +exports.openPlayground = openPlayground; +async function runGoplay(code) { + try { + const stdout = await (0, tools_1.execTool)(binaries_1.GOPLAY, ['-'], code); + coc_nvim_1.window.showMessage(stdout); + return true; + } + catch (err) { + coc_nvim_1.window.showMessage(`${err}`, "error"); + return false; + } +} +//# sourceMappingURL=playground.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/request.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/request.js new file mode 100644 index 0000000..ad7c968 --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/request.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getJSON = void 0; +const tslib_1 = require("tslib"); +const https_1 = tslib_1.__importDefault(require("https")); +const options = { + headers: { + 'User-Agent': `coc-go`, + } +}; +function getJSON(url) { + return new Promise((resolve, reject) => { + https_1.default.get(url, options, (res) => { + let body = ''; + res.on('data', (chunk) => (body += chunk)); + res.on('end', () => { + try { + resolve(JSON.parse(body)); + } + catch (err) { + reject(err); + } + }); + }).on('error', reject); + }); +} +exports.getJSON = getJSON; +//# sourceMappingURL=request.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/tests.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/tests.js new file mode 100644 index 0000000..4aa14b2 --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/tests.js @@ -0,0 +1,85 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.extractFunctionName = exports.toogleTests = exports.generateTestsFunction = exports.generateTestsExported = exports.generateTestsAll = void 0; +const coc_nvim_1 = require("coc.nvim"); +const vscode_uri_1 = require("vscode-uri"); +const tools_1 = require("./tools"); +const binaries_1 = require("../binaries"); +//////////////////////////////////////////////////////////////////////////////// +async function generateTestsAll(document) { + if (isTest(document)) { + coc_nvim_1.window.showMessage("Document is a test file", "error"); + return; + } + await runGotests(document, ["-all"]) && await openTests(document); +} +exports.generateTestsAll = generateTestsAll; +async function generateTestsExported(document) { + if (isTest(document)) { + coc_nvim_1.window.showMessage("Document is a test file", "error"); + return; + } + await runGotests(document, ["-exported"]) && await openTests(document); +} +exports.generateTestsExported = generateTestsExported; +async function generateTestsFunction(document) { + if (isTest(document)) { + coc_nvim_1.window.showMessage("Document is a test file", "error"); + return; + } + const { line } = await coc_nvim_1.window.getCursorPosition(); + const text = await document.getText({ + start: { line, character: 0 }, + end: { line, character: Infinity }, + }); + coc_nvim_1.window.showMessage(text); + const funcName = extractFunctionName(text); + if (!funcName) { + coc_nvim_1.window.showMessage("No function found", "error"); + return; + } + await runGotests(document, ["-only", `^${funcName}$`]) && await openTests(document); +} +exports.generateTestsFunction = generateTestsFunction; +async function toogleTests(document) { + const targetURI = isTest(document) + ? sourceURI(document) + : testURI(document); + return coc_nvim_1.workspace.openResource(targetURI); +} +exports.toogleTests = toogleTests; +//////////////////////////////////////////////////////////////////////////////// +async function openTests(document) { + return coc_nvim_1.workspace.openResource(testURI(document)); +} +function isTest(document) { + return document.uri.endsWith('_test.go'); +} +function testURI(document) { + return document.uri.replace(/(_test)?\.go$/, '_test.go'); +} +function sourceURI(document) { + return document.uri.replace(/(_test)?\.go$/, '.go'); +} +async function runGotests(document, args) { + const config = coc_nvim_1.workspace.getConfiguration().get('go.tests', {}); + args.push(...(config.generateFlags || []), '-w', vscode_uri_1.URI.parse(document.uri).fsPath); + try { + const stdout = await (0, tools_1.execTool)(binaries_1.GOTESTS, args); + coc_nvim_1.window.showMessage(stdout || ""); + return true; + } + catch (err) { + coc_nvim_1.window.showMessage(`Error: ${err}`, "error"); + return false; + } +} +//////////////////////////////////////////////////////////////////////////////// +function extractFunctionName(line) { + const m = /^func +(\([^)]+\) +)?([^\s(]+)/.exec(line); + if (m) { + return m[2]; + } +} +exports.extractFunctionName = extractFunctionName; +//# sourceMappingURL=tests.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/tests.test.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/tests.test.js new file mode 100644 index 0000000..70d0801 --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/tests.test.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = require("tslib"); +const assert_1 = tslib_1.__importDefault(require("assert")); +const tests_1 = require("./tests"); +describe('extractFunctionName()', () => { + const cases = [ + ['', null], + ['\tfuncFoo()', null], + ['func Foo() {', 'Foo'], + ['func Foo() string {', 'Foo'], + ['func Foo(str string) string {', 'Foo'], + ['func (b *Bar) Foo(str string) string {', 'Foo'], + ]; + cases.forEach(([line, name]) => { + it(`should extract ${JSON.stringify(name)} from "${line}"`, () => { + assert_1.default.equal(name, (0, tests_1.extractFunctionName)(line)); + }); + }); +}); +//# sourceMappingURL=tests.test.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/tools.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/tools.js new file mode 100644 index 0000000..375db4a --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/tools.js @@ -0,0 +1,149 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.execTool = exports.commandExists = exports.runBin = exports.runGoTool = exports.goBinPath = exports.installGoBin = void 0; +const tslib_1 = require("tslib"); +const path_1 = tslib_1.__importDefault(require("path")); +const fs_1 = tslib_1.__importDefault(require("fs")); +const util_1 = tslib_1.__importDefault(require("util")); +const child_process_1 = require("child_process"); +const coc_nvim_1 = require("coc.nvim"); +const which_1 = tslib_1.__importDefault(require("which")); +const config_1 = require("./config"); +const versions_1 = require("./versions"); +const runExec = util_1.default.promisify(child_process_1.exec); +const isWin = process.platform === 'win32'; +async function installGoBin(source, force = false, getVersion) { + const name = goBinName(source); + if (!force && await goBinExists(name)) { + return true; + } + const statusItem = coc_nvim_1.window.createStatusBarItem(90, { progress: true }); + statusItem.text = `Installing '${name}'`; + statusItem.show(); + const success = await goInstall(source) && await goBinExists(name); + if (success) { + const vname = getVersion ? `${name}@${await getVersion()}` : name; + coc_nvim_1.window.showMessage(`Installed '${vname}'`); + } + else { + coc_nvim_1.window.showMessage(`Failed to install '${name}'`, 'error'); + } + statusItem.hide(); + return success; +} +exports.installGoBin = installGoBin; +async function goInstall(source) { + return await goVersionOrLater('1.17.0') + ? goRun(`install ${source}@latest`) + : goRun(`get ${source}@latest`); +} +async function goVersionOrLater(version) { + try { + return (0, versions_1.compareVersions)(version, await getGoVersion()) < 0; + } + catch (err) { + // mute + } + return false; +} +async function getGoVersion() { + try { + const [, out] = await runBin('go', ['version']); + return out.trim().match(/^go version go(\S+) .*$/)[1]; + } + catch (err) { + // mute + } + return ''; +} +async function goBinPath(source) { + const name = goBinName(source); + return path_1.default.join(await (0, config_1.configDir)('bin'), name + (isWin ? ".exe" : "")); +} +exports.goBinPath = goBinPath; +async function runGoTool(name, args = []) { + return runBin(await goBinPath(name), args); +} +exports.runGoTool = runGoTool; +async function runBin(bin, args = []) { + return new Promise((resolve) => { + const p = (0, child_process_1.spawn)(bin, args); + let out = ""; + p.stdout.on('data', (data) => out += data); + p.on("close", code => resolve([code, out])); + }); +} +exports.runBin = runBin; +async function commandExists(command) { + if (path_1.default.isAbsolute(command)) { + return fileExists(command); + } + return new Promise((resolve) => { (0, which_1.default)(command, (err) => resolve(err == null)); }); +} +exports.commandExists = commandExists; +//////////////////////////////////////////////////////////////////////////////// +async function goBinExists(source) { + const name = goBinName(source); + const bin = await goBinPath(name); + return fileExists(bin); +} +async function fileExists(path) { + return new Promise((resolve) => fs_1.default.open(path, 'r', (err) => resolve(err === null))); +} +async function goRun(args) { + const gopath = await (0, config_1.configDir)('tools'); + const gobin = await (0, config_1.configDir)('bin'); + const env = { + GO111MODULE: 'on', + GOBIN: gobin, + GOPATH: gopath, + GOROOT: '', + GOTOOLDIR: '', + }; + const cmd = isWin + ? `go ${args}` + : `env GOBIN="${gobin}" go ${args}`; + const opts = { + env: Object.assign({}, process.env, env), + cwd: gopath, + shell: isWin ? undefined : process.env.SHELL, + windowsHide: true, + }; + try { + await runExec(cmd, opts); + } + catch (ex) { + coc_nvim_1.window.showMessage(ex, 'error'); + return false; + } + return true; +} +async function execTool(source, args, input) { + const [bin, name] = await Promise.all([ + goBinPath(source), + goBinName(source), + ]); + if (!await commandExists(bin)) { + await installGoBin(source); + } + return new Promise((resolve, reject) => { + const p = (0, child_process_1.execFile)(bin, args, { cwd: coc_nvim_1.workspace.cwd }, async (err, stdout, stderr) => { + if (err && err.code === "ENOENT") { + return reject(`Error: Command ${name} not found! Run "CocCommand go.install.${name}" to install it and try again.`); + } + if (err) { + return reject(stderr.toString()); + } + return resolve(stdout.toString()); + }); + if (p.pid) { + p.stdin.end(input); + } + }); +} +exports.execTool = execTool; +//////////////////////////////////////////////////////////////////////////////// +function goBinName(source) { + return source.replace(/\/\.\.\.$/, '').split('/').pop(); +} +//# sourceMappingURL=tools.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/ui.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/ui.js new file mode 100644 index 0000000..772354e --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/ui.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.withProgress = void 0; +const coc_nvim_1 = require("coc.nvim"); +// eslint-disable-next-line no-unused-vars +async function withProgress(text, fn) { + const status = coc_nvim_1.window.createStatusBarItem(90, { progress: true }); + // Show status item at leaste one second + let offset = 1000; + const t = setTimeout(() => (offset = 0), offset); + const dispose = () => { + clearTimeout(t); + setTimeout(() => status.dispose(), offset); + }; + status.text = text; + status.show(); + await fn(status); + dispose(); +} +exports.withProgress = withProgress; +//# sourceMappingURL=ui.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/versions.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/versions.js new file mode 100644 index 0000000..1bcd82a --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/versions.js @@ -0,0 +1,33 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseVersion = exports.compareVersions = exports.isValidVersion = void 0; +const versionExp = /^v?(\d+)\.(\d+)(\.(\d+))?$/; +function isValidVersion(version) { + return Boolean(version.trim().match(versionExp)); +} +exports.isValidVersion = isValidVersion; +function compareVersions(version1, version2) { + const v1 = parseVersion(version1); + const v2 = parseVersion(version2); + for (let i = 0; i < 3; i++) { + if (v1[i] !== v2[i]) { + return Math.max(-1, Math.min(1, v1[i] - v2[i])); + } + } + return 0; +} +exports.compareVersions = compareVersions; +function parseVersion(v) { + let ver = [0, 0, 0]; + const match = v.trim().match(versionExp); + if (match) { + const [, major, minor, , patch = '0'] = match; + ver = [parseInt(major), parseInt(minor), parseInt(patch)]; + } + if (!isValidVersion(v)) { + throw new Error(`'${v}' is not a valid version`); + } + return ver; +} +exports.parseVersion = parseVersion; +//# sourceMappingURL=versions.js.map
\ No newline at end of file diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/versions.test.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/versions.test.js new file mode 100644 index 0000000..640786f --- /dev/null +++ b/.config/coc/extensions/node_modules/coc-go/lib/utils/versions.test.js @@ -0,0 +1,59 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = require("tslib"); +const assert_1 = tslib_1.__importDefault(require("assert")); +const versions_1 = require("./versions"); +const v0_0_0 = [0, 0, 0]; +const v1_0_0 = [1, 0, 0]; +const v1_2_0 = [1, 2, 0]; +const v1_2_3 = [1, 2, 3]; +describe('isValidVersion()', () => { + it('should recognise valid versions', () => { + assert_1.default.ok((0, versions_1.isValidVersion)('v1.0.0')); + assert_1.default.ok((0, versions_1.isValidVersion)('1.0.0')); + assert_1.default.ok((0, versions_1.isValidVersion)('0.1.0')); + assert_1.default.ok((0, versions_1.isValidVersion)('0.0.1')); + assert_1.default.ok((0, versions_1.isValidVersion)('0.0.0')); + assert_1.default.ok((0, versions_1.isValidVersion)('v0.0.0')); + }); + it('should recognise invalid versions', () => { + assert_1.default.ok(!(0, versions_1.isValidVersion)('v 1.0.0')); + assert_1.default.ok(!(0, versions_1.isValidVersion)('1')); + assert_1.default.ok((0, versions_1.isValidVersion)('1.1')); + }); +}); +describe("parseVersion()", () => { + it("should parse simple versions", () => { + assert_1.default.deepStrictEqual((0, versions_1.parseVersion)('v0.0.0'), v0_0_0); + assert_1.default.deepStrictEqual((0, versions_1.parseVersion)('v1.0.0'), v1_0_0); + assert_1.default.deepStrictEqual((0, versions_1.parseVersion)('v1.2.0'), v1_2_0); + assert_1.default.deepStrictEqual((0, versions_1.parseVersion)('v1.2'), v1_2_0); + assert_1.default.deepStrictEqual((0, versions_1.parseVersion)('v1.2.3'), v1_2_3); + }); +}); +describe('compareVersions()', () => { + it('should compare equal version', () => { + assert_1.default.throws(() => (0, versions_1.compareVersions)('', '')); + assert_1.default.strictEqual((0, versions_1.compareVersions)('1.0.0', '1.0.0'), 0); + assert_1.default.strictEqual((0, versions_1.compareVersions)('1.2.0', '1.2.0'), 0); + assert_1.default.strictEqual((0, versions_1.compareVersions)('1.2.3', '1.2.3'), 0); + assert_1.default.strictEqual((0, versions_1.compareVersions)('v1.0.0', '1.0.0'), 0); + }); + it('should compare greater version', () => { + assert_1.default.throws(() => (0, versions_1.compareVersions)('', '')); + assert_1.default.strictEqual((0, versions_1.compareVersions)('2.0.0', '1.0.0'), 1); + assert_1.default.strictEqual((0, versions_1.compareVersions)('1.1.0', '1.0.0'), 1); + assert_1.default.strictEqual((0, versions_1.compareVersions)('1.0.4', '1.0.0'), 1); + assert_1.default.strictEqual((0, versions_1.compareVersions)('v1.1.0', '1.0.0'), 1); + assert_1.default.strictEqual((0, versions_1.compareVersions)('1.1.0', 'v1.0.0'), 1); + }); + it('should compare smaller version', () => { + assert_1.default.throws(() => (0, versions_1.compareVersions)('', '')); + assert_1.default.strictEqual((0, versions_1.compareVersions)('1.0.0', '2.0.0'), -1); + assert_1.default.strictEqual((0, versions_1.compareVersions)('1.0.0', '1.1.0'), -1); + assert_1.default.strictEqual((0, versions_1.compareVersions)('1.0.0', '1.0.4'), -1); + assert_1.default.strictEqual((0, versions_1.compareVersions)('1.0.0', 'v1.1.0'), -1); + assert_1.default.strictEqual((0, versions_1.compareVersions)('v1.0.0', '1.1.0'), -1); + }); +}); +//# sourceMappingURL=versions.test.js.map
\ No newline at end of file |
