Skip to content

Commit

Permalink
Cache code lenses, and update only on valid document parse. Fixes #275
Browse files Browse the repository at this point in the history
  • Loading branch information
ak1394 committed Jun 5, 2024
1 parent 359e14e commit 8c72b22
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 25 deletions.
22 changes: 11 additions & 11 deletions src/audit/lens.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,32 @@ import { getOpenApiVersion } from "../parsers";
import { OpenApiVersion } from "../types";

export class AuditCodelensProvider implements vscode.CodeLensProvider {
onDidChangeCodeLenses?: vscode.Event<void>;
private lenses: Record<string, vscode.CodeLens[]> = {};

constructor(private cache: Cache) {}

async provideCodeLenses(
document: vscode.TextDocument,
token: vscode.CancellationToken
): Promise<vscode.CodeLens[]> {
const result: (vscode.CodeLens | undefined)[] = [];
const parsed = this.cache.getParsedDocument(document);
const version = getOpenApiVersion(parsed);
if (parsed && version !== OpenApiVersion.Unknown) {
const result: (vscode.CodeLens | undefined)[] = [];
const oas = parsed as unknown as BundledSwaggerOrOasSpec;
const operations = isOpenapi(oas) ? OpenApi30.getOperations(oas) : Swagger.getOperations(oas);
for (const [path, method, operation] of operations) {
result.push(auditLens(document, oas, path, method));
}

result.push(topAuditLens(document));

this.lenses[document.uri.toString()] = result.filter(
(lens): lens is vscode.CodeLens => lens !== undefined
);
}

return result.filter((lens): lens is vscode.CodeLens => lens !== undefined);
return this.lenses[document.uri.toString()];
}
}

Expand Down Expand Up @@ -58,14 +64,8 @@ function auditLens(
}

function topAuditLens(document: vscode.TextDocument): vscode.CodeLens | undefined {
const position = document.positionAt(0);
const line = document.lineAt(position.line + 1);
const range = new vscode.Range(
new vscode.Position(position.line, line.firstNonWhitespaceCharacterIndex),
new vscode.Position(position.line, line.range.end.character)
);

return new vscode.CodeLens(range, {
const line = document.lineAt(0);
return new vscode.CodeLens(line.range, {
title: "Audit",
tooltip: "Audit this OpenAPI file",
command: "openapi.securityAudit",
Expand Down
22 changes: 11 additions & 11 deletions src/platform/scan/lens.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,32 @@ import { getOpenApiVersion } from "../../parsers";
import { OpenApiVersion } from "../../types";

export class ScanCodelensProvider implements vscode.CodeLensProvider {
onDidChangeCodeLenses?: vscode.Event<void>;
private lenses: Record<string, vscode.CodeLens[]> = {};

constructor(private cache: Cache) {}

async provideCodeLenses(
document: vscode.TextDocument,
token: vscode.CancellationToken
): Promise<vscode.CodeLens[]> {
const result: (vscode.CodeLens | undefined)[] = [];
const parsed = this.cache.getParsedDocument(document);
const version = getOpenApiVersion(parsed);
if (parsed && version !== OpenApiVersion.Unknown) {
const result: (vscode.CodeLens | undefined)[] = [];
const oas = parsed as unknown as BundledSwaggerOrOasSpec;
const operations = isOpenapi(oas) ? OpenApi30.getOperations(oas) : Swagger.getOperations(oas);
for (const [path, method, operation] of operations) {
result.push(scanLens(document, oas, path, method));
}

result.push(topScanLens(document, oas));

this.lenses[document.uri.toString()] = result.filter(
(lens): lens is vscode.CodeLens => lens !== undefined
);
}

return result.filter((lens): lens is vscode.CodeLens => lens !== undefined);
return this.lenses[document.uri.toString()];
}
}

Expand Down Expand Up @@ -78,14 +84,8 @@ function topScanLens(
return undefined;
}

const position = document.positionAt(0);
const line = document.lineAt(position.line + 1);
const range = new vscode.Range(
new vscode.Position(position.line, line.firstNonWhitespaceCharacterIndex),
new vscode.Position(position.line, line.range.end.character)
);

return new vscode.CodeLens(range, {
const line = document.lineAt(0);
return new vscode.CodeLens(line.range, {
title: `Scan`,
tooltip: "Scan this OpenAPI file",
command: "openapi.platform.editorRunSingleOperationScan",
Expand Down
9 changes: 6 additions & 3 deletions src/tryit/lens.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,18 @@ import { getOpenApiVersion } from "../parsers";
import { OpenApiVersion } from "../types";

export class TryItCodelensProvider implements vscode.CodeLensProvider {
onDidChangeCodeLenses?: vscode.Event<void>;
private lenses: Record<string, vscode.CodeLens[]> = {};

constructor(private cache: Cache) {}

async provideCodeLenses(
document: vscode.TextDocument,
token: vscode.CancellationToken
): Promise<vscode.CodeLens[]> {
const result: vscode.CodeLens[] = [];
const parsed = this.cache.getParsedDocument(document);
const version = getOpenApiVersion(parsed);
if (parsed && version !== OpenApiVersion.Unknown) {
const result: vscode.CodeLens[] = [];
const oas = parsed as unknown as BundledSwaggerOrOasSpec;
const operations = isOpenapi(oas) ? OpenApi30.getOperations(oas) : Swagger.getOperations(oas);
for (const [path, method, operation] of operations) {
Expand All @@ -31,9 +32,11 @@ export class TryItCodelensProvider implements vscode.CodeLensProvider {
);
}
}

this.lenses[document.uri.toString()] = result;
}

return result;
return this.lenses[document.uri.toString()];
}
}

Expand Down

0 comments on commit 8c72b22

Please sign in to comment.