|
{indicator} |
@@ -249,7 +268,7 @@ export class PathTable extends React.Component {
const stepIndex = pathNodeIndex + 1; // Convert to 1-based
const zebraIndex = resultIndex + stepIndex;
rows.push(
-
+
|
|
{stepIndex} |
@@ -264,9 +283,13 @@ export class PathTable extends React.Component {
});
if (numTruncatedResults > 0) {
- rows.push(|
- Too many results to show at once. {numTruncatedResults} result(s) omitted.
- | );
+ rows.push(
+
+ |
+ Too many results to show at once. {numTruncatedResults} result(s) omitted.
+ |
+
+ );
}
return
diff --git a/extensions/ql-vscode/src/view/result-table-utils.tsx b/extensions/ql-vscode/src/view/result-table-utils.tsx
index d92e0a5f1..dd0e4f93e 100644
--- a/extensions/ql-vscode/src/view/result-table-utils.tsx
+++ b/extensions/ql-vscode/src/view/result-table-utils.tsx
@@ -1,6 +1,6 @@
import * as React from 'react';
import { UrlValue, ResolvableLocationValue } from '../bqrs-cli-types';
-import { tryGetResolvableLocation } from '../bqrs-utils';
+import { isStringLoc, tryGetResolvableLocation } from '../bqrs-utils';
import { RawResultsSortState, QueryMetadata, SortDirection } from '../interface-types';
import { assertNever } from '../helpers-pure';
import { ResultSet } from '../interface-types';
@@ -60,28 +60,41 @@ export function jumpToLocation(loc: ResolvableLocationValue, databaseUri: string
/**
* Render a location as a link which when clicked displays the original location.
*/
-export function renderLocation(loc: UrlValue | undefined, label: string | undefined,
- databaseUri: string, title?: string, callback?: () => void): JSX.Element {
+export function renderLocation(
+ loc: UrlValue | undefined,
+ label: string | undefined,
+ databaseUri: string,
+ title?: string,
+ callback?: () => void
+): JSX.Element {
+
+ if (loc === undefined) {
+ return ;
+ } else if (isStringLoc(loc)) {
+ return {loc};
+ }
// If the label was empty, use a placeholder instead, so the link is still clickable.
let displayLabel = label;
- if (label === undefined || label === '')
+ if (!label) {
displayLabel = '[empty string]';
- else if (label.match(/^\s+$/))
+ } else if (label.match(/^\s+$/)) {
displayLabel = `[whitespace: "${label}"]`;
+ }
- if (loc !== undefined) {
- const resolvableLoc = tryGetResolvableLocation(loc);
- if (resolvableLoc !== undefined) {
- return {displayLabel};
- } else {
- return {displayLabel};
- }
+ onClick={jumpToLocationHandler(resolvableLoc, databaseUri, callback)}>
+ {displayLabel}
+
+ );
+ } else {
+ return {displayLabel};
}
- return ;
}
/**
diff --git a/extensions/ql-vscode/src/view/results.tsx b/extensions/ql-vscode/src/view/results.tsx
index bd53eef07..045f57520 100644
--- a/extensions/ql-vscode/src/view/results.tsx
+++ b/extensions/ql-vscode/src/view/results.tsx
@@ -11,7 +11,7 @@ import {
QueryMetadata,
ResultsPaths,
ALERTS_TABLE_NAME,
- ParsedResultSets,
+ ParsedResultSets
} from '../interface-types';
import { EventHandlers as EventHandlerList } from './event-handler-list';
import { ResultTables } from './result-tables';
@@ -172,14 +172,17 @@ class App extends React.Component<{}, ResultsViewState> {
});
}
- private async getResultSets(
+ private getResultSets(
resultsInfo: ResultsInfo
- ): Promise {
+ ): readonly ResultSet[] {
const parsedResultSets = resultsInfo.parsedResultSets;
- return [{
- ...parsedResultSets.resultSet,
- t: (parsedResultSets.resultSet.t ?? 'RawResultSet') as any
- }];
+ const resultSet = parsedResultSets.resultSet;
+ if (!resultSet.t) {
+ throw new Error(
+ 'Missing result set type. Should be either "SarifResultSet" or "RawResultSet".'
+ );
+ }
+ return [resultSet];
}
private async loadResults(): Promise {
@@ -191,7 +194,7 @@ class App extends React.Component<{}, ResultsViewState> {
let results: Results | null = null;
let statusText = '';
try {
- const resultSets = await this.getResultSets(resultsInfo);
+ const resultSets = this.getResultSets(resultsInfo);
results = {
resultSets,
database: resultsInfo.database,
diff --git a/extensions/ql-vscode/src/vscode-tests/no-workspace/interface-utils.test.ts b/extensions/ql-vscode/src/vscode-tests/no-workspace/interface-utils.test.ts
index fa9ca3a45..6231e4d4d 100644
--- a/extensions/ql-vscode/src/vscode-tests/no-workspace/interface-utils.test.ts
+++ b/extensions/ql-vscode/src/vscode-tests/no-workspace/interface-utils.test.ts
@@ -71,6 +71,23 @@ describe('interface-utils', () => {
describe('resolveWholeFileLocation', () => {
it('should resolve a whole file location', () => {
+ const mockDatabaseItem: DatabaseItem = ({
+ resolveSourceFile: sinon.stub().returns(vscode.Uri.file('abc')),
+ } as unknown) as DatabaseItem;
+ expect(
+ tryResolveLocation(
+ 'file://hucairz:0:0:0:0',
+ mockDatabaseItem
+ )
+ ).to.deep.equal(
+ new vscode.Location(
+ vscode.Uri.file('abc'),
+ new vscode.Range(0, 0, 0, 0)
+ )
+ );
+ });
+
+ it('should resolve a five-part location edge case', () => {
const mockDatabaseItem: DatabaseItem = ({
resolveSourceFile: sinon.stub().returns(vscode.Uri.file('abc')),
} as unknown) as DatabaseItem;
|