diff --git a/packages/common/src/types/TextEditor.ts b/packages/common/src/types/TextEditor.ts index 3506610e33..195ea3a2a5 100644 --- a/packages/common/src/types/TextEditor.ts +++ b/packages/common/src/types/TextEditor.ts @@ -1,5 +1,6 @@ import type { Edit, + GeneralizedRange, Range, RevealLineAt, Selection, @@ -154,9 +155,9 @@ export interface EditableTextEditor extends TextEditor { * remove all breakpoints overlapping with the given descriptor if it overlaps * with any existing breakpoint, otherwise add a new breakpoint at the given * location. - * @param descriptors A list of breakpoint descriptors + * @param ranges A list of breakpoint ranges */ - toggleBreakpoint(descriptors?: BreakpointDescriptor[]): Promise; + toggleBreakpoint(ranges?: GeneralizedRange[]): Promise; /** * Toggle line comments @@ -237,21 +238,3 @@ export interface EditableTextEditor extends TextEditor { */ extractVariable(range?: Range): Promise; } - -interface LineBreakpointDescriptor { - type: "line"; - startLine: number; - /** - * Last line, inclusive - */ - endLine: number; -} - -interface InlineBreakpointDescriptor { - type: "inline"; - range: Range; -} - -export type BreakpointDescriptor = - | LineBreakpointDescriptor - | InlineBreakpointDescriptor; diff --git a/packages/cursorless-engine/src/actions/ToggleBreakpoint.ts b/packages/cursorless-engine/src/actions/ToggleBreakpoint.ts index fcc65da5fb..c7c17a42cc 100644 --- a/packages/cursorless-engine/src/actions/ToggleBreakpoint.ts +++ b/packages/cursorless-engine/src/actions/ToggleBreakpoint.ts @@ -1,11 +1,14 @@ -import type { BreakpointDescriptor } from "@cursorless/common"; import { FlashStyle } from "@cursorless/common"; import type { ModifierStageFactory } from "../processTargets/ModifierStageFactory"; import { containingLineIfUntypedModifier } from "../processTargets/modifiers/commonContainingScopeIfUntypedModifiers"; import { ide } from "../singletons/ide.singleton"; import type { Target } from "../typings/target.types"; -import { flashTargets, runOnTargetsForEachEditor } from "../util/targetUtils"; -import type { SimpleAction, ActionReturnValue } from "./actions.types"; +import { + flashTargets, + runOnTargetsForEachEditor, + toGeneralizedRange, +} from "../util/targetUtils"; +import type { ActionReturnValue, SimpleAction } from "./actions.types"; export default class ToggleBreakpoint implements SimpleAction { getFinalStages = () => [ @@ -22,25 +25,11 @@ export default class ToggleBreakpoint implements SimpleAction { await flashTargets(ide(), thatTargets, FlashStyle.referenced); await runOnTargetsForEachEditor(targets, async (editor, targets) => { - const breakpointDescriptors: BreakpointDescriptor[] = targets.map( - (target) => { - const range = target.contentRange; - return target.isLine - ? { - type: "line", - startLine: range.start.line, - endLine: range.end.line, - } - : { - type: "inline", - range, - }; - }, - ); + const generalizedRanges = targets.map(toGeneralizedRange); await ide() .getEditableTextEditor(editor) - .toggleBreakpoint(breakpointDescriptors); + .toggleBreakpoint(generalizedRanges); }); return { diff --git a/packages/cursorless-everywhere-talon-core/src/ide/TalonJsEditor.ts b/packages/cursorless-everywhere-talon-core/src/ide/TalonJsEditor.ts index 39ed343551..2d51df7b3e 100644 --- a/packages/cursorless-everywhere-talon-core/src/ide/TalonJsEditor.ts +++ b/packages/cursorless-everywhere-talon-core/src/ide/TalonJsEditor.ts @@ -1,8 +1,8 @@ import { selectionsEqual, - type BreakpointDescriptor, type Edit, type EditableTextEditor, + type GeneralizedRange, type InMemoryTextDocument, type OpenLinkOptions, type Range, @@ -100,9 +100,7 @@ export class TalonJsEditor implements EditableTextEditor { throw new Error("unfold not implemented."); } - toggleBreakpoint( - _descriptors?: BreakpointDescriptor[] | undefined, - ): Promise { + toggleBreakpoint(_ranges?: GeneralizedRange[]): Promise { throw new Error("toggleBreakpoint not implemented."); } diff --git a/packages/cursorless-vscode/src/ide/vscode/VscodeTextEditorImpl.ts b/packages/cursorless-vscode/src/ide/vscode/VscodeTextEditorImpl.ts index 1aa3b828ac..b78f766385 100644 --- a/packages/cursorless-vscode/src/ide/vscode/VscodeTextEditorImpl.ts +++ b/packages/cursorless-vscode/src/ide/vscode/VscodeTextEditorImpl.ts @@ -1,7 +1,7 @@ import type { - BreakpointDescriptor, Edit, EditableTextEditor, + GeneralizedRange, OpenLinkOptions, Range, RevealLineAt, @@ -164,8 +164,8 @@ export class VscodeTextEditorImpl implements EditableTextEditor { return vscodeUnfold(this.ide, this, ranges); } - public toggleBreakpoint(descriptors?: BreakpointDescriptor[]): Promise { - return vscodeToggleBreakpoint(this, descriptors); + public toggleBreakpoint(ranges?: GeneralizedRange[]): Promise { + return vscodeToggleBreakpoint(this, ranges); } public async toggleLineComment(_ranges?: Range[]): Promise { diff --git a/packages/cursorless-vscode/src/ide/vscode/VscodeToggleBreakpoint.ts b/packages/cursorless-vscode/src/ide/vscode/VscodeToggleBreakpoint.ts index 33248fde85..809e673f30 100644 --- a/packages/cursorless-vscode/src/ide/vscode/VscodeToggleBreakpoint.ts +++ b/packages/cursorless-vscode/src/ide/vscode/VscodeToggleBreakpoint.ts @@ -1,13 +1,13 @@ -import type { BreakpointDescriptor } from "@cursorless/common"; -import { toVscodeRange } from "@cursorless/vscode-common"; +import type { GeneralizedRange, Position } from "@cursorless/common"; +import { toVscodePosition } from "@cursorless/vscode-common"; import * as vscode from "vscode"; import type { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; export async function vscodeToggleBreakpoint( editor: VscodeTextEditorImpl, - descriptors: BreakpointDescriptor[] | undefined, + ranges?: GeneralizedRange[] | undefined, ): Promise { - if (descriptors == null) { + if (ranges == null) { return await vscode.commands.executeCommand( "editor.debug.action.toggleBreakpoint", ); @@ -17,8 +17,9 @@ export async function vscodeToggleBreakpoint( const toAdd: vscode.Breakpoint[] = []; const toRemove: vscode.Breakpoint[] = []; - descriptors.forEach((descriptor) => { - const existing = getBreakpoints(uri, descriptor); + ranges.forEach((range) => { + const existing = getBreakpoints(uri, range); + if (existing.length > 0) { toRemove.push(...existing); } else { @@ -26,9 +27,9 @@ export async function vscodeToggleBreakpoint( new vscode.SourceBreakpoint( new vscode.Location( uri, - descriptor.type === "line" - ? new vscode.Range(descriptor.startLine, 0, descriptor.endLine, 0) - : toVscodeRange(descriptor.range), + range.type === "line" + ? new vscode.Range(range.start, 0, range.end, 0) + : toVscodeRange(range.start, range.end), ), ), ); @@ -39,15 +40,15 @@ export async function vscodeToggleBreakpoint( vscode.debug.removeBreakpoints(toRemove); } -function getBreakpoints(uri: vscode.Uri, descriptor: BreakpointDescriptor) { - let rangeInterceptsDescriptor: (range: vscode.Range) => boolean; +function getBreakpoints(uri: vscode.Uri, range: GeneralizedRange) { + let rangeInterceptPredicate: (range: vscode.Range) => boolean; - if (descriptor.type === "line") { - rangeInterceptsDescriptor = ({ start, end }) => - descriptor.startLine <= end.line && descriptor.endLine >= start.line; + if (range.type === "line") { + rangeInterceptPredicate = ({ start, end }) => + range.start <= end.line && range.end >= start.line; } else { - const descriptorRange = toVscodeRange(descriptor.range); - rangeInterceptsDescriptor = (range) => + const descriptorRange = toVscodeRange(range.start, range.end); + rangeInterceptPredicate = (range) => range.intersection(descriptorRange) != null; } @@ -55,6 +56,10 @@ function getBreakpoints(uri: vscode.Uri, descriptor: BreakpointDescriptor) { (breakpoint) => breakpoint instanceof vscode.SourceBreakpoint && breakpoint.location.uri.toString() === uri.toString() && - rangeInterceptsDescriptor(breakpoint.location.range), + rangeInterceptPredicate(breakpoint.location.range), ); } + +function toVscodeRange(start: Position, end: Position): vscode.Range { + return new vscode.Range(toVscodePosition(start), toVscodePosition(end)); +} diff --git a/packages/neovim-common/src/ide/neovim/NeovimTextEditorImpl.ts b/packages/neovim-common/src/ide/neovim/NeovimTextEditorImpl.ts index 0e3db8dbaa..cc198be151 100644 --- a/packages/neovim-common/src/ide/neovim/NeovimTextEditorImpl.ts +++ b/packages/neovim-common/src/ide/neovim/NeovimTextEditorImpl.ts @@ -1,7 +1,7 @@ import type { - BreakpointDescriptor, Edit, EditableTextEditor, + GeneralizedRange, OpenLinkOptions, Range, RevealLineAt, @@ -127,9 +127,7 @@ export class NeovimTextEditorImpl implements EditableTextEditor { throw Error("unfold Not implemented"); } - public toggleBreakpoint( - _descriptors?: BreakpointDescriptor[], - ): Promise { + public toggleBreakpoint(_ranges?: GeneralizedRange[]): Promise { throw Error("toggleBreakpoint Not implemented"); }