import * as fn from "jsr:@denops/std@^7.0.1/function"; import type { ActionData } from "jsr:@shougo/ddu-kind-file@0.8.0"; import { BaseSource, type GatherArguments, } from "jsr:@shougo/ddu-vim@^5.0.0/source"; import type { Item } from "jsr:@shougo/ddu-vim@^5.0.0/types"; import { accumulate } from "jsr:@milly/denops-batch-accumulate@^1.0.0-pre4"; type Params = { useLoclist: boolean; }; interface QflistItem { bufnr: number; lnum: number; col: number; text: string; } export class Source extends BaseSource { override kind = "file"; override gather( args: GatherArguments, ): ReadableStream[]> { return new ReadableStream({ async start(controller) { const func: [string, ...unknown[]] = args.sourceParams.useLoclist ? ["getloclist", 0] : ["getqflist"]; const items = await args.denops.call(...func) as QflistItem[]; controller.enqueue( await accumulate( args.denops, async (denops) => await Promise.all(items.map(async (i) => { const bufname = await fn.bufname(denops, i.bufnr); return { word: i.text, display: `${bufname}|${i.lnum} col ${i.col}|${i.text}`, action: { ...i, lineNr: i.lnum, }, } satisfies Item; })), ), ); controller.close(); }, }); } override params(): Params { return { useLoclist: false, }; } }