Skip to content

Commit 575401f

Browse files
author
Andreas Arvidsson
committed
Treat leading and trailing modifier on empty content range as a token
1 parent fb2c1f3 commit 575401f

3 files changed

Lines changed: 70 additions & 4 deletions

File tree

src/processTargets/modifiers/LeadingTrailingStages.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,16 @@ import {
44
TrailingModifier,
55
} from "../../typings/targetDescriptor.types";
66
import { ProcessedTargetsContext } from "../../typings/Types";
7+
import getModifierStage from "../getModifierStage";
78
import { ModifierStage } from "../PipelineStages.types";
89

910
export class LeadingStage implements ModifierStage {
1011
constructor(private modifier: LeadingModifier) {}
1112

1213
run(context: ProcessedTargetsContext, target: Target): Target[] {
13-
const leading = target.getLeadingDelimiterTarget();
14+
const leading = getTargetToUse(context, target).getLeadingDelimiterTarget();
1415
if (leading == null) {
15-
throw Error("No available leading range");
16+
throw Error("No available leading delimiter range");
1617
}
1718
return [leading];
1819
}
@@ -22,10 +23,25 @@ export class TrailingStage implements ModifierStage {
2223
constructor(private modifier: TrailingModifier) {}
2324

2425
run(context: ProcessedTargetsContext, target: Target): Target[] {
25-
const trailing = target.getTrailingDelimiterTarget();
26+
const trailing = getTargetToUse(
27+
context,
28+
target
29+
).getTrailingDelimiterTarget();
2630
if (trailing == null) {
27-
throw Error("No available trailing range");
31+
throw Error("No available trailing delimiter range");
2832
}
2933
return [trailing];
3034
}
3135
}
36+
37+
/**If the content range of the given target is empty convert it to a token target. If not just return it unmodified. */
38+
function getTargetToUse(context: ProcessedTargetsContext, target: Target) {
39+
if (target.contentRange.isEmpty) {
40+
const tokenStage = getModifierStage({
41+
type: "containingScope",
42+
scopeType: { type: "token" },
43+
});
44+
return tokenStage.run(context, target)[0];
45+
}
46+
return target;
47+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
languageId: plaintext
2+
command:
3+
spokenForm: clear leading
4+
version: 2
5+
targets:
6+
- type: primitive
7+
modifiers:
8+
- {type: leading}
9+
usePrePhraseSnapshot: true
10+
action: {name: clearAndSetSelection}
11+
initialState:
12+
documentContents: aaa bbb ccc
13+
selections:
14+
- anchor: {line: 0, character: 6}
15+
active: {line: 0, character: 6}
16+
marks: {}
17+
finalState:
18+
documentContents: aaabbb ccc
19+
selections:
20+
- anchor: {line: 0, character: 3}
21+
active: {line: 0, character: 3}
22+
thatMark:
23+
- anchor: {line: 0, character: 3}
24+
active: {line: 0, character: 3}
25+
fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: leading}]}]
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
languageId: plaintext
2+
command:
3+
spokenForm: clear trailing
4+
version: 2
5+
targets:
6+
- type: primitive
7+
modifiers:
8+
- {type: trailing}
9+
usePrePhraseSnapshot: true
10+
action: {name: clearAndSetSelection}
11+
initialState:
12+
documentContents: aaa bbb ccc
13+
selections:
14+
- anchor: {line: 0, character: 6}
15+
active: {line: 0, character: 6}
16+
marks: {}
17+
finalState:
18+
documentContents: aaa bbbccc
19+
selections:
20+
- anchor: {line: 0, character: 7}
21+
active: {line: 0, character: 7}
22+
thatMark:
23+
- anchor: {line: 0, character: 7}
24+
active: {line: 0, character: 7}
25+
fullTargets: [{type: primitive, mark: {type: cursor}, modifiers: [{type: trailing}]}]

0 commit comments

Comments
 (0)