Skip to content

Commit fd194ef

Browse files
pokeyfidgetingbits
authored andcommitted
Fix "clone" action with ScopeTypeTarget (cursorless-dev#1961)
- Fixes cursorless-dev#1691 - Fixes cursorless-dev#1959 - Also strengthens typing for clone args even more cc/ @auscompgeek ## 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
1 parent d6502fc commit fd194ef

File tree

6 files changed

+68
-5
lines changed

6 files changed

+68
-5
lines changed

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import type { InsertionMode, TargetPlainObject } from "@cursorless/common";
1+
import type {
2+
EnforceUndefined,
3+
InsertionMode,
4+
TargetPlainObject,
5+
} from "@cursorless/common";
26
import {
37
NoContainingScopeError,
48
Range,
@@ -43,7 +47,7 @@ export default abstract class BaseTarget<
4347
> implements Target
4448
{
4549
protected abstract readonly type: string;
46-
protected readonly state: CommonTargetParameters;
50+
protected readonly state: EnforceUndefined<CommonTargetParameters>;
4751
isLine = false;
4852
isToken = true;
4953
hasExplicitScopeType = true;
@@ -123,7 +127,7 @@ export default abstract class BaseTarget<
123127
});
124128
}
125129

126-
protected abstract getCloneParameters(): TParameters;
130+
protected abstract getCloneParameters(): EnforceUndefined<TParameters>;
127131

128132
createContinuousRangeTarget(
129133
isReversed: boolean,
@@ -172,7 +176,10 @@ export default abstract class BaseTarget<
172176
*
173177
* @returns The object to be used for determining equality
174178
*/
175-
protected getEqualityParameters(): Omit<TParameters, "thatTarget"> {
179+
protected getEqualityParameters(): Omit<
180+
EnforceUndefined<TParameters>,
181+
"thatTarget"
182+
> {
176183
const { thatTarget, ...otherCloneParameters } = this.getCloneParameters();
177184

178185
return {

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,9 @@ export default class ScopeTypeTarget extends BaseTarget<ScopeTypeTargetParameter
145145
protected getCloneParameters() {
146146
return {
147147
...this.state,
148+
delimiter: this.insertionDelimiter,
149+
removalRange: undefined,
150+
interiorRange: undefined,
148151
scopeTypeType: this.scopeTypeType_,
149152
contentRemovalRange: this.removalRange_,
150153
leadingDelimiterRange: this.leadingDelimiterRange_,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export default class SubTokenWordTarget extends BaseTarget<SubTokenTargetParamet
7575
);
7676
}
7777

78-
protected getCloneParameters(): SubTokenTargetParameters {
78+
protected getCloneParameters() {
7979
return {
8080
...this.state,
8181
leadingDelimiterRange: this.leadingDelimiterRange_,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ export default class UntypedTarget extends BaseTarget<UntypedTargetParameters> {
6060
protected getCloneParameters() {
6161
return {
6262
...this.state,
63+
isToken: this.isToken,
6364
hasExplicitRange: this.hasExplicitRange,
6465
};
6566
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
languageId: typescript
2+
command:
3+
version: 6
4+
spokenForm: clone two args
5+
action:
6+
name: insertCopyAfter
7+
target:
8+
type: primitive
9+
modifiers:
10+
- type: relativeScope
11+
scopeType: {type: argumentOrParameter}
12+
offset: 0
13+
length: 2
14+
direction: forward
15+
usePrePhraseSnapshot: true
16+
initialState:
17+
documentContents: aaa(bbb, ccc)
18+
selections:
19+
- anchor: {line: 0, character: 4}
20+
active: {line: 0, character: 4}
21+
marks: {}
22+
finalState:
23+
documentContents: aaa(bbb, ccc, bbb, ccc)
24+
selections:
25+
- anchor: {line: 0, character: 14}
26+
active: {line: 0, character: 14}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
languageId: plaintext
2+
command:
3+
version: 6
4+
spokenForm: clone two items
5+
action:
6+
name: insertCopyAfter
7+
target:
8+
type: primitive
9+
modifiers:
10+
- type: relativeScope
11+
scopeType: {type: collectionItem}
12+
offset: 0
13+
length: 2
14+
direction: forward
15+
usePrePhraseSnapshot: true
16+
initialState:
17+
documentContents: (aaa, bbb)
18+
selections:
19+
- anchor: {line: 0, character: 1}
20+
active: {line: 0, character: 1}
21+
marks: {}
22+
finalState:
23+
documentContents: (aaa, bbb, aaa, bbb)
24+
selections:
25+
- anchor: {line: 0, character: 11}
26+
active: {line: 0, character: 11}

0 commit comments

Comments
 (0)