Skip to content

Commit 72c8e0b

Browse files
Convert RedactableError to an Error class of its own
1 parent 160a6cc commit 72c8e0b

24 files changed

Lines changed: 174 additions & 193 deletions

extensions/ql-vscode/src/astViewer.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import { commandRunner } from "./commandRunner";
2727
import { DisposableObject } from "./pure/disposable-object";
2828
import { showAndLogExceptionWithTelemetry } from "./helpers";
2929
import { asError, getErrorMessage } from "./pure/helpers-pure";
30-
import { redactableErrorMessage } from "./pure/errors";
30+
import { redactableError } from "./pure/errors";
3131

3232
export interface AstItem {
3333
id: BqrsId;
@@ -150,10 +150,9 @@ export class AstViewer extends DisposableObject {
150150
},
151151
(error: unknown) =>
152152
showAndLogExceptionWithTelemetry(
153-
asError(error),
154-
redactableErrorMessage`Failed to reveal AST: ${getErrorMessage(
155-
error,
156-
)}`,
153+
redactableError(
154+
asError(error),
155+
)`Failed to reveal AST: ${getErrorMessage(error)}`,
157156
),
158157
);
159158
}
@@ -214,10 +213,9 @@ export class AstViewer extends DisposableObject {
214213
},
215214
(error: unknown) =>
216215
showAndLogExceptionWithTelemetry(
217-
asError(error),
218-
redactableErrorMessage`Failed to reveal AST: ${getErrorMessage(
219-
error,
220-
)}`,
216+
redactableError(
217+
asError(error),
218+
)`Failed to reveal AST: ${getErrorMessage(error)}`,
221219
),
222220
);
223221
}

extensions/ql-vscode/src/commandRunner.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
import { extLogger } from "./common";
1414
import { asError, getErrorMessage, getErrorStack } from "./pure/helpers-pure";
1515
import { telemetryListener } from "./telemetry";
16-
import { redactableErrorMessage } from "./pure/errors";
16+
import { redactableError } from "./pure/errors";
1717

