From 2eb66826bdec26623ddc88aecc2043993db8878e Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Wed, 7 Feb 2024 16:24:33 -0800 Subject: [PATCH] testing: rename FunctionCoverage -> DeclarationCoverage for finalization (#204667) --- .../workbench/api/common/extHost.api.impl.ts | 4 +- .../api/common/extHostTypeConverters.ts | 4 +- src/vs/workbench/api/common/extHostTypes.ts | 14 ++-- .../browser/codeCoverageDecorations.ts | 6 +- .../testing/browser/testCoverageBars.ts | 10 +-- .../testing/browser/testCoverageView.ts | 76 +++++++++---------- .../contrib/testing/common/testCoverage.ts | 8 +- .../contrib/testing/common/testTypes.ts | 30 ++++---- .../vscode.proposed.testCoverage.d.ts | 37 +++++---- 9 files changed, 94 insertions(+), 95 deletions(-) diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 5b7786330ac..f86fd099ef4 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -1615,7 +1615,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I TestResultState: extHostTypes.TestResultState, TestRunRequest: extHostTypes.TestRunRequest, TestMessage: extHostTypes.TestMessage, - TestMessage2: extHostTypes.TestMessage, // back compat for Oct 2023 TestTag: extHostTypes.TestTag, TestRunProfileKind: extHostTypes.TestRunProfileKind, TextSearchCompleteMessageType: TextSearchCompleteMessageType, @@ -1625,7 +1624,8 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I FileCoverage: extHostTypes.FileCoverage, StatementCoverage: extHostTypes.StatementCoverage, BranchCoverage: extHostTypes.BranchCoverage, - FunctionCoverage: extHostTypes.FunctionCoverage, + DeclarationCoverage: extHostTypes.DeclarationCoverage, + FunctionCoverage: extHostTypes.DeclarationCoverage, // back compat for Feb 2024 WorkspaceTrustState: extHostTypes.WorkspaceTrustState, LanguageStatusSeverity: extHostTypes.LanguageStatusSeverity, QuickPickItemKind: extHostTypes.QuickPickItemKind, diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index 42a57e47c13..6237bc44823 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -2021,7 +2021,7 @@ export namespace TestCoverage { }; } else { return { - type: DetailType.Function, + type: DetailType.Declaration, name: coverage.name, count: coverage.executed, location: fromLocation(coverage.location), @@ -2034,7 +2034,7 @@ export namespace TestCoverage { uri: coverage.uri, statement: fromCoveredCount(coverage.statementCoverage), branch: coverage.branchCoverage && fromCoveredCount(coverage.branchCoverage), - function: coverage.functionCoverage && fromCoveredCount(coverage.functionCoverage), + declaration: coverage.declarationCoverage && fromCoveredCount(coverage.declarationCoverage), details: coverage.detailedCoverage?.map(fromDetailed), }; } diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index b0269443d64..300a1a4c549 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -3970,7 +3970,7 @@ export class FileCoverage implements vscode.FileCoverage { public static fromDetails(uri: vscode.Uri, details: vscode.DetailedCoverage[]): vscode.FileCoverage { const statements = new CoveredCount(0, 0); const branches = new CoveredCount(0, 0); - const fn = new CoveredCount(0, 0); + const decl = new CoveredCount(0, 0); for (const detail of details) { if ('branches' in detail) { @@ -3982,8 +3982,8 @@ export class FileCoverage implements vscode.FileCoverage { branches.covered += branch.executed ? 1 : 0; } } else { - fn.total += 1; - fn.covered += detail.executed ? 1 : 0; + decl.total += 1; + decl.covered += detail.executed ? 1 : 0; } } @@ -3991,7 +3991,7 @@ export class FileCoverage implements vscode.FileCoverage { uri, statements, branches.total > 0 ? branches : undefined, - fn.total > 0 ? fn : undefined, + decl.total > 0 ? decl : undefined, ); coverage.detailedCoverage = details; @@ -4005,11 +4005,11 @@ export class FileCoverage implements vscode.FileCoverage { public readonly uri: vscode.Uri, public statementCoverage: vscode.CoveredCount, public branchCoverage?: vscode.CoveredCount, - public functionCoverage?: vscode.CoveredCount, + public declarationCoverage?: vscode.CoveredCount, ) { validateCC(statementCoverage); validateCC(branchCoverage); - validateCC(functionCoverage); + validateCC(declarationCoverage); } } @@ -4037,7 +4037,7 @@ export class BranchCoverage implements vscode.BranchCoverage { ) { } } -export class FunctionCoverage implements vscode.FunctionCoverage { +export class DeclarationCoverage implements vscode.DeclarationCoverage { // back compat until finalization: get executionCount() { return +this.executed; } set executionCount(n: number) { this.executed = n; } diff --git a/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts b/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts index 0c556853d8c..d96710fbd0d 100644 --- a/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts +++ b/src/vs/workbench/contrib/testing/browser/codeCoverageDecorations.ts @@ -366,7 +366,7 @@ export class CoverageDetailsModel { //#region decoration generation // Coverage from a provider can have a range that contains smaller ranges, - // such as a function declarationt that has nested statements. In this we + // such as a function declaration that has nested statements. In this we // make sequential, non-overlapping ranges for each detail for display in // the editor without ugly overlaps. const detailRanges: DetailRange[] = details.map(detail => ({ @@ -445,8 +445,8 @@ export class CoverageDetailsModel { /** Gets the markdown description for the given detail */ public describe(detail: CoverageDetailsWithBranch, model: ITextModel): IMarkdownString | undefined { - if (detail.type === DetailType.Function) { - return new MarkdownString().appendMarkdown(localize('coverage.fnExecutedCount', 'Function `{0}` was executed {1} time(s).', detail.name, detail.count)); + if (detail.type === DetailType.Declaration) { + return new MarkdownString().appendMarkdown(localize('coverage.declExecutedCount', '`{0}` was executed {1} time(s).', detail.name, detail.count)); } else if (detail.type === DetailType.Statement) { const text = wrapName(model.getValueInRange(tidyLocation(detail.location)).trim() || ``); const str = new MarkdownString(); diff --git a/src/vs/workbench/contrib/testing/browser/testCoverageBars.ts b/src/vs/workbench/contrib/testing/browser/testCoverageBars.ts index 9a1c2987b9d..08cb528de32 100644 --- a/src/vs/workbench/contrib/testing/browser/testCoverageBars.ts +++ b/src/vs/workbench/contrib/testing/browser/testCoverageBars.ts @@ -35,7 +35,7 @@ export interface TestCoverageBarsOptions { } /** Type that can be used to render coverage bars */ -export type CoverageBarSource = Pick; +export type CoverageBarSource = Pick; export class ManagedTestCoverageBars extends Disposable { private _coverage?: CoverageBarSource; @@ -142,7 +142,7 @@ export class ManagedTestCoverageBars extends Disposable { renderBar(el.tpcBar, overallStat, false, thresholds); } else { renderBar(el.statement, percent(coverage.statement), coverage.statement.total === 0, thresholds); - renderBar(el.function, coverage.function && percent(coverage.function), coverage.function?.total === 0, thresholds); + renderBar(el.function, coverage.declaration && percent(coverage.declaration), coverage.declaration?.total === 0, thresholds); renderBar(el.branch, coverage.branch && percent(coverage.branch), coverage.branch?.total === 0, thresholds); } } @@ -196,11 +196,11 @@ const calculateDisplayedStat = (coverage: CoverageBarSource, method: TestingDisp case TestingDisplayedCoveragePercent.Minimum: { let value = percent(coverage.statement); if (coverage.branch) { value = Math.min(value, percent(coverage.branch)); } - if (coverage.function) { value = Math.min(value, percent(coverage.function)); } + if (coverage.declaration) { value = Math.min(value, percent(coverage.declaration)); } return value; } case TestingDisplayedCoveragePercent.TotalCoverage: - return getTotalCoveragePercent(coverage.statement, coverage.branch, coverage.function); + return getTotalCoveragePercent(coverage.statement, coverage.branch, coverage.declaration); default: assertNever(method); } @@ -219,7 +219,7 @@ const displayPercent = (value: number, precision = 2) => { }; const stmtCoverageText = (coverage: CoverageBarSource) => localize('statementCoverage', '{0}/{1} statements covered ({2})', coverage.statement.covered, coverage.statement.total, displayPercent(percent(coverage.statement))); -const fnCoverageText = (coverage: CoverageBarSource) => coverage.function && localize('functionCoverage', '{0}/{1} functions covered ({2})', coverage.function.covered, coverage.function.total, displayPercent(percent(coverage.function))); +const fnCoverageText = (coverage: CoverageBarSource) => coverage.declaration && localize('functionCoverage', '{0}/{1} functions covered ({2})', coverage.declaration.covered, coverage.declaration.total, displayPercent(percent(coverage.declaration))); const branchCoverageText = (coverage: CoverageBarSource) => coverage.branch && localize('branchCoverage', '{0}/{1} branches covered ({2})', coverage.branch.covered, coverage.branch.total, displayPercent(percent(coverage.branch))); const getOverallHoverText = (coverage: CoverageBarSource) => new MarkdownString([ diff --git a/src/vs/workbench/contrib/testing/browser/testCoverageView.ts b/src/vs/workbench/contrib/testing/browser/testCoverageView.ts index 5b583bf8322..2451613400f 100644 --- a/src/vs/workbench/contrib/testing/browser/testCoverageView.ts +++ b/src/vs/workbench/contrib/testing/browser/testCoverageView.ts @@ -44,7 +44,7 @@ import { CoverageBarSource, ManagedTestCoverageBars } from 'vs/workbench/contrib import { TestCommandId, Testing } from 'vs/workbench/contrib/testing/common/constants'; import { ComputedFileCoverage, FileCoverage, TestCoverage, getTotalCoveragePercent } from 'vs/workbench/contrib/testing/common/testCoverage'; import { ITestCoverageService } from 'vs/workbench/contrib/testing/common/testCoverageService'; -import { CoverageDetails, DetailType, ICoveredCount, IFunctionCoverage, TestResultState } from 'vs/workbench/contrib/testing/common/testTypes'; +import { CoverageDetails, DetailType, ICoveredCount, IDeclarationCoverage, TestResultState } from 'vs/workbench/contrib/testing/common/testTypes'; import { ACTIVE_GROUP, IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; const enum CoverageSortOrder { @@ -97,10 +97,10 @@ export class TestCoverageView extends ViewPane { let fnNodeId = 0; -class FunctionCoverageNode { +class DeclarationCoverageNode { public readonly id = String(fnNodeId++); public readonly containedDetails = new Set(); - public readonly children: FunctionCoverageNode[] = []; + public readonly children: DeclarationCoverageNode[] = []; public get hits() { return this.data.count; @@ -121,7 +121,7 @@ class FunctionCoverageNode { constructor( public readonly uri: URI, - private readonly data: IFunctionCoverage, + private readonly data: IDeclarationCoverage, details: readonly CoverageDetails[], ) { if (data.location instanceof Range) { @@ -172,11 +172,11 @@ class FunctionCoverageNode { } } -class RevealUncoveredFunctions { +class RevealUncoveredDeclarations { public readonly id = String(fnNodeId++); public get label() { - return localize('functionsWithoutCoverage', "{0} functions without coverage...", this.n); + return localize('functionsWithoutCoverage', "{0} declarations without coverage...", this.n); } constructor(public readonly n: number) { } @@ -189,12 +189,12 @@ class LoadingDetails { /** Type of nodes returned from {@link TestCoverage}. Note: value is *always* defined. */ type TestCoverageFileNode = IPrefixTreeNode; -type CoverageTreeElement = TestCoverageFileNode | FunctionCoverageNode | LoadingDetails | RevealUncoveredFunctions; +type CoverageTreeElement = TestCoverageFileNode | DeclarationCoverageNode | LoadingDetails | RevealUncoveredDeclarations; const isFileCoverage = (c: CoverageTreeElement): c is TestCoverageFileNode => typeof c === 'object' && 'value' in c; -const isFunctionCoverage = (c: CoverageTreeElement): c is FunctionCoverageNode => c instanceof FunctionCoverageNode; -const shouldShowFunctionDetailsOnExpand = (c: CoverageTreeElement): c is IPrefixTreeNode => - isFileCoverage(c) && c.value instanceof FileCoverage && !!c.value.function?.total; +const isDeclarationCoverage = (c: CoverageTreeElement): c is DeclarationCoverageNode => c instanceof DeclarationCoverageNode; +const shouldShowDeclDetailsOnExpand = (c: CoverageTreeElement): c is IPrefixTreeNode => + isFileCoverage(c) && c.value instanceof FileCoverage && !!c.value.declaration?.total; class TestCoverageTree extends Disposable { private readonly tree: WorkbenchCompressibleObjectTree; @@ -215,7 +215,7 @@ class TestCoverageTree extends Disposable { new TestCoverageTreeListDelegate(), [ instantiationService.createInstance(FileCoverageRenderer, labels), - instantiationService.createInstance(FunctionCoverageRenderer), + instantiationService.createInstance(DeclarationCoverageRenderer), instantiationService.createInstance(BasicRenderer), ], { @@ -256,7 +256,7 @@ class TestCoverageTree extends Disposable { this._register(this.tree); this._register(this.tree.onDidChangeCollapseState(e => { const el = e.node.element; - if (!e.node.collapsed && !e.node.children.length && el && shouldShowFunctionDetailsOnExpand(el)) { + if (!e.node.collapsed && !e.node.children.length && el && shouldShowDeclDetailsOnExpand(el)) { if (el.value!.hasSynchronousDetails) { this.tree.setChildren(el, [{ element: new LoadingDetails(), incompressible: true }]); } @@ -270,7 +270,7 @@ class TestCoverageTree extends Disposable { if (e.element) { if (isFileCoverage(e.element) && !e.element.children?.size) { resource = e.element.value!.uri; - } else if (isFunctionCoverage(e.element)) { + } else if (isDeclarationCoverage(e.element)) { resource = e.element.uri; selection = e.element.location; } @@ -310,7 +310,7 @@ class TestCoverageTree extends Disposable { incompressible: isFile, collapsed: isFile, // directories can be expanded, and items with function info can be expanded - collapsible: !isFile || !!file.value?.function?.total, + collapsible: !isFile || !!file.value?.declaration?.total, children: file.children && Iterable.map(file.children?.values(), toChild) }; }; @@ -327,13 +327,13 @@ class TestCoverageTree extends Disposable { return; // avoid any issues if the tree changes in the meanwhile } - const functions: FunctionCoverageNode[] = []; + const decl: DeclarationCoverageNode[] = []; for (const fn of details) { - if (fn.type !== DetailType.Function) { + if (fn.type !== DetailType.Declaration) { continue; } - let arr = functions; + let arr = decl; while (true) { const parent = arr.find(p => p.containedDetails.has(fn)); if (parent) { @@ -343,10 +343,10 @@ class TestCoverageTree extends Disposable { } } - arr.push(new FunctionCoverageNode(el.value!.uri, fn, details)); + arr.push(new DeclarationCoverageNode(el.value!.uri, fn, details)); } - const makeChild = (fn: FunctionCoverageNode): ICompressedTreeElement => ({ + const makeChild = (fn: DeclarationCoverageNode): ICompressedTreeElement => ({ element: fn, incompressible: true, collapsed: true, @@ -354,7 +354,7 @@ class TestCoverageTree extends Disposable { children: fn.children.map(makeChild) }); - this.tree.setChildren(el, functions.map(makeChild)); + this.tree.setChildren(el, decl.map(makeChild)); } } @@ -367,10 +367,10 @@ class TestCoverageTreeListDelegate implements IListVirtualDelegate { case CoverageSortOrder.Coverage: return b.value!.tpc - a.value!.tpc; } - } else if (isFunctionCoverage(a) && isFunctionCoverage(b)) { + } else if (isDeclarationCoverage(a) && isDeclarationCoverage(b)) { switch (order) { case CoverageSortOrder.Location: return Position.compare( @@ -474,7 +474,7 @@ class FileCoverageRenderer implements ICompressibleTreeRenderer { +class DeclarationCoverageRenderer implements ICompressibleTreeRenderer { public static readonly ID = 'N'; - public readonly templateId = FunctionCoverageRenderer.ID; + public readonly templateId = DeclarationCoverageRenderer.ID; constructor( @IInstantiationService private readonly instantiationService: IInstantiationService, ) { } /** @inheritdoc */ - public renderTemplate(container: HTMLElement): FunctionTemplateData { + public renderTemplate(container: HTMLElement): DeclarationTemplateData { const templateDisposables = new DisposableStore(); container.classList.add('test-coverage-list-item'); const icon = dom.append(container, dom.$('.state')); @@ -507,21 +507,21 @@ class FunctionCoverageRenderer implements ICompressibleTreeRenderer, _index: number, templateData: FunctionTemplateData): void { - this.doRender(node.element as FunctionCoverageNode, templateData, node.filterData); + public renderElement(node: ITreeNode, _index: number, templateData: DeclarationTemplateData): void { + this.doRender(node.element as DeclarationCoverageNode, templateData, node.filterData); } /** @inheritdoc */ - public renderCompressedElements(node: ITreeNode, FuzzyScore>, _index: number, templateData: FunctionTemplateData): void { - this.doRender(node.element.elements[node.element.elements.length - 1] as FunctionCoverageNode, templateData, node.filterData); + public renderCompressedElements(node: ITreeNode, FuzzyScore>, _index: number, templateData: DeclarationTemplateData): void { + this.doRender(node.element.elements[node.element.elements.length - 1] as DeclarationCoverageNode, templateData, node.filterData); } - public disposeTemplate(templateData: FunctionTemplateData) { + public disposeTemplate(templateData: DeclarationTemplateData) { templateData.templateDisposables.dispose(); } /** @inheritdoc */ - private doRender(element: FunctionCoverageNode, templateData: FunctionTemplateData, _filterData: FuzzyScore | undefined) { + private doRender(element: DeclarationCoverageNode, templateData: DeclarationTemplateData, _filterData: FuzzyScore | undefined) { const covered = !!element.hits; const icon = covered ? testingWasCovered : testingStatesToIcons.get(TestResultState.Unset); templateData.container.classList.toggle('not-covered', !covered); @@ -552,7 +552,7 @@ class BasicRenderer implements ICompressibleTreeRenderer()); const items: Item[] = [ - { label: localize('testing.coverageSortByLocation', 'Sort by Location'), value: CoverageSortOrder.Location, description: localize('testing.coverageSortByLocationDescription', 'Files are sorted alphabetically, functions are sorted by position') }, - { label: localize('testing.coverageSortByCoverage', 'Sort by Coverage'), value: CoverageSortOrder.Coverage, description: localize('testing.coverageSortByCoverageDescription', 'Files and functions are sorted by total coverage') }, - { label: localize('testing.coverageSortByName', 'Sort by Name'), value: CoverageSortOrder.Name, description: localize('testing.coverageSortByNameDescription', 'Files and functions are sorted alphabetically') }, + { label: localize('testing.coverageSortByLocation', 'Sort by Location'), value: CoverageSortOrder.Location, description: localize('testing.coverageSortByLocationDescription', 'Files are sorted alphabetically, declarations are sorted by position') }, + { label: localize('testing.coverageSortByCoverage', 'Sort by Coverage'), value: CoverageSortOrder.Coverage, description: localize('testing.coverageSortByCoverageDescription', 'Files and declarations are sorted by total coverage') }, + { label: localize('testing.coverageSortByName', 'Sort by Name'), value: CoverageSortOrder.Name, description: localize('testing.coverageSortByNameDescription', 'Files and declarations are sorted alphabetically') }, ]; quickInput.placeholder = localize('testing.coverageSortPlaceholder', 'Sort the Test Coverage view...'); diff --git a/src/vs/workbench/contrib/testing/common/testCoverage.ts b/src/vs/workbench/contrib/testing/common/testCoverage.ts index 7545c7c3da6..05d532263da 100644 --- a/src/vs/workbench/contrib/testing/common/testCoverage.ts +++ b/src/vs/workbench/contrib/testing/common/testCoverage.ts @@ -98,7 +98,7 @@ export class TestCoverage { ICoveredCount.sum(fileCoverage.statement, v.statement); if (v.branch) { ICoveredCount.sum(fileCoverage.branch ??= ICoveredCount.empty(), v.branch); } - if (v.function) { ICoveredCount.sum(fileCoverage.function ??= ICoveredCount.empty(), v.function); } + if (v.declaration) { ICoveredCount.sum(fileCoverage.declaration ??= ICoveredCount.empty(), v.declaration); } } } @@ -146,21 +146,21 @@ export abstract class AbstractFileCoverage { public readonly uri: URI; public readonly statement: ICoveredCount; public readonly branch?: ICoveredCount; - public readonly function?: ICoveredCount; + public readonly declaration?: ICoveredCount; /** * Gets the total coverage percent based on information provided. * This is based on the Clover total coverage formula */ public get tpc() { - return getTotalCoveragePercent(this.statement, this.branch, this.function); + return getTotalCoveragePercent(this.statement, this.branch, this.declaration); } constructor(coverage: IFileCoverage) { this.uri = coverage.uri; this.statement = coverage.statement; this.branch = coverage.branch; - this.function = coverage.function; + this.declaration = coverage.declaration; } } diff --git a/src/vs/workbench/contrib/testing/common/testTypes.ts b/src/vs/workbench/contrib/testing/common/testTypes.ts index ed4ff1c93ea..7737ef78020 100644 --- a/src/vs/workbench/contrib/testing/common/testTypes.ts +++ b/src/vs/workbench/contrib/testing/common/testTypes.ts @@ -549,7 +549,7 @@ export interface IFileCoverage { uri: URI; statement: ICoveredCount; branch?: ICoveredCount; - function?: ICoveredCount; + declaration?: ICoveredCount; details?: CoverageDetails[]; } @@ -559,14 +559,14 @@ export namespace IFileCoverage { uri: UriComponents; statement: ICoveredCount; branch?: ICoveredCount; - function?: ICoveredCount; + declaration?: ICoveredCount; details?: CoverageDetails.Serialized[]; } export const serialize = (original: Readonly): Serialized => ({ statement: original.statement, branch: original.branch, - function: original.function, + declaration: original.declaration, details: original.details?.map(CoverageDetails.serialize), uri: original.uri.toJSON(), }); @@ -574,7 +574,7 @@ export namespace IFileCoverage { export const deserialize = (uriIdentity: ITestUriCanonicalizer, serialized: Serialized): IFileCoverage => ({ statement: serialized.statement, branch: serialized.branch, - function: serialized.function, + declaration: serialized.declaration, details: serialized.details?.map(CoverageDetails.deserialize), uri: uriIdentity.asCanonicalUri(URI.revive(serialized.uri)), }); @@ -596,21 +596,21 @@ function deserializeThingWithLocation): Serialized => - original.type === DetailType.Function ? IFunctionCoverage.serialize(original) : IStatementCoverage.serialize(original); + original.type === DetailType.Declaration ? IDeclarationCoverage.serialize(original) : IStatementCoverage.serialize(original); export const deserialize = (serialized: Serialized): CoverageDetails => - serialized.type === DetailType.Function ? IFunctionCoverage.deserialize(serialized) : IStatementCoverage.deserialize(serialized); + serialized.type === DetailType.Declaration ? IDeclarationCoverage.deserialize(serialized) : IStatementCoverage.deserialize(serialized); } export interface IBranchCoverage { @@ -630,23 +630,23 @@ export namespace IBranchCoverage { export const deserialize: (original: Serialized) => IBranchCoverage = deserializeThingWithLocation; } -export interface IFunctionCoverage { - type: DetailType.Function; +export interface IDeclarationCoverage { + type: DetailType.Declaration; name: string; count: number | boolean; location: Range | Position; } -export namespace IFunctionCoverage { +export namespace IDeclarationCoverage { export interface Serialized { - type: DetailType.Function; + type: DetailType.Declaration; name: string; count: number | boolean; location: IRange | IPosition; } - export const serialize: (original: IFunctionCoverage) => Serialized = serializeThingWithLocation; - export const deserialize: (original: Serialized) => IFunctionCoverage = deserializeThingWithLocation; + export const serialize: (original: IDeclarationCoverage) => Serialized = serializeThingWithLocation; + export const deserialize: (original: Serialized) => IDeclarationCoverage = deserializeThingWithLocation; } export interface IStatementCoverage { diff --git a/src/vscode-dts/vscode.proposed.testCoverage.d.ts b/src/vscode-dts/vscode.proposed.testCoverage.d.ts index aa0b1fee9ac..614792e0d9c 100644 --- a/src/vscode-dts/vscode.proposed.testCoverage.d.ts +++ b/src/vscode-dts/vscode.proposed.testCoverage.d.ts @@ -47,7 +47,7 @@ declare module 'vscode' { /** * A class that contains information about a covered resource. A count can - * be give for lines, branches, and functions in a file. + * be give for lines, branches, and declarations in a file. */ export class CoveredCount { /** @@ -87,9 +87,10 @@ declare module 'vscode' { branchCoverage?: CoveredCount; /** - * Function coverage information. + * Declaration coverage information. Depending on the reporter and + * language, this may be types such as functions, methods, or namespaces. */ - functionCoverage?: CoveredCount; + declarationCoverage?: CoveredCount; /** * Detailed, per-statement coverage. If this is undefined, the editor will @@ -111,19 +112,16 @@ declare module 'vscode' { * does not provide statement coverage information, this can instead be * used to represent line coverage. * @param branchCoverage Branch coverage information - * @param functionCoverage Function coverage information + * @param declarationCoverage Declaration coverage information */ constructor( uri: Uri, statementCoverage: CoveredCount, branchCoverage?: CoveredCount, - functionCoverage?: CoveredCount, + declarationCoverage?: CoveredCount, ); } - // @API are StatementCoverage and BranchCoverage etc really needed - // or is a generic type with a kind-property enough - /** * Contains coverage information for a single statement or line. */ @@ -189,35 +187,36 @@ declare module 'vscode' { } /** - * Contains coverage information for a function or method. + * Contains coverage information for a declaration. Depending on the reporter + * and language, this may be types such as functions, methods, or namespaces. */ - export class FunctionCoverage { + export class DeclarationCoverage { /** - * Name of the function or method. + * Name of the declaration. */ name: string; /** - * The number of times this function was executed, or a boolean indicating - * whether it was executed if the exact count is unknown. If zero or false, - * the function will be marked as un-covered. + * The number of times this declaration was executed, or a boolean + * indicating whether it was executed if the exact count is unknown. If + * zero or false, the declaration will be marked as un-covered. */ executed: number | boolean; /** - * Function location. + * Declaration location. */ location: Position | Range; /** - * @param executed The number of times this function was executed, or a + * @param executed The number of times this declaration was executed, or a * boolean indicating whether it was executed if the exact count is - * unknown. If zero or false, the function will be marked as un-covered. - * @param location The function position. + * unknown. If zero or false, the declaration will be marked as un-covered. + * @param location The declaration position. */ constructor(name: string, executed: number | boolean, location: Position | Range); } - export type DetailedCoverage = StatementCoverage | FunctionCoverage; + export type DetailedCoverage = StatementCoverage | DeclarationCoverage; }