Skip to content

Commit 2eb6682

Browse files
authored
testing: rename FunctionCoverage -> DeclarationCoverage for finalization (microsoft#204667)
1 parent f6a5654 commit 2eb6682

File tree

9 files changed

+94
-95
lines changed

9 files changed

+94
-95
lines changed

src/vs/workbench/api/common/extHost.api.impl.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1615,7 +1615,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I
16151615
TestResultState: extHostTypes.TestResultState,
16161616
TestRunRequest: extHostTypes.TestRunRequest,
16171617
TestMessage: extHostTypes.TestMessage,
1618-
TestMessage2: extHostTypes.TestMessage, // back compat for Oct 2023
16191618
TestTag: extHostTypes.TestTag,
16201619
TestRunProfileKind: extHostTypes.TestRunProfileKind,
16211620
TextSearchCompleteMessageType: TextSearchCompleteMessageType,
@@ -1625,7 +1624,8 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I
16251624
FileCoverage: extHostTypes.FileCoverage,
16261625
StatementCoverage: extHostTypes.StatementCoverage,
16271626
BranchCoverage: extHostTypes.BranchCoverage,
1628-
FunctionCoverage: extHostTypes.FunctionCoverage,
1627+
DeclarationCoverage: extHostTypes.DeclarationCoverage,
1628+
FunctionCoverage: extHostTypes.DeclarationCoverage, // back compat for Feb 2024
16291629
WorkspaceTrustState: extHostTypes.WorkspaceTrustState,
16301630
LanguageStatusSeverity: extHostTypes.LanguageStatusSeverity,
16311631
QuickPickItemKind: extHostTypes.QuickPickItemKind,

src/vs/workbench/api/common/extHostTypeConverters.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2021,7 +2021,7 @@ export namespace TestCoverage {
20212021
};
20222022
} else {
20232023
return {
2024-
type: DetailType.Function,
2024+
type: DetailType.Declaration,
20252025
name: coverage.name,
20262026
count: coverage.executed,
20272027
location: fromLocation(coverage.location),
@@ -2034,7 +2034,7 @@ export namespace TestCoverage {
20342034
uri: coverage.uri,
20352035
statement: fromCoveredCount(coverage.statementCoverage),
20362036
branch: coverage.branchCoverage && fromCoveredCount(coverage.branchCoverage),
2037-
function: coverage.functionCoverage && fromCoveredCount(coverage.functionCoverage),
2037+
declaration: coverage.declarationCoverage && fromCoveredCount(coverage.declarationCoverage),
20382038
details: coverage.detailedCoverage?.map(fromDetailed),
20392039
};
20402040
}

src/vs/workbench/api/common/extHostTypes.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3970,7 +3970,7 @@ export class FileCoverage implements vscode.FileCoverage {
39703970
public static fromDetails(uri: vscode.Uri, details: vscode.DetailedCoverage[]): vscode.FileCoverage {
39713971
const statements = new CoveredCount(0, 0);
39723972
const branches = new CoveredCount(0, 0);
3973-
const fn = new CoveredCount(0, 0);
3973+
const decl = new CoveredCount(0, 0);
39743974

39753975
for (const detail of details) {
39763976
if ('branches' in detail) {
@@ -3982,16 +3982,16 @@ export class FileCoverage implements vscode.FileCoverage {
39823982
branches.covered += branch.executed ? 1 : 0;
39833983
}
39843984
} else {
3985-
fn.total += 1;
3986-
fn.covered += detail.executed ? 1 : 0;
3985+
decl.total += 1;
3986+
decl.covered += detail.executed ? 1 : 0;
39873987
}
39883988
}
39893989

39903990
const coverage = new FileCoverage(
39913991
uri,
39923992
statements,
39933993
branches.total > 0 ? branches : undefined,
3994-
fn.total > 0 ? fn : undefined,
3994+
decl.total > 0 ? decl : undefined,
39953995
);
39963996

39973997
coverage.detailedCoverage = details;
@@ -4005,11 +4005,11 @@ export class FileCoverage implements vscode.FileCoverage {
40054005
public readonly uri: vscode.Uri,
40064006
public statementCoverage: vscode.CoveredCount,
40074007
public branchCoverage?: vscode.CoveredCount,
4008-
public functionCoverage?: vscode.CoveredCount,
4008+
public declarationCoverage?: vscode.CoveredCount,
40094009
) {
40104010
validateCC(statementCoverage);
40114011
validateCC(branchCoverage);
4012-
validateCC(functionCoverage);
4012+
validateCC(declarationCoverage);
40134013
}
40144014
}
40154015

@@ -4037,7 +4037,7 @@ export class BranchCoverage implements vscode.BranchCoverage {
40374037
) { }
40384038
}
40394039

4040-
export class FunctionCoverage implements vscode.FunctionCoverage {
4040+
export class DeclarationCoverage implements vscode.DeclarationCoverage {
40414041
// back compat until finalization:
40424042
get executionCount() { return +this.executed; }
40434043
set executionCount(n: number) { this.executed = n; }

src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ export class CoverageDetailsModel {
366366

367367
//#region decoration generation
368368
// Coverage from a provider can have a range that contains smaller ranges,
369-
// such as a function declarationt that has nested statements. In this we
369+
// such as a function declaration that has nested statements. In this we
370370
// make sequential, non-overlapping ranges for each detail for display in
371371
// the editor without ugly overlaps.
372372
const detailRanges: DetailRange[] = details.map(detail => ({
@@ -445,8 +445,8 @@ export class CoverageDetailsModel {
445445

446446
/** Gets the markdown description for the given detail */
447447
public describe(detail: CoverageDetailsWithBranch, model: ITextModel): IMarkdownString | undefined {
448-
if (detail.type === DetailType.Function) {
449-
return new MarkdownString().appendMarkdown(localize('coverage.fnExecutedCount', 'Function `{0}` was executed {1} time(s).', detail.name, detail.count));
448+
if (detail.type === DetailType.Declaration) {
449+
return new MarkdownString().appendMarkdown(localize('coverage.declExecutedCount', '`{0}` was executed {1} time(s).', detail.name, detail.count));
450450
} else if (detail.type === DetailType.Statement) {
451451
const text = wrapName(model.getValueInRange(tidyLocation(detail.location)).trim() || `<empty statement>`);
452452
const str = new MarkdownString();

src/vs/workbench/contrib/testing/browser/testCoverageBars.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export interface TestCoverageBarsOptions {
3535
}
3636

3737
/** Type that can be used to render coverage bars */
38-
export type CoverageBarSource = Pick<AbstractFileCoverage, 'statement' | 'branch' | 'function'>;
38+
export type CoverageBarSource = Pick<AbstractFileCoverage, 'statement' | 'branch' | 'declaration'>;
3939

4040
export class ManagedTestCoverageBars extends Disposable {
4141
private _coverage?: CoverageBarSource;
@@ -142,7 +142,7 @@ export class ManagedTestCoverageBars extends Disposable {
142142
renderBar(el.tpcBar, overallStat, false, thresholds);
143143
} else {
144144
renderBar(el.statement, percent(coverage.statement), coverage.statement.total === 0, thresholds);
145-
renderBar(el.function, coverage.function && percent(coverage.function), coverage.function?.total === 0, thresholds);
145+
renderBar(el.function, coverage.declaration && percent(coverage.declaration), coverage.declaration?.total === 0, thresholds);
146146
renderBar(el.branch, coverage.branch && percent(coverage.branch), coverage.branch?.total === 0, thresholds);
147147
}
148148
}
@@ -196,11 +196,11 @@ const calculateDisplayedStat = (coverage: CoverageBarSource, method: TestingDisp
196196
case TestingDisplayedCoveragePercent.Minimum: {
197197
let value = percent(coverage.statement);
198198
if (coverage.branch) { value = Math.min(value, percent(coverage.branch)); }
199-
if (coverage.function) { value = Math.min(value, percent(coverage.function)); }
199+
if (coverage.declaration) { value = Math.min(value, percent(coverage.declaration)); }
200200
return value;
201201
}
202202
case TestingDisplayedCoveragePercent.TotalCoverage:
203-
return getTotalCoveragePercent(coverage.statement, coverage.branch, coverage.function);
203+
return getTotalCoveragePercent(coverage.statement, coverage.branch, coverage.declaration);
204204
default:
205205
assertNever(method);
206206
}
@@ -219,7 +219,7 @@ const displayPercent = (value: number, precision = 2) => {
219219
};
220220

221221
const stmtCoverageText = (coverage: CoverageBarSource) => localize('statementCoverage', '{0}/{1} statements covered ({2})', coverage.statement.covered, coverage.statement.total, displayPercent(percent(coverage.statement)));
222-
const fnCoverageText = (coverage: CoverageBarSource) => coverage.function && localize('functionCoverage', '{0}/{1} functions covered ({2})', coverage.function.covered, coverage.function.total, displayPercent(percent(coverage.function)));
222+
const fnCoverageText = (coverage: CoverageBarSource) => coverage.declaration && localize('functionCoverage', '{0}/{1} functions covered ({2})', coverage.declaration.covered, coverage.declaration.total, displayPercent(percent(coverage.declaration)));
223223
const branchCoverageText = (coverage: CoverageBarSource) => coverage.branch && localize('branchCoverage', '{0}/{1} branches covered ({2})', coverage.branch.covered, coverage.branch.total, displayPercent(percent(coverage.branch)));
224224

225225
const getOverallHoverText = (coverage: CoverageBarSource) => new MarkdownString([

src/vs/workbench/contrib/testing/browser/testCoverageView.ts

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import { CoverageBarSource, ManagedTestCoverageBars } from 'vs/workbench/contrib
4444
import { TestCommandId, Testing } from 'vs/workbench/contrib/testing/common/constants';
4545
import { ComputedFileCoverage, FileCoverage, TestCoverage, getTotalCoveragePercent } from 'vs/workbench/contrib/testing/common/testCoverage';
4646
import { ITestCoverageService } from 'vs/workbench/contrib/testing/common/testCoverageService';
47-
import { CoverageDetails, DetailType, ICoveredCount, IFunctionCoverage, TestResultState } from 'vs/workbench/contrib/testing/common/testTypes';
47+
import { CoverageDetails, DetailType, ICoveredCount, IDeclarationCoverage, TestResultState } from 'vs/workbench/contrib/testing/common/testTypes';
4848
import { ACTIVE_GROUP, IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService';
4949

5050
const enum CoverageSortOrder {
@@ -97,10 +97,10 @@ export class TestCoverageView extends ViewPane {
9797

9898
let fnNodeId = 0;
9999

100-
class FunctionCoverageNode {
100+
class DeclarationCoverageNode {
101101
public readonly id = String(fnNodeId++);
102102
public readonly containedDetails = new Set<CoverageDetails>();
103-
public readonly children: FunctionCoverageNode[] = [];
103+
public readonly children: DeclarationCoverageNode[] = [];
104104

105105
public get hits() {
106106
return this.data.count;
@@ -121,7 +121,7 @@ class FunctionCoverageNode {
121121

122122
constructor(
123123
public readonly uri: URI,
124-
private readonly data: IFunctionCoverage,
124+
private readonly data: IDeclarationCoverage,
125125
details: readonly CoverageDetails[],
126126
) {
127127
if (data.location instanceof Range) {
@@ -172,11 +172,11 @@ class FunctionCoverageNode {
172172
}
173173
}
174174

175-
class RevealUncoveredFunctions {
175+
class RevealUncoveredDeclarations {
176176
public readonly id = String(fnNodeId++);
177177

178178
public get label() {
179-
return localize('functionsWithoutCoverage', "{0} functions without coverage...", this.n);
179+
return localize('functionsWithoutCoverage', "{0} declarations without coverage...", this.n);
180180
}
181181

182182
constructor(public readonly n: number) { }
@@ -189,12 +189,12 @@ class LoadingDetails {
189189

190190
/** Type of nodes returned from {@link TestCoverage}. Note: value is *always* defined. */
191191
type TestCoverageFileNode = IPrefixTreeNode<ComputedFileCoverage | FileCoverage>;
192-
type CoverageTreeElement = TestCoverageFileNode | FunctionCoverageNode | LoadingDetails | RevealUncoveredFunctions;
192+
type CoverageTreeElement = TestCoverageFileNode | DeclarationCoverageNode | LoadingDetails | RevealUncoveredDeclarations;
193193

194194
const isFileCoverage = (c: CoverageTreeElement): c is TestCoverageFileNode => typeof c === 'object' && 'value' in c;
195-
const isFunctionCoverage = (c: CoverageTreeElement): c is FunctionCoverageNode => c instanceof FunctionCoverageNode;
196-
const shouldShowFunctionDetailsOnExpand = (c: CoverageTreeElement): c is IPrefixTreeNode<FileCoverage> =>
197-
isFileCoverage(c) && c.value instanceof FileCoverage && !!c.value.function?.total;
195+
const isDeclarationCoverage = (c: CoverageTreeElement): c is DeclarationCoverageNode => c instanceof DeclarationCoverageNode;
196+
const shouldShowDeclDetailsOnExpand = (c: CoverageTreeElement): c is IPrefixTreeNode<FileCoverage> =>
197+
isFileCoverage(c) && c.value instanceof FileCoverage && !!c.value.declaration?.total;
198198

199199
class TestCoverageTree extends Disposable {
200200
private readonly tree: WorkbenchCompressibleObjectTree<CoverageTreeElement, void>;
@@ -215,7 +215,7 @@ class TestCoverageTree extends Disposable {
215215
new TestCoverageTreeListDelegate(),
216216
[
217217
instantiationService.createInstance(FileCoverageRenderer, labels),
218-
instantiationService.createInstance(FunctionCoverageRenderer),
218+
instantiationService.createInstance(DeclarationCoverageRenderer),
219219
instantiationService.createInstance(BasicRenderer),
220220
],
221221
{
@@ -256,7 +256,7 @@ class TestCoverageTree extends Disposable {
256256
this._register(this.tree);
257257
this._register(this.tree.onDidChangeCollapseState(e => {
258258
const el = e.node.element;
259-
if (!e.node.collapsed && !e.node.children.length && el && shouldShowFunctionDetailsOnExpand(el)) {
259+
if (!e.node.collapsed && !e.node.children.length && el && shouldShowDeclDetailsOnExpand(el)) {
260260
if (el.value!.hasSynchronousDetails) {
261261
this.tree.setChildren(el, [{ element: new LoadingDetails(), incompressible: true }]);
262262
}
@@ -270,7 +270,7 @@ class TestCoverageTree extends Disposable {
270270
if (e.element) {
271271
if (isFileCoverage(e.element) && !e.element.children?.size) {
272272
resource = e.element.value!.uri;
273-
} else if (isFunctionCoverage(e.element)) {
273+
} else if (isDeclarationCoverage(e.element)) {
274274
resource = e.element.uri;
275275
selection = e.element.location;
276276
}
@@ -310,7 +310,7 @@ class TestCoverageTree extends Disposable {
310310
incompressible: isFile,
311311
collapsed: isFile,
312312
// directories can be expanded, and items with function info can be expanded
313-
collapsible: !isFile || !!file.value?.function?.total,
313+
collapsible: !isFile || !!file.value?.declaration?.total,
314314
children: file.children && Iterable.map(file.children?.values(), toChild)
315315
};
316316
};
@@ -327,13 +327,13 @@ class TestCoverageTree extends Disposable {
327327
return; // avoid any issues if the tree changes in the meanwhile
328328
}
329329

330-
const functions: FunctionCoverageNode[] = [];
330+
const decl: DeclarationCoverageNode[] = [];
331331
for (const fn of details) {
332-
if (fn.type !== DetailType.Function) {
332+
if (fn.type !== DetailType.Declaration) {
333333
continue;
334334
}
335335

336-
let arr = functions;
336+
let arr = decl;
337337
while (true) {
338338
const parent = arr.find(p => p.containedDetails.has(fn));
339339
if (parent) {
@@ -343,18 +343,18 @@ class TestCoverageTree extends Disposable {
343343
}
344344
}
345345

346-
arr.push(new FunctionCoverageNode(el.value!.uri, fn, details));
346+
arr.push(new DeclarationCoverageNode(el.value!.uri, fn, details));
347347
}
348348

349-
const makeChild = (fn: FunctionCoverageNode): ICompressedTreeElement<CoverageTreeElement> => ({
349+
const makeChild = (fn: DeclarationCoverageNode): ICompressedTreeElement<CoverageTreeElement> => ({
350350
element: fn,
351351
incompressible: true,
352352
collapsed: true,
353353
collapsible: fn.children.length > 0,
354354
children: fn.children.map(makeChild)
355355
});
356356

357-
this.tree.setChildren(el, functions.map(makeChild));
357+
this.tree.setChildren(el, decl.map(makeChild));
358358
}
359359
}
360360

@@ -367,10 +367,10 @@ class TestCoverageTreeListDelegate implements IListVirtualDelegate<CoverageTreeE
367367
if (isFileCoverage(element)) {
368368
return FileCoverageRenderer.ID;
369369
}
370-
if (isFunctionCoverage(element)) {
371-
return FunctionCoverageRenderer.ID;
370+
if (isDeclarationCoverage(element)) {
371+
return DeclarationCoverageRenderer.ID;
372372
}
373-
if (element instanceof LoadingDetails || element instanceof RevealUncoveredFunctions) {
373+
if (element instanceof LoadingDetails || element instanceof RevealUncoveredDeclarations) {
374374
return BasicRenderer.ID;
375375
}
376376
assertNever(element);
@@ -389,7 +389,7 @@ class Sorter implements ITreeSorter<CoverageTreeElement> {
389389
case CoverageSortOrder.Coverage:
390390
return b.value!.tpc - a.value!.tpc;
391391
}
392-
} else if (isFunctionCoverage(a) && isFunctionCoverage(b)) {
392+
} else if (isDeclarationCoverage(a) && isDeclarationCoverage(b)) {
393393
switch (order) {
394394
case CoverageSortOrder.Location:
395395
return Position.compare(
@@ -474,24 +474,24 @@ class FileCoverageRenderer implements ICompressibleTreeRenderer<CoverageTreeElem
474474
}
475475
}
476476

477-
interface FunctionTemplateData {
477+
interface DeclarationTemplateData {
478478
container: HTMLElement;
479479
bars: ManagedTestCoverageBars;
480480
templateDisposables: DisposableStore;
481481
icon: HTMLElement;
482482
label: HTMLElement;
483483
}
484484

485-
class FunctionCoverageRenderer implements ICompressibleTreeRenderer<CoverageTreeElement, FuzzyScore, FunctionTemplateData> {
485+
class DeclarationCoverageRenderer implements ICompressibleTreeRenderer<CoverageTreeElement, FuzzyScore, DeclarationTemplateData> {
486486
public static readonly ID = 'N';
487-
public readonly templateId = FunctionCoverageRenderer.ID;
487+
public readonly templateId = DeclarationCoverageRenderer.ID;
488488

489489
constructor(
490490
@IInstantiationService private readonly instantiationService: IInstantiationService,
491491
) { }
492492

493493
/** @inheritdoc */
494-
public renderTemplate(container: HTMLElement): FunctionTemplateData {
494+
public renderTemplate(container: HTMLElement): DeclarationTemplateData {
495495
const templateDisposables = new DisposableStore();
496496
container.classList.add('test-coverage-list-item');
497497
const icon = dom.append(container, dom.$('.state'));
@@ -507,21 +507,21 @@ class FunctionCoverageRenderer implements ICompressibleTreeRenderer<CoverageTree
507507
}
508508

509509
/** @inheritdoc */
510-
public renderElement(node: ITreeNode<CoverageTreeElement, FuzzyScore>, _index: number, templateData: FunctionTemplateData): void {
511-
this.doRender(node.element as FunctionCoverageNode, templateData, node.filterData);
510+
public renderElement(node: ITreeNode<CoverageTreeElement, FuzzyScore>, _index: number, templateData: DeclarationTemplateData): void {
511+
this.doRender(node.element as DeclarationCoverageNode, templateData, node.filterData);
512512
}
513513

514514
/** @inheritdoc */
515-
public renderCompressedElements(node: ITreeNode<ICompressedTreeNode<CoverageTreeElement>, FuzzyScore>, _index: number, templateData: FunctionTemplateData): void {
516-
this.doRender(node.element.elements[node.element.elements.length - 1] as FunctionCoverageNode, templateData, node.filterData);
515+
public renderCompressedElements(node: ITreeNode<ICompressedTreeNode<CoverageTreeElement>, FuzzyScore>, _index: number, templateData: DeclarationTemplateData): void {
516+
this.doRender(node.element.elements[node.element.elements.length - 1] as DeclarationCoverageNode, templateData, node.filterData);
517517
}
518518

519-
public disposeTemplate(templateData: FunctionTemplateData) {
519+
public disposeTemplate(templateData: DeclarationTemplateData) {
520520
templateData.templateDisposables.dispose();
521521
}
522522

523523
/** @inheritdoc */
524-
private doRender(element: FunctionCoverageNode, templateData: FunctionTemplateData, _filterData: FuzzyScore | undefined) {
524+
private doRender(element: DeclarationCoverageNode, templateData: DeclarationTemplateData, _filterData: FuzzyScore | undefined) {
525525
const covered = !!element.hits;
526526
const icon = covered ? testingWasCovered : testingStatesToIcons.get(TestResultState.Unset);
527527
templateData.container.classList.toggle('not-covered', !covered);
@@ -552,7 +552,7 @@ class BasicRenderer implements ICompressibleTreeRenderer<CoverageTreeElement, Fu
552552
}
553553

554554
private renderInner(element: CoverageTreeElement, container: HTMLElement) {
555-
container.innerText = (element as RevealUncoveredFunctions | LoadingDetails).label;
555+
container.innerText = (element as RevealUncoveredDeclarations | LoadingDetails).label;
556556
}
557557
}
558558

@@ -585,9 +585,9 @@ registerAction2(class TestCoverageChangeSortingAction extends ViewAction<TestCov
585585
const disposables = new DisposableStore();
586586
const quickInput = disposables.add(accessor.get(IQuickInputService).createQuickPick<Item>());
587587
const items: Item[] = [
588-
{ label: localize('testing.coverageSortByLocation', 'Sort by Location'), value: CoverageSortOrder.Location, description: localize('testing.coverageSortByLocationDescription', 'Files are sorted alphabetically, functions are sorted by position') },
589-
{ label: localize('testing.coverageSortByCoverage', 'Sort by Coverage'), value: CoverageSortOrder.Coverage, description: localize('testing.coverageSortByCoverageDescription', 'Files and functions are sorted by total coverage') },
590-
{ label: localize('testing.coverageSortByName', 'Sort by Name'), value: CoverageSortOrder.Name, description: localize('testing.coverageSortByNameDescription', 'Files and functions are sorted alphabetically') },
588+
{ label: localize('testing.coverageSortByLocation', 'Sort by Location'), value: CoverageSortOrder.Location, description: localize('testing.coverageSortByLocationDescription', 'Files are sorted alphabetically, declarations are sorted by position') },
589+
{ label: localize('testing.coverageSortByCoverage', 'Sort by Coverage'), value: CoverageSortOrder.Coverage, description: localize('testing.coverageSortByCoverageDescription', 'Files and declarations are sorted by total coverage') },
590+
{ label: localize('testing.coverageSortByName', 'Sort by Name'), value: CoverageSortOrder.Name, description: localize('testing.coverageSortByNameDescription', 'Files and declarations are sorted alphabetically') },
591591
];
592592

593593
quickInput.placeholder = localize('testing.coverageSortPlaceholder', 'Sort the Test Coverage view...');

0 commit comments

Comments
 (0)