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;

0 commit comments

Comments
 (0)