Skip to content

Commit 73e67b4

Browse files
authored
Merge branch 'main' into highlightLiveWatch
2 parents 3d36c28 + 40cd824 commit 73e67b4

6 files changed

Lines changed: 175 additions & 9 deletions

File tree

package.json

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,11 @@
187187
"title": "Set Value",
188188
"category": "Live Watch"
189189
},
190+
{
191+
"command": "vscode-cmsis-debugger.liveWatch.resetViewState",
192+
"title": "Reset View State",
193+
"category": "Live Watch"
194+
},
190195
{
191196
"command": "vscode-cmsis-debugger.componentViewer.lockComponent",
192197
"title": "Lock Component Display",
@@ -412,6 +417,10 @@
412417
"command": "vscode-cmsis-debugger.liveWatch.setValue",
413418
"when": "false"
414419
},
420+
{
421+
"command": "vscode-cmsis-debugger.liveWatch.resetViewState",
422+
"when": "false"
423+
},
415424
{
416425
"command": "vscode-cmsis-debugger.componentViewer.lockComponent",
417426
"when": "false"
@@ -636,16 +645,21 @@
636645
"when": "inDebugMode && view == cmsis-debugger.liveWatch && vscode-cmsis-debugger.setExpressionSupported",
637646
"group": "contextMenuG1@5"
638647
},
639-
{
640-
"command": "vscode-cmsis-debugger.liveWatch.deleteAll",
641-
"when": "view == cmsis-debugger.liveWatch",
642-
"group": "contextMenuG2@1"
643-
},
644648
{
645649
"command": "vscode-cmsis-debugger.liveWatch.refresh",
646650
"when": "view == cmsis-debugger.liveWatch",
647651
"group": "contextMenuG2@2"
648652
},
653+
{
654+
"command": "vscode-cmsis-debugger.liveWatch.enablePeriodicUpdate",
655+
"when": "inDebugMode && view == cmsis-debugger.liveWatch && liveWatch.canAccessWhileRunning && !liveWatch.periodicUpdateEnabled",
656+
"group": "contextMenuG2@3"
657+
},
658+
{
659+
"command": "vscode-cmsis-debugger.liveWatch.disablePeriodicUpdate",
660+
"when": "inDebugMode && view == cmsis-debugger.liveWatch && liveWatch.canAccessWhileRunning && liveWatch.periodicUpdateEnabled",
661+
"group": "contextMenuG2@3"
662+
},
649663
{
650664
"command": "vscode-cmsis-debugger.liveWatch.showInMemoryInspector",
651665
"when": "view == cmsis-debugger.liveWatch",
@@ -661,6 +675,16 @@
661675
"when": "inDebugMode && (view == cmsis-debugger.liveWatch) && cdt.debug.outputRadix && cdt.debug.outputRadix != 'hexadecimal' && (debugType == 'gdb' || debugType == 'gdbtarget')",
662676
"group": "contextMenuG4@2"
663677
},
678+
{
679+
"command": "vscode-cmsis-debugger.liveWatch.deleteAll",
680+
"when": "view == cmsis-debugger.liveWatch",
681+
"group": "contextMenuG5@1"
682+
},
683+
{
684+
"command": "vscode-cmsis-debugger.liveWatch.resetViewState",
685+
"when": "inDebugMode && view == cmsis-debugger.liveWatch",
686+
"group": "contextMenuG5@2"
687+
},
664688
{
665689
"command": "vscode-cmsis-debugger.componentViewer.lockComponent",
666690
"when": "view == cmsis-debugger.componentViewer && viewItem == parentInstance",

src/desktop/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ export const activate = async (context: vscode.ExtensionContext): Promise<void>
9494
cpuStates.resetViewState(),
9595
componentViewer.resetRuntimeViewState(),
9696
corePeripherals.resetRuntimeViewState(),
97-
liveWatchTreeDataProvider.resetViewState(),
97+
liveWatchTreeDataProvider.resetRuntimeViewState(),
9898
]);
9999
})
100100
);

