diff --git a/packages/cursorless-engine/src/processTargets/modifiers/ContainingScopeStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/ContainingScopeStage.ts index 6b22f1c783..2c3f34108b 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/ContainingScopeStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/ContainingScopeStage.ts @@ -34,7 +34,7 @@ export class ContainingScopeStage implements ModifierStage { run(target: Target): Target[] { const { scopeType, ancestorIndex = 0 } = this.modifier; - const scopeHandler = this.scopeHandlerFactory.create( + const scopeHandler = this.scopeHandlerFactory.maybeCreate( scopeType, target.editor.document.languageId, ); diff --git a/packages/cursorless-engine/src/processTargets/modifiers/EveryScopeStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/EveryScopeStage.ts index 8d8f00df85..cde16de7dd 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/EveryScopeStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/EveryScopeStage.ts @@ -39,7 +39,7 @@ export class EveryScopeStage implements ModifierStage { const { scopeType } = this.modifier; const { editor, isReversed } = target; - const scopeHandler = this.scopeHandlerFactory.create( + const scopeHandler = this.scopeHandlerFactory.maybeCreate( scopeType, editor.document.languageId, ); @@ -108,7 +108,7 @@ export class EveryScopeStage implements ModifierStage { scopeHandlerFactory: ScopeHandlerFactory, target: Target, ): Range[] { - const iterationScopeHandler = scopeHandlerFactory.create( + const iterationScopeHandler = scopeHandlerFactory.maybeCreate( scopeHandler.iterationScopeType, target.editor.document.languageId, ); diff --git a/packages/cursorless-engine/src/processTargets/modifiers/PreferredScopeStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/PreferredScopeStage.ts index b5f7d1d6a0..03e9fb7ca3 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/PreferredScopeStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/PreferredScopeStage.ts @@ -46,10 +46,6 @@ export class PreferredScopeStage implements ModifierStage { target.editor.document.languageId, ); - if (scopeHandler == null) { - throw Error(`Couldn't create scope handler for: ${scopeType.type}`); - } - const closestTargets = getClosestScopeTargets(target, scopeHandler); if (closestTargets == null) { diff --git a/packages/cursorless-engine/src/processTargets/modifiers/RelativeScopeStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/RelativeScopeStage.ts index c43c62a006..3d91160e12 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/RelativeScopeStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/RelativeScopeStage.ts @@ -31,7 +31,7 @@ export class RelativeScopeStage implements ModifierStage { ) {} run(target: Target): Target[] { - const scopeHandler = this.scopeHandlerFactory.create( + const scopeHandler = this.scopeHandlerFactory.maybeCreate( this.modifier.scopeType, target.editor.document.languageId, ); diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/BoundedScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/BoundedScopeHandler.ts index 4eacef014b..56d0f6bbf2 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/BoundedScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/BoundedScopeHandler.ts @@ -35,14 +35,14 @@ abstract class BoundedBaseScopeHandler extends BaseScopeHandler { this.targetScopeHandler = this.scopeHandlerFactory.create( this.targetScopeType, this.languageId, - )!; + ); this.surroundingPairInteriorScopeHandler = this.scopeHandlerFactory.create( { type: "surroundingPairInterior", delimiter: "any", }, this.languageId, - )!; + ); } get iterationScopeType(): ScopeType { diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/NestedScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/NestedScopeHandler.ts index f4a4f18780..95af8c8675 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/NestedScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/NestedScopeHandler.ts @@ -63,7 +63,7 @@ export abstract class NestedScopeHandler extends BaseScopeHandler { this._searchScopeHandler = this.scopeHandlerFactory.create( this.searchScopeType, this.languageId, - )!; + ); } return this._searchScopeHandler; diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/OneOfScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/OneOfScopeHandler.ts index d8ad2cdb52..c484ef76a9 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/OneOfScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/OneOfScopeHandler.ts @@ -24,25 +24,18 @@ export class OneOfScopeHandler extends BaseScopeHandler { languageId: string, ): ScopeHandler { const scopeHandlers: ScopeHandler[] = scopeType.scopeTypes.map( - (scopeType) => { - const handler = scopeHandlerFactory.create(scopeType, languageId); - if (handler == null) { - throw new Error(`No available scope handler for '${scopeType.type}'`); - } - return handler; - }, + (scopeType) => scopeHandlerFactory.create(scopeType, languageId), ); const iterationScopeType = (): CustomScopeType => ({ type: "custom", scopeHandler: new OneOfScopeHandler( undefined, - scopeHandlers.map( - (scopeHandler) => - scopeHandlerFactory.create( - scopeHandler.iterationScopeType, - languageId, - )!, + scopeHandlers.map((scopeHandler) => + scopeHandlerFactory.create( + scopeHandler.iterationScopeType, + languageId, + ), ), () => { throw new Error("Not implemented"); diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactory.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactory.ts index 7fe8f9d18a..b50cfac4f3 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactory.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactory.ts @@ -2,8 +2,13 @@ import type { ScopeType } from "@cursorless/common"; import type { CustomScopeType, ScopeHandler } from "./scopeHandler.types"; export interface ScopeHandlerFactory { - create( + maybeCreate( scopeType: ScopeType | CustomScopeType, languageId: string, ): ScopeHandler | undefined; + + create( + scopeType: ScopeType | CustomScopeType, + languageId: string, + ): ScopeHandler; } diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactoryImpl.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactoryImpl.ts index 0d4b4056d7..17b7f9c129 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactoryImpl.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactoryImpl.ts @@ -45,10 +45,11 @@ import type { CustomScopeType, ScopeHandler } from "./scopeHandler.types"; */ export class ScopeHandlerFactoryImpl implements ScopeHandlerFactory { constructor(private languageDefinitions: LanguageDefinitions) { + this.maybeCreate = this.maybeCreate.bind(this); this.create = this.create.bind(this); } - create( + maybeCreate( scopeType: ScopeType | CustomScopeType, languageId: string, ): ScopeHandler | undefined { @@ -114,4 +115,15 @@ export class ScopeHandlerFactoryImpl implements ScopeHandlerFactory { ?.getScopeHandler(scopeType); } } + + create( + scopeType: ScopeType | CustomScopeType, + languageId: string, + ): ScopeHandler { + const handler = this.maybeCreate(scopeType, languageId); + if (handler == null) { + throw new Error(`Couldn't create scope handler for '${scopeType.type}'`); + } + return handler; + } } diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/SurroundingPairScopeHandler/SurroundingPairInteriorScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/SurroundingPairScopeHandler/SurroundingPairInteriorScopeHandler.ts index f6be0ac0df..feb91a40a5 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/SurroundingPairScopeHandler/SurroundingPairInteriorScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/SurroundingPairScopeHandler/SurroundingPairInteriorScopeHandler.ts @@ -24,7 +24,7 @@ export class SurroundingPairInteriorScopeHandler extends BaseScopeHandler { requireStrongContainment: true, }, this.languageId, - )!; + ); } get iterationScopeType() { diff --git a/packages/cursorless-engine/src/scopeProviders/ScopeRangeProvider.ts b/packages/cursorless-engine/src/scopeProviders/ScopeRangeProvider.ts index c69fe4c860..5ae8efc6b0 100644 --- a/packages/cursorless-engine/src/scopeProviders/ScopeRangeProvider.ts +++ b/packages/cursorless-engine/src/scopeProviders/ScopeRangeProvider.ts @@ -29,7 +29,7 @@ export class ScopeRangeProvider { editor: TextEditor, { scopeType, visibleOnly }: ScopeRangeConfig, ): ScopeRanges[] { - const scopeHandler = this.scopeHandlerFactory.create( + const scopeHandler = this.scopeHandlerFactory.maybeCreate( scopeType, editor.document.languageId, ); @@ -50,13 +50,16 @@ export class ScopeRangeProvider { { scopeType, visibleOnly, includeNestedTargets }: IterationScopeRangeConfig, ): IterationScopeRanges[] { const { languageId } = editor.document; - const scopeHandler = this.scopeHandlerFactory.create(scopeType, languageId); + const scopeHandler = this.scopeHandlerFactory.maybeCreate( + scopeType, + languageId, + ); if (scopeHandler == null) { return []; } - const iterationScopeHandler = this.scopeHandlerFactory.create( + const iterationScopeHandler = this.scopeHandlerFactory.maybeCreate( scopeHandler.iterationScopeType, languageId, ); diff --git a/packages/cursorless-engine/src/scopeProviders/ScopeSupportChecker.ts b/packages/cursorless-engine/src/scopeProviders/ScopeSupportChecker.ts index a3844346eb..d2b9e8345f 100644 --- a/packages/cursorless-engine/src/scopeProviders/ScopeSupportChecker.ts +++ b/packages/cursorless-engine/src/scopeProviders/ScopeSupportChecker.ts @@ -29,7 +29,10 @@ export class ScopeSupportChecker { */ getScopeSupport(editor: TextEditor, scopeType: ScopeType): ScopeSupport { const { languageId } = editor.document; - const scopeHandler = this.scopeHandlerFactory.create(scopeType, languageId); + const scopeHandler = this.scopeHandlerFactory.maybeCreate( + scopeType, + languageId, + ); if (scopeHandler == null) { return getLegacyScopeSupport(languageId, scopeType); @@ -53,13 +56,16 @@ export class ScopeSupportChecker { scopeType: ScopeType, ): ScopeSupport { const { languageId } = editor.document; - const scopeHandler = this.scopeHandlerFactory.create(scopeType, languageId); + const scopeHandler = this.scopeHandlerFactory.maybeCreate( + scopeType, + languageId, + ); if (scopeHandler == null) { return getLegacyScopeSupport(languageId, scopeType); } - const iterationScopeHandler = this.scopeHandlerFactory.create( + const iterationScopeHandler = this.scopeHandlerFactory.maybeCreate( scopeHandler.iterationScopeType, languageId, );