Skip to content

Commit 941c0ab

Browse files
Started working on selected scope visualizer
1 parent 1ecae85 commit 941c0ab

File tree

4 files changed

+91
-4
lines changed

4 files changed

+91
-4
lines changed

packages/common/src/types/ScopeProvider.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ export interface ScopeProvider {
1919
config: ScopeRangeConfig,
2020
) => ScopeRanges[];
2121

22+
provideScopeRangesForRange(
23+
editor: TextEditor,
24+
scopeType: ScopeType,
25+
range: Range,
26+
): ScopeRanges[];
27+
2228
/**
2329
* Get the iteration scope ranges for the given editor.
2430
* @param editor The editor

packages/cursorless-engine/src/cursorlessEngine.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ function createScopeProvider(
175175

176176
return {
177177
provideScopeRanges: rangeProvider.provideScopeRanges,
178+
provideScopeRangesForRange: rangeProvider.provideScopeRangesForRange,
178179
provideIterationScopeRanges: rangeProvider.provideIterationScopeRanges,
179180
onDidChangeScopeRanges: rangeWatcher.onDidChangeScopeRanges,
180181
onDidChangeIterationScopeRanges:

packages/cursorless-engine/src/scopeProviders/ScopeRangeProvider.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import type {
1+
import {
22
IterationScopeRangeConfig,
33
IterationScopeRanges,
4+
Range,
45
ScopeRangeConfig,
56
ScopeRanges,
7+
ScopeType,
68
TextEditor,
79
} from "@cursorless/common";
810

@@ -21,6 +23,8 @@ export class ScopeRangeProvider {
2123
private modifierStageFactory: ModifierStageFactory,
2224
) {
2325
this.provideScopeRanges = this.provideScopeRanges.bind(this);
26+
this.provideScopeRangesForRange =
27+
this.provideScopeRangesForRange.bind(this);
2428
this.provideIterationScopeRanges =
2529
this.provideIterationScopeRanges.bind(this);
2630
}
@@ -45,6 +49,32 @@ export class ScopeRangeProvider {
4549
);
4650
}
4751

52+
provideScopeRangesForRange(
53+
editor: TextEditor,
54+
scopeType: ScopeType,
55+
range: Range,
56+
): ScopeRanges[] {
57+
const scopeHandler = this.scopeHandlerFactory.maybeCreate(
58+
scopeType,
59+
editor.document.languageId,
60+
);
61+
62+
if (scopeHandler == null) {
63+
return [];
64+
}
65+
66+
// Need to have a non empty intersection with the scopes
67+
if (range.isEmpty) {
68+
const offset = editor.document.offsetAt(range.start);
69+
range = new Range(
70+
editor.document.positionAt(offset - 1),
71+
editor.document.positionAt(offset + 1),
72+
);
73+
}
74+
75+
return getScopeRanges(editor, scopeHandler, range);
76+
}
77+
4878
provideIterationScopeRanges(
4979
editor: TextEditor,
5080
{ scopeType, visibleOnly, includeNestedTargets }: IterationScopeRangeConfig,

packages/cursorless-vscode/src/ScopeTreeProvider.ts

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type {
22
CursorlessCommandId,
33
ScopeProvider,
44
ScopeSupportInfo,
5+
ScopeType,
56
ScopeTypeInfo,
67
} from "@cursorless/common";
78
import {
@@ -12,13 +13,17 @@ import {
1213
serializeScopeType,
1314
uriEncodeHashId,
1415
} from "@cursorless/common";
15-
import type { CustomSpokenFormGenerator } from "@cursorless/cursorless-engine";
16-
import type { VscodeApi } from "@cursorless/vscode-common";
16+
import {
17+
ide,
18+
type CustomSpokenFormGenerator,
19+
} from "@cursorless/cursorless-engine";
20+
import { fromVscodeSelection, type VscodeApi } from "@cursorless/vscode-common";
1721
import { isEqual } from "lodash-es";
1822
import type {
1923
Disposable,
2024
Event,
2125
ExtensionContext,
26+
TextEditorSelectionChangeEvent,
2227
TreeDataProvider,
2328
TreeItemLabel,
2429
TreeView,
@@ -61,6 +66,8 @@ export class ScopeTreeProvider implements TreeDataProvider<MyTreeItem> {
6166
private customSpokenFormGenerator: CustomSpokenFormGenerator,
6267
private hasCommandServer: boolean,
6368
) {
69+
this.onChangeTextSelection = this.onChangeTextSelection.bind(this);
70+
6471
this.treeView = vscodeApi.window.createTreeView(
6572
CURSORLESS_SCOPE_TREE_VIEW_ID,
6673
{
@@ -79,7 +86,7 @@ export class ScopeTreeProvider implements TreeDataProvider<MyTreeItem> {
7986
}
8087
}
8188

82-
onDidChangeVisible(e: TreeViewVisibilityChangeEvent) {
89+
private onDidChangeVisible(e: TreeViewVisibilityChangeEvent) {
8390
if (e.visible) {
8491
if (this.visibleDisposable != null) {
8592
return;
@@ -96,6 +103,46 @@ export class ScopeTreeProvider implements TreeDataProvider<MyTreeItem> {
96103
}
97104
}
98105

106+
private onChangeTextSelection(e: TextEditorSelectionChangeEvent) {
107+
if (e.selections.length !== 1) {
108+
return;
109+
}
110+
111+
const editor = ide().activeTextEditor;
112+
113+
if (editor == null) {
114+
return;
115+
}
116+
117+
const selection = fromVscodeSelection(e.selections[0]);
118+
119+
console.log("selection", selection.concise());
120+
121+
for (const supportLevel of this.supportLevels) {
122+
if (supportLevel.support !== ScopeSupport.supportedAndPresentInEditor) {
123+
continue;
124+
}
125+
126+
const scopes = this.scopeProvider.provideScopeRangesForRange(
127+
editor,
128+
supportLevel.scopeType,
129+
selection,
130+
);
131+
132+
if (scopes.length === 0) {
133+
continue;
134+
}
135+
136+
console.log(supportLevel.scopeType.type);
137+
138+
for (const scope of scopes) {
139+
for (const target of scope.targets) {
140+
console.log(target.contentRange.concise());
141+
}
142+
}
143+
}
144+
}
145+
99146
private registerScopeSupportListener() {
100147
this.visibleDisposable = disposableFrom(
101148
this.scopeProvider.onDidChangeScopeSupport((supportLevels) => {
@@ -105,6 +152,9 @@ export class ScopeTreeProvider implements TreeDataProvider<MyTreeItem> {
105152
this.scopeVisualizer.onDidChangeScopeType(() => {
106153
this._onDidChangeTreeData.fire();
107154
}),
155+
this.vscodeApi.window.onDidChangeTextEditorSelection(
156+
this.onChangeTextSelection,
157+
),
108158
);
109159
}
110160

0 commit comments

Comments
 (0)