Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | import * as LServer from "vscode-languageserver-types"; import {IRegistry} from "../_iregistry"; import {ICodeActionParams} from "./_interfaces"; import {Diagnostics} from "./diagnostics"; import {IEdit} from "../edit_helper"; import {Issue} from "../issue"; import {Position} from "../position"; import {LSPEdit} from "./_edit"; export class CodeActions { private readonly reg: IRegistry; public constructor(reg: IRegistry) { this.reg = reg; } public find(params: ICodeActionParams): LServer.CodeAction[] { const diag = new Diagnostics(this.reg); const issues = diag.findIssues(params.textDocument); const totals: {[key: string]: number} = {}; const shown = new Set<string>(); const ret: LServer.CodeAction[] = []; for (const i of issues) { const fix = i.getDefaultFix(); if (fix !== undefined) { if (totals[i.getKey()] === undefined) { totals[i.getKey()] = 1; } else { totals[i.getKey()]++; } if (this.inRange(i, params.range) === true) { ret.push({ title: "Apply fix, " + i.getKey(), kind: LServer.CodeActionKind.QuickFix, diagnostics: [Diagnostics.mapDiagnostic(i)], isPreferred: true, edit: LSPEdit.mapEdit(fix), }); shown.add(i.getKey()); } } for (const alternative of i.getAlternativeFixes() || []) { if (this.inRange(i, params.range) === true) { ret.push({ title: alternative.description, kind: LServer.CodeActionKind.QuickFix, diagnostics: [Diagnostics.mapDiagnostic(i)], isPreferred: true, edit: LSPEdit.mapEdit(alternative.edit), }); shown.add(i.getKey()); } } } for (const s of shown) { if (totals[s] > 1) { const foo = this.fixAlls(s, issues); ret.push(foo); } } return ret; } ////////////////////// private fixAlls(key: string, issues: readonly Issue[]): LServer.CodeAction { const diagnostics: LServer.Diagnostic[] = []; const fixes: IEdit[] = []; for (const i of issues) { if (i.getKey() !== key) { continue; } const fix = i.getDefaultFix(); if (fix === undefined) { continue; } fixes.push(fix); diagnostics.push(Diagnostics.mapDiagnostic(i)); } return { title: "Fix all, " + key, kind: LServer.CodeActionKind.QuickFix, diagnostics, isPreferred: true, edit: LSPEdit.mapEdits(fixes), }; } private inRange(i: Issue, range: LServer.Range): boolean { const start = new Position(range.start.line + 1, range.start.character + 1); const end = new Position(range.end.line + 1, range.end.character + 1); return i.getStart().isBetween(start, end) || i.getEnd().isBetween(start, end) || start.isBetween(i.getStart(), i.getEnd()) || end.isBetween(i.getStart(), i.getEnd()) || end.equals(i.getEnd()); } } |