| /* eslint-disable @typescript-eslint/no-this-alias */ |
| /* eslint-disable @typescript-eslint/no-explicit-any */ |
| /*--------------------------------------------------------- |
| * Copyright (C) Microsoft Corporation. All rights reserved. |
| * Licensed under the MIT License. See LICENSE in the project root for license information. |
| *--------------------------------------------------------*/ |
| |
| 'use strict'; |
| |
| import path = require('path'); |
| import vscode = require('vscode'); |
| import { getGoplsConfig } from './config'; |
| import { goBuild } from './goBuild'; |
| import { buildLanguageServerConfig } from './language/goLanguageServer'; |
| import { goLint } from './goLint'; |
| import { isModSupported } from './goModules'; |
| import { diagnosticsStatusBarItem, outputChannel } from './goStatus'; |
| import { goVet } from './goVet'; |
| import { getTestFlags, goTest, TestConfig } from './testUtils'; |
| import { ICheckResult } from './util'; |
| import { GoExtensionContext } from './context'; |
| |
| const STATUS_BAR_ITEM_NAME = 'Go Test'; |
| const statusBarItem = vscode.window.createStatusBarItem(STATUS_BAR_ITEM_NAME, vscode.StatusBarAlignment.Left); |
| statusBarItem.name = STATUS_BAR_ITEM_NAME; |
| statusBarItem.command = 'go.test.showOutput'; |
| const neverAgain = { title: "Don't Show Again" }; |
| |
| export function removeTestStatus(e: vscode.TextDocumentChangeEvent) { |
| if (e.document.isUntitled) { |
| return; |
| } |
| statusBarItem.hide(); |
| statusBarItem.text = ''; |
| } |
| |
| export function notifyIfGeneratedFile(this: void, e: vscode.TextDocumentChangeEvent) { |
| const ctx: any = this; |
| if (e.document.isUntitled || e.document.languageId !== 'go') { |
| return; |
| } |
| if ( |
| ctx.globalState.get('ignoreGeneratedCodeWarning') !== true && |
| e.document.lineAt(0).text.match(/^\/\/ Code generated .* DO NOT EDIT\.$/) |
| ) { |
| vscode.window.showWarningMessage('This file seems to be generated. DO NOT EDIT.', neverAgain).then((result) => { |
| if (result === neverAgain) { |
| ctx.globalState.update('ignoreGeneratedCodeWarning', true); |
| } |
| }); |
| } |
| } |
| |
| interface IToolCheckResults { |
| diagnosticCollection: vscode.DiagnosticCollection; |
| errors: ICheckResult[]; |
| } |
| |
| export function check( |
| goCtx: GoExtensionContext, |
| fileUri: vscode.Uri, |
| goConfig: vscode.WorkspaceConfiguration |
| ): Promise<IToolCheckResults[]> { |
| diagnosticsStatusBarItem.hide(); |
| outputChannel.clear(); |
| const runningToolsPromises = []; |
| const cwd = path.dirname(fileUri.fsPath); |
| |
| // If a user has enabled diagnostics via a language server, |
| // then we disable running build or vet to avoid duplicate errors and warnings. |
| const lspConfig = buildLanguageServerConfig(goConfig); |
| const disableBuildAndVet = lspConfig.enabled && lspConfig.features.diagnostics; |
| |
| let testPromise: Thenable<boolean>; |
| const testConfig: TestConfig = { |
| goConfig, |
| dir: cwd, |
| flags: getTestFlags(goConfig), |
| background: true, |
| applyCodeCoverage: !!goConfig['coverOnSave'] |
| }; |
| |
| const runTest = () => { |
| if (testPromise) { |
| return testPromise; |
| } |
| |
| testPromise = isModSupported(fileUri).then((isMod) => { |
| testConfig.isMod = isMod; |
| return goTest(testConfig); |
| }); |
| return testPromise; |
| }; |
| |
| const { buildDiagnosticCollection, lintDiagnosticCollection, vetDiagnosticCollection } = goCtx; |
| if ( |
| buildDiagnosticCollection && |
| !disableBuildAndVet && |
| !!goConfig['buildOnSave'] && |
| goConfig['buildOnSave'] !== 'off' |
| ) { |
| runningToolsPromises.push( |
| isModSupported(fileUri) |
| .then((isMod) => goBuild(fileUri, isMod, goConfig, goConfig['buildOnSave'] === 'workspace')) |
| .then((errors) => ({ diagnosticCollection: buildDiagnosticCollection, errors })) |
| ); |
| } |
| |
| if (goConfig['testOnSave']) { |
| statusBarItem.show(); |
| statusBarItem.text = 'Tests Running'; |
| runTest().then((success) => { |
| if (statusBarItem.text === '') { |
| return; |
| } |
| if (success) { |
| statusBarItem.text = 'Tests Passed'; |
| } else { |
| statusBarItem.text = 'Tests Failed'; |
| } |
| }); |
| } |
| |
| if (lintDiagnosticCollection && !!goConfig['lintOnSave'] && goConfig['lintOnSave'] !== 'off') { |
| const goplsConfig = getGoplsConfig(fileUri); |
| runningToolsPromises.push( |
| goLint(fileUri, goConfig, goplsConfig, goConfig['lintOnSave']).then((errors) => ({ |
| diagnosticCollection: lintDiagnosticCollection, |
| errors |
| })) |
| ); |
| } |
| |
| if (vetDiagnosticCollection && !disableBuildAndVet && !!goConfig['vetOnSave'] && goConfig['vetOnSave'] !== 'off') { |
| runningToolsPromises.push( |
| goVet(fileUri, goConfig, goConfig['vetOnSave'] === 'workspace').then((errors) => ({ |
| diagnosticCollection: vetDiagnosticCollection, |
| errors |
| })) |
| ); |
| } |
| |
| if (goConfig['coverOnSave']) { |
| runTest().then((success) => { |
| if (!success) { |
| return []; |
| } |
| }); |
| } |
| |
| return Promise.all(runningToolsPromises); |
| } |