From b6c4cd988f50f5d48f2efb6a53e09574100e5134 Mon Sep 17 00:00:00 2001 From: Paul Cody Johnston Date: Sat, 27 Nov 2021 15:43:12 +0000 Subject: [PATCH] Debugger improvements (#86) * Bump to 1.7.0 * Bump bzl to 1.2.14 * Remove typescript codelens provider * only start adapter and bazel server if this is a launch config --- package-lock.json | 5 +- package.json | 8 +- src/bezel/codelens.ts | 209 ------------------------------------- src/bezel/configuration.ts | 2 +- src/bezel/debugger.ts | 40 ++++--- src/bezel/feature.ts | 5 - src/bezel/lsp.ts | 9 +- src/bezel/subscription.ts | 3 +- 8 files changed, 37 insertions(+), 244 deletions(-) delete mode 100644 src/bezel/codelens.ts diff --git a/package-lock.json b/package-lock.json index 274e4a0e..62dca276 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "bazel-stack-vscode", - "version": "1.4.0", + "version": "1.7.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "1.4.0", + "version": "1.7.0", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.3.4", @@ -4559,6 +4559,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "license": "MIT", "dependencies": { "minimatch": "^3.0.4", "semver": "^7.3.4", diff --git a/package.json b/package.json index 9316d661..a58aefba 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "bazel-stack-vscode", "displayName": "bazel-stack-vscode", "description": "Bazel Support for Visual Studio Code", - "version": "1.6.0", + "version": "1.7.0", "publisher": "StackBuild", "license": "Apache-2.0", "icon": "stackb-full.png", @@ -234,7 +234,7 @@ }, "bsv.bzl.server.release": { "type": "string", - "default": "v1.1.2", + "default": "v1.2.14", "description": "Bzl release version" }, "bsv.bzl.server.command": { @@ -659,7 +659,7 @@ "bazel-explorer": [ { "id": "bsv.workspace", - "name": "Stack VSCode v1.6.0", + "name": "Stack VSCode v1.7.0", "icon": "media/bazel-wireframe.svg", "contextualTitle": "Current Bazel Workspace", "when": "resourceLangId == bazel" @@ -821,4 +821,4 @@ "tabWidth": 2, "arrowParens": "avoid" } -} \ No newline at end of file +} diff --git a/src/bezel/codelens.ts b/src/bezel/codelens.ts deleted file mode 100644 index 3513eb4b..00000000 --- a/src/bezel/codelens.ts +++ /dev/null @@ -1,209 +0,0 @@ -import * as vscode from 'vscode'; -import { flatten } from 'vscode-common/out/arrays'; -import { BazelServer } from './bazel'; -import { Bzl } from './bzl'; -import { CodeSearch } from './codesearch'; -import { LanguageServerConfiguration } from './configuration'; -import { CommandName } from './constants'; -import { StarlarkDebugger } from './debugger'; -import { BzlLanguageClient, Label, LabelKindRange } from './lsp'; -import { Status } from './status'; - -/** - * CodelensProvider for Bazel Commands. - */ -export class BazelCodelensProvider implements vscode.Disposable, vscode.CodeLensProvider { - private disposables: vscode.Disposable[] = []; - private _onDidChangeCodeLenses: vscode.EventEmitter = new vscode.EventEmitter(); - public readonly onDidChangeCodeLenses: vscode.Event = this._onDidChangeCodeLenses.event; - - constructor( - private lsp: BzlLanguageClient, - private bazel: BazelServer, - private codesearch: CodeSearch, - private bzl: Bzl, - private debug: StarlarkDebugger - ) { - this.disposables.push(vscode.languages.registerCodeLensProvider('bazel', this)); - } - - public async provideCodeLenses( - document: vscode.TextDocument, - token: vscode.CancellationToken - ): Promise { - const cfg = await this.lsp.settings.get(); - const enableCodelensBuild = cfg.enableCodelensBuild && this.bazel.status !== Status.DISABLED; - const enableCodelensTest = cfg.enableCodelensTest && this.bazel.status !== Status.DISABLED; - const enableCodelensRun = cfg.enableCodelensRun && this.bazel.status !== Status.DISABLED; - const enableCodelensStarlarkDebug = - cfg.enableCodelensStarlarkDebug && this.debug.status !== Status.DISABLED; - const enableCodelensCodesearch = - cfg.enableCodelensCodesearch && this.codesearch.status !== Status.DISABLED; - const enableCodelensBrowse = cfg.enableCodelensBrowse && this.bzl.status !== Status.DISABLED; - - try { - const labelKinds = await this.lsp.getLabelKindsInDocument(document.uri); - if (!(labelKinds && labelKinds.length)) { - return []; - } - // first entry becomes the template for the codelenses for the "package" - // level codelenses. - const a = labelKinds[0]; - - const recursive = this.createCodeLensesForLabelKindRange( - { - enableCodelensCopyLabel: cfg.enableCodelensCopyLabel, - enableCodelensBuild: enableCodelensBuild, - enableCodelensTest: enableCodelensTest, - enableCodelensRun: false, - enableCodelensStarlarkDebug: false, - enableCodelensCodesearch: enableCodelensCodesearch, - enableCodelensBrowse: enableCodelensBrowse, - }, - { - label: { Repo: a.label.Repo, Pkg: a.label.Pkg, Name: '...' }, - kind: 'package', - range: new vscode.Range(new vscode.Position(0, 0), new vscode.Position(0, 0)), - } - ); - - const all = this.createCodeLensesForLabelKindRange( - { - enableCodelensCopyLabel: cfg.enableCodelensCopyLabel, - enableCodelensBuild: enableCodelensBuild, - enableCodelensTest: enableCodelensTest, - enableCodelensRun: false, - enableCodelensStarlarkDebug: false, - enableCodelensCodesearch: enableCodelensCodesearch, - enableCodelensBrowse: enableCodelensBrowse, - }, - { - label: { Repo: a.label.Repo, Pkg: a.label.Pkg, Name: 'all' }, - kind: 'package', - range: new vscode.Range(new vscode.Position(0, 0), new vscode.Position(0, 0)), - } - ); - - const special = flatten([recursive, all]); - const normal = flatten( - labelKinds.map(lk => - this.createCodeLensesForLabelKindRange( - { - enableCodelensCopyLabel: cfg.enableCodelensCopyLabel, - enableCodelensBuild: enableCodelensBuild, - enableCodelensTest: enableCodelensTest, - enableCodelensRun: enableCodelensRun, - enableCodelensStarlarkDebug: enableCodelensStarlarkDebug, - enableCodelensCodesearch: enableCodelensCodesearch, - enableCodelensBrowse: enableCodelensBrowse, - }, - lk - ) - ) - ); - - return special.concat(normal); - } catch (err) { - console.warn(`codelens error ${document.uri.fsPath}: ${err.message}`); - } - return []; - } - - private createCodeLensesForLabelKindRange( - cfg: Partial, - labelKind: LabelKindRange - ): vscode.CodeLens[] { - const lenses: vscode.CodeLens[] = []; - - if (cfg.enableCodelensCopyLabel) { - lenses.push( - this.labelKindLens(labelKind, '', 'Copy to Clipboard', CommandName.CopyToClipboard) - ); - } - - if (cfg.enableCodelensBuild) { - lenses.push(this.labelKindLens(labelKind, 'build', 'Build label', CommandName.Build)); - } - - const labelName = labelKind.label!.Name!; - if ( - cfg.enableCodelensTest && - (labelName === '...' || labelName === 'all' || labelName.endsWith('_test')) - ) { - lenses.push(this.labelKindLens(labelKind, 'test', 'Test label', CommandName.Test)); - } - - if (cfg.enableCodelensRun) { - lenses.push(this.labelKindLens(labelKind, 'run', 'Run label', CommandName.Run)); - } else { - if (labelKind.label.Name === 'debug_test') { - console.log('?'); - } - } - - if (cfg.enableCodelensStarlarkDebug) { - lenses.push( - this.labelKindLens( - labelKind, - 'debug', - 'Start starlark debug server and debug CLI client', - CommandName.DebugBuild - ) - ); - } - - if (cfg.enableCodelensCodesearch) { - lenses.push( - this.labelKindLens( - labelKind, - 'codesearch', - 'Codesearch all transitive source files for this target', - CommandName.Codesearch - ) - ); - } - - if (cfg.enableCodelensBrowse) { - lenses.push( - this.labelKindLens( - labelKind, - 'browse', - 'View this target in the browser', - CommandName.UiLabel - ) - ); - } - - return lenses; - } - - private labelKindLens( - labelKind: LabelKindRange, - title: string, - tooltip: string, - command: string - ): vscode.CodeLens { - const label = formatLabel(labelKind.label); - if (!title) { - title = label; - } - return new vscode.CodeLens(labelKind.range, { - title: title, - tooltip: tooltip, - command: command, - arguments: [label], - }); - } - - public dispose() { - for (const disposable of this.disposables) { - disposable.dispose(); - } - } -} - -function formatLabel(label: Label): string { - const repo = label.Repo ? '@' + label.Repo : ''; - const sep = label.Name === '...' ? (label.Pkg ? '/' : '') : ':'; - return `${repo}//${label.Pkg}${sep}${label.Name}`; -} diff --git a/src/bezel/configuration.ts b/src/bezel/configuration.ts index 60290ce4..97d69793 100644 --- a/src/bezel/configuration.ts +++ b/src/bezel/configuration.ts @@ -253,7 +253,7 @@ export class BzlSettings extends Settings { enabled: config.get('enabled', true), autoLaunch: config.get('autoLaunch', true), downloadBaseURL: config.get('downloadBaseUrl', 'https://get.bzl.io'), - release: config.get('release', 'v1.1.2'), + release: config.get('release', 'v1.2.14'), executable: normalize(config.get('executable', '')), address: address, command: config.get('command', ['serve', '--address=${address}']), diff --git a/src/bezel/debugger.ts b/src/bezel/debugger.ts index 28669325..2b170392 100644 --- a/src/bezel/debugger.ts +++ b/src/bezel/debugger.ts @@ -15,7 +15,7 @@ import { isDefined } from 'vscode-common/out/types'; export class StarlarkDebugger extends LaunchableComponent - implements vscode.Disposable, vscode.DebugAdapterDescriptorFactory, vscode.DebugConfigurationProvider { + implements vscode.DebugAdapterDescriptorFactory, vscode.DebugConfigurationProvider { constructor( public readonly settings: StarlarkDebuggerSettings, @@ -171,31 +171,41 @@ export class StarlarkDebugger * @return The resolved debug configuration or undefined or null. */ async resolveDebugConfigurationWithSubstitutedVariables(folder: vscode.WorkspaceFolder | undefined, config: vscode.DebugConfiguration, token?: vscode.CancellationToken): Promise { - let targetLabel = config.targetLabel; - if (!targetLabel) { - targetLabel = await this.handleCommandAskForDebugTargetLabel(); - } - if (!targetLabel) { - vscode.window.showInformationMessage('A label for the "bazel build" command is required. Please add it to your launch configuration.'); - return; + if (config.request !== 'launch') { + return config } + // // launch the debug adapter if it not already running + // + if (this.status !== Status.READY && this.status !== Status.DISABLED) { // this needs to wait until the thing is actually running! await this.handleCommandLaunch(); this.restart(); } - // launch the bazel debugger if this is a launch config - if (config.request === 'launch') { - const bazelSettings = await this.bazelSettings.get(); - const flags = bazelSettings.starlarkDebugFlags || []; - const extraFlags = config.extraBazelFlags || []; + // + // make sure target label is defined + // - await vscode.commands.executeCommand(CommandName.Invoke, - ['build', targetLabel, ...flags, ...extraFlags].filter(arg => isDefined(arg))); + if (!config.targetLabel) { + config.targetLabel = await this.handleCommandAskForDebugTargetLabel(); } + if (!config.targetLabel) { + vscode.window.showInformationMessage('A label for the "bazel build" command is required. Please add it to your launch configuration.'); + return; + } + + // + // run bazel debug + // + const bazelSettings = await this.bazelSettings.get(); + const flags = bazelSettings.starlarkDebugFlags || []; + const extraFlags = config.extraBazelFlags || []; + + await vscode.commands.executeCommand(CommandName.Invoke, + ['build', config.targetLabel, ...flags, ...extraFlags].filter(arg => isDefined(arg))); return config; } diff --git a/src/bezel/feature.ts b/src/bezel/feature.ts index 4e2cd22f..63848c07 100644 --- a/src/bezel/feature.ts +++ b/src/bezel/feature.ts @@ -2,8 +2,6 @@ import * as vscode from 'vscode'; import { API } from '../api'; import { Bzl } from './bzl'; import { BuiltInCommands } from '../constants'; -import { Container } from '../container'; -import { BazelCodelensProvider } from './codelens'; import { SubscriptionSettings, BazelConfiguration, @@ -147,9 +145,6 @@ export class BzlFeature implements vscode.Disposable { new StarlarkDebugger(debugSettings, bazelSettings, bzlSettings, workspaceFolder) )); const codeSearch = this.addComponent(new CodeSearch(codeSearchSettings, bzl)); - this.addDisposable( - new BazelCodelensProvider(lspClient, bazelServer, codeSearch, bzl, starlarkDebugger) - ); this.addDisposable( new BezelWorkspaceView( lspClient, diff --git a/src/bezel/lsp.ts b/src/bezel/lsp.ts index 6680613d..255c01dd 100644 --- a/src/bezel/lsp.ts +++ b/src/bezel/lsp.ts @@ -64,6 +64,7 @@ export class BzlLanguageClient } private handleStateChangeEvent(e: StateChangeEvent) { + // console.log('lsp StateChangeEvent new =>', e.newState); let status = Status.UNKNOWN; switch (e.newState) { case State.Starting: @@ -309,9 +310,7 @@ function createLanguageClient(cfg: LanguageServerConfiguration): LanguageClient args: cfg.command, }; - // Options to control the language client let clientOptions: LanguageClientOptions = { - // Register the server for plain text documents documentSelector: [ { scheme: 'file', language: 'starlark' }, { scheme: 'file', language: 'bazel' }, @@ -321,10 +320,8 @@ function createLanguageClient(cfg: LanguageServerConfiguration): LanguageClient // workspace fileEvents: vscode.workspace.createFileSystemWatcher('**/BUILD.bazel'), }, - // initializationFailedHandler: err => { - // this.setError(err instanceof Error ? err : new Error(err)); - // return false; - // }, + progressOnInitialization: true, + initializationOptions: {}, }; const forceDebug = false; diff --git a/src/bezel/subscription.ts b/src/bezel/subscription.ts index 7958a67f..09c97be4 100644 --- a/src/bezel/subscription.ts +++ b/src/bezel/subscription.ts @@ -1,7 +1,6 @@ import * as vscode from 'vscode'; import * as grpc from '@grpc/grpc-js'; import * as loader from '@grpc/proto-loader'; -import { Container } from '../container'; import { ProtoGrpcType as LicenseProtoType } from '../proto/license'; import { SubscriptionConfiguration, @@ -11,7 +10,7 @@ import { } from './configuration'; import { GRPCClient } from './grpcclient'; import { getGRPCCredentials } from './proto'; -import { RunnableComponent, Status } from './status'; +import { RunnableComponent } from './status'; import { LicensesClient } from '../proto/build/stack/license/v1beta1/Licenses'; import { License } from '../proto/build/stack/license/v1beta1/License'; import { RenewLicenseResponse } from '../proto/build/stack/license/v1beta1/RenewLicenseResponse';