Unit Tests: Add unit tests for PR changes (#4)

This commit is contained in:
Jason2866
2026-03-11 19:21:24 +01:00
committed by GitHub
parent 2e1300ad25
commit bee381f4f3
36 changed files with 29736 additions and 2 deletions
+1
View File
@@ -1,3 +1,4 @@
node_modules/
out/
.vscode-test/
coverage/
+448
View File
@@ -0,0 +1,448 @@
import * as fs from 'fs';
import * as path from 'path';
import * as yaml from 'js-yaml';
describe('GitHub Actions Publish Workflow', () => {
const workflowPath = path.join(__dirname, '../../.github/workflows/publish.yml');
function loadWorkflow(): { content: string; parsed: any; error: Error | null } {
try {
const content = fs.readFileSync(workflowPath, 'utf8');
const parsed = yaml.load(content) as any;
return { content, parsed, error: null };
} catch (e) {
return { content: '', parsed: null, error: e as Error };
}
}
describe('Workflow File Structure', () => {
test('workflow file should exist', () => {
expect(fs.existsSync(workflowPath)).toBe(true);
});
test('workflow file should be valid YAML', () => {
const { error } = loadWorkflow();
expect(error).toBeNull();
});
test('workflow should have a name', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.name).toBeDefined();
expect(typeof workflow.name).toBe('string');
});
test('workflow name should be "Publish to npm"', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.name).toBe('Publish to npm');
});
});
describe('Workflow Triggers', () => {
test('workflow should have "on" trigger definition', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.on).toBeDefined();
});
test('workflow should trigger on release published event', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.on.release).toBeDefined();
expect(workflow.on.release.types).toContain('published');
});
test('workflow should only trigger on published releases', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.on.release.types).toEqual(['published']);
});
test('workflow should not have other trigger types', () => {
const { parsed: workflow } = loadWorkflow();
const triggerKeys = Object.keys(workflow.on);
expect(triggerKeys).toEqual(['release']);
});
});
describe('Workflow Permissions', () => {
test('workflow should have permissions defined', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.permissions).toBeDefined();
});
test('workflow should have id-token write permission for provenance', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.permissions['id-token']).toBe('write');
});
test('workflow should have contents read permission', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.permissions.contents).toBe('read');
});
test('workflow should only have necessary permissions', () => {
const { parsed: workflow } = loadWorkflow();
const permissionKeys = Object.keys(workflow.permissions);
expect(permissionKeys.sort()).toEqual(['contents', 'id-token'].sort());
});
test('workflow should not have excessive permissions', () => {
const { parsed: workflow } = loadWorkflow();
// Ensure no write access to contents or other dangerous permissions
expect(workflow.permissions.contents).not.toBe('write');
expect(workflow.permissions.packages).toBeUndefined();
expect(workflow.permissions.actions).toBeUndefined();
});
});
describe('Workflow Jobs', () => {
test('workflow should have jobs defined', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.jobs).toBeDefined();
});
test('workflow should have a publish job', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.jobs.publish).toBeDefined();
});
test('publish job should run on ubuntu-latest', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.jobs.publish['runs-on']).toBe('ubuntu-latest');
});
test('publish job should have steps', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.jobs.publish.steps).toBeDefined();
expect(Array.isArray(workflow.jobs.publish.steps)).toBe(true);
});
test('publish job should have at least 4 steps', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.jobs.publish.steps.length).toBeGreaterThanOrEqual(4);
});
});
describe('Workflow Steps - Checkout and Setup', () => {
function getSteps() {
return loadWorkflow().parsed.jobs.publish.steps;
}
test('first step should checkout the code', () => {
const steps = getSteps();
expect(steps[0].uses).toMatch(/actions\/checkout@v/);
});
test('checkout should use v4 or later', () => {
const steps = getSteps();
const checkoutVersion = steps[0].uses.match(/@v(\d+)/);
expect(checkoutVersion).not.toBeNull();
expect(parseInt(checkoutVersion![1])).toBeGreaterThanOrEqual(4);
});
test('second step should setup Node.js', () => {
const steps = getSteps();
expect(steps[1].uses).toMatch(/actions\/setup-node@v/);
});
test('Node.js setup should use v4 or later', () => {
const steps = getSteps();
const nodeVersion = steps[1].uses.match(/@v(\d+)/);
expect(nodeVersion).not.toBeNull();
expect(parseInt(nodeVersion![1])).toBeGreaterThanOrEqual(4);
});
test('Node.js should be configured with version 22', () => {
const steps = getSteps();
expect(steps[1].with).toBeDefined();
expect(String(steps[1].with['node-version'])).toBe('22');
});
test('Node.js should be configured with npm registry', () => {
const steps = getSteps();
expect(steps[1].with['registry-url']).toBe('https://registry.npmjs.org');
});
});
describe('Workflow Steps - Build Process', () => {
function getSteps() {
return loadWorkflow().parsed.jobs.publish.steps;
}
test('should update npm to latest version', () => {
const steps = getSteps();
const npmUpdateStep = steps.find(step => step.run && step.run.includes('npm install -g npm@latest'));
expect(npmUpdateStep).toBeDefined();
});
test('should install dependencies', () => {
const steps = getSteps();
const npmInstallStep = steps.find(step => step.run && (step.run === 'npm ci' || step.run === 'npm install'));
expect(npmInstallStep).toBeDefined();
});
test('should run build command', () => {
const steps = getSteps();
const buildStep = steps.find(step => step.run && step.run === 'npm run build');
expect(buildStep).toBeDefined();
});
test('build step should come after install', () => {
const steps = getSteps();
const installStepIndex = steps.findIndex(step => step.run && (step.run === 'npm ci' || step.run === 'npm install'));
const buildStepIndex = steps.findIndex(step => step.run && step.run === 'npm run build');
expect(buildStepIndex).toBeGreaterThan(installStepIndex);
});
});
describe('Workflow Steps - Publishing', () => {
function getSteps() {
return loadWorkflow().parsed.jobs.publish.steps;
}
function getPublishStep() {
const steps = getSteps();
return steps.find(step => step.run && step.run.includes('npm publish'));
}
test('should have npm publish step', () => {
expect(getPublishStep()).toBeDefined();
});
test('publish should use --provenance flag for transparency', () => {
expect(getPublishStep().run).toContain('--provenance');
});
test('publish should use --access public flag', () => {
expect(getPublishStep().run).toContain('--access public');
});
test('publish command should have both required flags', () => {
expect(getPublishStep().run).toMatch(/npm publish.*--provenance.*--access public/);
});
test('publish step should be the last step', () => {
const steps = getSteps();
const publishStepIndex = steps.findIndex(step => step.run && step.run.includes('npm publish'));
expect(publishStepIndex).toBe(steps.length - 1);
});
test('publish step should come after build', () => {
const steps = getSteps();
const buildStepIndex = steps.findIndex(step => step.run && step.run === 'npm run build');
const publishStepIndex = steps.findIndex(step => step.run && step.run.includes('npm publish'));
expect(publishStepIndex).toBeGreaterThan(buildStepIndex);
});
});
describe('Workflow Step Order and Dependencies', () => {
test('steps should follow correct execution order', () => {
const steps = loadWorkflow().parsed.jobs.publish.steps;
const stepDescriptions = steps.map(step => {
if (step.uses) {
if (step.uses.includes('checkout')) return 'checkout';
if (step.uses.includes('setup-node')) return 'setup-node';
}
if (step.run) {
if (step.run.includes('npm install -g npm@latest')) return 'update-npm';
if (step.run === 'npm ci' || step.run === 'npm install') return 'install';
if (step.run === 'npm run build') return 'build';
if (step.run.includes('npm publish')) return 'publish';
}
return 'unknown';
});
const expectedOrder = ['checkout', 'setup-node', 'update-npm', 'install', 'build', 'publish'];
expect(stepDescriptions).toEqual(expectedOrder);
});
test('all steps should be either actions or run commands', () => {
const steps = loadWorkflow().parsed.jobs.publish.steps;
steps.forEach(step => {
const hasUses = step.uses !== undefined;
const hasRun = step.run !== undefined;
expect(hasUses || hasRun).toBe(true);
});
});
});
describe('Security and Best Practices', () => {
test('workflow should use pinned action versions', () => {
const steps = loadWorkflow().parsed.jobs.publish.steps;
const actionSteps = steps.filter((step: any) => step.uses);
actionSteps.forEach((step: any) => {
// Should have @v followed by a number
expect(step.uses).toMatch(/@v\d+/);
});
});
test('workflow should use provenance for supply chain security', () => {
const { parsed: workflow } = loadWorkflow();
const steps = workflow.jobs.publish.steps;
const publishStep = steps.find((step: any) => step.run && step.run.includes('npm publish'));
expect(publishStep.run).toContain('--provenance');
});
test('workflow should have minimal permissions', () => {
const { parsed: workflow } = loadWorkflow();
// id-token: write is required for provenance
// contents: read is minimal permission for checkout
expect(workflow.permissions['id-token']).toBe('write');
expect(workflow.permissions.contents).toBe('read');
// Should not have write permissions for contents
expect(workflow.permissions.contents).not.toBe('write');
});
test('workflow should update npm before installing', () => {
const { parsed: workflow } = loadWorkflow();
const steps = workflow.jobs.publish.steps;
const npmUpdateStep = steps.find((step: any) => step.run && step.run.includes('npm install -g npm@latest'));
expect(npmUpdateStep).toBeDefined();
});
});
describe('Edge Cases and Error Scenarios', () => {
test('workflow should not have duplicate job names', () => {
const { parsed: workflow } = loadWorkflow();
const jobNames = Object.keys(workflow.jobs);
const uniqueJobNames = new Set(jobNames);
expect(jobNames.length).toBe(uniqueJobNames.size);
});
test('workflow should not have empty steps', () => {
const { parsed: workflow } = loadWorkflow();
const steps = workflow.jobs.publish.steps;
steps.forEach((step: any) => {
expect(step).not.toEqual({});
});
});
test('workflow YAML should not contain syntax errors', () => {
const { content } = loadWorkflow();
expect(() => {
yaml.load(content, { schema: yaml.FAILSAFE_SCHEMA });
}).not.toThrow();
});
test('workflow should be idempotent', () => {
const { content } = loadWorkflow();
// Multiple runs should produce same result
const parsed1 = yaml.load(content);
const parsed2 = yaml.load(content);
expect(parsed1).toEqual(parsed2);
});
});
describe('Integration with Package Configuration', () => {
function loadPackageJson() {
const packagePath = path.join(__dirname, '../../package.json');
if (fs.existsSync(packagePath)) {
const packageContent = fs.readFileSync(packagePath, 'utf8');
return JSON.parse(packageContent);
}
return undefined;
}
test('package.json should exist', () => {
expect(loadPackageJson()).toBeDefined();
});
test('build script referenced in workflow should exist in package.json', () => {
const packageJson = loadPackageJson();
expect(packageJson.scripts).toBeDefined();
expect(packageJson.scripts.build).toBeDefined();
});
test('build script should be executable', () => {
const packageJson = loadPackageJson();
expect(typeof packageJson.scripts.build).toBe('string');
expect(packageJson.scripts.build.length).toBeGreaterThan(0);
});
test('package should have a name for npm publishing', () => {
const packageJson = loadPackageJson();
expect(packageJson.name).toBeDefined();
expect(typeof packageJson.name).toBe('string');
});
test('package should have a version for npm publishing', () => {
const packageJson = loadPackageJson();
expect(packageJson.version).toBeDefined();
expect(typeof packageJson.version).toBe('string');
});
});
describe('Workflow Completeness', () => {
test('workflow should have all required top-level keys', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.name).toBeDefined();
expect(workflow.on).toBeDefined();
expect(workflow.permissions).toBeDefined();
expect(workflow.jobs).toBeDefined();
});
test('workflow should not have deprecated syntax', () => {
const { content } = loadWorkflow();
// Check that workflow doesn't use old syntax
expect(content).not.toContain('::set-output');
expect(content).not.toContain('::save-state');
});
test('workflow file should end with newline', () => {
const { content } = loadWorkflow();
expect(content.endsWith('\n')).toBe(true);
});
test('workflow should use consistent indentation', () => {
const { content } = loadWorkflow();
const lines = content.split('\n');
const indentedLines = lines.filter(line => line.match(/^[ ]+/));
// Check that all indentation is consistent (multiples of 2)
indentedLines.forEach(line => {
const indent = line.match(/^[ ]+/);
if (indent) {
expect(indent[0].length % 2).toBe(0);
}
});
});
});
describe('Negative Test Cases', () => {
test('workflow should not trigger on push events', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.on.push).toBeUndefined();
});
test('workflow should not trigger on pull request events', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.on.pull_request).toBeUndefined();
});
test('workflow should not have manual workflow_dispatch trigger', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.on.workflow_dispatch).toBeUndefined();
});
test('workflow should not have scheduled triggers', () => {
const { parsed: workflow } = loadWorkflow();
expect(workflow.on.schedule).toBeUndefined();
});
test('publish step should not use --dry-run flag', () => {
const { parsed: workflow } = loadWorkflow();
const steps = workflow.jobs.publish.steps;
const publishStep = steps.find((step: any) => step.run && step.run.includes('npm publish'));
expect(publishStep.run).not.toContain('--dry-run');
});
test('workflow should not skip git checks', () => {
const { content } = loadWorkflow();
expect(content).not.toContain('--no-git-checks');
});
test('workflow should not force publish', () => {
const { content } = loadWorkflow();
expect(content).not.toContain('--force');
});
});
});
+2452
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+224
View File
@@ -0,0 +1,224 @@
body, html {
margin:0; padding: 0;
height: 100%;
}
body {
font-family: Helvetica Neue, Helvetica, Arial;
font-size: 14px;
color:#333;
}
.small { font-size: 12px; }
*, *:after, *:before {
-webkit-box-sizing:border-box;
-moz-box-sizing:border-box;
box-sizing:border-box;
}
h1 { font-size: 20px; margin: 0;}
h2 { font-size: 14px; }
pre {
font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
margin: 0;
padding: 0;
-moz-tab-size: 2;
-o-tab-size: 2;
tab-size: 2;
}
a { color:#0074D9; text-decoration:none; }
a:hover { text-decoration:underline; }
.strong { font-weight: bold; }
.space-top1 { padding: 10px 0 0 0; }
.pad2y { padding: 20px 0; }
.pad1y { padding: 10px 0; }
.pad2x { padding: 0 20px; }
.pad2 { padding: 20px; }
.pad1 { padding: 10px; }
.space-left2 { padding-left:55px; }
.space-right2 { padding-right:20px; }
.center { text-align:center; }
.clearfix { display:block; }
.clearfix:after {
content:'';
display:block;
height:0;
clear:both;
visibility:hidden;
}
.fl { float: left; }
@media only screen and (max-width:640px) {
.col3 { width:100%; max-width:100%; }
.hide-mobile { display:none!important; }
}
.quiet {
color: #7f7f7f;
color: rgba(0,0,0,0.5);
}
.quiet a { opacity: 0.7; }
.fraction {
font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
font-size: 10px;
color: #555;
background: #E8E8E8;
padding: 4px 5px;
border-radius: 3px;
vertical-align: middle;
}
div.path a:link, div.path a:visited { color: #333; }
table.coverage {
border-collapse: collapse;
margin: 10px 0 0 0;
padding: 0;
}
table.coverage td {
margin: 0;
padding: 0;
vertical-align: top;
}
table.coverage td.line-count {
text-align: right;
padding: 0 5px 0 20px;
}
table.coverage td.line-coverage {
text-align: right;
padding-right: 10px;
min-width:20px;
}
table.coverage td span.cline-any {
display: inline-block;
padding: 0 5px;
width: 100%;
}
.missing-if-branch {
display: inline-block;
margin-right: 5px;
border-radius: 3px;
position: relative;
padding: 0 4px;
background: #333;
color: yellow;
}
.skip-if-branch {
display: none;
margin-right: 10px;
position: relative;
padding: 0 4px;
background: #ccc;
color: white;
}
.missing-if-branch .typ, .skip-if-branch .typ {
color: inherit !important;
}
.coverage-summary {
border-collapse: collapse;
width: 100%;
}
.coverage-summary tr { border-bottom: 1px solid #bbb; }
.keyline-all { border: 1px solid #ddd; }
.coverage-summary td, .coverage-summary th { padding: 10px; }
.coverage-summary tbody { border: 1px solid #bbb; }
.coverage-summary td { border-right: 1px solid #bbb; }
.coverage-summary td:last-child { border-right: none; }
.coverage-summary th {
text-align: left;
font-weight: normal;
white-space: nowrap;
}
.coverage-summary th.file { border-right: none !important; }
.coverage-summary th.pct { }
.coverage-summary th.pic,
.coverage-summary th.abs,
.coverage-summary td.pct,
.coverage-summary td.abs { text-align: right; }
.coverage-summary td.file { white-space: nowrap; }
.coverage-summary td.pic { min-width: 120px !important; }
.coverage-summary tfoot td { }
.coverage-summary .sorter {
height: 10px;
width: 7px;
display: inline-block;
margin-left: 0.5em;
background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
}
.coverage-summary .sorted .sorter {
background-position: 0 -20px;
}
.coverage-summary .sorted-desc .sorter {
background-position: 0 -10px;
}
.status-line { height: 10px; }
/* yellow */
.cbranch-no { background: yellow !important; color: #111; }
/* dark red */
.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
.low .chart { border:1px solid #C21F39 }
.highlighted,
.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
background: #C21F39 !important;
}
/* medium red */
.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
/* light red */
.low, .cline-no { background:#FCE1E5 }
/* light green */
.high, .cline-yes { background:rgb(230,245,208) }
/* medium green */
.cstat-yes { background:rgb(161,215,106) }
/* dark green */
.status-line.high, .high .cover-fill { background:rgb(77,146,33) }
.high .chart { border:1px solid rgb(77,146,33) }
/* dark yellow (gold) */
.status-line.medium, .medium .cover-fill { background: #f9cd0b; }
.medium .chart { border:1px solid #f9cd0b; }
/* light yellow */
.medium { background: #fff4c2; }
.cstat-skip { background: #ddd; color: #111; }
.fstat-skip { background: #ddd; color: #111 !important; }
.cbranch-skip { background: #ddd !important; color: #111; }
span.cline-neutral { background: #eaeaea; }
.coverage-summary td.empty {
opacity: .5;
padding-top: 4px;
padding-bottom: 4px;
line-height: 1;
color: #888;
}
.cover-fill, .cover-empty {
display:inline-block;
height: 12px;
}
.chart {
line-height: 0;
}
.cover-empty {
background: white;
}
.cover-full {
border-right: none !important;
}
pre.prettyprint {
border: none !important;
padding: 0 !important;
margin: 0 !important;
}
.com { color: #999 !important; }
.ignore-none { color: #999; font-weight: normal; }
.wrapper {
min-height: 100%;
height: auto !important;
height: 100%;
margin: 0 auto -48px;
}
.footer, .push {
height: 48px;
}
+87
View File
@@ -0,0 +1,87 @@
/* eslint-disable */
var jumpToCode = (function init() {
// Classes of code we would like to highlight in the file view
var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];
// Elements to highlight in the file listing view
var fileListingElements = ['td.pct.low'];
// We don't want to select elements that are direct descendants of another match
var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `
// Selector that finds elements on the page to which we can jump
var selector =
fileListingElements.join(', ') +
', ' +
notSelector +
missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`
// The NodeList of matching elements
var missingCoverageElements = document.querySelectorAll(selector);
var currentIndex;
function toggleClass(index) {
missingCoverageElements
.item(currentIndex)
.classList.remove('highlighted');
missingCoverageElements.item(index).classList.add('highlighted');
}
function makeCurrent(index) {
toggleClass(index);
currentIndex = index;
missingCoverageElements.item(index).scrollIntoView({
behavior: 'smooth',
block: 'center',
inline: 'center'
});
}
function goToPrevious() {
var nextIndex = 0;
if (typeof currentIndex !== 'number' || currentIndex === 0) {
nextIndex = missingCoverageElements.length - 1;
} else if (missingCoverageElements.length > 1) {
nextIndex = currentIndex - 1;
}
makeCurrent(nextIndex);
}
function goToNext() {
var nextIndex = 0;
if (
typeof currentIndex === 'number' &&
currentIndex < missingCoverageElements.length - 1
) {
nextIndex = currentIndex + 1;
}
makeCurrent(nextIndex);
}
return function jump(event) {
if (
document.getElementById('fileSearch') === document.activeElement &&
document.activeElement != null
) {
// if we're currently focused on the search input, we don't want to navigate
return;
}
switch (event.which) {
case 78: // n
case 74: // j
goToNext();
break;
case 66: // b
case 75: // k
case 80: // p
goToPrevious();
break;
}
};
})();
window.addEventListener('keydown', jumpToCode);
View File
+161
View File
@@ -0,0 +1,161 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for All files</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>All files</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/2443</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1150</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/513</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/2386</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="src"><a href="src/index.html">src</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="211" class="abs low">0/211</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="94" class="abs low">0/94</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="58" class="abs low">0/58</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="208" class="abs low">0/208</td>
</tr>
<tr>
<td class="file low" data-value="src/backend"><a href="src/backend/index.html">src/backend</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1025" class="abs low">0/1025</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="466" class="abs low">0/466</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="152" class="abs low">0/152</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1013" class="abs low">0/1013</td>
</tr>
<tr>
<td class="file low" data-value="src/backend/mi2"><a href="src/backend/mi2/index.html">src/backend/mi2</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="310" class="abs low">0/310</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="144" class="abs low">0/144</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="91" class="abs low">0/91</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="309" class="abs low">0/309</td>
</tr>
<tr>
<td class="file low" data-value="src/frontend"><a href="src/frontend/index.html">src/frontend</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="897" class="abs low">0/897</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="446" class="abs low">0/446</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="212" class="abs low">0/212</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="856" class="abs low">0/856</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-03-11T16:25:16.382Z
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="sorter.js"></script>
<script src="block-navigation.js"></script>
</body>
</html>
+1
View File
@@ -0,0 +1 @@
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
File diff suppressed because one or more lines are too long
+210
View File
@@ -0,0 +1,210 @@
/* eslint-disable */
var addSorting = (function() {
'use strict';
var cols,
currentSort = {
index: 0,
desc: false
};
// returns the summary table element
function getTable() {
return document.querySelector('.coverage-summary');
}
// returns the thead element of the summary table
function getTableHeader() {
return getTable().querySelector('thead tr');
}
// returns the tbody element of the summary table
function getTableBody() {
return getTable().querySelector('tbody');
}
// returns the th element for nth column
function getNthColumn(n) {
return getTableHeader().querySelectorAll('th')[n];
}
function onFilterInput() {
const searchValue = document.getElementById('fileSearch').value;
const rows = document.getElementsByTagName('tbody')[0].children;
// Try to create a RegExp from the searchValue. If it fails (invalid regex),
// it will be treated as a plain text search
let searchRegex;
try {
searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive
} catch (error) {
searchRegex = null;
}
for (let i = 0; i < rows.length; i++) {
const row = rows[i];
let isMatch = false;
if (searchRegex) {
// If a valid regex was created, use it for matching
isMatch = searchRegex.test(row.textContent);
} else {
// Otherwise, fall back to the original plain text search
isMatch = row.textContent
.toLowerCase()
.includes(searchValue.toLowerCase());
}
row.style.display = isMatch ? '' : 'none';
}
}
// loads the search box
function addSearchBox() {
var template = document.getElementById('filterTemplate');
var templateClone = template.content.cloneNode(true);
templateClone.getElementById('fileSearch').oninput = onFilterInput;
template.parentElement.appendChild(templateClone);
}
// loads all columns
function loadColumns() {
var colNodes = getTableHeader().querySelectorAll('th'),
colNode,
cols = [],
col,
i;
for (i = 0; i < colNodes.length; i += 1) {
colNode = colNodes[i];
col = {
key: colNode.getAttribute('data-col'),
sortable: !colNode.getAttribute('data-nosort'),
type: colNode.getAttribute('data-type') || 'string'
};
cols.push(col);
if (col.sortable) {
col.defaultDescSort = col.type === 'number';
colNode.innerHTML =
colNode.innerHTML + '<span class="sorter"></span>';
}
}
return cols;
}
// attaches a data attribute to every tr element with an object
// of data values keyed by column name
function loadRowData(tableRow) {
var tableCols = tableRow.querySelectorAll('td'),
colNode,
col,
data = {},
i,
val;
for (i = 0; i < tableCols.length; i += 1) {
colNode = tableCols[i];
col = cols[i];
val = colNode.getAttribute('data-value');
if (col.type === 'number') {
val = Number(val);
}
data[col.key] = val;
}
return data;
}
// loads all row data
function loadData() {
var rows = getTableBody().querySelectorAll('tr'),
i;
for (i = 0; i < rows.length; i += 1) {
rows[i].data = loadRowData(rows[i]);
}
}
// sorts the table using the data for the ith column
function sortByIndex(index, desc) {
var key = cols[index].key,
sorter = function(a, b) {
a = a.data[key];
b = b.data[key];
return a < b ? -1 : a > b ? 1 : 0;
},
finalSorter = sorter,
tableBody = document.querySelector('.coverage-summary tbody'),
rowNodes = tableBody.querySelectorAll('tr'),
rows = [],
i;
if (desc) {
finalSorter = function(a, b) {
return -1 * sorter(a, b);
};
}
for (i = 0; i < rowNodes.length; i += 1) {
rows.push(rowNodes[i]);
tableBody.removeChild(rowNodes[i]);
}
rows.sort(finalSorter);
for (i = 0; i < rows.length; i += 1) {
tableBody.appendChild(rows[i]);
}
}
// removes sort indicators for current column being sorted
function removeSortIndicators() {
var col = getNthColumn(currentSort.index),
cls = col.className;
cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
col.className = cls;
}
// adds sort indicators for current column being sorted
function addSortIndicators() {
getNthColumn(currentSort.index).className += currentSort.desc
? ' sorted-desc'
: ' sorted';
}
// adds event listeners for all sorter widgets
function enableUI() {
var i,
el,
ithSorter = function ithSorter(i) {
var col = cols[i];
return function() {
var desc = col.defaultDescSort;
if (currentSort.index === i) {
desc = !currentSort.desc;
}
sortByIndex(i, desc);
removeSortIndicators();
currentSort.index = i;
currentSort.desc = desc;
addSortIndicators();
};
};
for (i = 0; i < cols.length; i += 1) {
if (cols[i].sortable) {
// add the click event handler on the th so users
// dont have to click on those tiny arrows
el = getNthColumn(i).querySelector('.sorter').parentElement;
if (el.addEventListener) {
el.addEventListener('click', ithSorter(i));
} else {
el.attachEvent('onclick', ithSorter(i));
}
}
}
}
// adds sorting functionality to the UI
return function() {
if (!getTable()) {
return;
}
cols = loadColumns();
loadData();
addSearchBox();
addSortIndicators();
enableUI();
};
})();
window.addEventListener('load', addSorting);
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,937 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/backend/expand_value.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../index.html">All files</a> / <a href="index.html">src/backend</a> expand_value.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/181</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/105</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/12</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/181</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a>
<a name='L85'></a><a href='#L85'>85</a>
<a name='L86'></a><a href='#L86'>86</a>
<a name='L87'></a><a href='#L87'>87</a>
<a name='L88'></a><a href='#L88'>88</a>
<a name='L89'></a><a href='#L89'>89</a>
<a name='L90'></a><a href='#L90'>90</a>
<a name='L91'></a><a href='#L91'>91</a>
<a name='L92'></a><a href='#L92'>92</a>
<a name='L93'></a><a href='#L93'>93</a>
<a name='L94'></a><a href='#L94'>94</a>
<a name='L95'></a><a href='#L95'>95</a>
<a name='L96'></a><a href='#L96'>96</a>
<a name='L97'></a><a href='#L97'>97</a>
<a name='L98'></a><a href='#L98'>98</a>
<a name='L99'></a><a href='#L99'>99</a>
<a name='L100'></a><a href='#L100'>100</a>
<a name='L101'></a><a href='#L101'>101</a>
<a name='L102'></a><a href='#L102'>102</a>
<a name='L103'></a><a href='#L103'>103</a>
<a name='L104'></a><a href='#L104'>104</a>
<a name='L105'></a><a href='#L105'>105</a>
<a name='L106'></a><a href='#L106'>106</a>
<a name='L107'></a><a href='#L107'>107</a>
<a name='L108'></a><a href='#L108'>108</a>
<a name='L109'></a><a href='#L109'>109</a>
<a name='L110'></a><a href='#L110'>110</a>
<a name='L111'></a><a href='#L111'>111</a>
<a name='L112'></a><a href='#L112'>112</a>
<a name='L113'></a><a href='#L113'>113</a>
<a name='L114'></a><a href='#L114'>114</a>
<a name='L115'></a><a href='#L115'>115</a>
<a name='L116'></a><a href='#L116'>116</a>
<a name='L117'></a><a href='#L117'>117</a>
<a name='L118'></a><a href='#L118'>118</a>
<a name='L119'></a><a href='#L119'>119</a>
<a name='L120'></a><a href='#L120'>120</a>
<a name='L121'></a><a href='#L121'>121</a>
<a name='L122'></a><a href='#L122'>122</a>
<a name='L123'></a><a href='#L123'>123</a>
<a name='L124'></a><a href='#L124'>124</a>
<a name='L125'></a><a href='#L125'>125</a>
<a name='L126'></a><a href='#L126'>126</a>
<a name='L127'></a><a href='#L127'>127</a>
<a name='L128'></a><a href='#L128'>128</a>
<a name='L129'></a><a href='#L129'>129</a>
<a name='L130'></a><a href='#L130'>130</a>
<a name='L131'></a><a href='#L131'>131</a>
<a name='L132'></a><a href='#L132'>132</a>
<a name='L133'></a><a href='#L133'>133</a>
<a name='L134'></a><a href='#L134'>134</a>
<a name='L135'></a><a href='#L135'>135</a>
<a name='L136'></a><a href='#L136'>136</a>
<a name='L137'></a><a href='#L137'>137</a>
<a name='L138'></a><a href='#L138'>138</a>
<a name='L139'></a><a href='#L139'>139</a>
<a name='L140'></a><a href='#L140'>140</a>
<a name='L141'></a><a href='#L141'>141</a>
<a name='L142'></a><a href='#L142'>142</a>
<a name='L143'></a><a href='#L143'>143</a>
<a name='L144'></a><a href='#L144'>144</a>
<a name='L145'></a><a href='#L145'>145</a>
<a name='L146'></a><a href='#L146'>146</a>
<a name='L147'></a><a href='#L147'>147</a>
<a name='L148'></a><a href='#L148'>148</a>
<a name='L149'></a><a href='#L149'>149</a>
<a name='L150'></a><a href='#L150'>150</a>
<a name='L151'></a><a href='#L151'>151</a>
<a name='L152'></a><a href='#L152'>152</a>
<a name='L153'></a><a href='#L153'>153</a>
<a name='L154'></a><a href='#L154'>154</a>
<a name='L155'></a><a href='#L155'>155</a>
<a name='L156'></a><a href='#L156'>156</a>
<a name='L157'></a><a href='#L157'>157</a>
<a name='L158'></a><a href='#L158'>158</a>
<a name='L159'></a><a href='#L159'>159</a>
<a name='L160'></a><a href='#L160'>160</a>
<a name='L161'></a><a href='#L161'>161</a>
<a name='L162'></a><a href='#L162'>162</a>
<a name='L163'></a><a href='#L163'>163</a>
<a name='L164'></a><a href='#L164'>164</a>
<a name='L165'></a><a href='#L165'>165</a>
<a name='L166'></a><a href='#L166'>166</a>
<a name='L167'></a><a href='#L167'>167</a>
<a name='L168'></a><a href='#L168'>168</a>
<a name='L169'></a><a href='#L169'>169</a>
<a name='L170'></a><a href='#L170'>170</a>
<a name='L171'></a><a href='#L171'>171</a>
<a name='L172'></a><a href='#L172'>172</a>
<a name='L173'></a><a href='#L173'>173</a>
<a name='L174'></a><a href='#L174'>174</a>
<a name='L175'></a><a href='#L175'>175</a>
<a name='L176'></a><a href='#L176'>176</a>
<a name='L177'></a><a href='#L177'>177</a>
<a name='L178'></a><a href='#L178'>178</a>
<a name='L179'></a><a href='#L179'>179</a>
<a name='L180'></a><a href='#L180'>180</a>
<a name='L181'></a><a href='#L181'>181</a>
<a name='L182'></a><a href='#L182'>182</a>
<a name='L183'></a><a href='#L183'>183</a>
<a name='L184'></a><a href='#L184'>184</a>
<a name='L185'></a><a href='#L185'>185</a>
<a name='L186'></a><a href='#L186'>186</a>
<a name='L187'></a><a href='#L187'>187</a>
<a name='L188'></a><a href='#L188'>188</a>
<a name='L189'></a><a href='#L189'>189</a>
<a name='L190'></a><a href='#L190'>190</a>
<a name='L191'></a><a href='#L191'>191</a>
<a name='L192'></a><a href='#L192'>192</a>
<a name='L193'></a><a href='#L193'>193</a>
<a name='L194'></a><a href='#L194'>194</a>
<a name='L195'></a><a href='#L195'>195</a>
<a name='L196'></a><a href='#L196'>196</a>
<a name='L197'></a><a href='#L197'>197</a>
<a name='L198'></a><a href='#L198'>198</a>
<a name='L199'></a><a href='#L199'>199</a>
<a name='L200'></a><a href='#L200'>200</a>
<a name='L201'></a><a href='#L201'>201</a>
<a name='L202'></a><a href='#L202'>202</a>
<a name='L203'></a><a href='#L203'>203</a>
<a name='L204'></a><a href='#L204'>204</a>
<a name='L205'></a><a href='#L205'>205</a>
<a name='L206'></a><a href='#L206'>206</a>
<a name='L207'></a><a href='#L207'>207</a>
<a name='L208'></a><a href='#L208'>208</a>
<a name='L209'></a><a href='#L209'>209</a>
<a name='L210'></a><a href='#L210'>210</a>
<a name='L211'></a><a href='#L211'>211</a>
<a name='L212'></a><a href='#L212'>212</a>
<a name='L213'></a><a href='#L213'>213</a>
<a name='L214'></a><a href='#L214'>214</a>
<a name='L215'></a><a href='#L215'>215</a>
<a name='L216'></a><a href='#L216'>216</a>
<a name='L217'></a><a href='#L217'>217</a>
<a name='L218'></a><a href='#L218'>218</a>
<a name='L219'></a><a href='#L219'>219</a>
<a name='L220'></a><a href='#L220'>220</a>
<a name='L221'></a><a href='#L221'>221</a>
<a name='L222'></a><a href='#L222'>222</a>
<a name='L223'></a><a href='#L223'>223</a>
<a name='L224'></a><a href='#L224'>224</a>
<a name='L225'></a><a href='#L225'>225</a>
<a name='L226'></a><a href='#L226'>226</a>
<a name='L227'></a><a href='#L227'>227</a>
<a name='L228'></a><a href='#L228'>228</a>
<a name='L229'></a><a href='#L229'>229</a>
<a name='L230'></a><a href='#L230'>230</a>
<a name='L231'></a><a href='#L231'>231</a>
<a name='L232'></a><a href='#L232'>232</a>
<a name='L233'></a><a href='#L233'>233</a>
<a name='L234'></a><a href='#L234'>234</a>
<a name='L235'></a><a href='#L235'>235</a>
<a name='L236'></a><a href='#L236'>236</a>
<a name='L237'></a><a href='#L237'>237</a>
<a name='L238'></a><a href='#L238'>238</a>
<a name='L239'></a><a href='#L239'>239</a>
<a name='L240'></a><a href='#L240'>240</a>
<a name='L241'></a><a href='#L241'>241</a>
<a name='L242'></a><a href='#L242'>242</a>
<a name='L243'></a><a href='#L243'>243</a>
<a name='L244'></a><a href='#L244'>244</a>
<a name='L245'></a><a href='#L245'>245</a>
<a name='L246'></a><a href='#L246'>246</a>
<a name='L247'></a><a href='#L247'>247</a>
<a name='L248'></a><a href='#L248'>248</a>
<a name='L249'></a><a href='#L249'>249</a>
<a name='L250'></a><a href='#L250'>250</a>
<a name='L251'></a><a href='#L251'>251</a>
<a name='L252'></a><a href='#L252'>252</a>
<a name='L253'></a><a href='#L253'>253</a>
<a name='L254'></a><a href='#L254'>254</a>
<a name='L255'></a><a href='#L255'>255</a>
<a name='L256'></a><a href='#L256'>256</a>
<a name='L257'></a><a href='#L257'>257</a>
<a name='L258'></a><a href='#L258'>258</a>
<a name='L259'></a><a href='#L259'>259</a>
<a name='L260'></a><a href='#L260'>260</a>
<a name='L261'></a><a href='#L261'>261</a>
<a name='L262'></a><a href='#L262'>262</a>
<a name='L263'></a><a href='#L263'>263</a>
<a name='L264'></a><a href='#L264'>264</a>
<a name='L265'></a><a href='#L265'>265</a>
<a name='L266'></a><a href='#L266'>266</a>
<a name='L267'></a><a href='#L267'>267</a>
<a name='L268'></a><a href='#L268'>268</a>
<a name='L269'></a><a href='#L269'>269</a>
<a name='L270'></a><a href='#L270'>270</a>
<a name='L271'></a><a href='#L271'>271</a>
<a name='L272'></a><a href='#L272'>272</a>
<a name='L273'></a><a href='#L273'>273</a>
<a name='L274'></a><a href='#L274'>274</a>
<a name='L275'></a><a href='#L275'>275</a>
<a name='L276'></a><a href='#L276'>276</a>
<a name='L277'></a><a href='#L277'>277</a>
<a name='L278'></a><a href='#L278'>278</a>
<a name='L279'></a><a href='#L279'>279</a>
<a name='L280'></a><a href='#L280'>280</a>
<a name='L281'></a><a href='#L281'>281</a>
<a name='L282'></a><a href='#L282'>282</a>
<a name='L283'></a><a href='#L283'>283</a>
<a name='L284'></a><a href='#L284'>284</a>
<a name='L285'></a><a href='#L285'>285</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { MINode } from './mi_parse';</span>
&nbsp;
const VARIABLE_ASSIGNMENT_REGEX = <span class="cstat-no" title="statement not covered" >/^([a-zA-Z_\-][a-zA-Z0-9_\-]*|\[\d+\])\s*=\s*/;</span>
const VARIABLE_NAME_REGEX = <span class="cstat-no" title="statement not covered" >/^[a-zA-Z_\-][a-zA-Z0-9_\-]*/;</span>
const ANGLE_BRACKET_REGEX = <span class="cstat-no" title="statement not covered" >/^\&lt;.+?\&gt;/;</span>
const HEX_STRING_REGEX = <span class="cstat-no" title="statement not covered" >/^(0x[0-9a-fA-F]+\s*)"/;</span>
const HEX_REGEX = <span class="cstat-no" title="statement not covered" >/^0x[0-9a-fA-F]+/;</span>
const NULL_PTR_REGEX = <span class="cstat-no" title="statement not covered" >/^0x0+\b/;</span>
const CHAR_CODE_STRING_REGEX = <span class="cstat-no" title="statement not covered" >/^(\d+) ['"]/;</span>
const NUMBER_REGEX = <span class="cstat-no" title="statement not covered" >/^\d+(\.\d+)?/;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export function <span class="fstat-no" title="function not covered" >i</span>sExpandable(</span>value: string): number {
<span class="cstat-no" title="statement not covered" > value = value.trim();</span>
<span class="cstat-no" title="statement not covered" > if (value.length === 0) {</span>
<span class="cstat-no" title="statement not covered" > return 0;</span>
}
<span class="cstat-no" title="statement not covered" > if (value.startsWith('{...}')) {</span>
<span class="cstat-no" title="statement not covered" > return 2;</span>
}
<span class="cstat-no" title="statement not covered" > if (value[0] === '{') {</span>
<span class="cstat-no" title="statement not covered" > return 1;</span>
}
<span class="cstat-no" title="statement not covered" > if (value.startsWith('true') || value.startsWith('false') || NULL_PTR_REGEX.exec(value) || HEX_STRING_REGEX.exec(value)) {</span>
<span class="cstat-no" title="statement not covered" > return 0;</span>
}
<span class="cstat-no" title="statement not covered" > if (HEX_REGEX.exec(value)) {</span>
<span class="cstat-no" title="statement not covered" > return 2;</span>
}
// Check other patterns but always return 0 for them
<span class="cstat-no" title="statement not covered" > CHAR_CODE_STRING_REGEX.exec(value) || NUMBER_REGEX.exec(value) || VARIABLE_NAME_REGEX.exec(value) || ANGLE_BRACKET_REGEX.exec(value);</span>
<span class="cstat-no" title="statement not covered" > return 0;</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" >export function <span class="fstat-no" title="function not covered" >e</span>xpandValue(</span>
createVariableReference: (name: string | any, options?: any) =&gt; number,
value: string,
root: string = <span class="branch-0 cbranch-no" title="branch not covered" >'',</span>
extra?: any
): any {
const parseQuotedString = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(): string =</span>&gt; {</span>
<span class="cstat-no" title="statement not covered" > value = value.trim();</span>
<span class="cstat-no" title="statement not covered" > if (value[0] !== '"' &amp;&amp; value[0] !== "'") {</span>
<span class="cstat-no" title="statement not covered" > return '';</span>
}
&nbsp;
let pos = <span class="cstat-no" title="statement not covered" >1;</span>
let scanning = <span class="cstat-no" title="statement not covered" >true;</span>
const quote = <span class="cstat-no" title="statement not covered" >value[0];</span>
let remaining = <span class="cstat-no" title="statement not covered" >value.substr(1);</span>
let escaped = <span class="cstat-no" title="statement not covered" >false;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > while (scanning) {</span>
<span class="cstat-no" title="statement not covered" > if (escaped) {</span>
<span class="cstat-no" title="statement not covered" > escaped = false;</span>
} else <span class="cstat-no" title="statement not covered" >if (remaining[0] === '\\') {</span>
<span class="cstat-no" title="statement not covered" > escaped = true;</span>
} else <span class="cstat-no" title="statement not covered" >if (remaining[0] === quote) {</span>
<span class="cstat-no" title="statement not covered" > scanning = false;</span>
}
<span class="cstat-no" title="statement not covered" > remaining = remaining.substr(1);</span>
<span class="cstat-no" title="statement not covered" > pos++;</span>
}
&nbsp;
const result = <span class="cstat-no" title="statement not covered" >value.substr(0, pos).trim();</span>
<span class="cstat-no" title="statement not covered" > value = value.substr(pos).trim();</span>
<span class="cstat-no" title="statement not covered" > return result;</span>
};
&nbsp;
const stack = <span class="cstat-no" title="statement not covered" >[root];</span>
let lastAssignedVariable = <span class="cstat-no" title="statement not covered" >'';</span>
&nbsp;
const buildFullExpression = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(n</span>ame: string): string =&gt; {</span>
let fullPath = <span class="cstat-no" title="statement not covered" >'';</span>
let derefPrefix = <span class="cstat-no" title="statement not covered" >'';</span>
<span class="cstat-no" title="statement not covered" > stack.push(name);</span>
<span class="cstat-no" title="statement not covered" > stack.forEach(<span class="fstat-no" title="function not covered" >(p</span>art) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > derefPrefix = '';</span>
<span class="cstat-no" title="statement not covered" > if (part === '') {</span>
// skip
} else <span class="cstat-no" title="statement not covered" >if (part.startsWith('[')) {</span>
<span class="cstat-no" title="statement not covered" > fullPath += part;</span>
} else <span class="cstat-no" title="statement not covered" >if (fullPath) {</span>
<span class="cstat-no" title="statement not covered" > while (part.startsWith('*')) {</span>
<span class="cstat-no" title="statement not covered" > derefPrefix += '*';</span>
<span class="cstat-no" title="statement not covered" > part = part.substr(1);</span>
}
<span class="cstat-no" title="statement not covered" > fullPath = fullPath + '.' + part;</span>
} else {
<span class="cstat-no" title="statement not covered" > fullPath = part;</span>
}
});
<span class="cstat-no" title="statement not covered" > stack.pop();</span>
<span class="cstat-no" title="statement not covered" > return derefPrefix + fullPath;</span>
};
&nbsp;
let parseValue: () =&gt; any;
let parseCommaValue: () =&gt; any;
let parseNamedValue: (pushToStack?: boolean) =&gt; any;
let parseCommaNamedValue: (pushToStack?: boolean) =&gt; any;
let createResult: (name: string, val: any) =&gt; any;
&nbsp;
<span class="cstat-no" title="statement not covered" > parseValue = <span class="fstat-no" title="function not covered" >(): any =</span>&gt; {</span>
<span class="cstat-no" title="statement not covered" > value = value.trim();</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (value[0] === '"') {</span>
<span class="cstat-no" title="statement not covered" > return parseQuotedString();</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" > if (value[0] === '{') {</span>
// Parse object/array
<span class="cstat-no" title="statement not covered" > return (<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
<span class="cstat-no" title="statement not covered" > value = value.trim();</span>
<span class="cstat-no" title="statement not covered" > if (value[0] !== '{') {</span>
<span class="cstat-no" title="statement not covered" > return;</span>
}
<span class="cstat-no" title="statement not covered" > value = value.substr(1).trim();</span>
<span class="cstat-no" title="statement not covered" > if (value[0] === '}') {</span>
<span class="cstat-no" title="statement not covered" > value = value.substr(1).trim();</span>
<span class="cstat-no" title="statement not covered" > return [];</span>
}
<span class="cstat-no" title="statement not covered" > if (value.startsWith('...')) {</span>
<span class="cstat-no" title="statement not covered" > value = value.substr(3).trim();</span>
<span class="cstat-no" title="statement not covered" > if (value[0] === '}') {</span>
<span class="cstat-no" title="statement not covered" > value = value.substr(1).trim();</span>
<span class="cstat-no" title="statement not covered" > return '&lt;...&gt;';</span>
}
}
&nbsp;
// Check if this is an array or named values
const equalsIdx = <span class="cstat-no" title="statement not covered" >value.indexOf('=');</span>
const braceIdx = <span class="cstat-no" title="statement not covered" >value.indexOf('{');</span>
const commaIdx = <span class="cstat-no" title="statement not covered" >value.indexOf(',');</span>
&nbsp;
let checkIdx = <span class="cstat-no" title="statement not covered" >braceIdx;</span>
<span class="cstat-no" title="statement not covered" > if (commaIdx !== -1 &amp;&amp; commaIdx &lt; braceIdx) {</span>
<span class="cstat-no" title="statement not covered" > checkIdx = commaIdx;</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" > if ((checkIdx !== -1 &amp;&amp; equalsIdx &gt; checkIdx) || equalsIdx === -1) {</span>
// Array of values
const arr: any[] = <span class="cstat-no" title="statement not covered" >[];</span>
<span class="cstat-no" title="statement not covered" > stack.push('[0]');</span>
let val = <span class="cstat-no" title="statement not covered" >parseValue();</span>
<span class="cstat-no" title="statement not covered" > stack.pop();</span>
<span class="cstat-no" title="statement not covered" > arr.push(createResult('[0]', val));</span>
&nbsp;
let index = <span class="cstat-no" title="statement not covered" >0;</span>
<span class="cstat-no" title="statement not covered" > for (;;) {</span>
<span class="cstat-no" title="statement not covered" > stack.push('[' + (++index) + ']');</span>
<span class="cstat-no" title="statement not covered" > val = parseCommaValue();</span>
<span class="cstat-no" title="statement not covered" > if (!val) {</span>
<span class="cstat-no" title="statement not covered" > stack.pop();</span>
<span class="cstat-no" title="statement not covered" > break;</span>
}
<span class="cstat-no" title="statement not covered" > stack.pop();</span>
<span class="cstat-no" title="statement not covered" > arr.push(createResult('[' + index + ']', val));</span>
}
<span class="cstat-no" title="statement not covered" > value = value.substr(1).trim();</span>
<span class="cstat-no" title="statement not covered" > return arr;</span>
}
&nbsp;
// Named values
let named = <span class="cstat-no" title="statement not covered" >parseNamedValue(true);</span>
<span class="cstat-no" title="statement not covered" > if (named) {</span>
const arr: any[] = <span class="cstat-no" title="statement not covered" >[];</span>
<span class="cstat-no" title="statement not covered" > arr.push(named);</span>
<span class="cstat-no" title="statement not covered" > while ((named = parseCommaNamedValue(true))) {</span>
<span class="cstat-no" title="statement not covered" > arr.push(named);</span>
}
<span class="cstat-no" title="statement not covered" > value = value.substr(1).trim();</span>
<span class="cstat-no" title="statement not covered" > return arr;</span>
}
})();
}
&nbsp;
// Parse primitive value
<span class="cstat-no" title="statement not covered" > return (<span class="fstat-no" title="function not covered" >() =</span>&gt; {</span>
<span class="cstat-no" title="statement not covered" > value = value.trim();</span>
let match: RegExpExecArray;
let result: any;
&nbsp;
<span class="cstat-no" title="statement not covered" > if (value.length === 0) {</span>
<span class="cstat-no" title="statement not covered" > result = undefined;</span>
} else <span class="cstat-no" title="statement not covered" >if (value.startsWith('true')) {</span>
<span class="cstat-no" title="statement not covered" > result = 'true';</span>
<span class="cstat-no" title="statement not covered" > value = value.substr(4).trim();</span>
} else <span class="cstat-no" title="statement not covered" >if (value.startsWith('false')) {</span>
<span class="cstat-no" title="statement not covered" > result = 'false';</span>
<span class="cstat-no" title="statement not covered" > value = value.substr(5).trim();</span>
} else <span class="cstat-no" title="statement not covered" >if ((match = NULL_PTR_REGEX.exec(value))) {</span>
<span class="cstat-no" title="statement not covered" > result = '&lt;nullptr&gt;';</span>
<span class="cstat-no" title="statement not covered" > value = value.substr(match[0].length).trim();</span>
} else <span class="cstat-no" title="statement not covered" >if ((match = HEX_STRING_REGEX.exec(value))) {</span>
<span class="cstat-no" title="statement not covered" > value = value.substr(match[1].length).trim();</span>
<span class="cstat-no" title="statement not covered" > result = parseQuotedString();</span>
} else <span class="cstat-no" title="statement not covered" >if ((match = HEX_REGEX.exec(value))) {</span>
<span class="cstat-no" title="statement not covered" > result = '*' + match[0];</span>
<span class="cstat-no" title="statement not covered" > value = value.substr(match[0].length).trim();</span>
} else <span class="cstat-no" title="statement not covered" >if ((match = CHAR_CODE_STRING_REGEX.exec(value))) {</span>
<span class="cstat-no" title="statement not covered" > result = match[1];</span>
<span class="cstat-no" title="statement not covered" > value = value.substr(match[0].length - 1);</span>
<span class="cstat-no" title="statement not covered" > result += ' ' + parseQuotedString();</span>
} else <span class="cstat-no" title="statement not covered" >if (</span>
(match = NUMBER_REGEX.exec(value)) ||
(match = VARIABLE_NAME_REGEX.exec(value)) ||
(match = ANGLE_BRACKET_REGEX.exec(value))
) {
<span class="cstat-no" title="statement not covered" > result = match[0];</span>
<span class="cstat-no" title="statement not covered" > value = value.substr(match[0].length).trim();</span>
} else {
<span class="cstat-no" title="statement not covered" > result = value;</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" > return result;</span>
})();
};
&nbsp;
<span class="cstat-no" title="statement not covered" > parseNamedValue = <span class="fstat-no" title="function not covered" >(p</span>ushToStack: boolean = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: any =&gt; {</span>
<span class="cstat-no" title="statement not covered" > value = value.trim();</span>
const match = <span class="cstat-no" title="statement not covered" >VARIABLE_ASSIGNMENT_REGEX.exec(value);</span>
<span class="cstat-no" title="statement not covered" > if (!match) {</span>
<span class="cstat-no" title="statement not covered" > return;</span>
}
<span class="cstat-no" title="statement not covered" > value = value.substr(match[0].length).trim();</span>
const name = (<span class="cstat-no" title="statement not covered" >lastAssignedVariable = match[1])</span>;
<span class="cstat-no" title="statement not covered" > if (pushToStack) {</span>
<span class="cstat-no" title="statement not covered" > stack.push(lastAssignedVariable);</span>
}
const val = <span class="cstat-no" title="statement not covered" >parseValue();</span>
<span class="cstat-no" title="statement not covered" > if (pushToStack) {</span>
<span class="cstat-no" title="statement not covered" > stack.pop();</span>
}
<span class="cstat-no" title="statement not covered" > return createResult(name, val);</span>
};
&nbsp;
<span class="cstat-no" title="statement not covered" > createResult = <span class="fstat-no" title="function not covered" >(n</span>ame: string, val: any): any =&gt; {</span>
let variablesReference = <span class="cstat-no" title="statement not covered" >0;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (typeof val === 'object') {</span>
<span class="cstat-no" title="statement not covered" > variablesReference = createVariableReference(val);</span>
<span class="cstat-no" title="statement not covered" > val = 'Object';</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" > if (typeof val === 'string' &amp;&amp; val.startsWith('*0x')) {</span>
<span class="cstat-no" title="statement not covered" > if (extra &amp;&amp; MINode.valueOf(extra, 'arg') === '1') {</span>
<span class="cstat-no" title="statement not covered" > variablesReference = createVariableReference(buildFullExpression('*(' + name), { arg: true });</span>
<span class="cstat-no" title="statement not covered" > val = '&lt;args&gt;';</span>
} else {
<span class="cstat-no" title="statement not covered" > variablesReference = createVariableReference(buildFullExpression('*' + name));</span>
<span class="cstat-no" title="statement not covered" > val = 'Object@' + val;</span>
}
}
&nbsp;
<span class="cstat-no" title="statement not covered" > if (typeof val === 'string' &amp;&amp; val.startsWith('&lt;...&gt;')) {</span>
<span class="cstat-no" title="statement not covered" > variablesReference = createVariableReference(buildFullExpression(name));</span>
<span class="cstat-no" title="statement not covered" > val = '...';</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" > return {</span>
name,
value: val,
variablesReference,
};
};
&nbsp;
<span class="cstat-no" title="statement not covered" > parseCommaValue = <span class="fstat-no" title="function not covered" >(): any =</span>&gt; {</span>
<span class="cstat-no" title="statement not covered" > value = value.trim();</span>
<span class="cstat-no" title="statement not covered" > if (value[0] === ',') {</span>
<span class="cstat-no" title="statement not covered" > value = value.substr(1).trim();</span>
<span class="cstat-no" title="statement not covered" > return parseValue();</span>
}
};
&nbsp;
<span class="cstat-no" title="statement not covered" > parseCommaNamedValue = <span class="fstat-no" title="function not covered" >(p</span>ushToStack: boolean = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: any =&gt; {</span>
<span class="cstat-no" title="statement not covered" > value = value.trim();</span>
<span class="cstat-no" title="statement not covered" > if (value[0] === ',') {</span>
<span class="cstat-no" title="statement not covered" > value = value.substr(1).trim();</span>
<span class="cstat-no" title="statement not covered" > return parseNamedValue(pushToStack);</span>
}
};
&nbsp;
<span class="cstat-no" title="statement not covered" > value = value.trim();</span>
<span class="cstat-no" title="statement not covered" > return parseValue();</span>
}
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-03-11T16:25:16.382Z
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../sorter.js"></script>
<script src="../../block-navigation.js"></script>
</body>
</html>
+161
View File
@@ -0,0 +1,161 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/backend</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../index.html">All files</a> src/backend</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/1025</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/466</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/152</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/1013</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="adapter.ts"><a href="adapter.ts.html">adapter.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="598" class="abs low">0/598</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="201" class="abs low">0/201</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="115" class="abs low">0/115</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="588" class="abs low">0/588</td>
</tr>
<tr>
<td class="file low" data-value="expand_value.ts"><a href="expand_value.ts.html">expand_value.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="181" class="abs low">0/181</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="105" class="abs low">0/105</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="12" class="abs low">0/12</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="181" class="abs low">0/181</td>
</tr>
<tr>
<td class="file low" data-value="mi_parse.ts"><a href="mi_parse.ts.html">mi_parse.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="183" class="abs low">0/183</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="113" class="abs low">0/113</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="11" class="abs low">0/11</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="182" class="abs low">0/182</td>
</tr>
<tr>
<td class="file low" data-value="symbols.ts"><a href="symbols.ts.html">symbols.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="63" class="abs low">0/63</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="47" class="abs low">0/47</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="14" class="abs low">0/14</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="62" class="abs low">0/62</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-03-11T16:25:16.382Z
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../sorter.js"></script>
<script src="../../block-navigation.js"></script>
</body>
</html>
@@ -0,0 +1,131 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/backend/mi2</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> src/backend/mi2</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/310</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/144</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/91</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/309</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="mi2.ts"><a href="mi2.ts.html">mi2.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="279" class="abs low">0/279</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="133" class="abs low">0/133</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="82" class="abs low">0/82</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="278" class="abs low">0/278</td>
</tr>
<tr>
<td class="file low" data-value="types.ts"><a href="types.ts.html">types.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="31" class="abs low">0/31</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="11" class="abs low">0/11</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="9" class="abs low">0/9</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="31" class="abs low">0/31</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-03-11T16:25:16.382Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,334 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/backend/mi2/types.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> / <a href="index.html">src/backend/mi2</a> types.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/31</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/11</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/9</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/31</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { MINode } from '../mi_parse';</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export class V</span>ariableObject {
public name: string;
public exp: string;
public numchild: number;
public type: string;
public value: string;
public threadId: string;
public frozen: boolean;
public dynamic: boolean;
public displayhint: string;
public hasMore: boolean;
public id: number;
public fullExp: string;
&nbsp;
<span class="fstat-no" title="function not covered" > constructor(n</span>ode: any) {
<span class="cstat-no" title="statement not covered" > this.name = MINode.valueOf(node, 'name');</span>
<span class="cstat-no" title="statement not covered" > this.exp = MINode.valueOf(node, 'exp');</span>
<span class="cstat-no" title="statement not covered" > this.numchild = parseInt(MINode.valueOf(node, 'numchild'));</span>
<span class="cstat-no" title="statement not covered" > this.type = MINode.valueOf(node, 'type');</span>
<span class="cstat-no" title="statement not covered" > this.value = MINode.valueOf(node, 'value');</span>
<span class="cstat-no" title="statement not covered" > this.threadId = MINode.valueOf(node, 'thread-id');</span>
<span class="cstat-no" title="statement not covered" > this.frozen = !!MINode.valueOf(node, 'frozen');</span>
<span class="cstat-no" title="statement not covered" > this.dynamic = !!MINode.valueOf(node, 'dynamic');</span>
<span class="cstat-no" title="statement not covered" > this.displayhint = MINode.valueOf(node, 'displayhint');</span>
<span class="cstat-no" title="statement not covered" > this.hasMore = !!MINode.valueOf(node, 'has_more');</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > applyChanges(</span>node: any): void {
<span class="cstat-no" title="statement not covered" > this.value = MINode.valueOf(node, 'value');</span>
<span class="cstat-no" title="statement not covered" > if (MINode.valueOf(node, 'type_changed')) {</span>
<span class="cstat-no" title="statement not covered" > this.type = MINode.valueOf(node, 'new_type');</span>
}
<span class="cstat-no" title="statement not covered" > this.dynamic = !!MINode.valueOf(node, 'dynamic');</span>
<span class="cstat-no" title="statement not covered" > this.displayhint = MINode.valueOf(node, 'displayhint');</span>
<span class="cstat-no" title="statement not covered" > this.hasMore = !!MINode.valueOf(node, 'has_more');</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > isCompound(</span>): boolean {
<span class="cstat-no" title="statement not covered" > return (</span>
this.numchild &gt; 0 ||
this.value === '{...}' ||
(this.dynamic &amp;&amp; (this.displayhint === 'array' || this.displayhint === 'map'))
);
}
&nbsp;
<span class="fstat-no" title="function not covered" > toProtocolVariable(</span>): any {
<span class="cstat-no" title="statement not covered" > return {</span>
name: this.exp,
evaluateName: this.fullExp || this.exp,
value: this.value === undefined ? '&lt;unknown&gt;' : this.value,
type: this.type,
presentationHint: { kind: this.displayhint },
variablesReference: this.id,
};
}
}
&nbsp;
<span class="cstat-no" title="statement not covered" >export class M</span>IError {
public readonly message: string;
public readonly source: string;
&nbsp;
<span class="fstat-no" title="function not covered" > constructor(m</span>essage: string, source: string) {
<span class="cstat-no" title="statement not covered" > Object.defineProperty(this, 'name', {</span>
get: <span class="fstat-no" title="function not covered" >() =</span>&gt; <span class="cstat-no" title="statement not covered" >this.constructor.name,</span>
});
<span class="cstat-no" title="statement not covered" > Object.defineProperty(this, 'message', {</span>
get: <span class="fstat-no" title="function not covered" >() =</span>&gt; <span class="cstat-no" title="statement not covered" >message,</span>
});
<span class="cstat-no" title="statement not covered" > Object.defineProperty(this, 'source', {</span>
get: <span class="fstat-no" title="function not covered" >() =</span>&gt; <span class="cstat-no" title="statement not covered" >source,</span>
});
<span class="cstat-no" title="statement not covered" > Error.captureStackTrace(this, this.constructor);</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > toString(</span>): string {
<span class="cstat-no" title="statement not covered" > return `${(this as any).message} (from ${(this as any).source})`;</span>
}
}
&nbsp;
<span class="cstat-no" title="statement not covered" >Object.setPrototypeOf(MIError, Object.create(Error.prototype));</span>
(<span class="cstat-no" title="statement not covered" >MIError as any).prototype.constructor = MIError;</span>
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-03-11T16:25:16.382Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,586 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/backend/symbols.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../index.html">All files</a> / <a href="index.html">src/backend</a> symbols.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/63</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/47</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/14</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/62</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a>
<a name='L85'></a><a href='#L85'>85</a>
<a name='L86'></a><a href='#L86'>86</a>
<a name='L87'></a><a href='#L87'>87</a>
<a name='L88'></a><a href='#L88'>88</a>
<a name='L89'></a><a href='#L89'>89</a>
<a name='L90'></a><a href='#L90'>90</a>
<a name='L91'></a><a href='#L91'>91</a>
<a name='L92'></a><a href='#L92'>92</a>
<a name='L93'></a><a href='#L93'>93</a>
<a name='L94'></a><a href='#L94'>94</a>
<a name='L95'></a><a href='#L95'>95</a>
<a name='L96'></a><a href='#L96'>96</a>
<a name='L97'></a><a href='#L97'>97</a>
<a name='L98'></a><a href='#L98'>98</a>
<a name='L99'></a><a href='#L99'>99</a>
<a name='L100'></a><a href='#L100'>100</a>
<a name='L101'></a><a href='#L101'>101</a>
<a name='L102'></a><a href='#L102'>102</a>
<a name='L103'></a><a href='#L103'>103</a>
<a name='L104'></a><a href='#L104'>104</a>
<a name='L105'></a><a href='#L105'>105</a>
<a name='L106'></a><a href='#L106'>106</a>
<a name='L107'></a><a href='#L107'>107</a>
<a name='L108'></a><a href='#L108'>108</a>
<a name='L109'></a><a href='#L109'>109</a>
<a name='L110'></a><a href='#L110'>110</a>
<a name='L111'></a><a href='#L111'>111</a>
<a name='L112'></a><a href='#L112'>112</a>
<a name='L113'></a><a href='#L113'>113</a>
<a name='L114'></a><a href='#L114'>114</a>
<a name='L115'></a><a href='#L115'>115</a>
<a name='L116'></a><a href='#L116'>116</a>
<a name='L117'></a><a href='#L117'>117</a>
<a name='L118'></a><a href='#L118'>118</a>
<a name='L119'></a><a href='#L119'>119</a>
<a name='L120'></a><a href='#L120'>120</a>
<a name='L121'></a><a href='#L121'>121</a>
<a name='L122'></a><a href='#L122'>122</a>
<a name='L123'></a><a href='#L123'>123</a>
<a name='L124'></a><a href='#L124'>124</a>
<a name='L125'></a><a href='#L125'>125</a>
<a name='L126'></a><a href='#L126'>126</a>
<a name='L127'></a><a href='#L127'>127</a>
<a name='L128'></a><a href='#L128'>128</a>
<a name='L129'></a><a href='#L129'>129</a>
<a name='L130'></a><a href='#L130'>130</a>
<a name='L131'></a><a href='#L131'>131</a>
<a name='L132'></a><a href='#L132'>132</a>
<a name='L133'></a><a href='#L133'>133</a>
<a name='L134'></a><a href='#L134'>134</a>
<a name='L135'></a><a href='#L135'>135</a>
<a name='L136'></a><a href='#L136'>136</a>
<a name='L137'></a><a href='#L137'>137</a>
<a name='L138'></a><a href='#L138'>138</a>
<a name='L139'></a><a href='#L139'>139</a>
<a name='L140'></a><a href='#L140'>140</a>
<a name='L141'></a><a href='#L141'>141</a>
<a name='L142'></a><a href='#L142'>142</a>
<a name='L143'></a><a href='#L143'>143</a>
<a name='L144'></a><a href='#L144'>144</a>
<a name='L145'></a><a href='#L145'>145</a>
<a name='L146'></a><a href='#L146'>146</a>
<a name='L147'></a><a href='#L147'>147</a>
<a name='L148'></a><a href='#L148'>148</a>
<a name='L149'></a><a href='#L149'>149</a>
<a name='L150'></a><a href='#L150'>150</a>
<a name='L151'></a><a href='#L151'>151</a>
<a name='L152'></a><a href='#L152'>152</a>
<a name='L153'></a><a href='#L153'>153</a>
<a name='L154'></a><a href='#L154'>154</a>
<a name='L155'></a><a href='#L155'>155</a>
<a name='L156'></a><a href='#L156'>156</a>
<a name='L157'></a><a href='#L157'>157</a>
<a name='L158'></a><a href='#L158'>158</a>
<a name='L159'></a><a href='#L159'>159</a>
<a name='L160'></a><a href='#L160'>160</a>
<a name='L161'></a><a href='#L161'>161</a>
<a name='L162'></a><a href='#L162'>162</a>
<a name='L163'></a><a href='#L163'>163</a>
<a name='L164'></a><a href='#L164'>164</a>
<a name='L165'></a><a href='#L165'>165</a>
<a name='L166'></a><a href='#L166'>166</a>
<a name='L167'></a><a href='#L167'>167</a>
<a name='L168'></a><a href='#L168'>168</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import * as childProcess from 'child_process';</span>
<span class="cstat-no" title="statement not covered" >import * as fs from 'fs';</span>
<span class="cstat-no" title="statement not covered" >import * as path from 'path';</span>
<span class="cstat-no" title="statement not covered" >import { SymbolType, SymbolScope } from '../common';</span>
&nbsp;
const SYMBOL_REGEX = <span class="cstat-no" title="statement not covered" >/^([0-9a-f]{8})\s([lg\ !])([w\ ])([C\ ])([W\ ])([I\ ])([dD\ ])([FfO\ ])\s([^\s]+)\s([0-9a-f]+)\s(.*)\r?$/;</span>
const DEMANGLED_NAME_REGEX = <span class="cstat-no" title="statement not covered" >/^_Z[^\d]*(\d+)(.+)$/;</span>
&nbsp;
const TYPE_MAP: { [key: string]: SymbolType } = <span class="cstat-no" title="statement not covered" >{</span>
'F': SymbolType.Function,
'f': SymbolType.File,
'O': SymbolType.Object,
' ': SymbolType.Normal,
};
&nbsp;
const SCOPE_MAP: { [key: string]: SymbolScope } = <span class="cstat-no" title="statement not covered" >{</span>
'l': SymbolScope.Local,
'g': SymbolScope.Global,
' ': SymbolScope.Neither,
'!': SymbolScope.Both,
};
&nbsp;
export interface SymbolInformation {
address: number;
type: SymbolType;
scope: SymbolScope;
section: string;
length: number;
name: string;
file: string | null;
instructions: any[] | null;
hidden: boolean;
}
&nbsp;
<span class="cstat-no" title="statement not covered" >export class S</span>ymbolTable {
private <span class="cstat-no" title="statement not covered" >symbols: SymbolInformation[] = [];</span>
&nbsp;
<span class="fstat-no" title="function not covered" > constructor(</span>
private <span class="cstat-no" title="statement not covered" >toolchainBinDir: string,</span>
private <span class="cstat-no" title="statement not covered" >executable: string</span>
) {}
&nbsp;
<span class="fstat-no" title="function not covered" > loadSymbols(</span>): void {
let objdumpPath = <span class="cstat-no" title="statement not covered" >'';</span>
<span class="cstat-no" title="statement not covered" > fs.readdirSync(this.toolchainBinDir).forEach(<span class="fstat-no" title="function not covered" >(f</span>ile) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > if (file.includes('objdump') &amp;&amp; fs.existsSync(path.join(this.toolchainBinDir, file))) {</span>
<span class="cstat-no" title="statement not covered" > objdumpPath = path.join(this.toolchainBinDir, file);</span>
}
});
&nbsp;
<span class="cstat-no" title="statement not covered" > if (!objdumpPath) {</span>
<span class="cstat-no" title="statement not covered" > throw new Error('Could not find "objdump" program');</span>
}
&nbsp;
const lines = <span class="cstat-no" title="statement not covered" >childProcess</span>
.spawnSync(objdumpPath, ['--syms', this.executable])
.stdout.toString()
.split('\n');
&nbsp;
let currentFile: string | null = <span class="cstat-no" title="statement not covered" >null;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > for (const line of lines) {</span>
const match = <span class="cstat-no" title="statement not covered" >line.match(SYMBOL_REGEX);</span>
<span class="cstat-no" title="statement not covered" > if (!match) {</span>
<span class="cstat-no" title="statement not covered" > continue;</span>
}
&nbsp;
const type = <span class="cstat-no" title="statement not covered" >TYPE_MAP[match[8]];</span>
const scope = <span class="cstat-no" title="statement not covered" >SCOPE_MAP[match[2]];</span>
let name = <span class="cstat-no" title="statement not covered" >match[11].trim();</span>
let hidden = <span class="cstat-no" title="statement not covered" >false;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (match[7] === 'd' &amp;&amp; match[8] === 'f') {</span>
<span class="cstat-no" title="statement not covered" > currentFile = name;</span>
} else {
<span class="cstat-no" title="statement not covered" > if (name.startsWith('.hidden')) {</span>
<span class="cstat-no" title="statement not covered" > name = name.substring(7).trim();</span>
<span class="cstat-no" title="statement not covered" > hidden = true;</span>
}
&nbsp;
const demangledMatch = <span class="cstat-no" title="statement not covered" >name.match(DEMANGLED_NAME_REGEX);</span>
<span class="cstat-no" title="statement not covered" > if (demangledMatch) {</span>
<span class="cstat-no" title="statement not covered" > if (type !== SymbolType.Function) {</span>
<span class="cstat-no" title="statement not covered" > continue;</span>
}
const nameLength = <span class="cstat-no" title="statement not covered" >parseInt(demangledMatch[1]);</span>
<span class="cstat-no" title="statement not covered" > name = demangledMatch[2].substr(0, nameLength);</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (demangledMatch[2].length &gt; nameLength) {</span>
const nestedMatch = <span class="cstat-no" title="statement not covered" >demangledMatch[2].substr(nameLength).match(/^(\d+)(.+)$/);</span>
<span class="cstat-no" title="statement not covered" > if (nestedMatch) {</span>
<span class="cstat-no" title="statement not covered" > name += '::' + nestedMatch[2].substr(0, parseInt(nestedMatch[1]));</span>
}
}
}
&nbsp;
<span class="cstat-no" title="statement not covered" > this.symbols.push({</span>
address: parseInt(match[1], 16),
type,
scope,
section: match[9].trim(),
length: parseInt(match[10], 16),
name,
file: scope === SymbolScope.Local ? currentFile : null,
instructions: null,
hidden,
});
}
}
}
&nbsp;
<span class="fstat-no" title="function not covered" > getFunctionAtAddress(</span>address: number): SymbolInformation | undefined {
const matches = <span class="cstat-no" title="statement not covered" >this.symbols.filter(</span>
<span class="fstat-no" title="function not covered" > (s</span>ym) =&gt;
<span class="cstat-no" title="statement not covered" > sym.type === SymbolType.Function &amp;&amp;</span>
sym.address &lt;= address &amp;&amp;
sym.address + sym.length &gt; address
);
<span class="cstat-no" title="statement not covered" > if (matches &amp;&amp; matches.length !== 0) {</span>
<span class="cstat-no" title="statement not covered" > return matches[0];</span>
}
}
&nbsp;
<span class="fstat-no" title="function not covered" > getFunctionSymbols(</span>): SymbolInformation[] {
<span class="cstat-no" title="statement not covered" > return this.symbols.filter(<span class="fstat-no" title="function not covered" >(s</span>ym) =&gt; <span class="cstat-no" title="statement not covered" >sym.type === SymbolType.Function)</span>;</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > getGlobalVariables(</span>): SymbolInformation[] {
<span class="cstat-no" title="statement not covered" > return this.symbols.filter(</span>
<span class="fstat-no" title="function not covered" > (s</span>ym) =&gt; <span class="cstat-no" title="statement not covered" >sym.type === SymbolType.Object &amp;&amp; sym.scope === SymbolScope.Global</span>
);
}
&nbsp;
<span class="fstat-no" title="function not covered" > getStaticVariables(</span>file: string): SymbolInformation[] {
<span class="cstat-no" title="statement not covered" > return this.symbols.filter(</span>
<span class="fstat-no" title="function not covered" > (s</span>ym) =&gt;
<span class="cstat-no" title="statement not covered" > sym.type === SymbolType.Object &amp;&amp;</span>
sym.scope === SymbolScope.Local &amp;&amp;
sym.file === file
);
}
&nbsp;
<span class="fstat-no" title="function not covered" > getFunctionByName(</span>name: string, file: string): SymbolInformation | null {
let matches = <span class="cstat-no" title="statement not covered" >this.symbols.filter(</span>
<span class="fstat-no" title="function not covered" > (s</span>ym) =&gt;
<span class="cstat-no" title="statement not covered" > sym.type === SymbolType.Function &amp;&amp;</span>
sym.scope === SymbolScope.Local &amp;&amp;
sym.name === name &amp;&amp;
sym.file === file
);
<span class="cstat-no" title="statement not covered" > if (matches.length !== 0) {</span>
<span class="cstat-no" title="statement not covered" > return matches[0];</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" > matches = this.symbols.filter(</span>
<span class="fstat-no" title="function not covered" > (s</span>ym) =&gt;
<span class="cstat-no" title="statement not covered" > sym.type === SymbolType.Function &amp;&amp;</span>
sym.scope !== SymbolScope.Local &amp;&amp;
sym.name === name
);
<span class="cstat-no" title="statement not covered" > if (matches.length !== 0) {</span>
<span class="cstat-no" title="statement not covered" > return matches[0];</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" > return null;</span>
}
}
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-03-11T16:25:16.382Z
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../sorter.js"></script>
<script src="../../block-navigation.js"></script>
</body>
</html>
+205
View File
@@ -0,0 +1,205 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/common.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../prettify.css" />
<link rel="stylesheet" href="../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../index.html">All files</a> / <a href="index.html">src</a> common.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/22</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/7</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/6</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/22</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { Event } from '@vscode/debugadapter';</span>
&nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export enum N</span>umberFormat {</span>
<span class="cstat-no" title="statement not covered" > Auto = 0,</span>
<span class="cstat-no" title="statement not covered" > Hexidecimal = 1,</span>
<span class="cstat-no" title="statement not covered" > Decimal = 2,</span>
<span class="cstat-no" title="statement not covered" > Binary = 3,</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" >export class A</span>dapterOutputEvent extends Event {
<span class="fstat-no" title="function not covered" > constructor(c</span>ontent: string, type: string) {
<span class="cstat-no" title="statement not covered" > super('adapter-output', { content, type });</span>
}
}
&nbsp;
<span class="cstat-no" title="statement not covered" >export class S</span>toppedEvent extends Event {
<span class="fstat-no" title="function not covered" > constructor(r</span>eason: string, threadId: number, allThreadsStopped: boolean) {
<span class="cstat-no" title="statement not covered" > super('stopped', { reason, threadId, allThreadsStopped });</span>
}
}
&nbsp;
<span class="cstat-no" title="statement not covered" >export class T</span>elemetryEvent extends Event {
<span class="fstat-no" title="function not covered" > constructor(c</span>ategory: string, action: string, label: string, parameters: any = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
<span class="cstat-no" title="statement not covered" > super('record-event', { category, action, label, parameters });</span>
}
}
&nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export enum S</span>ymbolType {</span>
<span class="cstat-no" title="statement not covered" > Function = 0,</span>
<span class="cstat-no" title="statement not covered" > File = 1,</span>
<span class="cstat-no" title="statement not covered" > Object = 2,</span>
<span class="cstat-no" title="statement not covered" > Normal = 3,</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export enum S</span>ymbolScope {</span>
<span class="cstat-no" title="statement not covered" > Local = 0,</span>
<span class="cstat-no" title="statement not covered" > Global = 1,</span>
<span class="cstat-no" title="statement not covered" > Neither = 2,</span>
<span class="cstat-no" title="statement not covered" > Both = 3,</span>
}
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-03-11T16:25:16.382Z
</div>
<script src="../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../sorter.js"></script>
<script src="../block-navigation.js"></script>
</body>
</html>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,127 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/frontend/configprovider.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../index.html">All files</a> / <a href="index.html">src/frontend</a> configprovider.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/4</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/2</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/2</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/4</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import * as vscode from 'vscode';</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export class P</span>latformIODebugConfigurationProvider implements vscode.DebugConfigurationProvider {
<span class="fstat-no" title="function not covered" > constructor() {}</span>
&nbsp;
async <span class="fstat-no" title="function not covered" >resolveDebugConfiguration(</span>
folder: vscode.WorkspaceFolder | undefined,
config: vscode.DebugConfiguration,
token?: vscode.CancellationToken
): Promise&lt;vscode.DebugConfiguration&gt; {
(<span class="cstat-no" title="statement not covered" >config as any).cwd = folder ? folder.uri.fsPath : vscode.workspace.rootPath;</span>
<span class="cstat-no" title="statement not covered" > return config;</span>
}
}
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-03-11T16:25:16.382Z
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../sorter.js"></script>
<script src="../../block-navigation.js"></script>
</body>
</html>
@@ -0,0 +1,184 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/frontend/disassembly_content_provider.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../index.html">All files</a> / <a href="index.html">src/frontend</a> disassembly_content_provider.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/17</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/6</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/16</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import * as vscode from 'vscode';</span>
<span class="cstat-no" title="statement not covered" >import { parseQuery } from '../utils';</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export class D</span>isassemblyContentProvider implements vscode.TextDocumentContentProvider {
<span class="fstat-no" title="function not covered" > provideTextDocumentContent(</span>uri: vscode.Uri, token: vscode.CancellationToken): Thenable&lt;string&gt; {
<span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >(r</span>esolve, reject) =&gt; {</span>
const params = <span class="cstat-no" title="statement not covered" >parseQuery(uri.query);</span>
<span class="cstat-no" title="statement not covered" > vscode.debug.activeDebugSession</span>
.customRequest('disassemble', { function: params.func, file: params.file })
.then(
<span class="fstat-no" title="function not covered" > (r</span>esult: any) =&gt; {
const instructions = <span class="cstat-no" title="statement not covered" >result.instructions;</span>
let output = <span class="cstat-no" title="statement not covered" >'';</span>
<span class="cstat-no" title="statement not covered" > instructions.forEach(<span class="fstat-no" title="function not covered" >(i</span>nstruction: any) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > output += `${instruction.address}: ${this.padEnd(15, instruction.opcodes)} \t${instruction.instruction}\n`;</span>
});
<span class="cstat-no" title="statement not covered" > resolve(output);</span>
},
<span class="fstat-no" title="function not covered" > (e</span>rror: any) =&gt; {
<span class="cstat-no" title="statement not covered" > vscode.window.showErrorMessage(error.message);</span>
<span class="cstat-no" title="statement not covered" > reject(error.message);</span>
}
);
});
}
&nbsp;
private <span class="fstat-no" title="function not covered" >padEnd(</span>targetLength: number, str: string): string {
<span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >str.length;</span> i &lt; targetLength; i++) {</span>
<span class="cstat-no" title="statement not covered" > str += ' ';</span>
}
<span class="cstat-no" title="statement not covered" > return str;</span>
}
}
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-03-11T16:25:16.382Z
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../sorter.js"></script>
<script src="../../block-navigation.js"></script>
</body>
</html>
@@ -0,0 +1,235 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/frontend/disassembly_tree_provider.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../index.html">All files</a> / <a href="index.html">src/frontend</a> disassembly_tree_provider.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/19</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/6</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/7</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/19</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import * as vscode from 'vscode';</span>
&nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export class D</span></span>isassemblyTreeProvider implements vscode.TreeDataProvider&lt;vscode.TreeItem&gt; {
private <span class="cstat-no" title="statement not covered" >_onDidChangeTreeData = new vscode.EventEmitter&lt;void&gt;();</span>
public <span class="cstat-no" title="statement not covered" >onDidChangeTreeData = this._onDidChangeTreeData.event;</span>
private <span class="cstat-no" title="statement not covered" >forced: boolean = false;</span>
&nbsp;
<span class="fstat-no" title="function not covered" > refresh(</span>): void {
<span class="cstat-no" title="statement not covered" > this._onDidChangeTreeData.fire();</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > getChildren(</span>element?: vscode.TreeItem): vscode.TreeItem[] {
<span class="cstat-no" title="statement not covered" > if (!vscode.debug.activeDebugSession) {</span>
<span class="cstat-no" title="statement not covered" > return [];</span>
}
&nbsp;
const disassembleItem = <span class="cstat-no" title="statement not covered" >new vscode.TreeItem('Disassemble function');</span>
<span class="cstat-no" title="statement not covered" > disassembleItem.command = {</span>
title: 'Disassemble function',
command: 'platformio-debug.viewDisassembly',
};
&nbsp;
const switchLabel = <span class="cstat-no" title="statement not covered" >'Switch to ' + (this.forced ? 'code' : 'assembly');</span>
const switchItem = <span class="cstat-no" title="statement not covered" >new vscode.TreeItem(switchLabel);</span>
<span class="cstat-no" title="statement not covered" > switchItem.command = {</span>
title: switchLabel,
command: 'platformio-debug.setForceDisassembly',
arguments: [this.forced ? 'Auto' : 'Forced'],
};
&nbsp;
<span class="cstat-no" title="statement not covered" > return [disassembleItem, switchItem];</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > getTreeItem(</span>element: vscode.TreeItem): vscode.TreeItem {
<span class="cstat-no" title="statement not covered" > return element;</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > updateForcedState(</span>forced: boolean): void {
<span class="cstat-no" title="statement not covered" > this.forced = forced;</span>
<span class="cstat-no" title="statement not covered" > this.refresh();</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > debugSessionStarted(</span>): void {
<span class="cstat-no" title="statement not covered" > this.refresh();</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > debugSessionTerminated(</span>): void {
<span class="cstat-no" title="statement not covered" > this.updateForcedState(false);</span>
}
}
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-03-11T16:25:16.382Z
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../sorter.js"></script>
<script src="../../block-navigation.js"></script>
</body>
</html>
@@ -0,0 +1,206 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/frontend</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../index.html">All files</a> src/frontend</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/897</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/446</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/212</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/856</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="configprovider.ts"><a href="configprovider.ts.html">configprovider.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="4" class="abs low">0/4</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="2" class="abs low">0/2</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="2" class="abs low">0/2</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="4" class="abs low">0/4</td>
</tr>
<tr>
<td class="file low" data-value="disassembly_content_provider.ts"><a href="disassembly_content_provider.ts.html">disassembly_content_provider.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="17" class="abs low">0/17</td>
<td data-value="100" class="pct high">100%</td>
<td data-value="0" class="abs high">0/0</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="6" class="abs low">0/6</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="16" class="abs low">0/16</td>
</tr>
<tr>
<td class="file low" data-value="disassembly_tree_provider.ts"><a href="disassembly_tree_provider.ts.html">disassembly_tree_provider.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="19" class="abs low">0/19</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="6" class="abs low">0/6</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="7" class="abs low">0/7</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="19" class="abs low">0/19</td>
</tr>
<tr>
<td class="file low" data-value="memory_content_provider.ts"><a href="memory_content_provider.ts.html">memory_content_provider.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="86" class="abs low">0/86</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="46" class="abs low">0/46</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="10" class="abs low">0/10</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="82" class="abs low">0/82</td>
</tr>
<tr>
<td class="file low" data-value="memory_tree_provider.ts"><a href="memory_tree_provider.ts.html">memory_tree_provider.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="34" class="abs low">0/34</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="10" class="abs low">0/10</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="13" class="abs low">0/13</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="33" class="abs low">0/33</td>
</tr>
<tr>
<td class="file low" data-value="peripheral.ts"><a href="peripheral.ts.html">peripheral.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="571" class="abs low">0/571</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="306" class="abs low">0/306</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="126" class="abs low">0/126</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="543" class="abs low">0/543</td>
</tr>
<tr>
<td class="file low" data-value="registers.ts"><a href="registers.ts.html">registers.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="166" class="abs low">0/166</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="76" class="abs low">0/76</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="48" class="abs low">0/48</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="159" class="abs low">0/159</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-03-11T16:25:16.382Z
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../sorter.js"></script>
<script src="../../block-navigation.js"></script>
</body>
</html>
@@ -0,0 +1,559 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/frontend/memory_content_provider.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../index.html">All files</a> / <a href="index.html">src/frontend</a> memory_content_provider.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/86</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/46</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/10</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/82</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a>
<a name='L85'></a><a href='#L85'>85</a>
<a name='L86'></a><a href='#L86'>86</a>
<a name='L87'></a><a href='#L87'>87</a>
<a name='L88'></a><a href='#L88'>88</a>
<a name='L89'></a><a href='#L89'>89</a>
<a name='L90'></a><a href='#L90'>90</a>
<a name='L91'></a><a href='#L91'>91</a>
<a name='L92'></a><a href='#L92'>92</a>
<a name='L93'></a><a href='#L93'>93</a>
<a name='L94'></a><a href='#L94'>94</a>
<a name='L95'></a><a href='#L95'>95</a>
<a name='L96'></a><a href='#L96'>96</a>
<a name='L97'></a><a href='#L97'>97</a>
<a name='L98'></a><a href='#L98'>98</a>
<a name='L99'></a><a href='#L99'>99</a>
<a name='L100'></a><a href='#L100'>100</a>
<a name='L101'></a><a href='#L101'>101</a>
<a name='L102'></a><a href='#L102'>102</a>
<a name='L103'></a><a href='#L103'>103</a>
<a name='L104'></a><a href='#L104'>104</a>
<a name='L105'></a><a href='#L105'>105</a>
<a name='L106'></a><a href='#L106'>106</a>
<a name='L107'></a><a href='#L107'>107</a>
<a name='L108'></a><a href='#L108'>108</a>
<a name='L109'></a><a href='#L109'>109</a>
<a name='L110'></a><a href='#L110'>110</a>
<a name='L111'></a><a href='#L111'>111</a>
<a name='L112'></a><a href='#L112'>112</a>
<a name='L113'></a><a href='#L113'>113</a>
<a name='L114'></a><a href='#L114'>114</a>
<a name='L115'></a><a href='#L115'>115</a>
<a name='L116'></a><a href='#L116'>116</a>
<a name='L117'></a><a href='#L117'>117</a>
<a name='L118'></a><a href='#L118'>118</a>
<a name='L119'></a><a href='#L119'>119</a>
<a name='L120'></a><a href='#L120'>120</a>
<a name='L121'></a><a href='#L121'>121</a>
<a name='L122'></a><a href='#L122'>122</a>
<a name='L123'></a><a href='#L123'>123</a>
<a name='L124'></a><a href='#L124'>124</a>
<a name='L125'></a><a href='#L125'>125</a>
<a name='L126'></a><a href='#L126'>126</a>
<a name='L127'></a><a href='#L127'>127</a>
<a name='L128'></a><a href='#L128'>128</a>
<a name='L129'></a><a href='#L129'>129</a>
<a name='L130'></a><a href='#L130'>130</a>
<a name='L131'></a><a href='#L131'>131</a>
<a name='L132'></a><a href='#L132'>132</a>
<a name='L133'></a><a href='#L133'>133</a>
<a name='L134'></a><a href='#L134'>134</a>
<a name='L135'></a><a href='#L135'>135</a>
<a name='L136'></a><a href='#L136'>136</a>
<a name='L137'></a><a href='#L137'>137</a>
<a name='L138'></a><a href='#L138'>138</a>
<a name='L139'></a><a href='#L139'>139</a>
<a name='L140'></a><a href='#L140'>140</a>
<a name='L141'></a><a href='#L141'>141</a>
<a name='L142'></a><a href='#L142'>142</a>
<a name='L143'></a><a href='#L143'>143</a>
<a name='L144'></a><a href='#L144'>144</a>
<a name='L145'></a><a href='#L145'>145</a>
<a name='L146'></a><a href='#L146'>146</a>
<a name='L147'></a><a href='#L147'>147</a>
<a name='L148'></a><a href='#L148'>148</a>
<a name='L149'></a><a href='#L149'>149</a>
<a name='L150'></a><a href='#L150'>150</a>
<a name='L151'></a><a href='#L151'>151</a>
<a name='L152'></a><a href='#L152'>152</a>
<a name='L153'></a><a href='#L153'>153</a>
<a name='L154'></a><a href='#L154'>154</a>
<a name='L155'></a><a href='#L155'>155</a>
<a name='L156'></a><a href='#L156'>156</a>
<a name='L157'></a><a href='#L157'>157</a>
<a name='L158'></a><a href='#L158'>158</a>
<a name='L159'></a><a href='#L159'>159</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import * as vscode from 'vscode';</span>
<span class="cstat-no" title="statement not covered" >import { hexFormat, parseQuery } from '../utils';</span>
&nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export class M</span></span>emoryContentProvider implements vscode.TextDocumentContentProvider {
private <span class="cstat-no" title="statement not covered" >_onDidChange = new vscode.EventEmitter&lt;vscode.Uri&gt;();</span>
public <span class="cstat-no" title="statement not covered" >onDidChange = this._onDidChange.event;</span>
&nbsp;
private <span class="cstat-no" title="statement not covered" >firstBytePos = 10;</span>
private <span class="cstat-no" title="statement not covered" >lastBytePos = this.firstBytePos + 48 - 1;</span>
private <span class="cstat-no" title="statement not covered" >firstAsciiPos = this.lastBytePos + 3;</span>
private <span class="cstat-no" title="statement not covered" >lastAsciiPos = this.firstAsciiPos + 16;</span>
&nbsp;
private <span class="cstat-no" title="statement not covered" >smallDecorationType = vscode.window.createTextEditorDecorationType({</span>
borderWidth: '1px',
borderStyle: 'solid',
overviewRulerColor: 'blue',
overviewRulerLane: vscode.OverviewRulerLane.Right,
light: { borderColor: 'darkblue' },
dark: { borderColor: 'lightblue' },
});
&nbsp;
<span class="fstat-no" title="function not covered" > provideTextDocumentContent(</span>uri: vscode.Uri): Thenable&lt;string&gt; {
<span class="cstat-no" title="statement not covered" > return new Promise(<span class="fstat-no" title="function not covered" >(r</span>esolve, reject) =&gt; {</span>
const params = <span class="cstat-no" title="statement not covered" >parseQuery(uri.query);</span>
const address = <span class="cstat-no" title="statement not covered" >params.address.startsWith('0x')</span>
? parseInt(params.address.substring(2), 16)
: parseInt(params.address, 10);
const length = <span class="cstat-no" title="statement not covered" >params.length.startsWith('0x')</span>
? parseInt(params.length.substring(2), 16)
: parseInt(params.length, 10);
&nbsp;
<span class="cstat-no" title="statement not covered" > vscode.debug.activeDebugSession</span>
.customRequest('read-memory', { address, length: length || 32 })
.then(
<span class="fstat-no" title="function not covered" > (r</span>esult: any) =&gt; {
const bytes: number[] = <span class="cstat-no" title="statement not covered" >result.bytes;</span>
let rowAddress = <span class="cstat-no" title="statement not covered" >address - (address % 16);</span>
const offset = <span class="cstat-no" title="statement not covered" >address - rowAddress;</span>
let output = <span class="cstat-no" title="statement not covered" >'';</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > output += ' Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F \t\n';</span>
<span class="cstat-no" title="statement not covered" > output += hexFormat(rowAddress, 8, false) + ': ';</span>
&nbsp;
let asciiStr = <span class="cstat-no" title="statement not covered" >'';</span>
<span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; offset; i++) {</span>
<span class="cstat-no" title="statement not covered" > output += ' ';</span>
<span class="cstat-no" title="statement not covered" > asciiStr += ' ';</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; length; i++) {</span>
const byte = <span class="cstat-no" title="statement not covered" >bytes[i];</span>
<span class="cstat-no" title="statement not covered" > output += hexFormat(byte, 2, false).toUpperCase() + ' ';</span>
<span class="cstat-no" title="statement not covered" > asciiStr +=</span>
byte &lt;= 32 || (byte &gt;= 127 &amp;&amp; byte &lt;= 159)
? '.'
: String.fromCharCode(bytes[i]);
&nbsp;
<span class="cstat-no" title="statement not covered" > if ((address + i) % 16 === 15 &amp;&amp; i &lt; length - 1) {</span>
<span class="cstat-no" title="statement not covered" > output += ' ' + asciiStr;</span>
<span class="cstat-no" title="statement not covered" > asciiStr = '';</span>
<span class="cstat-no" title="statement not covered" > output += '\n';</span>
<span class="cstat-no" title="statement not covered" > rowAddress += 16;</span>
<span class="cstat-no" title="statement not covered" > output += hexFormat(rowAddress, 8, false) + ': ';</span>
}
}
&nbsp;
const remaining = <span class="cstat-no" title="statement not covered" >(16 - ((address + length) % 16)) % 16;</span>
<span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; remaining; i++) {</span>
<span class="cstat-no" title="statement not covered" > output += ' ';</span>
}
<span class="cstat-no" title="statement not covered" > output += ' ' + asciiStr;</span>
<span class="cstat-no" title="statement not covered" > output += '\n';</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > resolve(output);</span>
},
<span class="fstat-no" title="function not covered" > (e</span>rror: any) =&gt; {
<span class="cstat-no" title="statement not covered" > vscode.window.showErrorMessage(</span>
`Unable to read memory from ${hexFormat(address, 8)} to ${hexFormat(address + length, 8)}`
);
<span class="cstat-no" title="statement not covered" > reject(error.toString());</span>
}
);
});
}
&nbsp;
<span class="fstat-no" title="function not covered" > update(</span>document: vscode.TextDocument): void {
<span class="cstat-no" title="statement not covered" > this._onDidChange.fire(document.uri);</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > getOffset(</span>position: vscode.Position): number | undefined {
<span class="cstat-no" title="statement not covered" > if (position.line &lt; 1 || position.character &lt; this.firstBytePos) {</span>
<span class="cstat-no" title="statement not covered" > return;</span>
}
&nbsp;
let offset = <span class="cstat-no" title="statement not covered" >16 * (position.line - 1);</span>
const charOffset = <span class="cstat-no" title="statement not covered" >position.character - this.firstBytePos;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (position.character &gt;= this.firstBytePos &amp;&amp; position.character &lt;= this.lastBytePos) {</span>
<span class="cstat-no" title="statement not covered" > offset += Math.floor(charOffset / 3);</span>
} else <span class="cstat-no" title="statement not covered" >if (position.character &gt;= this.firstAsciiPos) {</span>
<span class="cstat-no" title="statement not covered" > offset += position.character - this.firstAsciiPos;</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" > return offset;</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > getPosition(</span>offset: number, isAscii: boolean = <span class="branch-0 cbranch-no" title="branch not covered" >false)</span>: vscode.Position {
const line = <span class="cstat-no" title="statement not covered" >1 + Math.floor(offset / 16);</span>
let character = <span class="cstat-no" title="statement not covered" >offset % 16;</span>
<span class="cstat-no" title="statement not covered" > if (isAscii) {</span>
<span class="cstat-no" title="statement not covered" > character += this.firstAsciiPos;</span>
} else {
<span class="cstat-no" title="statement not covered" > character = this.firstBytePos + 3 * character;</span>
}
<span class="cstat-no" title="statement not covered" > return new vscode.Position(line, character);</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > getRanges(</span>startOffset: number, endOffset: number, isAscii: boolean): vscode.Range[] {
const startPos = <span class="cstat-no" title="statement not covered" >this.getPosition(startOffset, isAscii);</span>
let endPos = <span class="cstat-no" title="statement not covered" >this.getPosition(endOffset, isAscii);</span>
<span class="cstat-no" title="statement not covered" > endPos = new vscode.Position(endPos.line, endPos.character + (isAscii ? 1 : 2));</span>
&nbsp;
const ranges: vscode.Range[] = <span class="cstat-no" title="statement not covered" >[];</span>
const startChar = <span class="cstat-no" title="statement not covered" >isAscii ? this.firstAsciiPos : this.firstBytePos;</span>
const endChar = <span class="cstat-no" title="statement not covered" >isAscii ? this.lastAsciiPos : this.lastBytePos;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > for (let line = <span class="cstat-no" title="statement not covered" >startPos.line;</span> line &lt;= endPos.line; ++line) {</span>
const lineStart = <span class="cstat-no" title="statement not covered" >new vscode.Position(line, line === startPos.line ? startPos.character : startChar);</span>
const lineEnd = <span class="cstat-no" title="statement not covered" >new vscode.Position(line, line === endPos.line ? endPos.character : endChar);</span>
<span class="cstat-no" title="statement not covered" > ranges.push(new vscode.Range(lineStart, lineEnd));</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" > return ranges;</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > handleSelection(</span>event: vscode.TextEditorSelectionChangeEvent): void {
const lineCount = <span class="cstat-no" title="statement not covered" >event.textEditor.document.lineCount;</span>
<span class="cstat-no" title="statement not covered" > if (</span>
event.selections[0].start.line + 1 === lineCount ||
event.selections[0].end.line + 1 === lineCount
) {
<span class="cstat-no" title="statement not covered" > event.textEditor.setDecorations(this.smallDecorationType, []);</span>
<span class="cstat-no" title="statement not covered" > return;</span>
}
&nbsp;
const startOffset = <span class="cstat-no" title="statement not covered" >this.getOffset(event.selections[0].start);</span>
const endOffset = <span class="cstat-no" title="statement not covered" >this.getOffset(event.selections[0].end);</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (startOffset === undefined || endOffset === undefined) {</span>
<span class="cstat-no" title="statement not covered" > event.textEditor.setDecorations(this.smallDecorationType, []);</span>
<span class="cstat-no" title="statement not covered" > return;</span>
}
&nbsp;
let ranges = <span class="cstat-no" title="statement not covered" >this.getRanges(startOffset, endOffset, false);</span>
<span class="cstat-no" title="statement not covered" > ranges = ranges.concat(this.getRanges(startOffset, endOffset, true));</span>
<span class="cstat-no" title="statement not covered" > event.textEditor.setDecorations(this.smallDecorationType, ranges);</span>
}
}
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-03-11T16:25:16.382Z
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../sorter.js"></script>
<script src="../../block-navigation.js"></script>
</body>
</html>
@@ -0,0 +1,322 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/frontend/memory_tree_provider.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../index.html">All files</a> / <a href="index.html">src/frontend</a> memory_tree_provider.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/34</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/10</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/13</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/33</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import * as vscode from 'vscode';</span>
&nbsp;
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export class M</span></span>emoryTreeProvider implements vscode.TreeDataProvider&lt;vscode.TreeItem&gt; {
private <span class="cstat-no" title="statement not covered" >_onDidChangeTreeData = new vscode.EventEmitter&lt;void&gt;();</span>
public <span class="cstat-no" title="statement not covered" >onDidChangeTreeData = this._onDidChangeTreeData.event;</span>
private <span class="cstat-no" title="statement not covered" >history: string[] = [];</span>
&nbsp;
<span class="fstat-no" title="function not covered" > refresh(</span>): void {
<span class="cstat-no" title="statement not covered" > this._onDidChangeTreeData.fire();</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > dumpSettings(</span>): string[] {
<span class="cstat-no" title="statement not covered" > return this.history;</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > getChildren(</span>element?: vscode.TreeItem): vscode.TreeItem[] {
<span class="cstat-no" title="statement not covered" > if (!vscode.debug.activeDebugSession) {</span>
<span class="cstat-no" title="statement not covered" > return [];</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" > if (this.history.length) {</span>
<span class="cstat-no" title="statement not covered" > return this.getHistoryNodes();</span>
}
&nbsp;
const item = <span class="cstat-no" title="statement not covered" >new vscode.TreeItem('Enter address...');</span>
<span class="cstat-no" title="statement not covered" > item.command = {</span>
title: 'Enter memory address...',
command: 'platformio-debug.examineMemory',
};
<span class="cstat-no" title="statement not covered" > return [item];</span>
}
&nbsp;
private <span class="fstat-no" title="function not covered" >getHistoryNodes(</span>): vscode.TreeItem[] {
<span class="cstat-no" title="statement not covered" > return this.history.map(<span class="fstat-no" title="function not covered" >(e</span>ntry) =&gt; {</span>
const item = <span class="cstat-no" title="statement not covered" >new vscode.TreeItem(entry);</span>
<span class="cstat-no" title="statement not covered" > item.command = {</span>
title: `Examine memory at ${entry}`,
command: 'platformio-debug.examineMemory',
arguments: entry.split('+'),
};
<span class="cstat-no" title="statement not covered" > return item;</span>
});
}
&nbsp;
<span class="fstat-no" title="function not covered" > getTreeItem(</span>element: vscode.TreeItem): vscode.TreeItem {
<span class="cstat-no" title="statement not covered" > return element;</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > pushHistory(</span>address: string, length: string): void {
const entry = <span class="cstat-no" title="statement not covered" >`${address}+${length}`;</span>
<span class="cstat-no" title="statement not covered" > if (!this.history.includes(entry)) {</span>
<span class="cstat-no" title="statement not covered" > this.history.push(entry);</span>
<span class="cstat-no" title="statement not covered" > this.refresh();</span>
}
}
&nbsp;
<span class="fstat-no" title="function not covered" > deleteHistory(</span>address: string, length: string): void {
const entry = <span class="cstat-no" title="statement not covered" >`${address}+${length}`;</span>
<span class="cstat-no" title="statement not covered" > if (this.history.includes(entry)) {</span>
<span class="cstat-no" title="statement not covered" > this.history = this.history.filter(<span class="fstat-no" title="function not covered" >(e</span>) =&gt; <span class="cstat-no" title="statement not covered" >e !== entry)</span>;</span>
<span class="cstat-no" title="statement not covered" > this.refresh();</span>
}
}
&nbsp;
<span class="fstat-no" title="function not covered" > clearHistory(</span>): void {
<span class="cstat-no" title="statement not covered" > this.history = [];</span>
<span class="cstat-no" title="statement not covered" > this.refresh();</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > debugSessionStarted(</span>savedState: string[]): void {
<span class="cstat-no" title="statement not covered" > this.history = savedState || [];</span>
<span class="cstat-no" title="statement not covered" > this.refresh();</span>
}
&nbsp;
<span class="fstat-no" title="function not covered" > debugSessionTerminated(</span>): void {
<span class="cstat-no" title="statement not covered" > this.history = [];</span>
<span class="cstat-no" title="statement not covered" > this.refresh();</span>
}
}
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-03-11T16:25:16.382Z
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../sorter.js"></script>
<script src="../../block-navigation.js"></script>
</body>
</html>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+146
View File
@@ -0,0 +1,146 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../prettify.css" />
<link rel="stylesheet" href="../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../index.html">All files</a> src</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/211</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/94</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/58</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/208</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="common.ts"><a href="common.ts.html">common.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="22" class="abs low">0/22</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="7" class="abs low">0/7</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="6" class="abs low">0/6</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="22" class="abs low">0/22</td>
</tr>
<tr>
<td class="file low" data-value="extension.ts"><a href="extension.ts.html">extension.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="149" class="abs low">0/149</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="68" class="abs low">0/68</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="46" class="abs low">0/46</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="148" class="abs low">0/148</td>
</tr>
<tr>
<td class="file low" data-value="utils.ts"><a href="utils.ts.html">utils.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="40" class="abs low">0/40</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="19" class="abs low">0/19</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="6" class="abs low">0/6</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="38" class="abs low">0/38</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-03-11T16:25:16.382Z
</div>
<script src="../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../sorter.js"></script>
<script src="../block-navigation.js"></script>
</body>
</html>
+274
View File
@@ -0,0 +1,274 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for src/utils.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../prettify.css" />
<link rel="stylesheet" href="../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../index.html">All files</a> / <a href="index.html">src</a> utils.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/40</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/19</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/6</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/38</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >export function <span class="fstat-no" title="function not covered" >h</span>exFormat(</span>value: number, padding: number = <span class="branch-0 cbranch-no" title="branch not covered" >8,</span> includePrefix: boolean = <span class="branch-0 cbranch-no" title="branch not covered" >true)</span>: string {
let result = <span class="cstat-no" title="statement not covered" >value.toString(16);</span>
<span class="cstat-no" title="statement not covered" > while (result.length &lt; padding) {</span>
<span class="cstat-no" title="statement not covered" > result = '0' + result;</span>
}
<span class="cstat-no" title="statement not covered" > return includePrefix ? '0x' + result : result;</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" >export function <span class="fstat-no" title="function not covered" >b</span>inaryFormat(</span>
value: number,
padding: number = <span class="branch-0 cbranch-no" title="branch not covered" >0,</span>
includePrefix: boolean = <span class="branch-0 cbranch-no" title="branch not covered" >true,</span>
groupByNibble: boolean = <span class="branch-0 cbranch-no" title="branch not covered" >false</span>
): string {
let result = <span class="cstat-no" title="statement not covered" >(value &gt;&gt;&gt; 0).toString(2);</span>
<span class="cstat-no" title="statement not covered" > while (result.length &lt; padding) {</span>
<span class="cstat-no" title="statement not covered" > result = '0' + result;</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" > if (groupByNibble) {</span>
const extraZeros = <span class="cstat-no" title="statement not covered" >4 - (result.length % 4);</span>
<span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i &lt; extraZeros; i++) {</span>
<span class="cstat-no" title="statement not covered" > result = '0' + result;</span>
}
const groups = <span class="cstat-no" title="statement not covered" >result.match(/[01]{4}/g);</span>
<span class="cstat-no" title="statement not covered" > result = groups.join(' ');</span>
<span class="cstat-no" title="statement not covered" > result = result.substring(extraZeros);</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" > return includePrefix ? '0b' + result : result;</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" >export function <span class="fstat-no" title="function not covered" >c</span>reateMask(</span>offset: number, width: number): number {
let mask = <span class="cstat-no" title="statement not covered" >0;</span>
const end = <span class="cstat-no" title="statement not covered" >offset + width - 1;</span>
<span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >offset;</span> i &lt;= end; i++) {</span>
<span class="cstat-no" title="statement not covered" > mask = (mask | (1 &lt;&lt; i)) &gt;&gt;&gt; 0;</span>
}
<span class="cstat-no" title="statement not covered" > return mask;</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" >export function <span class="fstat-no" title="function not covered" >e</span>xtractBits(</span>value: number, offset: number, width: number): number {
<span class="cstat-no" title="statement not covered" > return ((value &amp; createMask(offset, width)) &gt;&gt;&gt; offset) &gt;&gt;&gt; 0;</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" >export function <span class="fstat-no" title="function not covered" >p</span>arseQuery(</span>queryString: string): { [key: string]: string } {
const params: { [key: string]: string } = <span class="cstat-no" title="statement not covered" >{};</span>
const pairs = <span class="cstat-no" title="statement not covered" >(queryString[0] === '?' ? queryString.substr(1) : queryString).split('&amp;');</span>
<span class="cstat-no" title="statement not covered" > for (const pair of pairs) {</span>
const parts = <span class="cstat-no" title="statement not covered" >pair.split('=');</span>
<span class="cstat-no" title="statement not covered" > params[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1] || '');</span>
}
<span class="cstat-no" title="statement not covered" > return params;</span>
}
&nbsp;
<span class="cstat-no" title="statement not covered" >export function <span class="fstat-no" title="function not covered" >e</span>ncodeDisassembly(</span>name: string, file: string): string {
let uri = <span class="cstat-no" title="statement not covered" >'disassembly:///';</span>
<span class="cstat-no" title="statement not covered" > if (file) {</span>
<span class="cstat-no" title="statement not covered" > uri += `${file}:`;</span>
}
<span class="cstat-no" title="statement not covered" > uri += `${name}.dbgasm?func=${name}&amp;file=${file || ''}`;</span>
<span class="cstat-no" title="statement not covered" > return uri;</span>
}
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-03-11T16:25:16.382Z
</div>
<script src="../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../sorter.js"></script>
<script src="../block-navigation.js"></script>
</body>
</html>
+4706
View File
File diff suppressed because it is too large Load Diff
+14
View File
@@ -0,0 +1,14 @@
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
testMatch: ['**/__tests__/**/*.test.ts', '**/*.test.ts'],
collectCoverageFrom: [
'**/*.ts',
'!**/node_modules/**',
'!**/dist/**',
'!**/*.test.ts',
'!**/*.spec.ts',
'!**/*.d.ts',
],
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
};
+4120
View File
File diff suppressed because it is too large Load Diff
+10 -2
View File
@@ -11,7 +11,10 @@
"url": "https://github.com/Jason2866/pioarduino-vscode-debug.git"
},
"scripts": {
"build": "webpack --mode production"
"build": "webpack --mode production",
"test": "jest",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage"
},
"dependencies": {
"@vscode/debugadapter": "^1.68.0",
@@ -19,11 +22,16 @@
"xml2js": "^0.6.2"
},
"devDependencies": {
"@types/jest": "^30.0.0",
"@types/js-yaml": "^4.0.9",
"@types/node": "^22.0.0",
"@types/vscode": "~1.82.0",
"jest": "^30.3.0",
"js-yaml": "^4.1.1",
"ts-jest": "^29.4.6",
"ts-loader": "^9.5.4",
"typescript": "^5.9.3",
"webpack": "~5.105.4",
"webpack-cli": "~6.0.1"
}
}
}