Skip to content

Commit

Permalink
Change filters type
Browse files Browse the repository at this point in the history
  • Loading branch information
Shougo committed Jun 20, 2023
1 parent 951c320 commit 53f1d5e
Show file tree
Hide file tree
Showing 3 changed files with 130 additions and 64 deletions.
144 changes: 91 additions & 53 deletions denops/ddu/ddu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import {
SourceOptions,
TreePath,
UiOptions,
UserFilter,
UserOptions,
UserSource,
} from "./types.ts";
Expand Down Expand Up @@ -320,19 +321,19 @@ export class Ddu {
}

const [sourceOptions, sourceParams] = sourceArgs(
source,
this.options,
userSource,
source,
);

// Call "onRefreshItems" hooks
const filters = sourceOptions.matchers.concat(
sourceOptions.sorters,
).concat(sourceOptions.converters);
for (const filterName of filters) {
for (const userFilter of filters) {
const [filter, filterOptions, filterParams] = await this.getFilter(
denops,
filterName,
userFilter,
);
if (!filter || !filter.onRefreshItems) {
continue;
Expand Down Expand Up @@ -499,9 +500,9 @@ export class Ddu {
return;
}
const [sourceOptions, _] = sourceArgs(
source,
this.options,
userSource,
source,
);
sources.push({
name: userSource.name,
Expand Down Expand Up @@ -665,9 +666,9 @@ export class Ddu {
continue;
}
const [sourceOptions, sourceParams] = sourceArgs(
source,
this.options,
userSource,
source,
);

// The source may not have "onEvent"
Expand Down Expand Up @@ -818,11 +819,11 @@ export class Ddu {
return null;
}

const [kindOptions, _1] = kindArgs(this.options, kind);
const [kindOptions, _1] = kindArgs(kind, this.options);
const [sourceOptions, _2] = sourceArgs(
source,
this.options,
this.options.sources[indexes.length > 0 ? indexes[0] : 0],
source,
);

return {
Expand Down Expand Up @@ -869,12 +870,12 @@ export class Ddu {
indexes.length > 0 ? indexes[0] : 0
];
const [sourceOptions, sourceParams] = sourceArgs(
source,
this.options,
userSource,
source,
);

const [kindOptions, kindParams] = kindArgs(this.options, kind);
const [kindOptions, kindParams] = kindArgs(kind, this.options);

// Get default action in the first
if (actionName === "default") {
Expand All @@ -895,8 +896,8 @@ export class Ddu {

// NOTE: "actionName" may be overwritten by aliases
const [actionOptions, actionParams] = actionArgs(
this.options,
actionName,
this.options,
userActionParams,
);

Expand Down Expand Up @@ -1077,9 +1078,9 @@ export class Ddu {
const index = parent.__sourceIndex;
const source = this.loader.getSource(parent.__sourceName);
const [sourceOptions, sourceParams] = sourceArgs(
source,
this.options,
this.options.sources[index],
source,
);

this.setExpanded(convertTreePath(parent.treePath));
Expand Down Expand Up @@ -1243,9 +1244,9 @@ export class Ddu {
const index = item.__sourceIndex;
const source = this.loader.getSource(item.__sourceName);
const [sourceOptions, _] = sourceArgs(
source,
this.options,
this.options.sources[index],
source,
);

if (!item.treePath) {
Expand Down Expand Up @@ -1369,9 +1370,9 @@ export class Ddu {
getSourceArgs() {
return this.options.sources.map((userSource) =>
sourceArgs(
this.loader.getSource(userSource.name),
this.options,
userSource,
this.loader.getSource(userSource.name),
)
);
}
Expand All @@ -1388,9 +1389,9 @@ export class Ddu {
const source = this.loader.getSource(userSource.name);

const [sourceOptions, sourceParams] = sourceArgs(
source,
this.options,
userSource,
source,
);

if (!source || !source.checkUpdated) {
Expand Down Expand Up @@ -1476,33 +1477,40 @@ export class Ddu {
}

const [sourceOptions, sourceParams] = sourceArgs(
source,
this.options,
userSource,
source,
);

return [source, sourceOptions, sourceParams];
}

async getFilter(
denops: Denops,
name: string,
userFilter: UserFilter,
): Promise<
[
BaseFilter<BaseFilterParams> | undefined,
FilterOptions,
BaseFilterParams,
]
> {
if (!this.loader.getFilter(name)) {
await this.autoload(denops, "filter", name);
// Convert type
if (typeof userFilter === "string") {
userFilter = {
name: userFilter,
};
}

if (!this.loader.getFilter(userFilter.name)) {
await this.autoload(denops, "filter", userFilter.name);
}

const filter = this.loader.getFilter(name);
const filter = this.loader.getFilter(userFilter.name);
if (!filter) {
await denops.call(
"ddu#util#print_error",
`Not found filter: ${name}`,
`Not found filter: ${userFilter.name}`,
);
return [
undefined,
Expand All @@ -1511,7 +1519,11 @@ export class Ddu {
];
}

const [filterOptions, filterParams] = filterArgs(this.options, filter);
const [filterOptions, filterParams] = filterArgs(
filter,
this.options,
userFilter,
);
await checkFilterOnInit(filter, denops, filterOptions, filterParams);

return [filter, filterOptions, filterParams];
Expand Down Expand Up @@ -1566,7 +1578,7 @@ export class Ddu {
];
}

const [columnOptions, columnParams] = columnArgs(this.options, column);
const [columnOptions, columnParams] = columnArgs(column, this.options);
await checkColumnOnInit(column, denops, columnOptions, columnParams);

return [column, columnOptions, columnParams];
Expand All @@ -1580,9 +1592,9 @@ export class Ddu {
): Promise<[boolean, number, DduItem[]]> {
const source = this.loader.getSource(userSource.name);
const [sourceOptions, _] = sourceArgs(
source,
this.options,
userSource,
source,
);

const state = this.gatherStates[index];
Expand Down Expand Up @@ -1623,14 +1635,14 @@ export class Ddu {
private async callFilters(
denops: Denops,
sourceOptions: SourceOptions,
filters: string[],
filters: UserFilter[],
input: string,
items: DduItem[],
) {
for (const filterName of filters) {
for (const userFilter of filters) {
const [filter, filterOptions, filterParams] = await this.getFilter(
denops,
filterName,
userFilter,
);
if (!filter) {
continue;
Expand Down Expand Up @@ -1775,9 +1787,9 @@ function sourceArgs<
Params extends BaseSourceParams,
UserData extends unknown,
>(
source: BaseSource<Params, UserData> | null,
options: DduOptions,
userSource: UserSource | null,
source: BaseSource<Params, UserData> | null,
): [SourceOptions, BaseSourceParams] {
const o = foldMerge(
mergeSourceOptions,
Expand All @@ -1788,42 +1800,60 @@ function sourceArgs<
userSource?.options,
],
);
const p = foldMerge(mergeSourceParams, defaultDummy, [
source?.params(),
options.sourceParams["_"],
source ? options.sourceParams[source.name] : {},
userSource?.params,
]);
const p = foldMerge(
mergeSourceParams,
defaultDummy,
[
source?.params(),
options.sourceParams["_"],
source ? options.sourceParams[source.name] : {},
userSource?.params,
],
);
return [o, p];
}

function filterArgs<
Params extends BaseFilterParams,
>(
options: DduOptions,
filter: BaseFilter<Params>,
options: DduOptions,
userFilter: UserFilter,
): [FilterOptions, BaseFilterParams] {
// Convert type
if (typeof userFilter === "string") {
userFilter = {
name: userFilter,
};
}

const o = foldMerge(
mergeFilterOptions,
defaultFilterOptions,
[
options.filterOptions["_"],
options.filterOptions[filter.name],
userFilter?.options,
],
);
const p = foldMerge(
mergeFilterParams,
defaultDummy,
[
filter?.params(),
options.filterParams["_"],
options.filterParams[filter.name],
userFilter?.params,
],
);
const p = foldMerge(mergeFilterParams, defaultDummy, [
filter?.params(),
options.filterParams["_"],
options.filterParams[filter.name],
]);
return [o, p];
}

function kindArgs<
Params extends BaseKindParams,
>(
options: DduOptions,
kind: BaseKind<Params>,
options: DduOptions,
): [KindOptions, BaseKindParams] {
const o = foldMerge(
mergeKindOptions,
Expand All @@ -1833,19 +1863,23 @@ function kindArgs<
options.kindOptions[kind.name],
],
);
const p = foldMerge(mergeKindParams, defaultDummy, [
kind?.params(),
options.kindParams["_"],
options.kindParams[kind.name],
]);
const p = foldMerge(
mergeKindParams,
defaultDummy,
[
kind?.params(),
options.kindParams["_"],
options.kindParams[kind.name],
],
);
return [o, p];
}

function columnArgs<
Params extends BaseColumnParams,
>(
options: DduOptions,
column: BaseColumn<Params>,
options: DduOptions,
): [ColumnOptions, BaseColumnParams] {
const o = foldMerge(
mergeColumnOptions,
Expand All @@ -1855,17 +1889,21 @@ function columnArgs<
options.columnOptions[column.name],
],
);
const p = foldMerge(mergeColumnParams, defaultDummy, [
column?.params(),
options.columnParams["_"],
options.columnParams[column.name],
]);
const p = foldMerge(
mergeColumnParams,
defaultDummy,
[
column?.params(),
options.columnParams["_"],
options.columnParams[column.name],
],
);
return [o, p];
}

function actionArgs(
options: DduOptions,
actionName: string,
options: DduOptions,
params: BaseActionParams,
): [ActionOptions, BaseActionParams] {
const o = foldMerge(
Expand Down Expand Up @@ -2104,7 +2142,7 @@ Deno.test("sourceArgs", () => {
}
const source = new S();
source.name = "strength";
const [o, p] = sourceArgs(userOptions, null, source);
const [o, p] = sourceArgs(source, userOptions, null);
assertEquals(o, {
...defaultSourceOptions(),
matcherKey: "bar",
Expand Down
Loading

0 comments on commit 53f1d5e

Please sign in to comment.