Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions extensions/ql-vscode/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
- Add clearer error message when trying to run a command from the query history view if no item in the history is selected. [#702](https://github.com/github/vscode-codeql/pull/702)
- Fix a bug where it is not possible to download some database archives. This fix specifically addresses large archives and archives whose central directories do not align with file headers. [#700](https://github.com/github/vscode-codeql/pull/700)
- Avoid error dialogs when QL test discovery or database cleanup encounters a missing directory. [#706](https://github.com/github/vscode-codeql/pull/706)
- Add descriptive text and a link in the results view. [#711](https://github.com/github/vscode-codeql/pull/711)

## 1.3.7 - 24 November 2020

Expand Down
17 changes: 16 additions & 1 deletion extensions/ql-vscode/src/interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,9 @@ export class InterfaceManager extends DisposableObject {
);
}
break;
case 'openFile':
await this.openFile(msg.filePath);
break;
default:
assertNever(msg);
}
Expand Down Expand Up @@ -413,6 +416,8 @@ export class InterfaceManager extends DisposableObject {
database: results.database,
shouldKeepOldResultsWhileRendering,
metadata: results.query.metadata,
queryName: results.toString(),
queryPath: results.query.program.queryPath
});
}

Expand Down Expand Up @@ -444,6 +449,8 @@ export class InterfaceManager extends DisposableObject {
resultSetNames,
pageSize: PAGE_SIZE.getValue(),
numPages: numInterpretedPages(this._interpretation),
queryName: this._displayedQuery.toString(),
queryPath: this._displayedQuery.query.program.queryPath
});
}

Expand All @@ -456,6 +463,11 @@ export class InterfaceManager extends DisposableObject {
return schemas['result-sets'];
}

public async openFile(filePath: string) {
const textDocument = await vscode.workspace.openTextDocument(filePath);
await vscode.window.showTextDocument(textDocument, vscode.ViewColumn.One);
}

/**
* Show a page of raw results from the chosen table.
*/
Expand Down Expand Up @@ -517,6 +529,8 @@ export class InterfaceManager extends DisposableObject {
database: results.database,
shouldKeepOldResultsWhileRendering: false,
metadata: results.query.metadata,
queryName: results.toString(),
queryPath: results.query.program.queryPath
});
}

Expand All @@ -534,8 +548,9 @@ export class InterfaceManager extends DisposableObject {
sourceInfo
);
sarif.runs.forEach(run => {
if (run.results !== undefined)
if (run.results !== undefined) {
sortInterpretedResults(run.results, sortState);
}
});

