diff --git a/packages/common/src/errors.ts b/packages/common/src/errors.ts index 3236fc5ed6..90ee2b4c81 100644 --- a/packages/common/src/errors.ts +++ b/packages/common/src/errors.ts @@ -9,10 +9,12 @@ export class UnsupportedLanguageError extends Error { } } -export class UnsupportedError extends Error { - constructor(message: string) { - super(message); - this.name = "UnsupportedError"; +export class UnsupportedScopeError extends Error { + constructor(scopeType: string) { + super( + `Scope '${scopeType}' is not implemented yet; See ${DOCS_URL}/contributing/adding-a-new-scope`, + ); + this.name = "UnsupportedScopeError"; } } diff --git a/packages/cursorless-engine/src/processTargets/modifiers/ContainingScopeStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/ContainingScopeStage.ts index fdbe17ab1b..23c23bf2f0 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/ContainingScopeStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/ContainingScopeStage.ts @@ -34,15 +34,11 @@ export class ContainingScopeStage implements ModifierStage { run(target: Target): Target[] { const { scopeType, ancestorIndex = 0 } = this.modifier; - const scopeHandler = this.scopeHandlerFactory.maybeCreate( + const scopeHandler = this.scopeHandlerFactory.create( scopeType, target.editor.document.languageId, ); - if (scopeHandler == null) { - throw new NoContainingScopeError(scopeType.type); - } - const containingScopes = getContainingScopeTarget( target, scopeHandler, diff --git a/packages/cursorless-engine/src/processTargets/modifiers/EveryScopeStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/EveryScopeStage.ts index f9b3f43c43..6033a39001 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/EveryScopeStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/EveryScopeStage.ts @@ -42,15 +42,11 @@ export class EveryScopeStage implements ModifierStage { const { scopeType } = this.modifier; const { editor, isReversed } = target; - const scopeHandler = this.scopeHandlerFactory.maybeCreate( + const scopeHandler = this.scopeHandlerFactory.create( scopeType, editor.document.languageId, ); - if (scopeHandler == null) { - throw new NoContainingScopeError(scopeType.type); - } - let scopes: TargetScope[] | undefined; if (target.hasExplicitRange) { @@ -97,15 +93,11 @@ export class EveryScopeStage implements ModifierStage { scopeHandlerFactory: ScopeHandlerFactory, target: Target, ): Range[] { - const iterationScopeHandler = scopeHandlerFactory.maybeCreate( + const iterationScopeHandler = scopeHandlerFactory.create( scopeHandler.iterationScopeType, target.editor.document.languageId, ); - if (iterationScopeHandler == null) { - throw Error("Could not find iteration scope handler"); - } - const iterationScopeTarget = getContainingScopeTarget( target, iterationScopeHandler, diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactoryImpl.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactoryImpl.ts index 4002f883fe..b23314d897 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactoryImpl.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactoryImpl.ts @@ -1,4 +1,8 @@ -import { pseudoScopes, type ScopeType } from "@cursorless/common"; +import { + pseudoScopes, + UnsupportedScopeError, + type ScopeType, +} from "@cursorless/common"; import type { LanguageDefinitions } from "../../../languages/LanguageDefinitions"; import { BoundedNonWhitespaceSequenceScopeHandler, @@ -145,7 +149,7 @@ export class ScopeHandlerFactoryImpl implements ScopeHandlerFactory { ): ScopeHandler { const handler = this.maybeCreate(scopeType, languageId); if (handler == null) { - throw new Error(`Couldn't create scope handler for '${scopeType.type}'`); + throw new UnsupportedScopeError(scopeType.type); } return handler; }