Skip to content

Commit

Permalink
Refactor execActionWithCount in BaseMovement and overriding classes
Browse files Browse the repository at this point in the history
  • Loading branch information
xmbhasin committed Aug 10, 2018
1 parent 9b344a6 commit 5e32f93
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 168 deletions.
212 changes: 88 additions & 124 deletions src/actions/motion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { BaseAction } from './base';
import { RegisterAction } from './base';
import { ChangeOperator, DeleteOperator, YankOperator } from './operator';
import { shouldWrapKey } from './wrapping';
import { RecordedState } from '../state/recordedState';

export function isIMovement(o: IMovement | Position): o is IMovement {
return (o as IMovement).start !== undefined && (o as IMovement).stop !== undefined;
Expand Down Expand Up @@ -64,6 +65,9 @@ export abstract class BaseMovement extends BaseAction {
*/
public setsDesiredColumnToEOL = false;

protected minCount = 1;
protected maxCount = 99999;

constructor(keysPressed?: string[], isRepeat?: boolean) {
super();

Expand Down Expand Up @@ -112,49 +116,83 @@ export abstract class BaseMovement extends BaseAction {
let recordedState = vimState.recordedState;
let result: Position | IMovement = new Position(0, 0); // bogus init to satisfy typechecker

if (count < 1) {
count = 1;
} else if (count > 99999) {
count = 99999;
}
count = this.clampCount(count);

for (let i = 0; i < count; i++) {
const firstIteration = i === 0;
const lastIteration = i === count - 1;
const temporaryResult =
recordedState.operator && lastIteration
? await this.execActionForOperator(position, vimState)
: await this.execAction(position, vimState);
const temporaryResult = await this.createTemporaryResult(
position,
vimState,
recordedState,
lastIteration
);

if (temporaryResult instanceof Position) {
result = temporaryResult;
position = temporaryResult;
} else if (isIMovement(temporaryResult)) {
if ((<IMovement>temporaryResult).failed) {
return temporaryResult;
}

if (result instanceof Position) {
result = {
start: new Position(0, 0),
stop: new Position(0, 0),
failed: false,
};
}

result.failed = result.failed || temporaryResult.failed;
this.adjustResultAndPosition(
result,
position,
temporaryResult,
firstIteration,
lastIteration
);
}
}
return result;
}

if (firstIteration) {
(result as IMovement).start = temporaryResult.start;
}
protected clampCount(count: number) {
count = Math.max(count, this.minCount);
count = Math.min(count, this.maxCount);
return count;
}

if (lastIteration) {
(result as IMovement).stop = temporaryResult.stop;
} else {
position = temporaryResult.stop.getRightThroughLineBreaks();
}
protected async createTemporaryResult(
position: Position,
vimState: VimState,
recordedState: RecordedState,
lastIteration: boolean
): Promise<Position | IMovement> {
const temporaryResult =
recordedState.operator && lastIteration
? await this.execActionForOperator(position, vimState)
: await this.execAction(position, vimState);
return temporaryResult;
}
protected adjustResultAndPosition(
result: IMovement,
position: Position,
temporaryResult: IMovement,
firstIteration: boolean,
lastIteration: boolean
) {
result.failed = false || temporaryResult.failed;

result.registerMode = temporaryResult.registerMode;
}
if (firstIteration) {
result.start = temporaryResult.start;
}

return result;
if (lastIteration) {
result.stop = temporaryResult.stop;
} else {
position = temporaryResult.stop.getRightThroughLineBreaks();
}

result.registerMode = temporaryResult.registerMode;
}
}

Expand Down Expand Up @@ -1475,62 +1513,25 @@ export abstract class MoveInsideCharacter extends BaseMovement {
};
}

