diff --git a/packages/cursorless-engine/src/cursorlessEngine.ts b/packages/cursorless-engine/src/cursorlessEngine.ts index 2b8cde45d3..34738b3c5c 100644 --- a/packages/cursorless-engine/src/cursorlessEngine.ts +++ b/packages/cursorless-engine/src/cursorlessEngine.ts @@ -1,25 +1,26 @@ import { Command, CommandServerApi, - ensureCommandShape, FileSystem, Hats, IDE, ScopeProvider, + ensureCommandShape, } from "@cursorless/common"; +import { KeyboardTargetUpdater } from "./KeyboardTargetUpdater"; import { CommandRunnerDecorator, CursorlessEngine, } from "./api/CursorlessEngineApi"; import { Debug } from "./core/Debug"; import { HatTokenMapImpl } from "./core/HatTokenMapImpl"; -import { KeyboardTargetUpdater } from "./KeyboardTargetUpdater"; import type { Snippets } from "./core/Snippets"; import { StoredTargetMap } from "./core/StoredTargets"; import { RangeUpdater } from "./core/updateSelections/RangeUpdater"; +import { DisabledSnippets } from "./disabledComponents/DisabledSnippets"; +import { DisabledTalonSpokenForms } from "./disabledComponents/DisabledTalonSpokenForms"; import { CustomSpokenFormGeneratorImpl } from "./generateSpokenForm/CustomSpokenFormGeneratorImpl"; import { LanguageDefinitions } from "./languages/LanguageDefinitions"; -import { TalonSpokenFormsJsonReader } from "./nodeCommon/TalonSpokenFormsJsonReader"; import { ModifierStageFactoryImpl } from "./processTargets/ModifierStageFactoryImpl"; import { ScopeHandlerFactoryImpl } from "./processTargets/modifiers/scopeHandlers"; import { runCommand } from "./runCommand"; @@ -29,9 +30,9 @@ import { ScopeRangeProvider } from "./scopeProviders/ScopeRangeProvider"; import { ScopeRangeWatcher } from "./scopeProviders/ScopeRangeWatcher"; import { ScopeSupportChecker } from "./scopeProviders/ScopeSupportChecker"; import { ScopeSupportWatcher } from "./scopeProviders/ScopeSupportWatcher"; +import { type TalonSpokenForms } from "./scopeProviders/TalonSpokenForms"; import { injectIde } from "./singletons/ide.singleton"; import { TreeSitter } from "./typings/TreeSitter"; -import { DisabledSnippets } from "./disabledComponents/DisabledSnippets"; export async function createCursorlessEngine( treeSitter: TreeSitter, @@ -39,6 +40,7 @@ export async function createCursorlessEngine( hats: Hats, commandServerApi: CommandServerApi | null, fileSystem: FileSystem, + talonSpokenForms: TalonSpokenForms | undefined, snippets: Snippets = new DisabledSnippets(), ): Promise { injectIde(ide); @@ -62,10 +64,8 @@ export async function createCursorlessEngine( const languageDefinitions = new LanguageDefinitions(fileSystem, treeSitter); await languageDefinitions.init(); - const talonSpokenForms = new TalonSpokenFormsJsonReader(fileSystem); - const customSpokenFormGenerator = new CustomSpokenFormGeneratorImpl( - talonSpokenForms, + talonSpokenForms ?? new DisabledTalonSpokenForms(), ); ide.disposeOnExit( diff --git a/packages/cursorless-engine/src/disabledComponents/DisabledTalonSpokenForms.ts b/packages/cursorless-engine/src/disabledComponents/DisabledTalonSpokenForms.ts new file mode 100644 index 0000000000..671e967f4c --- /dev/null +++ b/packages/cursorless-engine/src/disabledComponents/DisabledTalonSpokenForms.ts @@ -0,0 +1,14 @@ +import type { + SpokenFormEntry, + TalonSpokenForms, +} from "../scopeProviders/TalonSpokenForms"; + +export class DisabledTalonSpokenForms implements TalonSpokenForms { + getSpokenFormEntries(): Promise { + throw Error("Talon spoken forms are not implemented."); + } + + onDidChange() { + return { dispose: () => {} }; + } +} diff --git a/packages/cursorless-engine/src/index.ts b/packages/cursorless-engine/src/index.ts index 2e1a6eafb1..64cfba29d4 100644 --- a/packages/cursorless-engine/src/index.ts +++ b/packages/cursorless-engine/src/index.ts @@ -11,6 +11,7 @@ export * from "./CommandHistory"; export * from "./CommandHistoryAnalyzer"; export * from "./util/grammarHelpers"; export * from "./ScopeTestRecorder"; +export * from "./scopeProviders/TalonSpokenForms"; export * from "./core/Snippets"; export * from "./core/mergeSnippets"; export * from "./util/object"; diff --git a/packages/cursorless-engine/src/nodeCommon/README.md b/packages/cursorless-engine/src/nodeCommon/README.md deleted file mode 100644 index 7e20bf48c3..0000000000 --- a/packages/cursorless-engine/src/nodeCommon/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Node common - -This directory contains utilities that are available in a node.js context. diff --git a/packages/cursorless-vscode/src/extension.ts b/packages/cursorless-vscode/src/extension.ts index 0eefff0ba8..21290562fd 100644 --- a/packages/cursorless-vscode/src/extension.ts +++ b/packages/cursorless-vscode/src/extension.ts @@ -17,7 +17,10 @@ import { TestCaseRecorder, TreeSitter, } from "@cursorless/cursorless-engine"; -import { FileSystemCommandHistoryStorage } from "@cursorless/file-system-common"; +import { + FileSystemCommandHistoryStorage, + FileSystemTalonSpokenForms, +} from "@cursorless/file-system-common"; import { CursorlessApi, getCommandServerApi, @@ -84,6 +87,7 @@ export async function activate( : await getCommandServerApi(); const treeSitter: TreeSitter = createTreeSitter(parseTreeApi); + const talonSpokenForms = new FileSystemTalonSpokenForms(fileSystem); const snippets = new VscodeSnippets(normalizedIde); void snippets.init(); @@ -103,6 +107,7 @@ export async function activate( hats, commandServerApi, fileSystem, + talonSpokenForms, snippets, ); diff --git a/packages/file-system-common/package.json b/packages/file-system-common/package.json index 781f84f74b..0a9d83eeae 100644 --- a/packages/file-system-common/package.json +++ b/packages/file-system-common/package.json @@ -25,6 +25,7 @@ }, "dependencies": { "@cursorless/common": "workspace:*", + "@cursorless/cursorless-engine": "workspace:*", "glob": "^10.3.10", "pathe": "^1.1.2" }, diff --git a/packages/cursorless-engine/src/nodeCommon/TalonSpokenFormsJsonReader.ts b/packages/file-system-common/src/FileSystemTalonSpokenForms.ts similarity index 88% rename from packages/cursorless-engine/src/nodeCommon/TalonSpokenFormsJsonReader.ts rename to packages/file-system-common/src/FileSystemTalonSpokenForms.ts index 530b81e310..6215dbab03 100644 --- a/packages/cursorless-engine/src/nodeCommon/TalonSpokenFormsJsonReader.ts +++ b/packages/file-system-common/src/FileSystemTalonSpokenForms.ts @@ -1,12 +1,16 @@ -import { Disposable, FileSystem, Notifier } from "@cursorless/common"; +import { + Disposable, + FileSystem, + Notifier, + type Listener, +} from "@cursorless/common"; import { readFile } from "fs/promises"; - -import * as path from "pathe"; import { NeedsInitialTalonUpdateError, SpokenFormEntry, TalonSpokenForms, -} from "../scopeProviders/TalonSpokenForms"; +} from "@cursorless/cursorless-engine"; +import * as path from "pathe"; interface TalonSpokenFormsPayload { version: number; @@ -15,7 +19,7 @@ interface TalonSpokenFormsPayload { const LATEST_SPOKEN_FORMS_JSON_VERSION = 0; -export class TalonSpokenFormsJsonReader implements TalonSpokenForms { +export class FileSystemTalonSpokenForms implements TalonSpokenForms { private disposable: Disposable; private notifier = new Notifier(); @@ -31,7 +35,9 @@ export class TalonSpokenFormsJsonReader implements TalonSpokenForms { * @param callback The callback to run when the scope ranges change * @returns A {@link Disposable} which will stop the callback from running */ - onDidChange = this.notifier.registerListener; + onDidChange(listener: Listener) { + return this.notifier.registerListener(listener); + } async getSpokenFormEntries(): Promise { let payload: TalonSpokenFormsPayload; diff --git a/packages/file-system-common/src/index.ts b/packages/file-system-common/src/index.ts index dce61aa373..5c217a785d 100644 --- a/packages/file-system-common/src/index.ts +++ b/packages/file-system-common/src/index.ts @@ -1 +1,2 @@ +export * from "./FileSystemTalonSpokenForms"; export * from "./FileSystemCommandHistoryStorage"; diff --git a/packages/file-system-common/tsconfig.json b/packages/file-system-common/tsconfig.json index f29b56f5fa..0adbe7e0dd 100644 --- a/packages/file-system-common/tsconfig.json +++ b/packages/file-system-common/tsconfig.json @@ -8,6 +8,9 @@ "references": [ { "path": "../common" + }, + { + "path": "../cursorless-engine" } ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07dade5fae..7bd096ecc3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -640,6 +640,9 @@ importers: '@cursorless/common': specifier: workspace:* version: link:../common + '@cursorless/cursorless-engine': + specifier: workspace:* + version: link:../cursorless-engine glob: specifier: ^10.3.10 version: 10.3.10