Skip to content

Commit

Permalink
Convert vscodeApi to singleton
Browse files Browse the repository at this point in the history
  • Loading branch information
pokey committed Jul 14, 2023
1 parent 7b8e38b commit bc4c816
Show file tree
Hide file tree
Showing 14 changed files with 50 additions and 83 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Vscode, getCursorlessApi } from "@cursorless/vscode-common";
import { VscodeApi, getCursorlessApi } from "@cursorless/vscode-common";
import * as sinon from "sinon";
import { DecorationRenderOptions, WorkspaceConfiguration } from "vscode";
import { COLOR_CONFIG } from "./colorConfig";
Expand All @@ -9,13 +9,13 @@ import {
} from "./scopeVisualizerTest.types";

export async function injectFakes(): Promise<Fakes> {
const { vscode: vscodeApi } = (await getCursorlessApi()).testHelpers!;
const { vscodeApi: vscodeApi } = (await getCursorlessApi()).testHelpers!;

const dispose = sinon.fake<[number], void>();

let decorationIndex = 0;
const createTextEditorDecorationType = sinon.fake<
Parameters<Vscode["window"]["createTextEditorDecorationType"]>,
Parameters<VscodeApi["window"]["createTextEditorDecorationType"]>,
MockDecorationType
>((_options: DecorationRenderOptions) => {
const id = decorationIndex++;
Expand All @@ -29,7 +29,7 @@ export async function injectFakes(): Promise<Fakes> {

const setDecorations = sinon.fake<
SetDecorationsParameters,
ReturnType<Vscode["editor"]["setDecorations"]>
ReturnType<VscodeApi["editor"]["setDecorations"]>
>();

const getConfigurationValue = sinon.fake.returns(COLOR_CONFIG);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { RangePlainObject } from "@cursorless/common";
import { Vscode } from "@cursorless/vscode-common";
import { VscodeApi } from "@cursorless/vscode-common";
import * as sinon from "sinon";
import * as vscode from "vscode";

Expand All @@ -17,10 +17,10 @@ export type SetDecorationsParameters = [
export interface Fakes {
setDecorations: sinon.SinonSpy<
SetDecorationsParameters,
ReturnType<Vscode["editor"]["setDecorations"]>
ReturnType<VscodeApi["editor"]["setDecorations"]>
>;
createTextEditorDecorationType: sinon.SinonSpy<
Parameters<Vscode["window"]["createTextEditorDecorationType"]>,
Parameters<VscodeApi["window"]["createTextEditorDecorationType"]>,
MockDecorationType
>;
dispose: sinon.SinonSpy<[number], void>;
Expand Down
8 changes: 4 additions & 4 deletions packages/cursorless-vscode/src/constructTestHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,11 @@ import {
plainObjectToTarget,
takeSnapshot,
} from "@cursorless/cursorless-engine";
import { TestHelpers, Vscode } from "@cursorless/vscode-common";
import { TestHelpers } from "@cursorless/vscode-common";
import type { TextEditor as VscodeTextEditor } from "vscode";
import { VscodeIDE } from "./ide/vscode/VscodeIDE";
import { toVscodeEditor } from "./ide/vscode/toVscodeEditor";
import type { TextEditor as VscodeTextEditor } from "vscode";
import { vscodeApi } from "./vscodeApi";

export function constructTestHelpers(
commandServerApi: CommandServerApi | null,
Expand All @@ -29,7 +30,6 @@ export function constructTestHelpers(
normalizedIde: NormalizedIDE,
injectIde: (ide: IDE) => void,
runIntegrationTests: () => Promise<void>,
vscode: Vscode,
): TestHelpers | undefined {
return {
commandServerApi: commandServerApi!,
Expand Down Expand Up @@ -75,6 +75,6 @@ export function constructTestHelpers(
},
hatTokenMap,
runIntegrationTests,
vscode,
vscodeApi,
};
}
14 changes: 0 additions & 14 deletions packages/cursorless-vscode/src/createVscodeApi.ts

This file was deleted.

12 changes: 1 addition & 11 deletions packages/cursorless-vscode/src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@ import {
ScopeVisualizerCommandApi,
VisualizationType,
} from "./ScopeVisualizerCommandApi";
import { createVscodeApi } from "./createVscodeApi";
import { Vscode } from "@cursorless/vscode-common";
import { ExtensionContext, Location } from "vscode";

/**
Expand Down Expand Up @@ -89,18 +87,13 @@ export async function activate(

const statusBarItem = StatusBarItem.create("cursorless.showQuickPick");
const keyboardCommands = KeyboardCommands.create(context, statusBarItem);
const vscode = createVscodeApi();

registerCommands(
context,
vscodeIDE,
commandApi,
testCaseRecorder,
createScopeVisualizerCommandApi(
vscode,
normalizedIde ?? vscodeIDE,
scopeProvider,
),
createScopeVisualizerCommandApi(normalizedIde ?? vscodeIDE, scopeProvider),
keyboardCommands,
hats,
);
Expand All @@ -115,7 +108,6 @@ export async function activate(
normalizedIde!,
injectIde,
runIntegrationTests,
vscode,
)
: undefined,

Expand Down Expand Up @@ -158,7 +150,6 @@ function createTreeSitter(parseTreeApi: ParseTreeApi): TreeSitter {
}

function createScopeVisualizerCommandApi(
vscode: Vscode,
ide: IDE,
scopeProvider: ScopeProvider,
): ScopeVisualizerCommandApi {
Expand All @@ -168,7 +159,6 @@ function createScopeVisualizerCommandApi(
start(scopeType: ScopeType, visualizationType: VisualizationType) {
scopeVisualizer?.dispose();
scopeVisualizer = createVscodeScopeVisualizer(
vscode,
ide,
scopeProvider,
scopeType,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { GeneralizedRange, Range } from "@cursorless/common";
import { flatmap } from "itertools";
import { Vscode } from "@cursorless/vscode-common";
import { VscodeTextEditorImpl } from "../../VscodeTextEditorImpl";
import { RangeTypeColors } from "../RangeTypeColors";
import { VscodeFancyRangeHighlighterRenderer } from "./VscodeFancyRangeHighlighterRenderer";
Expand All @@ -24,8 +23,8 @@ import { groupDifferentiatedStyledRanges } from "./groupDifferentiatedStyledRang
export class VscodeFancyRangeHighlighter {
private renderer: VscodeFancyRangeHighlighterRenderer;

constructor(vscode: Vscode, colors: RangeTypeColors) {
this.renderer = new VscodeFancyRangeHighlighterRenderer(vscode, colors);
constructor(colors: RangeTypeColors) {
this.renderer = new VscodeFancyRangeHighlighterRenderer(colors);
}

setRanges(editor: VscodeTextEditorImpl, ranges: GeneralizedRange[]) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
DecorationRenderOptions,
TextEditorDecorationType,
} from "vscode";
import { Vscode } from "@cursorless/vscode-common";
import { vscodeApi } from "../../../../vscodeApi";
import { VscodeTextEditorImpl } from "../../VscodeTextEditorImpl";
import { RangeTypeColors } from "../RangeTypeColors";
import {
Expand All @@ -28,9 +28,9 @@ export class VscodeFancyRangeHighlighterRenderer {
TextEditorDecorationType
>;

constructor(private vscode: Vscode, colors: RangeTypeColors) {
constructor(colors: RangeTypeColors) {
this.decorationTypes = new CompositeKeyDefaultMap(
({ style }) => getDecorationStyle(this.vscode, colors, style),
({ style }) => getDecorationStyle(colors, style),
({
style: { top, right, bottom, left, isWholeLine },
differentiationIndex,
Expand Down Expand Up @@ -61,7 +61,7 @@ export class VscodeFancyRangeHighlighterRenderer {
({ differentiatedStyles: styleParameters, ranges }) => {
const decorationType = this.decorationTypes.get(styleParameters);

this.vscode.editor.setDecorations(
vscodeApi.editor.setDecorations(
editor.vscodeEditor,
decorationType,
ranges.map(toVscodeRange),
Expand All @@ -84,7 +84,6 @@ export class VscodeFancyRangeHighlighterRenderer {
}

function getDecorationStyle(
vscode: Vscode,
colors: RangeTypeColors,
borders: DecorationStyle,
): TextEditorDecorationType {
Expand Down Expand Up @@ -112,7 +111,7 @@ function getDecorationStyle(
isWholeLine: borders.isWholeLine,
};

return vscode.window.createTextEditorDecorationType(options);
return vscodeApi.window.createTextEditorDecorationType(options);
}

function getBorderStyle(borders: DecorationStyle): string {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import {
GeneralizedRange,
isGeneralizedRangeEqual,
} from "@cursorless/common";
import { Vscode } from "@cursorless/vscode-common";
import { VscodeTextEditorImpl } from "../VscodeTextEditorImpl";
import { RangeTypeColors } from "./RangeTypeColors";
import { VscodeFancyRangeHighlighter } from "./VscodeFancyRangeHighlighter";
Expand All @@ -20,20 +19,14 @@ export class VscodeScopeRenderer implements Disposable {
private domainEqualsNestedHighlighter: VscodeFancyRangeHighlighter;

constructor(
vscode: Vscode,
domainColors: RangeTypeColors,
nestedRangeColors: RangeTypeColors,
) {
this.domainHighlighter = new VscodeFancyRangeHighlighter(
vscode,
domainColors,
);
this.domainHighlighter = new VscodeFancyRangeHighlighter(domainColors);
this.nestedRangeHighlighter = new VscodeFancyRangeHighlighter(
vscode,
nestedRangeColors,
);
this.domainEqualsNestedHighlighter = new VscodeFancyRangeHighlighter(
vscode,
blendRangeTypeColors(domainColors, nestedRangeColors),
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ import {
ScopeRangeType,
ScopeVisualizerColorConfig,
} from "@cursorless/vscode-common";
import { getColorsFromConfig } from "./getColorsFromConfig";
import { vscodeApi } from "../../../vscodeApi";
import { VscodeScopeRenderer } from "./VscodeScopeRenderer";
import { Vscode } from "@cursorless/vscode-common";
import { getColorsFromConfig } from "./getColorsFromConfig";

export abstract class VscodeScopeVisualizer {
protected renderer!: VscodeScopeRenderer;
Expand All @@ -24,13 +24,12 @@ export abstract class VscodeScopeVisualizer {
protected abstract getScopeSupport(editor: TextEditor): ScopeSupport;

constructor(
private vscode: Vscode,
private ide: IDE,
protected scopeProvider: ScopeProvider,
protected scopeType: ScopeType,
) {
this.disposables.push(
this.vscode.workspace.onDidChangeConfiguration(
vscodeApi.workspace.onDidChangeConfiguration(
({ affectsConfiguration }) => {
if (affectsConfiguration("cursorless.scopeVisualizer.colors")) {
this.initialize();
Expand Down Expand Up @@ -67,13 +66,12 @@ export abstract class VscodeScopeVisualizer {
}

private initialize() {
const colorConfig = this.vscode.workspace
const colorConfig = vscodeApi.workspace
.getConfiguration("cursorless.scopeVisualizer")
.get<ScopeVisualizerColorConfig>("colors")!;

this.renderer?.dispose();
this.renderer = new VscodeScopeRenderer(
this.vscode,
getColorsFromConfig(colorConfig, "domain"),
getColorsFromConfig(colorConfig, this.getNestedScopeRangeType()),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,36 +6,19 @@ import {
VscodeScopeContentVisualizer,
VscodeScopeRemovalVisualizer,
} from "./VscodeScopeTargetVisualizer";
import { Vscode } from "@cursorless/vscode-common";

export function createVscodeScopeVisualizer(
vscode: Vscode,
ide: IDE,
scopeProvider: ScopeProvider,
scopeType: ScopeType,
visualizationType: VisualizationType,
) {
switch (visualizationType) {
case "content":
return new VscodeScopeContentVisualizer(
vscode,
ide,
scopeProvider,
scopeType,
);
return new VscodeScopeContentVisualizer(ide, scopeProvider, scopeType);
case "removal":
return new VscodeScopeRemovalVisualizer(
vscode,
ide,
scopeProvider,
scopeType,
);
return new VscodeScopeRemovalVisualizer(ide, scopeProvider, scopeType);
case "iteration":
return new VscodeScopeIterationVisualizer(
vscode,
ide,
scopeProvider,
scopeType,
);
return new VscodeScopeIterationVisualizer(ide, scopeProvider, scopeType);
}
}
19 changes: 19 additions & 0 deletions packages/cursorless-vscode/src/vscodeApi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { workspace, window } from "vscode";
import { VscodeApi } from "@cursorless/vscode-common";

/**
* A very thin wrapper around the VSCode API that allows us to mock it for
* testing. This is necessary because the test harness gets bundled separately
* from the extension code, so if we just import the VSCode API directly from
* the extension code, and from the test harness, we'll end up with two copies
* of the VSCode API, so the mocks won't work.
*/
export const vscodeApi: VscodeApi = {
workspace,
window,
editor: {
setDecorations(editor, ...args) {
return editor.setDecorations(...args);
},
},
};
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { workspace, window, TextEditor } from "vscode";
/**
* Subset of VSCode api that we need to be able to mock for testing
*/
export interface Vscode {
export interface VscodeApi {
workspace: typeof workspace;
window: typeof window;

Expand Down
4 changes: 2 additions & 2 deletions packages/vscode-common/src/getExtensionApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import type {
} from "@cursorless/common";
import * as vscode from "vscode";
import type { Language, SyntaxNode, Tree } from "web-tree-sitter";
import { Vscode } from "./vscode";
import { VscodeApi } from "./VscodeApi";

export interface TestHelpers {
ide: NormalizedIDE;
Expand Down Expand Up @@ -43,7 +43,7 @@ export interface TestHelpers {
): Promise<TestCaseSnapshot>;

runIntegrationTests(): Promise<void>;
vscode: Vscode;
vscodeApi: VscodeApi;
}

export interface CursorlessApi {
Expand Down
2 changes: 1 addition & 1 deletion packages/vscode-common/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ export * from "./notebook";
export * from "./testUtil/openNewEditor";
export * from "./vscodeUtil";
export * from "./runCommand";
export * from "./vscode";
export * from "./VscodeApi";
export * from "./ScopeVisualizerColorConfig";

0 comments on commit bc4c816

Please sign in to comment.