Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
115 commits
Select commit Hold shift + click to select a range
5a61fba
Component Viewer initial commit
thorstendb-ARM Jan 8, 2026
db0edef
fixed mock file paths
thorstendb-ARM Jan 8, 2026
d0a388b
removed paralelism, added functions for Debug IF, added minimal scvd …
thorstendb-ARM Jan 8, 2026
58af03e
removed "any" from parser, added parser tests
thorstendb-ARM Jan 9, 2026
916c093
fixed parser for const folding, added tests
thorstendb-ARM Jan 9, 2026
a460a5e
moved test files, updated evaluator and cache, removed bigInt handling
thorstendb-ARM Jan 9, 2026
8080fc9
removed "any"
thorstendb-ARM Jan 9, 2026
bc32470
added test for pseudo members _count, _addr
thorstendb-ARM Jan 9, 2026
b1ae4bb
fixed evaluator func call
thorstendb-ARM Jan 9, 2026
e96a6b4
minor evaluator fixes, added tests
thorstendb-ARM Jan 9, 2026
a6ecf34
readded gdbtargetDebugTracker, fixed evaluator for context
thorstendb-ARM Jan 9, 2026
9a80f69
fix for potential issue in evaluator.ts
thorstendb-ARM Jan 9, 2026
b3e82ec
fixed unused in test
thorstendb-ARM Jan 9, 2026
a869b4e
fixed memory read, removed most console log, refactored CalcMem
thorstendb-ARM Jan 9, 2026
5d56755
changes to printf return
thorstendb-ARM Jan 9, 2026
902a058
cache refactor and test
thorstendb-ARM Jan 9, 2026
04d9675
added tests for scvd-eval-interface.ts
thorstendb-ARM Jan 9, 2026
7aa9465
cleanup
thorstendb-ARM Jan 9, 2026
a3e297d
refactored
thorstendb-ARM Jan 12, 2026
cb66e7e
refactor
thorstendb-ARM Jan 12, 2026
14a7036
refactored register host
thorstendb-ARM Jan 12, 2026
822e038
added async to readRegister
thorstendb-ARM Jan 12, 2026
9015331
fixed async
thorstendb-ARM Jan 12, 2026
c90bb4a
added class member access modifiers public, private etc.
thorstendb-ARM Jan 12, 2026
46534b5
refactor, moved if/else to multiline with braces
thorstendb-ARM Jan 12, 2026
7c451aa
refactored eval-interface, generalized name check
thorstendb-ARM Jan 12, 2026
75f21d5
refactored eval interface
thorstendb-ARM Jan 12, 2026
3782869
refactored tests and minimized files
thorstendb-ARM Jan 12, 2026
04dfc66
refactor
thorstendb-ARM Jan 12, 2026
f0d2d12
refactured and simplified data host
thorstendb-ARM Jan 12, 2026
40ffba1
renamed TODO to TOIMPL to outsmart qltysh bot
thorstendb-ARM Jan 12, 2026
daf6d1f
refactor, implemented review comments
thorstendb-ARM Jan 12, 2026
1625892
Merge branch 'main' into componentViewer
thorstendb-ARM Jan 12, 2026
7eaea38
added copyright headers
thorstendb-ARM Jan 12, 2026
d478af7
changed to multiline if/else
thorstendb-ARM Jan 12, 2026
de426a3
simplified cache
thorstendb-ARM Jan 12, 2026
01cd2d5
cleaned AI comments
thorstendb-ARM Jan 12, 2026
bbd2785
fixed copyrights
thorstendb-ARM Jan 13, 2026
ad6cb66
Merge branch 'main' into componentViewer
thorstendb-ARM Jan 13, 2026
a2ec3a1
refactor, if SPACE (
thorstendb-ARM Jan 13, 2026
dd90a6d
refactored for linter: Object injection sink
thorstendb-ARM Jan 13, 2026
7631b49
fixed errors
thorstendb-ARM Jan 13, 2026
d6e7afc
linter object sink
thorstendb-ARM Jan 13, 2026
aa2b3e6
fixed linter
thorstendb-ARM Jan 13, 2026
8b7fade
added calculateMemoryUsage() tests (normal, full, overflow, corrupt, …
thorstendb-ARM Jan 13, 2026
5b19514
added remaining printf spec and tests
thorstendb-ARM Jan 13, 2026
2a7cc01
added proposal for __size_of
thorstendb-ARM Jan 13, 2026
c223e5a
added implementation for getNumArrayElements()
thorstendb-ARM Jan 13, 2026
8a91c94
removed unnecessary guards
thorstendb-ARM Jan 13, 2026
330fb7c
fixed printf padding logic
thorstendb-ARM Jan 13, 2026
6148ec0
simplified padding
thorstendb-ARM Jan 13, 2026
2e4571f
retrieve file context from gdb
thorstendb-ARM Jan 13, 2026
be9346f
added printf test IPv6
thorstendb-ARM Jan 13, 2026
7ce2878
added bigint support for float64
thorstendb-ARM Jan 13, 2026
d7341ca
Component viewer target access addition (#732)
omarArm Jan 13, 2026
8275267
remove all global mocks from component viewer (#734)
omarArm Jan 14, 2026
e386bb5
for HEX display, removed padding and truncated float
thorstendb-ARM Jan 14, 2026
e6f09c6
fixed test
thorstendb-ARM Jan 14, 2026
5b66de0
fixed findSymbol error return
thorstendb-ARM Jan 14, 2026
ed873bc
refactoring expression
thorstendb-ARM Jan 14, 2026
c1da5c9
refactored expression
thorstendb-ARM Jan 14, 2026
88c5e73
huge refactor, divided ScvdBase into Base and Node
thorstendb-ARM Jan 14, 2026
e161587
refactored: removed model invalidate
thorstendb-ARM Jan 14, 2026
3e5df99
refactored expression
thorstendb-ARM Jan 14, 2026
a561ebd
refactored xml read, removed any
thorstendb-ARM Jan 14, 2026
5daec54
refactored castToDerived
thorstendb-ARM Jan 14, 2026
efd1d8a
added printf test
thorstendb-ARM Jan 15, 2026
2d313bb
removed unused code
thorstendb-ARM Jan 15, 2026
2326061
added condition to <break> "instruction"
thorstendb-ARM Jan 15, 2026
b0c764b
added missing copyrights
thorstendb-ARM Jan 15, 2026
9fcd1f0
added TPIP for xml2js
thorstendb-ARM Jan 15, 2026
26a1ea5
Add register reads (#737)
omarArm Jan 15, 2026
9859182
fixing collapsible state maintainence in tree view (#738)
omarArm Jan 15, 2026
6e1536e
refactored GUI tree to display a stable tree over multiple run/stop o…
thorstendb-ARM Jan 15, 2026
03bdb35
Catch unable to read memory errors (#739)
omarArm Jan 15, 2026
132cb78
added tests, added type awareness to evaluator
thorstendb-ARM Jan 16, 2026
f6df80f
refactor, added tests
thorstendb-ARM Jan 16, 2026
03345f5
refactured evaluator
thorstendb-ARM Jan 16, 2026
6368427
inline refactor
thorstendb-ARM Jan 16, 2026
06b830d
evaluator coverage test
thorstendb-ARM Jan 16, 2026
9278129
more tests added
thorstendb-ARM Jan 19, 2026
481d0e1
added tests
thorstendb-ARM Jan 19, 2026
dae6c5f
added tests for data-host (memory and registers)
thorstendb-ARM Jan 19, 2026
3870fa1
added tests
thorstendb-ARM Jan 20, 2026
87a50e6
remaining coverage
thorstendb-ARM Jan 20, 2026
7645fba
test cleanup
thorstendb-ARM Jan 20, 2026
649b946
prettify
thorstendb-ARM Jan 20, 2026
341d78f
fixed copyright headers
thorstendb-ARM Jan 20, 2026
2e80ba2
Merge branch 'main' into componentViewer
thorstendb-ARM Jan 20, 2026
a6cb0f8
fix view do display data
thorstendb-ARM Jan 20, 2026
558f03b
moved tests to unit and integration folders, renamed test files
thorstendb-ARM Jan 20, 2026
7bdd35e
added small description to copyright header for tests
thorstendb-ARM Jan 20, 2026
623e034
Code cleanup (#746)
omarArm Jan 20, 2026
09c68fe
removed wording "coverage"
thorstendb-ARM Jan 20, 2026
30f2ef6
fixed comments
thorstendb-ARM Jan 20, 2026
a780cb7
updated TPIP
thorstendb-ARM Jan 20, 2026
b2dbb8f
no need to set tree view functions as async functions (#747)
omarArm Jan 20, 2026
bf818df
removing jest timeout but leaving a comment (also logged)
thorstendb-ARM Jan 20, 2026
48d999f
Renaming Controller as Main (#748)
omarArm Jan 20, 2026
bfabc75
Merge branch 'main' into componentViewer
thorstendb-ARM Jan 21, 2026
19e74e7
Remove unneeded test file (#750)
omarArm Jan 21, 2026
541e28d
simplifying snapshotContainer()
thorstendb-ARM Jan 20, 2026
b6b1ec9
updated for snapshotContainer
thorstendb-ARM Jan 20, 2026
cfcf356
set "get classname" to a string, use instanceof where logic is needed
thorstendb-ARM Jan 21, 2026
d771f8f
removed unused function
thorstendb-ARM Jan 21, 2026
8431524
fixed checks for valid GDB data
thorstendb-ARM Jan 21, 2026
f9a6718
minor fixes on readMemory handling
thorstendb-ARM Jan 21, 2026
b3aa9b2
declaring member variable at the beginning of the class (#751)
omarArm Jan 21, 2026
625ff0a
fixed test
thorstendb-ARM Jan 21, 2026
4657a17
refactoring and code cleanup (#755)
omarArm Jan 21, 2026
163723b
adjust copyright message (#756)
omarArm Jan 21, 2026
3758187
fixed copyright headers
thorstendb-ARM Jan 21, 2026
81e5d88
review work
thorstendb-ARM Jan 21, 2026
36accaf
adjusting tests to new private members names
omarArm Jan 21, 2026
46f8f7d
minor file cleanup
thorstendb-ARM Jan 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion TPIP.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
# TPIP Report for vscode-cmsis-debugger

Report prepared at: 13/01/2026, 08:36:58
Report prepared at: 20/01/2026, 15:39:57

| *Package* | *Version* | *Repository* | *License* |
|---|---|---|---|
| arm-none-eabi-gdb | 14.3.1 | https://artifacts.tools.arm.com/arm-none-eabi-gdb/14.3.1/ | https://developer.arm.com/GetEula?Id=15d9660a-2059-4985-85e9-c01cdd4b1ba0 |
| pyocd | 0.42.0 | https://github.com/pyocd/pyOCD | https://github.com/pyocd/pyOCD/blob/v0.42.0/LICENSE |
| xml2js | 0.6.2 | https://github.com/Leonidas-from-XIV/node-xml2js | https://github.com/Leonidas-from-XIV/node-xml2js/blob/master/LICENSE |
| yaml | 2.8.2 | https://github.com/eemeli/yaml | https://github.com/eemeli/yaml/blob/main/LICENSE |
7 changes: 7 additions & 0 deletions docs/third-party-licenses.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@
"url": "https://github.com/pyocd/pyOCD",
"license": "https://github.com/pyocd/pyOCD/blob/v0.42.0/LICENSE"
},
{
"name": "xml2js",
"version": "0.6.2",
"spdx": "MIT",
"url": "https://github.com/Leonidas-from-XIV/node-xml2js",
"license": "https://github.com/Leonidas-from-XIV/node-xml2js/blob/master/LICENSE"
},
{
"name": "yaml",
"version": "2.8.2",
Expand Down
9 changes: 8 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@
"id": "cmsis-debugger.liveWatch",
"name": "Live Watch",
"icon": "media/trace-and-live-light.svg"
},
{
"id": "cmsis-debugger.componentViewer",
"name": "Component Viewer",
"icon": "media/trace-and-live-light.svg"
}
]
},
Expand Down Expand Up @@ -362,7 +367,8 @@
"baseContentUrl": "https://github.com/Open-CMSIS-Pack/vscode-cmsis-debugger/blob/main/README.md"
},
"dependencies": {
"yaml": "^2.8.2"
"yaml": "^2.8.2",
"xml2js": "^0.6.2"
},
"devDependencies": {
"@open-cmsis-pack/vsce-helper": "^0.2.2",
Expand All @@ -373,6 +379,7 @@
"@types/node": "^20.19.25",
"@types/node-fetch": "^2.6.13",
"@types/vscode": "^1.106.1",
"@types/xml2js": "^0.4.14",
"@types/yargs": "^17.0.35",
"@types/yarnpkg__lockfile": "^1.1.9",
"@typescript-eslint/eslint-plugin": "8.53.0",
Expand Down
22 changes: 16 additions & 6 deletions src/cbuild-run/cbuild-run-reader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,23 +44,33 @@ export class CbuildRunReader {
}

public getSvdFilePaths(cmsisPackRoot?: string, pname?: string): string[] {
const svdFilePaths = this.getFilePathsByType('svd', cmsisPackRoot, pname);
return svdFilePaths;
}

public getScvdFilePaths(cmsisPackRoot?: string, pname?: string): string[] {
const scvdFilePaths = this.getFilePathsByType('scvd', cmsisPackRoot, pname);
return scvdFilePaths;
}

private getFilePathsByType(type: 'svd' | 'scvd', cmsisPackRoot?: string, pname?: string): string[] {
if (!this.cbuildRun) {
return [];
}
// Get SVD file descriptors
// Get file descriptors
const systemDescriptions = this.cbuildRun['system-descriptions'];
const svdFileDescriptors = systemDescriptions?.filter(descriptor => descriptor.type === 'svd') ?? [];
if (svdFileDescriptors.length === 0) {
const fileDescriptors = systemDescriptions?.filter(descriptor => descriptor.type === type) ?? [];
if (fileDescriptors.length === 0) {
return [];
}
// Replace potential ${CMSIS_PACK_ROOT} placeholder
const effectiveCmsisPackRoot = cmsisPackRoot ?? getCmsisPackRootPath();
// Map to copies, leave originals untouched
const filteredSvdDescriptors = pname ? svdFileDescriptors.filter(descriptor => descriptor.pname === pname): svdFileDescriptors;
const svdFilePaths = filteredSvdDescriptors.map(descriptor => `${effectiveCmsisPackRoot
const filteredDescriptors = pname ? fileDescriptors.filter(descriptor => descriptor.pname === pname): fileDescriptors;
const filePaths = filteredDescriptors.map(descriptor => `${effectiveCmsisPackRoot
? descriptor.file.replaceAll(CMSIS_PACK_ROOT_ENVVAR, effectiveCmsisPackRoot)
: descriptor.file}`);
return svdFilePaths;
return filePaths;
}

public getPnames(): string[] {
Expand Down
2 changes: 1 addition & 1 deletion src/debug-session/gdbtarget-debug-session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ export class GDBTargetDebugSession {
return this.session.configuration.request === 'launch' && this.capabilities?.supportsTerminateRequest === true;
}

/** Function returns string only in case of failure */
// Function returns string only in case of failure
public async evaluateGlobalExpression(expression: string, context = 'hover'): Promise<DebugProtocol.EvaluateResponse['body'] | string> {
try {
const frameId = (vscode.debug.activeStackItem as vscode.DebugStackFrame)?.frameId ?? 0;
Expand Down
6 changes: 5 additions & 1 deletion src/desktop/extension.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Copyright 2025 Arm Limited
* Copyright 2025-2026 Arm Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -24,6 +24,7 @@ import { CpuStates } from '../features/cpu-states/cpu-states';
import { CpuStatesCommands } from '../features/cpu-states/cpu-states-commands';
import { LiveWatchTreeDataProvider } from '../views/live-watch/live-watch';
import { GenericCommands } from '../features/generic-commands';
import { ComponentViewer } from '../views/component-viewer/component-viewer-main';

const BUILTIN_TOOLS_PATHS = [
'tools/pyocd/pyocd',
Expand All @@ -39,6 +40,7 @@ export const activate = async (context: vscode.ExtensionContext): Promise<void>
const cpuStates = new CpuStates();
const cpuStatesCommands = new CpuStatesCommands();
const cpuStatesStatusBarItem = new CpuStatesStatusBarItem();
const componentViewer = new ComponentViewer(context);
// Register the Tree View under the id from package.json
liveWatchTreeDataProvider = new LiveWatchTreeDataProvider(context);

Expand All @@ -54,6 +56,8 @@ export const activate = async (context: vscode.ExtensionContext): Promise<void>
cpuStatesStatusBarItem.activate(context, cpuStates);
// Live Watch view
liveWatchTreeDataProvider.activate(gdbtargetDebugTracker);
// Component Viewer
componentViewer.activate(gdbtargetDebugTracker);

logger.debug('Extension Pack activated');
};
Expand Down
2 changes: 2 additions & 0 deletions src/manifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,5 @@ export const PUBLISHER_NAME = 'arm';
export const EXTENSION_NAME = 'vscode-cmsis-debugger';
export const EXTENSION_ID = `${PUBLISHER_NAME}.${EXTENSION_NAME}`;
export const DISPLAY_NAME = 'Arm CMSIS Debugger';

export const COMPONENT_VIEWER_DISPLAY_NAME = 'Arm CMSIS Component Viewer';
199 changes: 199 additions & 0 deletions src/views/component-viewer/component-viewer-instance.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
/**
* Copyright 2026 Arm Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import * as vscode from 'vscode';
import { URI } from 'vscode-uri';
import { parseStringPromise, ParserOptions } from 'xml2js';
import { Json } from './model/scvd-base';
import { Resolver } from './resolver';
import { ScvdComponentViewer } from './model/scvd-component-viewer';
import { ScvdBase } from './model/scvd-base';
import { StatementEngine } from './statement-engine/statement-engine';
import { ScvdEvalContext } from './scvd-eval-context';
import { GDBTargetDebugSession, GDBTargetDebugTracker } from '../../debug-session';
import { ScvdGuiTree } from './scvd-gui-tree';


const xmlOpts: ParserOptions = {
explicitArray: false,
mergeAttrs: true,
explicitRoot: true,
trim: true,
// Add child objects that carry their original tag name via '#name'
explicitChildren: true,
preserveChildrenOrder: true
};

export class ComponentViewerInstance {
private _model: ScvdComponentViewer | undefined;
private _memUsageStart: number = 0;
private _memUsageLast: number = 0;
private _timeUsageLast: number = 0;
private _statementEngine: StatementEngine | undefined;
private _guiTree: ScvdGuiTree | undefined;

public constructor(
) {
}

private injectLineNumbers(xml: string): string {
const lines = xml.split(/\r?\n/);
const result: string[] = [];
for (const [idx, line] of lines.entries()) {
result.push(line.replace(
/<((?!\/|!|\?)([A-Za-z_][A-Za-z0-9._:-]*))/g,
`<$1 __line="${idx + 1}"`
));
}
return result.join('\n');
}

public getGuiTree(): ScvdGuiTree[] | undefined {
return this._guiTree?.children;
}

public getStats(text: string): string {
const mem = process.memoryUsage();
const memCurrent = Math.round(mem.heapUsed / 1024 / 1024);
const timeCurrent = Date.now();

if (this._timeUsageLast === 0) {
this._timeUsageLast = timeCurrent;
}
if (this._memUsageStart === 0) {
this._memUsageStart = memCurrent;
this._memUsageLast = memCurrent;
}

const memUsage = memCurrent - this._memUsageLast;
const timeUsage = timeCurrent - this._timeUsageLast;
const memIncrease = memCurrent - this._memUsageStart;

this._memUsageLast = memCurrent;
this._timeUsageLast = timeCurrent;

return `${text}, Time: ${timeUsage} ms, Mem: ${memUsage}, Mem Increase: ${memIncrease} MB, (Total: ${memCurrent} MB)`;
}

public async readModel(filename: URI, debugSession: GDBTargetDebugSession, debugTracker: GDBTargetDebugTracker): Promise<void> {
const stats: string[] = [];

stats.push(this.getStats(` Start reading SCVD file ${filename}`));
const buf = (await this.readFileToBuffer(filename)).toString('utf-8');
stats.push(this.getStats(' read'));
const bufLineNo = this.injectLineNumbers(buf);
stats.push(this.getStats(' inject'));
const xml: Json = await this.parseXml(bufLineNo);
stats.push(this.getStats(' parse'));

if (xml === undefined) {
console.error('Failed to parse SCVD XML');
return;
}

ScvdBase.resetIds();
this.model = new ScvdComponentViewer(undefined);
if (!this.model) {
console.error('Failed to create SCVD model');
return;
}

this.model.readXml(xml);
stats.push(this.getStats(' model.readXml'));

const scvdEvalContext = new ScvdEvalContext(this.model);
scvdEvalContext.init(debugSession, debugTracker);
stats.push(this.getStats(' evalContext.init'));

const executionContext = scvdEvalContext.getExecutionContext();
this.model.setExecutionContextAll(executionContext);
stats.push(this.getStats(' model.setExecutionContextAll'));

this.model.configureAll();
stats.push(this.getStats(' model.configureAll'));
this.model.validateAll(true);
stats.push(this.getStats(' model.validateAll'));

const resolver = new Resolver(this.model);
resolver.resolve();
stats.push(this.getStats(' resolver.resolve'));

await this.model.calculateTypedefs();
stats.push(this.getStats(' model.calculateTypedefs'));

this.statementEngine = new StatementEngine(this.model, executionContext);
this.statementEngine.initialize();
stats.push(this.getStats(' statementEngine.initialize'));
this._guiTree = new ScvdGuiTree(undefined, 'component-viewer-root');

console.log('ComponentViewerInstance readModel stats:\n' + stats.join('\n '));
}

public async update(): Promise<void> {
const stats: string[] = [];
stats.push(this.getStats(' start'));
if (this._statementEngine === undefined || this._guiTree === undefined) {
return;
}
const epoch = this._guiTree.beginUpdate();
await this._statementEngine.executeAll(this._guiTree);
this._guiTree.finalizeUpdate(epoch);
stats.push(this.getStats('end'));
console.log('ComponentViewerInstance update stats:\n' + stats.join('\n '));
}

private async readFileToBuffer(filePath: URI): Promise<Buffer> {
try {
const buffer = await vscode.workspace.fs.readFile(filePath);
return Buffer.from(buffer);
} catch (error) {
console.error('Error reading file:', error);
throw error;
}
}

private async parseXml(text: string) {
try {
const json = await parseStringPromise(text, xmlOpts);
//console.log(JSON.stringify(json, null, 2));
return json;
} catch (err) {
console.error('Error parsing XML:', err);
}
}

public get model(): ScvdComponentViewer | undefined {
return this._model;
}

private set model(value: ScvdComponentViewer | undefined) {
this._model = value;
}

public get statementEngine(): StatementEngine | undefined {
return this._statementEngine;
}

private set statementEngine(value: StatementEngine | undefined) {
this._statementEngine = value;
}

public async executeStatements(guiTree: ScvdGuiTree): Promise<void> {
if (this._statementEngine !== undefined) {
await this._statementEngine.executeAll(guiTree);
}
}
}
20 changes: 20 additions & 0 deletions src/views/component-viewer/component-viewer-logger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/**
* Copyright 2025-2026 Arm Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import * as vscode from 'vscode';
import * as manifest from '../../manifest';

export const componentViewerLogger = vscode.window.createOutputChannel(manifest.COMPONENT_VIEWER_DISPLAY_NAME, { log: true });
Loading
Loading