src/views/dynamic-view-states.test.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import * as vscode from 'vscode';
1818
import {
1919
clearAllViewState,
2020
clearComponentViewerState,
21+
clearLiveWatchState,
2122
readComponentViewerState,
2223
readCpuStates,
2324
readLiveWatchState,
@@ -409,5 +410,60 @@ describe('dynamic-view-states', () => {
409410
vscode.ConfigurationTarget.Workspace
410411
);
411412
});
413+
414+
it('clears only Live Watch state and preserves other view state', async () => {
415+
const otherConfigKey = 'Other-Target::Debug';
416+
const updateMock = mockGetConfiguration(
417+
{
418+
[CONFIG_KEY]: {
419+
componentViewer: {
420+
filterPattern: 'global-filter',
421+
},
422+
liveWatchPeriodicUpdateEnabled: false,
423+
},
424+
[otherConfigKey]: {
425+
liveWatchPeriodicUpdateEnabled: false,
426+
},
427+
},
428+
{
429+
[CONFIG_KEY]: {
430+
corePeripherals: {
431+
periodicUpdateEnabled: false,
432+
},
433+
liveWatchPeriodicUpdateEnabled: false,
434+
},
435+
[otherConfigKey]: {
436+
cpuStatesEnabled: true,
437+
},
438+
}
439+
);
440+
await clearLiveWatchState();
441+
442+
expect(updateMock).toHaveBeenCalledWith(
443+
'vscode-cmsis-debugger.viewState',
444+
{
445+
[CONFIG_KEY]: {
446+
corePeripherals: {
447+
periodicUpdateEnabled: false,
448+
},
449+
},
450+
[otherConfigKey]: {
451+
cpuStatesEnabled: true,
452+
},
453+
},
454+
vscode.ConfigurationTarget.Workspace
455+
);
456+
expect(updateMock).toHaveBeenCalledWith(
457+
'vscode-cmsis-debugger.viewState',
458+
{
459+
[CONFIG_KEY]: {
460+
componentViewer: {
461+
filterPattern: 'global-filter',
462+
},
463+
},
464+
},
465+
vscode.ConfigurationTarget.Global
466+
);
467+
});
412468
});
413469
});

src/views/dynamic-view-states.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,3 +171,10 @@ export async function writeLiveWatchState(configStateKey: string, periodicUpdate
171171
const stateToStore = periodicUpdateEnabled ? userState === false ? true : undefined : false;
172172
await writeWorkspaceDynamicViewState(configStateKey, 'liveWatchPeriodicUpdateEnabled', stateToStore);
173173
}
174+
175+
export async function clearLiveWatchState(): Promise<void> {
176+
await Promise.all([
177+
clearDynamicViewState('liveWatchPeriodicUpdateEnabled', vscode.ConfigurationTarget.Workspace),
178+
clearDynamicViewState('liveWatchPeriodicUpdateEnabled', vscode.ConfigurationTarget.Global),
179+
]);
180+
}

src/views/live-watch/live-watch.test.ts

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,8 @@ describe('LiveWatchTreeDataProvider', () => {
544544
'vscode-cmsis-debugger.liveWatch.addToLiveWatchFromVariablesView',
545545
'vscode-cmsis-debugger.liveWatch.showInMemoryInspector',
546546
'vscode-cmsis-debugger.liveWatch.enablePeriodicUpdate',
547-
'vscode-cmsis-debugger.liveWatch.disablePeriodicUpdate'
547+
'vscode-cmsis-debugger.liveWatch.disablePeriodicUpdate',
548+
'vscode-cmsis-debugger.liveWatch.resetViewState'
548549
]);
549550
});
550551

@@ -786,6 +787,16 @@ describe('LiveWatchTreeDataProvider', () => {
786787
expect(refreshSpy).toHaveBeenCalled();
787788
jest.useRealTimers();
788789
});
790+
791+
it('reset view state command resets Live Watch view state', async () => {
792+
const resetViewStateSpy = jest.spyOn(liveWatchTreeDataProvider, 'resetViewState').mockResolvedValue(undefined);
793+
await liveWatchTreeDataProvider.activate(tracker);
794+
const handler = getRegisteredHandler('vscode-cmsis-debugger.liveWatch.resetViewState');
795+
expect(handler).toBeDefined();
796+
await handler();
797+
798+
expect(resetViewStateSpy).toHaveBeenCalled();
799+
});
789800
});
790801

