Skip to content

Commit

Permalink
relax vscode.Range#contains and Range, Selection, and Location constr…
Browse files Browse the repository at this point in the history
…uction, #129528
  • Loading branch information
jrieken committed Feb 10, 2022
1 parent 4461d40 commit 0fd15bb
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 15 deletions.
50 changes: 35 additions & 15 deletions src/vs/workbench/api/common/extHostTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,15 @@ export class Position {
return false;
}

static of(obj: vscode.Position): Position {
if (obj instanceof Position) {
return obj;
} else if (this.isPosition(obj)) {
return new Position(obj.line, obj.character);
}
throw new Error('Invalid argument, is NOT a position-like object');
}

private _line: number;
private _character: number;

Expand Down Expand Up @@ -245,6 +254,16 @@ export class Range {
&& Position.isPosition((<Range>thing.end));
}

static of(obj: vscode.Range): Range {
if (obj instanceof Range) {
return obj;
}
if (this.isRange(obj)) {
return new Range(obj.start, obj.end);
}
throw new Error('Invalid argument, is NOT a range-like object');
}

protected _start: Position;
protected _end: Position;

Expand All @@ -256,18 +275,19 @@ export class Range {
return this._end;
}

constructor(start: vscode.Position, end: vscode.Position);
constructor(start: Position, end: Position);
constructor(startLine: number, startColumn: number, endLine: number, endColumn: number);
constructor(startLineOrStart: number | Position, startColumnOrEnd: number | Position, endLine?: number, endColumn?: number) {
constructor(startLineOrStart: number | Position | vscode.Position, startColumnOrEnd: number | Position | vscode.Position, endLine?: number, endColumn?: number) {
let start: Position | undefined;
let end: Position | undefined;

if (typeof startLineOrStart === 'number' && typeof startColumnOrEnd === 'number' && typeof endLine === 'number' && typeof endColumn === 'number') {
start = new Position(startLineOrStart, startColumnOrEnd);
end = new Position(endLine, endColumn);
} else if (startLineOrStart instanceof Position && startColumnOrEnd instanceof Position) {
start = startLineOrStart;
end = startColumnOrEnd;
} else if (Position.isPosition(startLineOrStart) && Position.isPosition(startColumnOrEnd)) {
start = Position.of(startLineOrStart);
end = Position.of(startColumnOrEnd);
}

if (!start || !end) {
Expand All @@ -284,12 +304,12 @@ export class Range {
}

contains(positionOrRange: Position | Range): boolean {
if (positionOrRange instanceof Range) {
return this.contains(positionOrRange._start)
&& this.contains(positionOrRange._end);
if (Range.isRange(positionOrRange)) {
return this.contains(positionOrRange.start)
&& this.contains(positionOrRange.end);

} else if (positionOrRange instanceof Position) {
if (positionOrRange.isBefore(this._start)) {
} else if (Position.isPosition(positionOrRange)) {
if (Position.of(positionOrRange).isBefore(this._start)) {
return false;
}
if (this._end.isBefore(positionOrRange)) {
Expand Down Expand Up @@ -403,9 +423,9 @@ export class Selection extends Range {
if (typeof anchorLineOrAnchor === 'number' && typeof anchorColumnOrActive === 'number' && typeof activeLine === 'number' && typeof activeColumn === 'number') {
anchor = new Position(anchorLineOrAnchor, anchorColumnOrActive);
active = new Position(activeLine, activeColumn);
} else if (anchorLineOrAnchor instanceof Position && anchorColumnOrActive instanceof Position) {
anchor = anchorLineOrAnchor;
active = anchorColumnOrActive;
} else if (Position.isPosition(anchorLineOrAnchor) && Position.isPosition(anchorColumnOrActive)) {
anchor = Position.of(anchorLineOrAnchor);
active = Position.of(anchorColumnOrActive);
}

if (!anchor || !active) {
Expand Down Expand Up @@ -893,9 +913,9 @@ export class Location {

if (!rangeOrPosition) {
//that's OK
} else if (rangeOrPosition instanceof Range) {
this.range = rangeOrPosition;
} else if (rangeOrPosition instanceof Position) {
} else if (Range.isRange(rangeOrPosition)) {
this.range = Range.of(rangeOrPosition);
} else if (Position.isPosition(rangeOrPosition)) {
this.range = new Range(rangeOrPosition, rangeOrPosition);
} else {
throw new Error('Illegal argument');
Expand Down
12 changes: 12 additions & 0 deletions src/vs/workbench/api/test/browser/extHostTypes.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,18 @@ suite('ExtHostTypes', function () {
assert.ok(!range.contains(new types.Range(1, 1, 3, 11)));
});

test('Range, contains (no instanceof)', function () {
let range = new types.Range(1, 1, 2, 11);

let startLike = { line: range.start.line, character: range.start.character };
let endLike = { line: range.end.line, character: range.end.character };
let rangeLike = { start: startLike, end: endLike };

assert.ok(range.contains((<types.Position>startLike)));
assert.ok(range.contains((<types.Position>endLike)));
assert.ok(range.contains((<types.Range>rangeLike)));
});

test('Range, intersection', function () {
let range = new types.Range(1, 1, 2, 11);
let res: types.Range;
Expand Down

0 comments on commit 0fd15bb

Please sign in to comment.