public async execActionWithCount(
protected adjustResultAndPosition(
result: IMovement,
position: Position,
vimState: VimState,
count: number
): Promise<Position | IMovement> {
let recordedState = vimState.recordedState;
let result: Position | IMovement = new Position(0, 0); // bogus init to satisfy typechecker
temporaryResult: IMovement,
firstIteration: boolean,
lastIteration: boolean
) {
result.failed = false || temporaryResult.failed;

if (count < 1) {
count = 1;
} else if (count > 99999) {
count = 99999;
}

for (let i = 0; i < count; i++) {
const lastIteration = i === count - 1;
const temporaryResult =
recordedState.operator && lastIteration
? await this.execActionForOperator(position, vimState)
: await this.execAction(position, vimState);
// update start every iteration as selection expands
result.start = temporaryResult.start;

// return failure result when repeat prefixing
if (isIMovement(temporaryResult)) {
if ((<IMovement>temporaryResult).failed) {
return temporaryResult;
}
}

if (temporaryResult instanceof Position) {
result = temporaryResult;
position = temporaryResult;
} else if (isIMovement(temporaryResult)) {
if (result instanceof Position) {
result = {
start: new Position(0, 0),
stop: new Position(0, 0),
failed: false,
};
}

result.failed = result.failed || temporaryResult.failed;

// update start every iteration as selection expands
(result as IMovement).start = temporaryResult.start;

if (lastIteration) {
(result as IMovement).stop = temporaryResult.stop;
} else {
position = temporaryResult.stop;
}

result.registerMode = temporaryResult.registerMode;
}
if (lastIteration) {
result.stop = temporaryResult.stop;
} else {
position = temporaryResult.stop.getRightThroughLineBreaks();
}

return result;
result.registerMode = temporaryResult.registerMode;
}

public async execActionForOperator(
Expand Down Expand Up @@ -1910,62 +1911,25 @@ abstract class MoveTagMatch extends BaseMovement {
};
}

public async execActionWithCount(
protected adjustResultAndPosition(
result: IMovement,
position: Position,
vimState: VimState,
count: number
): Promise<Position | IMovement> {
let recordedState = vimState.recordedState;
let result: Position | IMovement = new Position(0, 0); // bogus init to satisfy typechecker
temporaryResult: IMovement,
firstIteration: boolean,
lastIteration: boolean
) {
result.failed = false || temporaryResult.failed;

if (count < 1) {
count = 1;
} else if (count > 99999) {
count = 99999;
}
// update start every iteration as selection expands
result.start = temporaryResult.start;

for (let i = 0; i < count; i++) {
const lastIteration = i === count - 1;
const temporaryResult =
recordedState.operator && lastIteration
? await this.execActionForOperator(position, vimState)
: await this.execAction(position, vimState);

// return failure result when repeat prefixing
if (isIMovement(temporaryResult)) {
if ((<IMovement>temporaryResult).failed) {
return temporaryResult;
}
}

if (temporaryResult instanceof Position) {
result = temporaryResult;
position = temporaryResult;
} else if (isIMovement(temporaryResult)) {
if (result instanceof Position) {
result = {
start: new Position(0, 0),
stop: new Position(0, 0),
failed: false,
};
}

result.failed = result.failed || temporaryResult.failed;

// update start every iteration as selection expands
(result as IMovement).start = temporaryResult.start;

if (lastIteration) {
(result as IMovement).stop = temporaryResult.stop;
} else {
position = temporaryResult.stop;
}

result.registerMode = temporaryResult.registerMode;
}
if (lastIteration) {
result.stop = temporaryResult.stop;
} else {
position = temporaryResult.stop.getRightThroughLineBreaks();
}

return result;
result.registerMode = temporaryResult.registerMode;
}

public async execActionForOperator(
Expand Down
59 changes: 15 additions & 44 deletions src/actions/textobject.ts
Original file line number Diff line number Diff line change
Expand Up @@ -245,55 +245,26 @@ export class SelectAnExpandingBlock extends TextObjectMovement {
};
}
}
public async execActionWithCount(
position: Position,
vimState: VimState,
count: number
): Promise<Position | IMovement> {
let recordedState = vimState.recordedState;
let result: Position | IMovement = new Position(0, 0); // bogus init to satisfy typechecker

if (count < 1) {
count = 1;
} else if (count > 99999) {
count = 99999;
}

for (let i = 0; i < count; i++) {
const lastIteration = i === count - 1;
const temporaryResult =
recordedState.operator && lastIteration
? await this.execActionForOperator(position, vimState)
: await this.execAction(position, vimState);

if (temporaryResult instanceof Position) {
result = temporaryResult;
position = temporaryResult;
} else if (isIMovement(temporaryResult)) {
if (result instanceof Position) {
result = {
start: new Position(0, 0),
stop: new Position(0, 0),
failed: false,
};
}

result.failed = result.failed || temporaryResult.failed;

// update start every iteration as selection expands
(result as IMovement).start = temporaryResult.start;
protected adjustResultAndPosition(
result: IMovement,
position: Position,
temporaryResult: IMovement,
firstIteration: boolean,
lastIteration: boolean
) {
result.failed = false || temporaryResult.failed;

if (lastIteration) {
(result as IMovement).stop = temporaryResult.stop;
} else {
position = temporaryResult.stop;
}
// update start every iteration as selection expands
result.start = temporaryResult.start;

result.registerMode = temporaryResult.registerMode;
}
if (lastIteration) {
result.stop = temporaryResult.stop;
} else {
position = temporaryResult.stop.getRightThroughLineBreaks();
}

return result;
result.registerMode = temporaryResult.registerMode;
}
}

Expand Down

0 comments on commit 5e32f93

Please sign in to comment.