const numTotalResults = (() => {
Expand Down
15 changes: 14 additions & 1 deletion extensions/ql-vscode/src/pure/interface-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ export interface SetStateMsg {
interpretation: undefined | Interpretation;
database: DatabaseInfo;
metadata?: QueryMetadata;
queryName: string;
queryPath: string;
/**
* Whether to keep displaying the old results while rendering the new results.
*
Expand Down Expand Up @@ -116,6 +118,8 @@ export interface ShowInterpretedPageMsg {
numPages: number;
pageSize: number;
resultSetNames: string[];
queryName: string;
queryPath: string;
}

/** Advance to the next or previous path no in the path viewer */
Expand Down Expand Up @@ -153,7 +157,8 @@ export type FromResultsViewMsg =
| ChangeRawResultsSortMsg
| ChangeInterpretedResultsSortMsg
| ResultViewLoaded
| ChangePage;
| ChangePage
| OpenFileMsg;

/**
* Message from the results view to open a database source
Expand All @@ -165,6 +170,14 @@ export interface ViewSourceFileMsg {
databaseUri: string;
}

/**
* Message from the results view to open a file in an editor.
*/
export interface OpenFileMsg {
t: 'openFile';
/* Full path to the file to open. */
filePath: string;
}

/**
* Message from the results view to toggle the display of
Expand Down
14 changes: 12 additions & 2 deletions extensions/ql-vscode/src/view/result-table-utils.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ export interface ResultTableProps {
}

export const className = 'vscode-codeql__result-table';
export const tableSelectionHeaderClassName = 'vscode-codeql__table-selection-header';
export const tableHeaderClassName = 'vscode-codeql__table-selection-header';
export const tableHeaderItemClassName = 'vscode-codeql__table-selection-header-item';
export const alertExtrasClassName = `${className}-alert-extras`;
export const toggleDiagnosticsClassName = `${className}-toggle-diagnostics`;
export const evenRowClassName = 'vscode-codeql__result-table-row--even';
Expand All @@ -45,7 +46,9 @@ export function jumpToLocationHandler(
jumpToLocation(loc, databaseUri);
e.preventDefault();
e.stopPropagation();
if (callback) callback();
if (callback) {
callback();
}
};
}

Expand All @@ -57,6 +60,13 @@ export function jumpToLocation(loc: ResolvableLocationValue, databaseUri: string
});
}

export function openFile(filePath: string): void {
vscode.postMessage({
t: 'openFile',
filePath
});
}

/**
* Render a location as a link which when clicked displays the original location.
*/
Expand Down
121 changes: 73 additions & 48 deletions extensions/ql-vscode/src/view/result-tables.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,23 @@ import {
SELECT_TABLE_NAME,
getDefaultResultSetName,
ParsedResultSets,
IntoResultsViewMsg
IntoResultsViewMsg,
} from '../pure/interface-types';
import { PathTable } from './alert-table';
import { RawTable } from './raw-results-table';
import {
ResultTableProps,
tableSelectionHeaderClassName,
tableHeaderClassName,
tableHeaderItemClassName,
toggleDiagnosticsClassName,
alertExtrasClassName
alertExtrasClassName,
openFile
} from './result-table-utils';
import { vscode } from './vscode-api';


const FILE_PATH_REGEX = /^(?:.+[\\/])*(.+)$/;

/**
* Properties for the `ResultTables` component.
*/
Expand All @@ -38,6 +42,8 @@ export interface ResultTablesProps {
sortStates: Map<string, RawResultsSortState>;
interpretedSortState?: InterpretedResultsSortState;
isLoadingNewResults: boolean;
queryName: string;
queryPath: string;
}

/**
Expand All @@ -62,7 +68,7 @@ function getResultCount(resultSet: ResultSet): number {

function renderResultCountString(resultSet: ResultSet): JSX.Element {
const resultCount = getResultCount(resultSet);
return <span className="number-of-results">
return <span className={tableHeaderItemClassName}>
{resultCount} {resultCount === 1 ? 'result' : 'results'}
</span>;
}
Expand Down Expand Up @@ -213,28 +219,44 @@ export class ResultTables
});
};

return <span className="vscode-codeql__table-selection-header">
<button onClick={prevPage} >&#xab;</button>
<input
type="number"
size={3}
value={this.state.selectedPage}
min="1"
max={numPages}
onChange={onChange}
onBlur={e => choosePage(e.target.value)}
onKeyDown={e => {
if (e.keyCode === 13) {
choosePage((e.target as HTMLInputElement).value);
}
}
}
/>
<span>
/ {numPages}
const openQuery = () => {
openFile(this.props.queryPath);
};
const fileName = FILE_PATH_REGEX.exec(this.props.queryPath)?.[1] || 'query';

return (
<span className="vscode-codeql__table-selection-pagination">
<button onClick={prevPage} >&#xab;</button>
<input
type="number"
size={3}
value={this.state.selectedPage}
min="1"
max={numPages}
onChange={onChange}
onBlur={e => choosePage(e.target.value)}
onKeyDown={e => {
if (e.keyCode === 13) {
choosePage((e.target as HTMLInputElement).value);
}
}}
/>
<span>
/&nbsp;{numPages}
</span>
<button value=">" onClick={nextPage} >&#xbb;</button>
<div className={tableHeaderItemClassName}>
{this.props.queryName}
</div>
<div className={tableHeaderItemClassName}>
<a
href="#"
onClick={openQuery}
className="vscode-codeql__result-table-location-link"
>Open {fileName}</a>
</div>
</span>
<button value=">" onClick={nextPage} >&#xbb;</button>
</span>;
);
}

render(): React.ReactNode {
Expand All @@ -248,32 +270,35 @@ export class ResultTables

const resultSetOptions =
resultSetNames.map(name => <option key={name} value={name}>{name}</option>);

return <div>
{this.renderPageButtons()}
<div className={tableSelectionHeaderClassName}>
<select value={selectedTable} onChange={this.onTableSelectionChange}>
{resultSetOptions}
</select>
{numberOfResults}
{selectedTable === ALERTS_TABLE_NAME ? this.alertTableExtras() : undefined}
return (
<div>
{this.renderPageButtons()}
<div className={tableHeaderClassName}>
</div>
<div className={tableHeaderClassName}>
<select value={selectedTable} onChange={this.onTableSelectionChange}>
{resultSetOptions}
</select>
{numberOfResults}
{selectedTable === ALERTS_TABLE_NAME ? this.alertTableExtras() : undefined}
{
this.props.isLoadingNewResults ?
<span className={UPDATING_RESULTS_TEXT_CLASS_NAME}>Updating results…</span>
: null
}
</div>
{
this.props.isLoadingNewResults ?
<span className={UPDATING_RESULTS_TEXT_CLASS_NAME}>Updating results…</span>
: null
resultSet &&
<ResultTable key={resultSet.schema.name} resultSet={resultSet}
databaseUri={this.props.database.databaseUri}
resultsPath={this.props.resultsPath}
sortState={this.props.sortStates.get(resultSet.schema.name)}
nonemptyRawResults={nonemptyRawResults}
showRawResults={() => { this.setState({ selectedTable: SELECT_TABLE_NAME }); }}
offset={this.getOffset()} />
}
</div>
{
resultSet &&
<ResultTable key={resultSet.schema.name} resultSet={resultSet}
databaseUri={this.props.database.databaseUri}
resultsPath={this.props.resultsPath}
sortState={this.props.sortStates.get(resultSet.schema.name)}
nonemptyRawResults={nonemptyRawResults}
showRawResults={() => { this.setState({ selectedTable: SELECT_TABLE_NAME }); }}
offset={this.getOffset()} />
}
</div>;
);
}

handleMessage(msg: IntoResultsViewMsg): void {
Expand Down
10 changes: 9 additions & 1 deletion extensions/ql-vscode/src/view/results.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {
QueryMetadata,
ResultsPaths,
ALERTS_TABLE_NAME,
ParsedResultSets
ParsedResultSets,
} from '../pure/interface-types';
import { EventHandlers as EventHandlerList } from './event-handler-list';
import { ResultTables } from './result-tables';
Expand All @@ -37,6 +37,8 @@ interface ResultsInfo {
*/
shouldKeepOldResultsWhileRendering: boolean;
metadata?: QueryMetadata;
queryName: string;
queryPath: string;
}

interface Results {
Expand Down Expand Up @@ -96,6 +98,8 @@ class App extends React.Component<{}, ResultsViewState> {
shouldKeepOldResultsWhileRendering:
msg.shouldKeepOldResultsWhileRendering,
metadata: msg.metadata,
queryName: msg.queryName,
queryPath: msg.queryPath,
});

this.loadResults();
Expand Down Expand Up @@ -127,6 +131,8 @@ class App extends React.Component<{}, ResultsViewState> {
interpretation: msg.interpretation,
shouldKeepOldResultsWhileRendering: true,
metadata: msg.metadata,
queryName: msg.queryName,
queryPath: msg.queryPath,
});
this.loadResults();
break;
Expand Down Expand Up @@ -280,6 +286,8 @@ class App extends React.Component<{}, ResultsViewState> {
this.state.isExpectingResultsUpdate ||
this.state.nextResultsInfo !== null
}
queryName={displayedResults.resultsInfo.queryName}
queryPath={displayedResults.resultsInfo.queryPath}
/>
);
} else {
Expand Down
Loading