diff --git a/extensions/ql-vscode/CHANGELOG.md b/extensions/ql-vscode/CHANGELOG.md index 9dc6fd8f3e7..53c37f91538 100644 --- a/extensions/ql-vscode/CHANGELOG.md +++ b/extensions/ql-vscode/CHANGELOG.md @@ -3,6 +3,7 @@ ## [UNRELEASED] - Display CodeQL CLI version being downloaded during an upgrade. [#862](https://github.com/github/vscode-codeql/pull/862) +- Display a helpful message and link to documentation when a query produces no results. [#866](https://github.com/github/vscode-codeql/pull/866) ## 1.4.8 - 05 May 2021 diff --git a/extensions/ql-vscode/src/view/alert-table.tsx b/extensions/ql-vscode/src/view/alert-table.tsx index 600c645e180..16e8a93a759 100644 --- a/extensions/ql-vscode/src/view/alert-table.tsx +++ b/extensions/ql-vscode/src/view/alert-table.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import * as Sarif from 'sarif'; import * as Keys from '../pure/result-keys'; import * as octicons from './octicons'; -import { className, renderLocation, ResultTableProps, zebraStripe, selectableZebraStripe, jumpToLocation, nextSortDirection } from './result-table-utils'; +import { className, renderLocation, ResultTableProps, zebraStripe, selectableZebraStripe, jumpToLocation, nextSortDirection, emptyQueryResultsMessage } from './result-table-utils'; import { onNavigation, NavigationEvent } from './results'; import { PathTableResultSet } from '../pure/interface-types'; import { @@ -79,7 +79,7 @@ export class PathTable extends React.Component { if (this.props.nonemptyRawResults) { return No Alerts. See raw results.; } else { - return No Alerts; + return emptyQueryResultsMessage(); } } diff --git a/extensions/ql-vscode/src/view/raw-results-table.tsx b/extensions/ql-vscode/src/view/raw-results-table.tsx index e56d727d9d1..8bc66371d1a 100644 --- a/extensions/ql-vscode/src/view/raw-results-table.tsx +++ b/extensions/ql-vscode/src/view/raw-results-table.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { ResultTableProps, className } from './result-table-utils'; +import { ResultTableProps, className, emptyQueryResultsMessage } from './result-table-utils'; import { RAW_RESULTS_LIMIT, RawResultsSortState } from '../pure/interface-types'; import { RawTableResultSet } from '../pure/interface-types'; import RawTableHeader from './RawTableHeader'; @@ -21,6 +21,10 @@ export class RawTable extends React.Component { const { resultSet, databaseUri } = this.props; let dataRows = resultSet.rows; + if (dataRows.length === 0) { + return emptyQueryResultsMessage(); + } + let numTruncatedResults = 0; if (dataRows.length > RAW_RESULTS_LIMIT) { numTruncatedResults = dataRows.length - RAW_RESULTS_LIMIT; diff --git a/extensions/ql-vscode/src/view/result-table-utils.tsx b/extensions/ql-vscode/src/view/result-table-utils.tsx index da828019480..3aaac3a8597 100644 --- a/extensions/ql-vscode/src/view/result-table-utils.tsx +++ b/extensions/ql-vscode/src/view/result-table-utils.tsx @@ -140,3 +140,9 @@ export function nextSortDirection(direction: SortDirection | undefined, includeU return assertNever(direction); } } + +export function emptyQueryResultsMessage(): JSX.Element { + return + This query returned no results. If this isn't what you're expecting, and for effective query-writing tips, check out the CodeQL language guides. + ; +}