Skip to content

Commit 5253d4c

Browse files
Remove use of constructor.name (#1580)
Fixes #1300 ## Checklist - [ ] I have added [tests](https://www.cursorless.org/docs/contributing/test-case-recorder/) - [ ] I have updated the [docs](https://github.com/cursorless-dev/cursorless/tree/main/docs) and [cheatsheet](https://github.com/cursorless-dev/cursorless/tree/main/cursorless-talon/src/cheatsheet) - [ ] I have not broken the cheatsheet --------- Co-authored-by: Pokey Rule <[email protected]>
1 parent b403a73 commit 5253d4c

20 files changed

+60
-32
lines changed

.eslintrc.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@
4646
"checkLoops": false
4747
}
4848
],
49+
"no-restricted-syntax": [
50+
"error",
51+
"MemberExpression[object.property.name='constructor'][property.name='name']"
52+
],
4953
"no-throw-literal": "warn",
5054
"semi": "off"
5155
},

packages/cursorless-engine/src/processTargets/targets/BaseTarget.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1+
import type { TargetPlainObject, TargetPosition } from "@cursorless/common";
12
import {
23
NoContainingScopeError,
34
Range,
45
Selection,
56
TextEditor,
7+
rangeToPlainObject,
68
} from "@cursorless/common";
79
import { isEqual } from "lodash";
8-
import type { TargetPosition } from "@cursorless/common";
9-
import type { EditNewActionType, Target } from "../../typings/target.types";
1010
import type { EditWithRangeUpdater } from "../../typings/Types";
11+
import type { EditNewActionType, Target } from "../../typings/target.types";
1112
import { isSameType } from "../../util/typeUtils";
1213
import { toPositionTarget } from "../modifiers/toPositionTarget";
1314
import {
@@ -41,6 +42,7 @@ export default abstract class BaseTarget<
4142
in out TParameters extends MinimumTargetParameters,
4243
> implements Target
4344
{
45+
protected abstract readonly type: string;
4446
protected readonly state: CommonTargetParameters;
4547
isLine = false;
4648
isToken = true;
@@ -194,6 +196,25 @@ export default abstract class BaseTarget<
194196
return toPositionTarget(this, position);
195197
}
196198

199+
/**
200+
* Converts the target to a plain object representation.
201+
*
202+
* Note that this implementation is quite incomplete, but is suitable for
203+
* round-tripping {@link UntypedTarget} objects and capturing the fact that an
204+
* object is not an un typed target if it is not, via the {@link type}
205+
* attribute. In the future, we should override this method in subclasses to
206+
* provide a more complete representation.
207+
* @returns A plain object representation of the target
208+
*/
209+
toPlainObject(): TargetPlainObject {
210+
return {
211+
type: this.type,
212+
contentRange: rangeToPlainObject(this.contentRange),
213+
isReversed: this.isReversed,
214+
hasExplicitRange: this.hasExplicitRange,
215+
};
216+
}
217+
197218
abstract get insertionDelimiter(): string;
198219
abstract getLeadingDelimiterTarget(): Target | undefined;
199220
abstract getTrailingDelimiterTarget(): Target | undefined;

packages/cursorless-engine/src/processTargets/targets/DocumentTarget.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { shrinkRangeToFitContent } from "../../util/selectionUtils";
33
import { BaseTarget, CommonTargetParameters, PlainTarget } from "./";
44

55
export default class DocumentTarget extends BaseTarget<CommonTargetParameters> {
6+
type = "DocumentTarget";
67
insertionDelimiter = "\n";
78
isLine = true;
89

packages/cursorless-engine/src/processTargets/targets/ImplicitTarget.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { BaseTarget, CommonTargetParameters } from ".";
77
* - The implicit anchor in the range `"take past air"`
88
*/
99
export default class ImplicitTarget extends BaseTarget<CommonTargetParameters> {
10+
type = "ImplicitTarget";
1011
insertionDelimiter = "";
1112
isRaw = true;
1213
hasExplicitScopeType = false;

packages/cursorless-engine/src/processTargets/targets/InteriorTarget.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export interface InteriorTargetParameters extends MinimumTargetParameters {
1313
}
1414

1515
export default class InteriorTarget extends BaseTarget<InteriorTargetParameters> {
16+
type = "InteriorTarget";
1617
insertionDelimiter = " ";
1718
private readonly fullInteriorRange: Range;
1819

packages/cursorless-engine/src/processTargets/targets/LineTarget.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { tryConstructPlainTarget } from "../../util/tryConstructTarget";
66
import { createContinuousLineRange } from "../targetUtil/createContinuousRange";
77

88
export default class LineTarget extends BaseTarget<CommonTargetParameters> {
9+
type = "LineTarget";
910
insertionDelimiter = "\n";
1011
isLine = true;
1112

packages/cursorless-engine/src/processTargets/targets/NotebookCellTarget.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
import { Target } from "../../typings/target.types";
88

99
export default class NotebookCellTarget extends BaseTarget<CommonTargetParameters> {
10+
type = "NotebookCellTarget";
1011
insertionDelimiter = "\n";
1112
isNotebookCell = true;
1213

@@ -36,6 +37,7 @@ interface NotebookCellPositionTargetParameters extends CommonTargetParameters {
3637
}
3738

3839
export class NotebookCellPositionTarget extends BaseTarget<NotebookCellPositionTargetParameters> {
40+
type = "NotebookCellPositionTarget";
3941
insertionDelimiter = "\n";
4042
isNotebookCell = true;
4143
public position: TargetPosition;

packages/cursorless-engine/src/processTargets/targets/ParagraphTarget.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { isSameType } from "../../util/typeUtils";
1313
import { createContinuousLineRange } from "../targetUtil/createContinuousRange";
1414

1515
export default class ParagraphTarget extends BaseTarget<CommonTargetParameters> {
16+
type = "ParagraphTarget";
1617
insertionDelimiter = "\n\n";
1718
isLine = true;
1819

packages/cursorless-engine/src/processTargets/targets/PlainTarget.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ interface PlainTargetParameters extends CommonTargetParameters {
99
* just consists of the content itself. Its insertion delimiter is empty string.
1010
*/
1111
export default class PlainTarget extends BaseTarget<PlainTargetParameters> {
12+
type = "PlainTarget";
1213
insertionDelimiter = "";
1314

1415
constructor(parameters: PlainTargetParameters) {

packages/cursorless-engine/src/processTargets/targets/PositionTarget.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ interface PositionTargetParameters extends CommonTargetParameters {
1111
}
1212

1313
export default class PositionTarget extends BaseTarget<PositionTargetParameters> {
14+
type = "PositionTarget";
1415
insertionDelimiter: string;
1516
isRaw: boolean;
1617
private position: TargetPosition;

packages/cursorless-engine/src/processTargets/targets/RawSelectionTarget.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { BaseTarget, CommonTargetParameters } from ".";
66
* inherited from the source in the case of a bring after a bring before
77
*/
88
export default class RawSelectionTarget extends BaseTarget<CommonTargetParameters> {
9+
type = "RawSelectionTarget";
910
insertionDelimiter = "";
1011
isRaw = true;
1112
isToken = false;

packages/cursorless-engine/src/processTargets/targets/ScopeTypeTarget.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export interface ScopeTypeTargetParameters extends CommonTargetParameters {
2828
}
2929

3030
export default class ScopeTypeTarget extends BaseTarget<ScopeTypeTargetParameters> {
31+
type = "ScopeTypeTarget";
3132
private scopeTypeType_: SimpleScopeTypeType;
3233
private removalRange_?: Range;
3334
private interiorRange_?: Range;

packages/cursorless-engine/src/processTargets/targets/SubTokenWordTarget.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export interface SubTokenTargetParameters extends CommonTargetParameters {
1313
}
1414

1515
export default class SubTokenWordTarget extends BaseTarget<SubTokenTargetParameters> {
16+
type = "SubTokenWordTarget";
1617
private leadingDelimiterRange_?: Range;
1718
private trailingDelimiterRange_?: Range;
1819
insertionDelimiter: string;

packages/cursorless-engine/src/processTargets/targets/SurroundingPairTarget.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ interface SurroundingPairTargetParameters extends CommonTargetParameters {
2929
}
3030

3131
export default class SurroundingPairTarget extends BaseTarget<SurroundingPairTargetParameters> {
32+
type = "SurroundingPairTarget";
3233
insertionDelimiter = " ";
3334
private interiorRange_: Range;
3435
private boundary_: [Range, Range];

packages/cursorless-engine/src/processTargets/targets/TokenTarget.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
} from "../targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior";
99

1010
export default class TokenTarget extends BaseTarget<CommonTargetParameters> {
11+
type = "TokenTarget";
1112
insertionDelimiter = " ";
1213

1314
getLeadingDelimiterTarget(): Target | undefined {

packages/cursorless-engine/src/processTargets/targets/UntypedTarget.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ interface UntypedTargetParameters extends CommonTargetParameters {
1919
* - Expand to nearest containing pair when asked for boundary or interior
2020
*/
2121
export default class UntypedTarget extends BaseTarget<UntypedTargetParameters> {
22+
type = "UntypedTarget";
2223
insertionDelimiter = " ";
2324
hasExplicitScopeType = false;
2425

packages/cursorless-engine/src/testUtil/takeSnapshot.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import {
1212
TextEditor,
1313
} from "@cursorless/common";
1414
import type { StoredTargetMap } from "../core/StoredTargets";
15-
import { targetToPlainObject } from "./targetToPlainObject";
1615

1716
export async function takeSnapshot(
1817
storedTargets: StoredTargetMap | undefined,
@@ -48,21 +47,24 @@ export async function takeSnapshot(
4847

4948
const thatMarkTargets = storedTargets?.get("that");
5049
if (thatMarkTargets != null && !excludeFields.includes("thatMark")) {
51-
snapshot.thatMark = thatMarkTargets.map(targetToPlainObject);
50+
snapshot.thatMark = thatMarkTargets.map((target) => target.toPlainObject());
5251
}
5352

5453
const sourceMarkTargets = storedTargets?.get("source");
5554
if (sourceMarkTargets != null && !excludeFields.includes("sourceMark")) {
56-
snapshot.sourceMark = sourceMarkTargets.map(targetToPlainObject);
55+
snapshot.sourceMark = sourceMarkTargets.map((target) =>
56+
target.toPlainObject(),
57+
);
5758
}
5859

5960
const instanceReferenceMarkTargets = storedTargets?.get("instanceReference");
6061
if (
6162
instanceReferenceMarkTargets != null &&
6263
!excludeFields.includes("instanceReferenceMark")
6364
) {
64-
snapshot.instanceReferenceMark =
65-
instanceReferenceMarkTargets.map(targetToPlainObject);
65+
snapshot.instanceReferenceMark = instanceReferenceMarkTargets.map(
66+
(target) => target.toPlainObject(),
67+
);
6668
}
6769

6870
if (extraFields.includes("timeOffsetSeconds")) {

packages/cursorless-engine/src/testUtil/targetToPlainObject.ts

Lines changed: 0 additions & 22 deletions
This file was deleted.

packages/cursorless-engine/src/typings/target.types.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ import type { ModifyIfUntypedStage } from "../processTargets/modifiers/Condition
99
import type {
1010
Range,
1111
Selection,
12-
TextEditor,
1312
// eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-imports
1413
Snippet,
1514
// eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-imports
1615
SnippetVariable,
16+
TargetPlainObject,
17+
TargetPosition,
18+
TextEditor,
1719
} from "@cursorless/common";
1820
import type {
1921
// eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-imports
@@ -23,7 +25,6 @@ import type {
2325
// eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-imports
2426
UntypedTarget,
2527
} from "../processTargets/targets";
26-
import type { TargetPosition } from "@cursorless/common";
2728
import type { EditWithRangeUpdater } from "./Types";
2829

2930
export type EditNewActionType = "edit" | "insertLineAfter";
@@ -155,4 +156,11 @@ export interface Target {
155156
* @param position The position to use, eg `start`, `end`, `before`, `after`
156157
*/
157158
toPositionTarget(position: TargetPosition): Target;
159+
/**
160+
* Constructs an object suitable for serialization by json. This is used to
161+
* capture targets for testing and recording test cases.
162+
*
163+
* @returns A plain object that can be json serialized
164+
*/
165+
toPlainObject(): TargetPlainObject;
158166
}

packages/cursorless-vscode/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -838,7 +838,7 @@
838838
"uninstall-local": "bash ./scripts/uninstall-local.sh",
839839
"esbuild": "pnpm run esbuild:base --sourcemap",
840840
"esbuild:watch": "pnpm run esbuild:base --sourcemap --watch",
841-
"esbuild:prod": "pnpm run esbuild:base --minify --keep-names",
841+
"esbuild:prod": "pnpm run esbuild:base --minify",
842842
"populate-dist": "tsx --conditions=cursorless:bundler ./src/scripts/populateDist/index.ts",
843843
"init-launch-sandbox": "tsx --conditions=cursorless:bundler src/scripts/initLaunchSandbox.ts",
844844
"preprocess-svg-hats": "tsx --conditions=cursorless:bundler src/scripts/preprocessSvgHats.ts",

0 commit comments

Comments
 (0)