Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 3 additions & 20 deletions packages/common/src/types/TextEditor.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type {
Edit,
GeneralizedRange,
Range,
RevealLineAt,
Selection,
Expand Down Expand Up @@ -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<void>;
toggleBreakpoint(ranges?: GeneralizedRange[]): Promise<void>;

/**
* Toggle line comments
Expand Down Expand Up @@ -237,21 +238,3 @@ export interface EditableTextEditor extends TextEditor {
*/
extractVariable(range?: Range): Promise<void>;
}

interface LineBreakpointDescriptor {
type: "line";
startLine: number;
/**
* Last line, inclusive
*/
endLine: number;
}

interface InlineBreakpointDescriptor {
type: "inline";
range: Range;
}

export type BreakpointDescriptor =
| LineBreakpointDescriptor
| InlineBreakpointDescriptor;
27 changes: 9 additions & 18 deletions packages/cursorless-engine/src/actions/ToggleBreakpoint.ts
Original file line number Diff line number Diff line change
@@ -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 = () => [
Expand All @@ -22,25 +25,13 @@ 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((target) =>
toGeneralizedRange(target),
);

await ide()
.getEditableTextEditor(editor)
.toggleBreakpoint(breakpointDescriptors);
.toggleBreakpoint(generalizedRanges);
});

return {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import {
selectionsEqual,
type BreakpointDescriptor,
type Edit,
type EditableTextEditor,
type GeneralizedRange,
type InMemoryTextDocument,
type OpenLinkOptions,
type Range,
Expand Down Expand Up @@ -100,9 +100,7 @@ export class TalonJsEditor implements EditableTextEditor {
throw new Error("unfold not implemented.");
}

toggleBreakpoint(
_descriptors?: BreakpointDescriptor[] | undefined,
): Promise<void> {
toggleBreakpoint(_ranges?: GeneralizedRange[]): Promise<void> {
throw new Error("toggleBreakpoint not implemented.");
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type {
BreakpointDescriptor,
Edit,
EditableTextEditor,
GeneralizedRange,
OpenLinkOptions,
Range,
RevealLineAt,
Expand Down Expand Up @@ -164,8 +164,8 @@ export class VscodeTextEditorImpl implements EditableTextEditor {
return vscodeUnfold(this.ide, this, ranges);
}

public toggleBreakpoint(descriptors?: BreakpointDescriptor[]): Promise<void> {
return vscodeToggleBreakpoint(this, descriptors);
public toggleBreakpoint(ranges?: GeneralizedRange[]): Promise<void> {
return vscodeToggleBreakpoint(this, ranges);
}

public async toggleLineComment(_ranges?: Range[]): Promise<void> {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<void> {
if (descriptors == null) {
if (ranges == null) {
return await vscode.commands.executeCommand(
"editor.debug.action.toggleBreakpoint",
);
Expand All @@ -17,18 +17,19 @@ 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 {
toAdd.push(
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),
),
),
);
Expand All @@ -39,22 +40,26 @@ 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;
}

return vscode.debug.breakpoints.filter(
(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));
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type {
BreakpointDescriptor,
Edit,
EditableTextEditor,
GeneralizedRange,
OpenLinkOptions,
Range,
RevealLineAt,
Expand Down Expand Up @@ -127,9 +127,7 @@ export class NeovimTextEditorImpl implements EditableTextEditor {
throw Error("unfold Not implemented");
}

public toggleBreakpoint(
_descriptors?: BreakpointDescriptor[],
): Promise<void> {
public toggleBreakpoint(_ranges?: GeneralizedRange[]): Promise<void> {
throw Error("toggleBreakpoint Not implemented");
}

Expand Down
Loading