791802
describe('Live Watch periodic update state persists to and restores from settings', () => {
@@ -863,6 +874,23 @@ describe('LiveWatchTreeDataProvider', () => {
863874

864875
it('re-enables sessions and updates the toolbar context on view state reset', async () => {
865876
const executeCommandSpy = jest.spyOn(vscode.commands, 'executeCommand').mockResolvedValue(undefined);
877+
const updateMock = jest.fn().mockResolvedValue(undefined);
878+
jest.spyOn(vscode.workspace, 'getConfiguration').mockReturnValue({
879+
update: updateMock,
880+
inspect: jest.fn().mockReturnValue({
881+
globalValue: {
882+
Debug: {
883+
liveWatchPeriodicUpdateEnabled: false,
884+
},
885+
},
886+
workspaceValue: {
887+
Debug: {
888+
liveWatchPeriodicUpdateEnabled: false,
889+
cpuStatesEnabled: true,
890+
},
891+
},
892+
}),
893+
} as any);
866894
await liveWatchTreeDataProvider.activate(tracker);
867895
(tracker as any)._onWillStartSession.fire(gdbtargetDebugSession);
868896
(liveWatchTreeDataProvider as any).sessionLiveWatchStates.get(gdbtargetDebugSession.session.id)!.periodicUpdateEnabled = false;
@@ -871,6 +899,49 @@ describe('LiveWatchTreeDataProvider', () => {
871899

872900
expect((liveWatchTreeDataProvider as any).sessionLiveWatchStates.get(gdbtargetDebugSession.session.id)!.periodicUpdateEnabled).toBe(true);
873901
expect(executeCommandSpy).toHaveBeenCalledWith('setContext', 'liveWatch.periodicUpdateEnabled', true);
902+
expect(updateMock).toHaveBeenCalledWith(
903+
'vscode-cmsis-debugger.viewState',
904+
{
905+
Debug: {
906+
cpuStatesEnabled: true,
907+
},
908+
},
909+
vscode.ConfigurationTarget.Workspace
910+
);
911+
expect(updateMock).toHaveBeenCalledWith(
912+
'vscode-cmsis-debugger.viewState',
913+
undefined,
914+
vscode.ConfigurationTarget.Global
915+
);
916+
});
917+
918+
it('runtime view state reset does not clear persisted settings', async () => {
919+
const executeCommandSpy = jest.spyOn(vscode.commands, 'executeCommand').mockResolvedValue(undefined);
920+
const updateMock = jest.fn().mockResolvedValue(undefined);
921+
jest.spyOn(vscode.workspace, 'getConfiguration').mockReturnValue({
922+
update: updateMock,
923+
inspect: jest.fn().mockReturnValue({
924+
globalValue: {
925+
Debug: {
926+
liveWatchPeriodicUpdateEnabled: false,
927+
},
928+
},
929+
workspaceValue: {
930+
Debug: {
931+
liveWatchPeriodicUpdateEnabled: false,
932+
},
933+
},
934+
}),
935+
} as any);
936+
await liveWatchTreeDataProvider.activate(tracker);
937+
(tracker as any)._onWillStartSession.fire(gdbtargetDebugSession);
938+
(liveWatchTreeDataProvider as any).sessionLiveWatchStates.get(gdbtargetDebugSession.session.id)!.periodicUpdateEnabled = false;
939+
940+
liveWatchTreeDataProvider.resetRuntimeViewState();
941+
942+
expect((liveWatchTreeDataProvider as any).sessionLiveWatchStates.get(gdbtargetDebugSession.session.id)!.periodicUpdateEnabled).toBe(true);
943+
expect(executeCommandSpy).toHaveBeenCalledWith('setContext', 'liveWatch.periodicUpdateEnabled', true);
944+
expect(updateMock).not.toHaveBeenCalled();
874945
});
875946
});
876947

src/views/live-watch/live-watch.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { DebugProtocol } from '@vscode/debugprotocol';
1919
import { GDBTargetDebugSession, GDBTargetDebugTracker, SessionEvent } from '../../debug-session';
2020
import { vscodeViewExists } from '../../vscode-utils';
2121
import { logger } from '../..';
22-
import { readLiveWatchState, writeLiveWatchState } from '../dynamic-view-states';
22+
import { clearLiveWatchState, readLiveWatchState, writeLiveWatchState } from '../dynamic-view-states';
2323

2424
export interface LiveWatchNode {
2525
id: number;
@@ -276,6 +276,8 @@ export class LiveWatchTreeDataProvider implements vscode.TreeDataProvider<LiveWa
276276
async () => await this.handleEnablePeriodicUpdate());
277277
const disablePeriodicUpdateCommand = vscode.commands.registerCommand('vscode-cmsis-debugger.liveWatch.disablePeriodicUpdate',
278278
async () => await this.handleDisablePeriodicUpdate());
279+
const resetViewStateCommand = vscode.commands.registerCommand('vscode-cmsis-debugger.liveWatch.resetViewState',
280+
async () => await this.resetViewState());
279281
vscode.commands.executeCommand('setContext', 'liveWatch.periodicUpdateEnabled', true);
280282
vscode.commands.executeCommand('setContext', 'liveWatch.canAccessWhileRunning', false);
281283
this._context.subscriptions.push(
@@ -292,7 +294,8 @@ export class LiveWatchTreeDataProvider implements vscode.TreeDataProvider<LiveWa
292294
addToLiveWatchFromVariablesViewCommand,
293295
showInMemoryInspectorCommand,
294296
enablePeriodicUpdateCommand,
295-
disablePeriodicUpdateCommand
297+
disablePeriodicUpdateCommand,
298+
resetViewStateCommand
296299
);
297300
return true;
298301
}
@@ -530,6 +533,11 @@ export class LiveWatchTreeDataProvider implements vscode.TreeDataProvider<LiveWa
530533
}
531534

532535
public async resetViewState(): Promise<void> {
536+
await clearLiveWatchState();
537+
this.resetRuntimeViewState();
538+
}
539+
540+
public resetRuntimeViewState(): void {
533541
for (const state of this.sessionLiveWatchStates.values()) {
534542
state.periodicUpdateEnabled = true;
535543
}

0 commit comments

Comments
 (0)