Skip to content
This repository was archived by the owner on May 21, 2019. It is now read-only.

Commit 9e98bd8

Browse files
committed
Add StaticAutocompletionProvider.
1 parent 986d223 commit 9e98bd8

File tree

5 files changed

+39
-16
lines changed

5 files changed

+39
-16
lines changed

src/Interfaces.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ export interface SuggestionContext extends PreliminarySuggestionContext {
3232
readonly argument: Argument;
3333
}
3434

35-
export type AutocompletionProvider = (context: SuggestionContext) => Promise<Suggestion[]>;
35+
export type DynamicAutocompletionProvider = (context: SuggestionContext) => Promise<Suggestion[]>;
36+
export type StaticAutocompletionProvider = Suggestion[];
37+
export type AutocompletionProvider = DynamicAutocompletionProvider | StaticAutocompletionProvider;
3638

3739
export interface FileInfo {
3840
name: string;

src/plugins/autocompletion_providers/Common.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import {statsIn, resolveDirectory, directoryName} from "../../utils/Common";
22
import {styles, Suggestion} from "./Suggestions";
3-
import {FileInfo, SuggestionContext, AutocompletionProvider} from "../../Interfaces";
3+
import {
4+
FileInfo, SuggestionContext, AutocompletionProvider, StaticAutocompletionProvider,
5+
DynamicAutocompletionProvider,
6+
} from "../../Interfaces";
47
import * as Path from "path";
58

69
function pathSuggestion(directory: string, path: string) {
@@ -35,7 +38,16 @@ export const environmentVariableSuggestions = async (context: SuggestionContext)
3538
};
3639

3740
export const combineAutocompletionProviders = (providers: AutocompletionProvider[]): AutocompletionProvider => async (context: SuggestionContext): Promise<Suggestion[]> => {
38-
return _.flatten(await Promise.all(providers.map(provider => provider(context))));
39-
};
41+
const staticProviders: StaticAutocompletionProvider[] = [];
42+
const dynamicProviders: DynamicAutocompletionProvider[] = [];
43+
44+
for (const provider of providers) {
45+
if (Array.isArray(provider)) {
46+
staticProviders.push(provider);
47+
} else {
48+
dynamicProviders.push(provider);
49+
}
50+
}
4051

41-
export const staticProvider = (suggestions: Suggestion[]): AutocompletionProvider => async (context: SuggestionContext): Promise<Suggestion[]> => suggestions;
52+
return _.flatten(staticProviders.concat(await Promise.all(dynamicProviders.map(provider => provider(context)))));
53+
};

src/plugins/autocompletion_providers/Git.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as Git from "../../utils/Git";
22
import {styles, Suggestion, longAndShortOption, longOption} from "./Suggestions";
33
import {PluginManager} from "../../PluginManager";
44
import {AutocompletionProvider, SuggestionContext} from "../../Interfaces";
5-
import {staticProvider, combineAutocompletionProviders} from "./Common";
5+
import {combineAutocompletionProviders} from "./Common";
66
import {linedOutputOf} from "../../PTY";
77

88
const addOptions = [
@@ -102,12 +102,12 @@ const notStagedFiles = async(context: SuggestionContext): Promise<Suggestion[]>
102102
};
103103

104104
const subCommandProviders: Dictionary<AutocompletionProvider> = {
105-
add: combineAutocompletionProviders([notStagedFiles, staticProvider(addOptions)]),
105+
add: combineAutocompletionProviders([notStagedFiles, addOptions]),
106106
checkout: combineAutocompletionProviders([branchesExceptCurrent, branchAlias]),
107-
commit: staticProvider(commitOptions),
108-
status: staticProvider(statusOptions),
107+
commit: commitOptions,
108+
status: statusOptions,
109109
merge: combineAutocompletionProviders([branchesExceptCurrent, branchAlias]),
110-
push: staticProvider(pushOptions),
110+
push: pushOptions,
111111
};
112112

113113
const subCommands = [
@@ -267,7 +267,11 @@ PluginManager.registerAutocompletionProvider("git", async(context) => {
267267
} else {
268268
const subCommandProvider = subCommandProviders[context.argument.command.nthArgument(1).value];
269269
if (subCommandProvider) {
270-
return subCommandProvider(context);
270+
if (Array.isArray(subCommandProvider)) {
271+
return subCommandProvider;
272+
} else {
273+
subCommandProvider(Object.assign({argument: this}, context));
274+
}
271275
} else {
272276
return [];
273277
}

src/plugins/autocompletion_providers/Rails.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {styles, Suggestion} from "./Suggestions";
22
import {PluginManager} from "../../PluginManager";
3-
import {staticProvider} from "./Common";
43

54
const railsCommandConfig = [
65
{
@@ -39,4 +38,4 @@ const railsCommandConfig = [
3938

4039
const railsCommand = railsCommandConfig.map(config => new Suggestion().withValue(config.name).withDescription(config.description).withStyle(styles.command));
4140

42-
PluginManager.registerAutocompletionProvider("rails", staticProvider(railsCommand));
41+
PluginManager.registerAutocompletionProvider("rails", railsCommand);

src/shell/Parser2.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {memoizeAccessor} from "../Decorators";
55
import {commandDescriptions} from "../plugins/autocompletion_providers/Executable";
66
import {executablesInPaths} from "../utils/Common";
77
import {loginShell} from "../utils/Shell";
8-
import {PreliminarySuggestionContext} from "../Interfaces";
8+
import {PreliminarySuggestionContext, AutocompletionProvider} from "../Interfaces";
99
import {PluginManager} from "../PluginManager";
1010

1111
export abstract class ASTNode {
@@ -147,8 +147,14 @@ export class Argument extends LeafNode {
147147
this.position = position;
148148
}
149149

150-
suggestions(context: PreliminarySuggestionContext): Promise<Suggestion[]> {
151-
return PluginManager.autocompletionProviderFor(this.command.commandWord.value)(Object.assign({argument: this}, context));
150+
async suggestions(context: PreliminarySuggestionContext): Promise<Suggestion[]> {
151+
const provider = PluginManager.autocompletionProviderFor(this.command.commandWord.value);
152+
153+
if (Array.isArray(provider)) {
154+
return provider;
155+
} else {
156+
provider(Object.assign({argument: this}, context));
157+
}
152158
}
153159
}
154160

0 commit comments

Comments
 (0)