1818
export class UserCancellationException extends Error {
1919
/**
@@ -129,10 +129,10 @@ export function commandRunner(
129129
try {
130130
return await task(...args);
131131
} catch (e) {
132-
const errorMessage = redactableErrorMessage`${
132+
error = asError(e);
133+
const errorMessage = redactableError(error)`${
133134
getErrorMessage(e) || e
134135
} (${commandId})`;
135-
error = asError(e);
136136
const errorStack = getErrorStack(e);
137137
if (e instanceof UserCancellationException) {
138138
// User has cancelled this action manually
@@ -146,7 +146,7 @@ export function commandRunner(
146146
const fullMessage = errorStack
147147
? `${errorMessage.fullMessage}\n${errorStack}`
148148
: errorMessage.fullMessage;
149-
void showAndLogExceptionWithTelemetry(error, errorMessage, {
149+
void showAndLogExceptionWithTelemetry(errorMessage, {
150150
fullMessage,
151151
extraTelemetryProperties: {
152152
command: commandId,
@@ -187,10 +187,10 @@ export function commandRunnerWithProgress<R>(
187187
try {
188188
return await withProgress(progressOptionsWithDefaults, task, ...args);
189189
} catch (e) {
190-
const errorMessage = redactableErrorMessage`${
190+
error = asError(e);
191+
const errorMessage = redactableError`${
191192
getErrorMessage(e) || e
192193
} (${commandId})`;
193-
error = asError(e);
194194
const errorStack = getErrorStack(e);
195195
if (e instanceof UserCancellationException) {
196196
// User has cancelled this action manually
@@ -206,7 +206,7 @@ export function commandRunnerWithProgress<R>(
206206
const fullMessage = errorStack
207207
? `${errorMessage.fullMessage}\n${errorStack}`
208208
: errorMessage.fullMessage;
209-
void showAndLogExceptionWithTelemetry(error, errorMessage, {
209+
void showAndLogExceptionWithTelemetry(errorMessage, {
210210
outputLogger,
211211
fullMessage,
212212
extraTelemetryProperties: {

extensions/ql-vscode/src/contextual/queryResolver.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { createInitialQueryInfo } from "../run-queries-shared";
1818
import { CancellationToken, Uri } from "vscode";
1919
import { ProgressCallback } from "../commandRunner";
2020
import { QueryRunner } from "../queryRunner";
21-
import { redactableErrorMessage } from "../pure/errors";
21+
import { redactableError } from "../pure/errors";
2222

2323
export async function qlpackOfDatabase(
2424
cli: CodeQLCliServer,
@@ -92,14 +92,13 @@ export async function resolveQueries(
9292
const keyTypeName = nameOfKeyType(keyType);
9393
const keyTypeTag = tagOfKeyType(keyType);
9494
const joinedPacksToSearch = packsToSearch.join(", ");
95-
const errorMessage = redactableErrorMessage`No ${keyTypeName} queries (tagged "${keyTypeTag}") could be found in the \
95+
const error = redactableError`No ${keyTypeName} queries (tagged "${keyTypeTag}") could be found in the \
9696
current library path (tried searching the following packs: ${joinedPacksToSearch}). \
9797
Try upgrading the CodeQL libraries. If that doesn't work, then ${keyTypeName} queries are not yet available \
9898
for this language.`;
9999

100-
const e = new Error(errorMessage.fullMessage);
101-
void showAndLogExceptionWithTelemetry(e, errorMessage);
102-
throw e;
100+
void showAndLogExceptionWithTelemetry(error);
101+
throw error;
103102
}
104103

105104
async function resolveContextualQuery(

extensions/ql-vscode/src/databases-ui.ts

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ import { QueryRunner } from "./queryRunner";
4242
import { isCanary } from "./config";
4343
import { App } from "./common/app";
4444
import { Credentials } from "./common/authentication";
45-
import { redactableErrorMessage } from "./pure/errors";
45+
import { redactableError } from "./pure/errors";
4646

4747
enum SortOrder {
4848
NameAsc = "NameAsc",
@@ -347,10 +347,9 @@ export class DatabaseUI extends DisposableObject {
347347
await this.chooseAndSetDatabase(true, progress, token);
348348
} catch (e) {
349349
void showAndLogExceptionWithTelemetry(
350-
asError(e),
351-
redactableErrorMessage`Failed to choose and set database: ${getErrorMessage(
352-
e,
353-
)}`,
350+
redactableError(
351+
asError(e),
352+
)`Failed to choose and set database: ${getErrorMessage(e)}`,
354353
);
355354
}
356355
};
@@ -401,10 +400,9 @@ export class DatabaseUI extends DisposableObject {
401400
await remove(dbDir);
402401
} catch (e) {
403402
void showAndLogExceptionWithTelemetry(
404-
asError(e),
405-
redactableErrorMessage`Failed to delete orphaned database: ${getErrorMessage(
406-
e,
407-
)}`,
403+
redactableError(
404+
asError(e),
405+
)`Failed to delete orphaned database: ${getErrorMessage(e)}`,
408406
);
409407
failures.push(`${basename(dbDir)}`);
410408
}
@@ -429,10 +427,9 @@ export class DatabaseUI extends DisposableObject {
429427
await this.chooseAndSetDatabase(false, progress, token);
430428
} catch (e: unknown) {
431429
void showAndLogExceptionWithTelemetry(
432-
asError(e),
433-
redactableErrorMessage`Failed to choose and set database: ${getErrorMessage(
434-
e,
435-
)}`,
430+
redactableError(
431+
asError(e),
432+
)`Failed to choose and set database: ${getErrorMessage(e)}`,
436433
);
437434
}
438435
};

extensions/ql-vscode/src/databases.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { Logger, extLogger } from "./common";
2222
import { asError, getErrorMessage } from "./pure/helpers-pure";
2323
import { QueryRunner } from "./queryRunner";
2424
import { pathsEqual } from "./pure/files";
25-
import { redactableErrorMessage } from "./pure/errors";
25+
import { redactableError } from "./pure/errors";
2626

2727
/**
2828
* databases.ts
@@ -796,10 +796,9 @@ export class DatabaseManager extends DisposableObject {
796796
} catch (e) {
797797
// database list had an unexpected type - nothing to be done?
798798
void showAndLogExceptionWithTelemetry(
799-
asError(e),
800-
redactableErrorMessage`Database list loading failed: ${getErrorMessage(
801-
e,
802-
)}`,
799+
redactableError(
800+
asError(e),
801+
)`Database list loading failed: ${getErrorMessage(e)}`,
803802
);
804803
}
805804

extensions/ql-vscode/src/eval-log-viewer.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { commandRunner } from "./commandRunner";
1212
import { DisposableObject } from "./pure/disposable-object";
1313
import { showAndLogExceptionWithTelemetry } from "./helpers";
1414
import { asError, getErrorMessage } from "./pure/helpers-pure";
15-
import { redactableErrorMessage } from "./pure/errors";
15+
import { redactableError } from "./pure/errors";
1616

1717
export interface EvalLogTreeItem {
1818
label?: string;
@@ -108,10 +108,9 @@ export class EvalLogViewer extends DisposableObject {
108108
},
109109
(err: unknown) =>
110110
showAndLogExceptionWithTelemetry(
111-
asError(err),
112-
redactableErrorMessage`Failed to reveal tree view: ${getErrorMessage(
113-
err,
114-
)}`,
111+
redactableError(
112+
asError(err),
113+
)`Failed to reveal tree view: ${getErrorMessage(err)}`,
115114
),
116115
);
117116
}

extensions/ql-vscode/src/extension.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ import { VariantAnalysisResultsManager } from "./remote-queries/variant-analysis
138138
import { ExtensionApp } from "./common/vscode/vscode-app";
139139
import { RepositoriesFilterSortStateWithIds } from "./pure/variant-analysis-filter-sort";
140140
import { DbModule } from "./databases/db-module";
141-
import { redactableErrorMessage } from "./pure/errors";
141+
import { redactableError } from "./pure/errors";
142142

143143
/**
144144
* extension.ts
@@ -717,8 +717,9 @@ async function activateWithInstalledDistribution(
717717
await compareView.showResults(from, to);
718718
} catch (e) {
719719
void showAndLogExceptionWithTelemetry(
720-
asError(e),
721-
redactableErrorMessage`Failed to show results: ${getErrorMessage(e)}`,
720+
redactableError(asError(e))`Failed to show results: ${getErrorMessage(
721+
e,
722+
)}`,
722723
);
723724
}
724725
}
@@ -815,9 +816,9 @@ async function activateWithInstalledDistribution(
815816
const errorMessage = getErrorMessage(e).includes(
816817
"Generating qhelp in markdown",
817818
)
818-
? redactableErrorMessage`Could not generate markdown from ${pathToQhelp}: Bad formatting in .qhelp file.`
819-
: redactableErrorMessage`Could not open a preview of the generated file (${absolutePathToMd}).`;
820-
void showAndLogExceptionWithTelemetry(asError(e), errorMessage, {
819+
? redactableError`Could not generate markdown from ${pathToQhelp}: Bad formatting in .qhelp file.`
820+
: redactableError`Could not open a preview of the generated file (${absolutePathToMd}).`;
821+
void showAndLogExceptionWithTelemetry(errorMessage, {
821822
fullMessage: `${errorMessage}\n${getErrorMessage(e)}`,
822823
});
823824
}

extensions/ql-vscode/src/helpers.ts

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { UserCancellationException } from "./commandRunner";
2222
import { extLogger, OutputChannelLogger } from "./common";
2323
import { QueryMetadata } from "./pure/interface-types";
2424
import { telemetryListener } from "./telemetry";
25-
import { RedactableErrorMessage } from "./pure/errors";
25+
import { RedactableError } from "./pure/errors";
2626

2727
// Shared temporary folder for the extension.
2828
export const tmpDir = dirSync({
@@ -63,27 +63,19 @@ interface ShowAndLogOptions {
6363
}
6464

6565
/**
66-
* Show an error message and log it to the console
66+
* Show an error message, log it to the console, and emit redacted information as telemetry
6767
*
68-
* @param error The error message to show, either as a Error or string. Will not be included in the
69-
* telemetry event, and therefore may safely include sensitive information.
70-
* @param message A message to show to the user. Will also be included in the telemetry event,
71-
* but only the redacated message will be sent.
68+
* @param error The error to show. Only redacted information will be included in the telemetry.
7269
* @param options See individual fields on `ShowAndLogExceptionOptions` type.
7370
*
7471
* @return A promise that resolves to the selected item or undefined when being dismissed.
7572
*/
7673
export async function showAndLogExceptionWithTelemetry(
77-
error: Error,
78-
message: RedactableErrorMessage,
74+
error: RedactableError,
7975
options: ShowAndLogExceptionOptions = {},
8076
): Promise<string | undefined> {
81-
telemetryListener?.sendError(
82-
message,
83-
error.stack,
84-
options.extraTelemetryProperties,
85-
);
86-
return showAndLogErrorMessage(message.fullMessage, options);
77+
telemetryListener?.sendError(error, options.extraTelemetryProperties);
78+
return showAndLogErrorMessage(error.fullMessage, options);
8779
}
8880

8981
/**

extensions/ql-vscode/src/interface.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ import { AbstractWebview, WebviewPanelConfig } from "./abstract-webview";
6767
import { PAGE_SIZE } from "./config";
6868
import { HistoryItemLabelProvider } from "./query-history/history-item-label-provider";
6969
import { telemetryListener } from "./telemetry";
70-
import { redactableErrorMessage } from "./pure/errors";
70+
import { redactableError } from "./pure/errors";
7171

7272
/**
7373
* interface.ts
@@ -294,10 +294,9 @@ export class ResultsView extends AbstractWebview<
294294
}
295295
} catch (e) {
296296
void showAndLogExceptionWithTelemetry(
297-
asError(e),
298-
redactableErrorMessage`Error handling message from results view: ${getErrorMessage(
299-
e,
300-
)}`,
297+
redactableError(
298+
asError(e),
299+
)`Error handling message from results view: ${getErrorMessage(e)}`,
301300
{
302301
fullMessage: getErrorStack(e),
303302
},
@@ -344,8 +343,7 @@ export class ResultsView extends AbstractWebview<
344343
): Promise<void> {
345344
if (this._displayedQuery === undefined) {
346345
void showAndLogExceptionWithTelemetry(
347-
asError("Failed to sort results since evaluation info was unknown."),
348-
redactableErrorMessage`Failed to sort results since evaluation info was unknown.`,
346+
redactableError`Failed to sort results since evaluation info was unknown.`,
349347
);
350348
return;
351349
}
@@ -363,8 +361,7 @@ export class ResultsView extends AbstractWebview<
363361
): Promise<void> {
364362
if (this._displayedQuery === undefined) {
365363
void showAndLogExceptionWithTelemetry(
366-
asError("Failed to sort results since evaluation info was unknown."),
367-
redactableErrorMessage`Failed to sort results since evaluation info was unknown.`,
364+
redactableError`Failed to sort results since evaluation info was unknown.`,
368365
);
369366
return;
370367
}
@@ -773,8 +770,9 @@ export class ResultsView extends AbstractWebview<
773770
// If interpretation fails, accept the error and continue
774771
// trying to render uninterpreted results anyway.
775772
void showAndLogExceptionWithTelemetry(
776-
asError(e),
777-
redactableErrorMessage`Showing raw results instead of interpreted ones due to an error. ${getErrorMessage(
773+
redactableError(
774+
asError(e),
775+
)`Showing raw results instead of interpreted ones due to an error. ${getErrorMessage(
778776
e,
779777
)}`,
780778
);

extensions/ql-vscode/src/legacy-query-server/run-queries.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import * as qsClient from "./queryserver-client";
2222
import { asError, getErrorMessage } from "../pure/helpers-pure";
2323
import { compileDatabaseUpgradeSequence } from "./upgrades";
2424
import { QueryEvaluationInfo, QueryWithResults } from "../run-queries-shared";
25-
import { redactableErrorMessage } from "../pure/errors";
25+
import { redactableError } from "../pure/errors";
2626

2727
/**
2828
* A collection of evaluation-time information about a query,
@@ -369,8 +369,11 @@ export async function compileAndRunQueryAgainstDatabase(
369369
void extLogger.log("Did not find any available ML models.");
370370
}
371371
} catch (e) {
372-
const notificationMessage = redactableErrorMessage`Couldn't resolve available ML models for ${qlProgram.queryPath}. Running the query without any ML models: ${e}.`;
373-
void showAndLogExceptionWithTelemetry(asError(e), notificationMessage);
372+
void showAndLogExceptionWithTelemetry(
373+
redactableError(
374+
asError(e),
375+
)`Couldn't resolve available ML models for ${qlProgram.queryPath}. Running the query without any ML models: ${e}.`,
376+
);
374377
}
375378

376379
const hasMetadataFile = await dbItem.hasMetadataFile();
@@ -422,14 +425,11 @@ export async function compileAndRunQueryAgainstDatabase(
422425
queryInfo,
423426
);
424427
if (result.resultType !== messages.QueryResultType.SUCCESS) {
425-
const message = result.message
426-
? redactableErrorMessage`${result.message}`
427-
: redactableErrorMessage`Failed to run query`;
428-
void extLogger.log(message.fullMessage);
429-
void showAndLogExceptionWithTelemetry(
430-
asError(message),
431-
redactableErrorMessage`Failed to run query: ${message}`,
432-
);
428+
const error = result.message
429+
? redactableError`${result.message}`
430+
: redactableError`Failed to run query`;
431+
void extLogger.log(error.fullMessage);
432+
void showAndLogExceptionWithTelemetry(error);
433433
}
434434
const message = formatLegacyMessage(result);
435435

0 commit comments

Comments
 (0)