-
-
Notifications
You must be signed in to change notification settings - Fork 93
Expand file tree
/
Copy pathcursorlessEngine.ts
More file actions
127 lines (112 loc) · 3.74 KB
/
cursorlessEngine.ts
File metadata and controls
127 lines (112 loc) · 3.74 KB
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import {
Command,
CommandServerApi,
FileSystem,
Hats,
IDE,
} from "@cursorless/common";
import { StoredTargetMap, TestCaseRecorder, TreeSitter } from ".";
import { CursorlessEngine } from "./api/CursorlessEngineApi";
import { ScopeProvider } from "./api/ScopeProvider";
import { ScopeRangeProvider } from "./ScopeVisualizer/ScopeRangeProvider";
import { ScopeSupportChecker } from "./ScopeVisualizer/ScopeSupportChecker";
import { Debug } from "./core/Debug";
import { HatTokenMapImpl } from "./core/HatTokenMapImpl";
import { Snippets } from "./core/Snippets";
import { ensureCommandShape } from "./core/commandVersionUpgrades/ensureCommandShape";
import { RangeUpdater } from "./core/updateSelections/RangeUpdater";
import { LanguageDefinitions } from "./languages/LanguageDefinitions";
import { ModifierStageFactoryImpl } from "./processTargets/ModifierStageFactoryImpl";
import { ScopeHandlerFactoryImpl } from "./processTargets/modifiers/scopeHandlers";
import { runCommand } from "./runCommand";
import { runIntegrationTests } from "./runIntegrationTests";
import { injectIde } from "./singletons/ide.singleton";
import { ScopeRangeWatcher } from "./ScopeVisualizer/ScopeRangeWatcher";
export function createCursorlessEngine(
treeSitter: TreeSitter,
ide: IDE,
hats: Hats,
commandServerApi: CommandServerApi | null,
fileSystem: FileSystem,
): CursorlessEngine {
injectIde(ide);
const debug = new Debug(treeSitter);
const rangeUpdater = new RangeUpdater();
const snippets = new Snippets();
snippets.init();
const hatTokenMap = new HatTokenMapImpl(
rangeUpdater,
debug,
hats,
commandServerApi,
);
hatTokenMap.allocateHats();
const storedTargets = new StoredTargetMap();
const testCaseRecorder = new TestCaseRecorder(hatTokenMap, storedTargets);
const languageDefinitions = new LanguageDefinitions(fileSystem, treeSitter);
ide.disposeOnExit(rangeUpdater, languageDefinitions, hatTokenMap, debug);
return {
commandApi: {
runCommand(command: Command) {
return runCommand(
debug,
hatTokenMap,
testCaseRecorder,
snippets,
storedTargets,
languageDefinitions,
rangeUpdater,
command,
);
},
runCommandSafe(...args: unknown[]) {
return runCommand(
debug,
hatTokenMap,
testCaseRecorder,
snippets,
storedTargets,
languageDefinitions,
rangeUpdater,
ensureCommandShape(args),
);
},
},
scopeProvider: createScopeProvider(languageDefinitions, storedTargets),
testCaseRecorder,
storedTargets,
hatTokenMap,
snippets,
injectIde,
runIntegrationTests: () =>
runIntegrationTests(treeSitter, languageDefinitions),
};
}
function createScopeProvider(
languageDefinitions: LanguageDefinitions,
storedTargets: StoredTargetMap,
): ScopeProvider {
const scopeHandlerFactory = new ScopeHandlerFactoryImpl(languageDefinitions);
const rangeProvider = new ScopeRangeProvider(
scopeHandlerFactory,
new ModifierStageFactoryImpl(
languageDefinitions,
storedTargets,
scopeHandlerFactory,
),
);
const rangeWatcher = new ScopeRangeWatcher(
languageDefinitions,
rangeProvider,
);
const supportChecker = new ScopeSupportChecker(scopeHandlerFactory);
return {
provideScopeRanges: rangeProvider.provideScopeRanges,
provideIterationScopeRanges: rangeProvider.provideIterationScopeRanges,
onDidChangeScopeRanges: rangeWatcher.onDidChangeScopeRanges,
onDidChangeIterationScopeRanges:
rangeWatcher.onDidChangeIterationScopeRanges,
getScopeSupport: supportChecker.getScopeSupport,
getIterationScopeSupport: supportChecker.getIterationScopeSupport,
};
}