From c38df6e473a9b2ef00d02674d4c1d68e565aa7d4 Mon Sep 17 00:00:00 2001 From: Paula Camargo Date: Thu, 11 Jul 2024 13:10:56 -0700 Subject: [PATCH 1/9] Add inline provider --- .../inlineValue/pythonInlineValueProvider.ts | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/extension/debugger/inlineValue/pythonInlineValueProvider.ts diff --git a/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts b/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts new file mode 100644 index 00000000..07bef630 --- /dev/null +++ b/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { commands, debug, InlineValue, InlineValueContext, InlineValueEvaluatableExpression, InlineValuesProvider, InlineValueText, InlineValueVariableLookup, + Range, TextDocument } from "vscode"; +import { executeCommand } from "../../common/vscodeapi"; + + +export class PythonInlineValueProvider implements InlineValuesProvider { + + public async provideInlineValues(document: TextDocument, viewPort: Range, context: InlineValueContext): Promise { + console.log("inline provider"); + let variables = await resolveInlineVariables({ + uri: document.uri.toString(), + viewPort: viewPort, + stoppedLocation: context.stoppedLocation, + }); + return []; + } + +} + +// tslint:disable-next-line:interface-name +export interface InlineParams { + uri: string; + viewPort?: Range; + stoppedLocation: Range; +} + +// tslint:disable-next-line:interface-name +export enum InlineKind { + VariableLookup = 0, + Evaluation = 1, +} + +// tslint:disable-next-line:interface-name +export interface InlineVariable { + range: Range; + name: string; + kind: InlineKind; + expression: string; + declaringClass: string; +} + +export async function resolveInlineVariables(inlineParams: InlineParams): Promise { + return await executeCommand("vscode.python.resolveInlineVariables", JSON.stringify(inlineParams)); +} \ No newline at end of file From ea33e67315ac038d067edcd4958ff3a5e258f8f0 Mon Sep 17 00:00:00 2001 From: Paula Camargo Date: Fri, 12 Jul 2024 13:36:49 -0700 Subject: [PATCH 2/9] add inlineProvider --- .../inlineValue/pythonInlineValueProvider.ts | 37 +++++++++++++++---- src/extension/extensionInit.ts | 4 ++ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts b/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts index 07bef630..82137ec5 100644 --- a/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts +++ b/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts @@ -10,14 +10,34 @@ export class PythonInlineValueProvider implements InlineValuesProvider { public async provideInlineValues(document: TextDocument, viewPort: Range, context: InlineValueContext): Promise { console.log("inline provider"); - let variables = await resolveInlineVariables({ - uri: document.uri.toString(), - viewPort: viewPort, - stoppedLocation: context.stoppedLocation, - }); + let a = JSON.stringify(context); + const allValues: InlineValue[] = []; + + for (let l = 0; l <= context.stoppedLocation.end.line; l++) { + const line = document.lineAt(l); + var re = /\b[a-zA-Z_][a-zA-Z0-9_]*\b/g; + do { + var m = re.exec(line.text); + if (m) { + const varName = m[0]; + const rng = new Range(l, m.index, l, m.index + varName.length); + + //allValues.push(new vscode.InlineValueText(r, `${varName}: some value`)); + allValues.push(new InlineValueVariableLookup(rng, varName)); + //allValues.push(new vscode.InlineValueEvaluatableExpression(r, varName)); + } + } while (m); + } + + return allValues; + // let variables = await resolveInlineVariables({ + // uri: document.uri.toString(), + // viewPort: viewPort, + // stoppedLocation: context.stoppedLocation, + // }); + return []; } - } // tslint:disable-next-line:interface-name @@ -43,5 +63,6 @@ export interface InlineVariable { } export async function resolveInlineVariables(inlineParams: InlineParams): Promise { - return await executeCommand("vscode.python.resolveInlineVariables", JSON.stringify(inlineParams)); -} \ No newline at end of file + debug.startDebugging; + return await executeCommand("vscode.debug.resolveInlineVariables", JSON.stringify(inlineParams)); +} diff --git a/src/extension/extensionInit.ts b/src/extension/extensionInit.ts index 760644cb..f41e2f09 100644 --- a/src/extension/extensionInit.ts +++ b/src/extension/extensionInit.ts @@ -49,6 +49,7 @@ import { openReportIssue } from './common/application/commands/reportIssueComman import { buildApi } from './api'; import { IExtensionApi } from './apiTypes'; import { registerHexDebugVisualizationTreeProvider } from './debugger/visualizers/inlineHexDecoder'; +import { PythonInlineValueProvider } from './debugger/inlineValue/pythonInlineValueProvider'; export async function registerDebugger(context: IExtensionContext): Promise { const childProcessAttachService = new ChildProcessAttachService(); @@ -136,6 +137,7 @@ export async function registerDebugger(context: IExtensionContext): Promise { const shouldTerminalFocusOnStart = getConfiguration('python', debugSession.workspaceFolder?.uri)?.terminal @@ -195,6 +197,8 @@ export async function registerDebugger(context: IExtensionContext): Promise('inlineHexDecoder', registerHexDebugVisualizationTreeProvider()), ); + context.subscriptions.push(languages.registerInlineValuesProvider({language: 'python'}, new PythonInlineValueProvider())); + context.subscriptions.push( debug.registerDebugVisualizationProvider('inlineHexDecoder', { provideDebugVisualization(_context, _token) { From 5631e6f48bef90face92d99ee9e7bd1bbbad81c3 Mon Sep 17 00:00:00 2001 From: Paula Camargo Date: Sat, 13 Jul 2024 22:33:05 -0700 Subject: [PATCH 3/9] Add inlie provider --- src/extension/common/vscodeapi.ts | 4 + .../inlineValue/pythonInlineValueProvider.ts | 139 +++++++++++------- src/extension/extensionInit.ts | 10 +- 3 files changed, 94 insertions(+), 59 deletions(-) diff --git a/src/extension/common/vscodeapi.ts b/src/extension/common/vscodeapi.ts index 3425be77..7ba92c93 100644 --- a/src/extension/common/vscodeapi.ts +++ b/src/extension/common/vscodeapi.ts @@ -128,3 +128,7 @@ export function startDebugging( ) { debug.startDebugging(folder, nameOrConfiguration, parentSession); } + +export function customRequest(command: string, args?: any): any { + return debug.activeDebugSession?.customRequest(command, args); +} diff --git a/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts b/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts index 82137ec5..22366fc1 100644 --- a/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts +++ b/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts @@ -1,68 +1,93 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { commands, debug, InlineValue, InlineValueContext, InlineValueEvaluatableExpression, InlineValuesProvider, InlineValueText, InlineValueVariableLookup, - Range, TextDocument } from "vscode"; -import { executeCommand } from "../../common/vscodeapi"; - +import { + debug, + InlineValue, + InlineValueContext, + InlineValuesProvider, + Range, + TextDocument, + InlineValueVariableLookup, +} from 'vscode'; +import { customRequest } from '../../common/vscodeapi'; export class PythonInlineValueProvider implements InlineValuesProvider { + public async provideInlineValues( + document: TextDocument, + viewPort: Range, + context: InlineValueContext, + ): Promise { + let scopesRequest = await customRequest('scopes', { frameId: context.frameId }); + let variablesRequest = await customRequest('variables', { + variablesReference: scopesRequest.scopes[0].variablesReference, + }); - public async provideInlineValues(document: TextDocument, viewPort: Range, context: InlineValueContext): Promise { - console.log("inline provider"); - let a = JSON.stringify(context); - const allValues: InlineValue[] = []; - - for (let l = 0; l <= context.stoppedLocation.end.line; l++) { - const line = document.lineAt(l); - var re = /\b[a-zA-Z_][a-zA-Z0-9_]*\b/g; - do { - var m = re.exec(line.text); - if (m) { - const varName = m[0]; - const rng = new Range(l, m.index, l, m.index + varName.length); + //https://docs.python.org/3/reference/lexical_analysis.html#keywords + const pythonKeywords = [ + 'False', + 'await', + 'else', + 'import ', + 'pass', + 'None', + 'break', + 'except', + 'in', + 'raise', + 'True', + 'class', + 'finally', + 'is', + 'return', + 'and', + 'continue', + 'for', + 'lambda', + 'try', + 'as', + 'def', + 'from', + 'nonlocal', + 'while', + 'assert', + 'del', + 'global', + 'not', + 'with', + 'async', + 'elif', + 'if', + 'or', + 'yield', + ]; - //allValues.push(new vscode.InlineValueText(r, `${varName}: some value`)); - allValues.push(new InlineValueVariableLookup(rng, varName)); - //allValues.push(new vscode.InlineValueEvaluatableExpression(r, varName)); - } - } while (m); - } + const pythonVariables: any[] = variablesRequest.variables + .filter((variable: any) => variable.type) + .map((variable: any) => variable.name); - return allValues; - // let variables = await resolveInlineVariables({ - // uri: document.uri.toString(), - // viewPort: viewPort, - // stoppedLocation: context.stoppedLocation, - // }); + //VariableRegex for matching variables names in a python file, excluding strings + let variableRegex = /(? { - debug.startDebugging; - return await executeCommand("vscode.debug.resolveInlineVariables", JSON.stringify(inlineParams)); -} diff --git a/src/extension/extensionInit.ts b/src/extension/extensionInit.ts index f41e2f09..30c4ac6a 100644 --- a/src/extension/extensionInit.ts +++ b/src/extension/extensionInit.ts @@ -137,7 +137,7 @@ export async function registerDebugger(context: IExtensionContext): Promise { const shouldTerminalFocusOnStart = getConfiguration('python', debugSession.workspaceFolder?.uri)?.terminal @@ -197,7 +197,13 @@ export async function registerDebugger(context: IExtensionContext): Promise('inlineHexDecoder', registerHexDebugVisualizationTreeProvider()), ); - context.subscriptions.push(languages.registerInlineValuesProvider({language: 'python'}, new PythonInlineValueProvider())); + context.subscriptions.push( + languages.registerInlineValuesProvider({ language: 'python' }, new PythonInlineValueProvider()), + ); + + context.subscriptions.push( + languages.registerInlineValuesProvider({ language: 'python' }, new PythonInlineValueProvider()), + ); context.subscriptions.push( debug.registerDebugVisualizationProvider('inlineHexDecoder', { From 23739bbbb9fb1fc98681f00014bde9855e128bb8 Mon Sep 17 00:00:00 2001 From: Paula Camargo Date: Sat, 13 Jul 2024 23:14:02 -0700 Subject: [PATCH 4/9] Add tests --- src/test/pythonFiles/testVarTypes.py | 6 + .../pythonInlineValueProvider.unit.test.ts | 191 ++++++++++++++++++ 2 files changed, 197 insertions(+) create mode 100644 src/test/pythonFiles/testVarTypes.py create mode 100644 src/test/unittest/inlineValue/pythonInlineValueProvider.unit.test.ts diff --git a/src/test/pythonFiles/testVarTypes.py b/src/test/pythonFiles/testVarTypes.py new file mode 100644 index 00000000..2e660e7b --- /dev/null +++ b/src/test/pythonFiles/testVarTypes.py @@ -0,0 +1,6 @@ +var1 = 5 +var2 = 7 +var3 = "hola" +var4 = {"a": 1, "b": 2} +var5 = [1, 2, 3] +var6 =var1 + var2 diff --git a/src/test/unittest/inlineValue/pythonInlineValueProvider.unit.test.ts b/src/test/unittest/inlineValue/pythonInlineValueProvider.unit.test.ts new file mode 100644 index 00000000..e49cd5e4 --- /dev/null +++ b/src/test/unittest/inlineValue/pythonInlineValueProvider.unit.test.ts @@ -0,0 +1,191 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +'use strict'; + +import * as chaiAsPromised from 'chai-as-promised'; +import * as path from 'path'; +import * as sinon from 'sinon'; +import { use, expect } from 'chai'; +import { EXTENSION_ROOT_DIR_FOR_TESTS } from '../../constants'; +import { PythonInlineValueProvider } from '../../../extension/debugger/inlineValue/pythonInlineValueProvider'; +import { workspace, Range, InlineValueContext, debug, TextDocument } from 'vscode'; +import * as vscodeapi from '../../../extension/common/vscodeapi'; + +use(chaiAsPromised); + +const WS_ROOT = path.join(EXTENSION_ROOT_DIR_FOR_TESTS, 'src', 'test'); + +suite('Debugging - pythonInlineProvider', () => { + let customRequestStub: sinon.SinonStub; + + setup(() => { + customRequestStub = sinon.stub(vscodeapi, 'customRequest'); + customRequestStub.withArgs('scopes', sinon.match.any).resolves({ scopes: [{ variablesReference: 0 }] }); + customRequestStub.withArgs('variables', sinon.match.any).resolves({ + variables: [ + { + name: 'special variables', + value: '', + type: '', + evaluateName: 'special variables', + variablesReference: 10, + }, + { + name: 'var1', + value: '5', + type: 'int', + evaluateName: 'var1', + variablesReference: 0, + }, + { + name: 'var2', + value: '7', + type: 'int', + evaluateName: 'var2', + variablesReference: 0, + }, + { + name: 'var3', + value: "'hola'", + type: 'str', + evaluateName: 'var3', + variablesReference: 0, + presentationHint: { + attributes: ['rawString'], + }, + }, + { + name: 'var4', + value: "{'a': 1, 'b': 2}", + type: 'dict', + evaluateName: 'var4', + variablesReference: 8, + }, + { + name: 'var5', + value: '[1, 2, 3]', + type: 'list', + evaluateName: 'var5', + variablesReference: 9, + }, + ], + }); + }); + + teardown(async () => { + sinon.restore(); + }); + + test('ProvideInlineValues function should return all the vars in the python file', async () => { + const file = path.join(WS_ROOT, 'pythonFiles', 'testVarTypes.py'); + let document = await workspace.openTextDocument(file); + const inlineValueProvider = new PythonInlineValueProvider(); + + const viewPort = new Range(0, 0, 5, 17); + const context = { frameId: 0, stoppedLocation: new Range(5, 1, 5, 1) } as InlineValueContext; + + const result = await inlineValueProvider.provideInlineValues(document, viewPort, context); + const expected = [ + { + range: { + c: { + c: 0, + e: 0, + }, + e: { + c: 0, + e: 4, + }, + }, + variableName: 'var1', + caseSensitiveLookup: false, + }, + { + range: { + c: { + c: 1, + e: 0, + }, + e: { + c: 1, + e: 4, + }, + }, + variableName: 'var2', + caseSensitiveLookup: false, + }, + { + range: { + c: { + c: 2, + e: 0, + }, + e: { + c: 2, + e: 4, + }, + }, + variableName: 'var3', + caseSensitiveLookup: false, + }, + { + range: { + c: { + c: 3, + e: 0, + }, + e: { + c: 3, + e: 4, + }, + }, + variableName: 'var4', + caseSensitiveLookup: false, + }, + { + range: { + c: { + c: 4, + e: 0, + }, + e: { + c: 4, + e: 4, + }, + }, + variableName: 'var5', + caseSensitiveLookup: false, + }, + { + range: { + c: { + c: 5, + e: 6, + }, + e: { + c: 5, + e: 10, + }, + }, + variableName: 'var1', + caseSensitiveLookup: false, + }, + { + range: { + c: { + c: 5, + e: 13, + }, + e: { + c: 5, + e: 17, + }, + }, + variableName: 'var2', + caseSensitiveLookup: false, + }, + ]; + expect(result).to.deep.equal(expected); + }); +}); From 4519e459a90f3a71fb8f20e6d296b97e882f9702 Mon Sep 17 00:00:00 2001 From: Paula Camargo Date: Mon, 15 Jul 2024 11:43:19 -0700 Subject: [PATCH 5/9] fix import --- src/extension/debugger/inlineValue/pythonInlineValueProvider.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts b/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts index 22366fc1..b808f553 100644 --- a/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts +++ b/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts @@ -2,7 +2,6 @@ // Licensed under the MIT license. import { - debug, InlineValue, InlineValueContext, InlineValuesProvider, From 7a7bd62723d65ab87a0b06caee38bc334ae88b90 Mon Sep 17 00:00:00 2001 From: Paula Camargo Date: Mon, 15 Jul 2024 11:49:37 -0700 Subject: [PATCH 6/9] fix lint --- .../unittest/inlineValue/pythonInlineValueProvider.unit.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/unittest/inlineValue/pythonInlineValueProvider.unit.test.ts b/src/test/unittest/inlineValue/pythonInlineValueProvider.unit.test.ts index e49cd5e4..fb0e77c3 100644 --- a/src/test/unittest/inlineValue/pythonInlineValueProvider.unit.test.ts +++ b/src/test/unittest/inlineValue/pythonInlineValueProvider.unit.test.ts @@ -9,7 +9,7 @@ import * as sinon from 'sinon'; import { use, expect } from 'chai'; import { EXTENSION_ROOT_DIR_FOR_TESTS } from '../../constants'; import { PythonInlineValueProvider } from '../../../extension/debugger/inlineValue/pythonInlineValueProvider'; -import { workspace, Range, InlineValueContext, debug, TextDocument } from 'vscode'; +import { workspace, Range, InlineValueContext } from 'vscode'; import * as vscodeapi from '../../../extension/common/vscodeapi'; use(chaiAsPromised); From c9ed0cde8b8c1877b1e3129b07312457e1c7732e Mon Sep 17 00:00:00 2001 From: Paula Camargo Date: Tue, 16 Jul 2024 17:34:31 -0700 Subject: [PATCH 7/9] Update inline function to remove strins values --- .../inlineValue/pythonInlineValueProvider.ts | 47 ++++++++++++++++--- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts b/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts index b808f553..f71a37d6 100644 --- a/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts +++ b/src/extension/debugger/inlineValue/pythonInlineValueProvider.ts @@ -8,6 +8,7 @@ import { Range, TextDocument, InlineValueVariableLookup, + InlineValueEvaluatableExpression, } from 'vscode'; import { customRequest } from '../../common/vscodeapi'; @@ -59,14 +60,19 @@ export class PythonInlineValueProvider implements InlineValuesProvider { 'if', 'or', 'yield', + 'self', ]; const pythonVariables: any[] = variablesRequest.variables .filter((variable: any) => variable.type) .map((variable: any) => variable.name); - //VariableRegex for matching variables names in a python file, excluding strings - let variableRegex = /(? { + const content = match.slice(1, -1); + + let result = ''; + let tempMatch; + + while ((tempMatch = insideBracesRegex.exec(content)) !== null) { + result += tempMatch[0]; + } + const processedContent = result || content; + + return match[0] + processedContent + match[0]; + }); +} From 43eac63ff9a1f9343f925611b932137346ffc409 Mon Sep 17 00:00:00 2001 From: Paula Camargo Date: Tue, 16 Jul 2024 17:46:13 -0700 Subject: [PATCH 8/9] Add unit test for class type --- src/test/pythonFiles/testClassVarType.py | 10 ++ .../pythonInlineValueProvider.unit.test.ts | 91 +++++++++++++++++-- 2 files changed, 94 insertions(+), 7 deletions(-) create mode 100644 src/test/pythonFiles/testClassVarType.py diff --git a/src/test/pythonFiles/testClassVarType.py b/src/test/pythonFiles/testClassVarType.py new file mode 100644 index 00000000..5b91c3b6 --- /dev/null +++ b/src/test/pythonFiles/testClassVarType.py @@ -0,0 +1,10 @@ +class Person: + def __init__(self, name, age): + self.name = name + self.age = age + + def greet(self): + return f"Hello, my name is {self.name} and I a {self.age} years old." + +person1 = Person("John Doe", 30) +person1.greet() diff --git a/src/test/unittest/inlineValue/pythonInlineValueProvider.unit.test.ts b/src/test/unittest/inlineValue/pythonInlineValueProvider.unit.test.ts index fb0e77c3..accdf38d 100644 --- a/src/test/unittest/inlineValue/pythonInlineValueProvider.unit.test.ts +++ b/src/test/unittest/inlineValue/pythonInlineValueProvider.unit.test.ts @@ -22,6 +22,13 @@ suite('Debugging - pythonInlineProvider', () => { setup(() => { customRequestStub = sinon.stub(vscodeapi, 'customRequest'); customRequestStub.withArgs('scopes', sinon.match.any).resolves({ scopes: [{ variablesReference: 0 }] }); + }); + + teardown(async () => { + sinon.restore(); + }); + + test('ProvideInlineValues function should return all the vars in the python file', async () => { customRequestStub.withArgs('variables', sinon.match.any).resolves({ variables: [ { @@ -71,13 +78,6 @@ suite('Debugging - pythonInlineProvider', () => { }, ], }); - }); - - teardown(async () => { - sinon.restore(); - }); - - test('ProvideInlineValues function should return all the vars in the python file', async () => { const file = path.join(WS_ROOT, 'pythonFiles', 'testVarTypes.py'); let document = await workspace.openTextDocument(file); const inlineValueProvider = new PythonInlineValueProvider(); @@ -188,4 +188,81 @@ suite('Debugging - pythonInlineProvider', () => { ]; expect(result).to.deep.equal(expected); }); + + test('ProvideInlineValues function should return all the vars in the python file with class variables', async () => { + customRequestStub.withArgs('variables', sinon.match.any).resolves({ + variables: [ + { + name: 'self', + value: '<__main__.Person object at 0x10b223310>', + type: 'Person', + evaluateName: 'self', + variablesReference: 5, + }, + ], + }); + const file = path.join(WS_ROOT, 'pythonFiles', 'testClassVarType.py'); + let document = await workspace.openTextDocument(file); + const inlineValueProvider = new PythonInlineValueProvider(); + + const viewPort = new Range(0, 0, 10, 0); + const context = { frameId: 0, stoppedLocation: new Range(6, 1, 6, 1) } as InlineValueContext; + + const result = await inlineValueProvider.provideInlineValues(document, viewPort, context); + const expected = [ + { + range: { + c: { + c: 2, + e: 8, + }, + e: { + c: 2, + e: 17, + }, + }, + expression: 'self.name', + }, + { + range: { + c: { + c: 3, + e: 8, + }, + e: { + c: 3, + e: 16, + }, + }, + expression: 'self.age', + }, + { + range: { + c: { + c: 6, + e: 18, + }, + e: { + c: 6, + e: 27, + }, + }, + expression: 'self.name', + }, + { + range: { + c: { + c: 6, + e: 29, + }, + e: { + c: 6, + e: 37, + }, + }, + expression: 'self.age', + }, + ]; + expect(result).to.deep.equal(expected); + }); }); From 967767a632e2baee6404e6843babd24138a5b531 Mon Sep 17 00:00:00 2001 From: Paula Camargo Date: Thu, 18 Jul 2024 15:37:08 -0700 Subject: [PATCH 9/9] fix merge --- src/extension/extensionInit.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/extension/extensionInit.ts b/src/extension/extensionInit.ts index 30c4ac6a..6f5a75b4 100644 --- a/src/extension/extensionInit.ts +++ b/src/extension/extensionInit.ts @@ -201,10 +201,6 @@ export async function registerDebugger(context: IExtensionContext): Promise