Skip to content

Commit 81557c5

Browse files
committed
1 parent 50487cf commit 81557c5

2 files changed

Lines changed: 93 additions & 13 deletions

File tree

src/vs/editor/common/model/textModel.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -884,10 +884,11 @@ export class TextModel extends OrderGuaranteeEventEmitter implements editorCommo
884884

885885
}
886886

887-
private _doFindNextMatchMultiline(searchStart:Position, searchRegex:RegExp): Range {
888-
let deltaOffset = this.getOffsetAt(searchStart);
889-
let text = this.getValueInRange(new Range(searchStart.lineNumber, searchStart.column, this.getLineCount(), this.getLineMaxColumn(this.getLineCount())));
890-
887+
private _doFindNextMatchMultiline(searchStart: Position, searchRegex: RegExp): Range {
888+
let searchTextStart: editorCommon.IPosition = { lineNumber: searchStart.lineNumber, column: 1 };
889+
let deltaOffset = this.getOffsetAt(searchTextStart);
890+
let text = this.getValueInRange(new Range(searchTextStart.lineNumber, searchTextStart.column, this.getLineCount(), this.getLineMaxColumn(this.getLineCount())));
891+
searchRegex.lastIndex = searchStart.column - 1;
891892
let m = searchRegex.exec(text);
892893
if (m) {
893894
let startOffset = deltaOffset + m.index;
@@ -912,16 +913,16 @@ export class TextModel extends OrderGuaranteeEventEmitter implements editorCommo
912913
let r: Range;
913914

914915
// Look in first line
915-
text = this._lines[startLineNumber - 1].text.substring(searchStart.column - 1);
916-
r = this._findFirstMatchInLine(searchRegex, text, startLineNumber, searchStart.column - 1);
916+
text = this._lines[startLineNumber - 1].text;
917+
r = this._findFirstMatchInLine(searchRegex, text, startLineNumber, searchStart.column);
917918
if (r) {
918919
return r;
919920
}
920921

921922
for (let i = 1; i <= lineCount; i++) {
922923
let lineIndex = (startLineNumber + i - 1) % lineCount;
923924
text = this._lines[lineIndex].text;
924-
r = this._findFirstMatchInLine(searchRegex, text, lineIndex + 1, 0);
925+
r = this._findFirstMatchInLine(searchRegex, text, lineIndex + 1, 1);
925926
if (r) {
926927
return r;
927928
}
@@ -982,12 +983,11 @@ export class TextModel extends OrderGuaranteeEventEmitter implements editorCommo
982983
return null;
983984
}
984985

985-
private _findFirstMatchInLine(searchRegex:RegExp, text:string, lineNumber:number, deltaOffset:number): Range {
986-
var m = searchRegex.exec(text);
987-
if (!m) {
988-
return null;
989-
}
990-
return new Range(lineNumber, m.index + 1 + deltaOffset, lineNumber, m.index + 1 + m[0].length + deltaOffset);
986+
private _findFirstMatchInLine(searchRegex: RegExp, text: string, lineNumber: number, fromColumn: number): Range {
987+
// Set regex to search from column
988+
searchRegex.lastIndex = fromColumn - 1;
989+
var m: RegExpExecArray = searchRegex.exec(text);
990+
return m ? new Range(lineNumber, m.index + 1, lineNumber, m.index + 1 + m[0].length) : null;
991991
}
992992

993993
private _findLastMatchInLine(searchRegex:RegExp, text:string, lineNumber:number): Range {

src/vs/editor/test/common/model/textModel.test.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,86 @@ suite('Editor Model - TextModel', () => {
555555

556556
model.dispose();
557557
});
558+
559+
test('findNextMatch without regex', () => {
560+
var testObject = new TextModel([], TextModel.toRawText('line line one\nline two\nthree', TextModel.DEFAULT_CREATION_OPTIONS));
561+
562+
let actual = testObject.findNextMatch('line', { lineNumber: 1, column: 1 }, false, false, false);
563+
assert.equal(new Range(1, 1, 1, 5).toString(), actual.toString());
564+
565+
actual = testObject.findNextMatch('line', actual.getEndPosition(), false, false, false);
566+
assert.equal(new Range(1, 6, 1, 10).toString(), actual.toString());
567+
568+
actual = testObject.findNextMatch('line', {lineNumber: 1, column: 3}, false, false, false);
569+
assert.equal(new Range(1, 6, 1, 10).toString(), actual.toString());
570+
571+
actual = testObject.findNextMatch('line', actual.getEndPosition(), false, false, false);
572+
assert.equal(new Range(2, 1, 2, 5).toString(), actual.toString());
573+
574+
actual = testObject.findNextMatch('line', actual.getEndPosition(), false, false, false);
575+
assert.equal(new Range(1, 1, 1, 5).toString(), actual.toString());
576+
});
577+
578+
test('findNextMatch with beginning boundary regex', () => {
579+
var testObject = new TextModel([], TextModel.toRawText('line one\nline two\nthree', TextModel.DEFAULT_CREATION_OPTIONS));
580+
581+
let actual = testObject.findNextMatch('^line', { lineNumber: 1, column: 1 }, true, false, false);
582+
assert.equal(new Range(1, 1, 1, 5).toString(), actual.toString());
583+
584+
actual = testObject.findNextMatch('^line', actual.getEndPosition(), true, false, false);
585+
assert.equal(new Range(2, 1, 2, 5).toString(), actual.toString());
586+
587+
actual = testObject.findNextMatch('^line', { lineNumber: 1, column: 3 }, true, false, false);
588+
assert.equal(new Range(2, 1, 2, 5).toString(), actual.toString());
589+
590+
actual = testObject.findNextMatch('^line', actual.getEndPosition(), true, false, false);
591+
assert.equal(new Range(1, 1, 1, 5).toString(), actual.toString());
592+
});
593+
594+
test('findNextMatch with beginning boundary regex and line has repetitive beginnings', () => {
595+
var testObject = new TextModel([], TextModel.toRawText('line line one\nline two\nthree', TextModel.DEFAULT_CREATION_OPTIONS));
596+
597+
let actual = testObject.findNextMatch('^line', { lineNumber: 1, column: 1 }, true, false, false);
598+
assert.equal(new Range(1, 1, 1, 5).toString(), actual.toString());
599+
600+
actual = testObject.findNextMatch('^line', actual.getEndPosition(), true, false, false);
601+
assert.equal(new Range(2, 1, 2, 5).toString(), actual.toString());
602+
603+
actual = testObject.findNextMatch('^line', { lineNumber: 1, column: 3 }, true, false, false);
604+
assert.equal(new Range(2, 1, 2, 5).toString(), actual.toString());
605+
606+
actual = testObject.findNextMatch('^line', actual.getEndPosition(), true, false, false);
607+
assert.equal(new Range(1, 1, 1, 5).toString(), actual.toString());
608+
});
609+
610+
test('findNextMatch with beginning boundary multiline regex and line has repetitive beginnings', () => {
611+
var testObject = new TextModel([], TextModel.toRawText('line line one\nline two\nline three', TextModel.DEFAULT_CREATION_OPTIONS));
612+
613+
let actual = testObject.findNextMatch('^line.*\\nline', { lineNumber: 1, column: 1 }, true, false, false);
614+
assert.equal(new Range(1, 1, 2, 5).toString(), actual.toString());
615+
616+
actual = testObject.findNextMatch('^line.*\\nline', actual.getEndPosition(), true, false, false);
617+
assert.equal(new Range(1, 1, 2, 5).toString(), actual.toString());
618+
619+
actual = testObject.findNextMatch('^line.*\\nline', { lineNumber: 2, column: 1 }, true, false, false);
620+
assert.equal(new Range(2, 1, 3, 5).toString(), actual.toString());
621+
});
622+
623+
test('findNextMatch with ending boundary regex', () => {
624+
var testObject = new TextModel([], TextModel.toRawText('one line line\ntwo line\nthree', TextModel.DEFAULT_CREATION_OPTIONS));
625+
626+
let actual = testObject.findNextMatch('line$', { lineNumber: 1, column: 1 }, true, false, false);
627+
assert.equal(new Range(1, 10, 1, 14).toString(), actual.toString());
628+
629+
actual = testObject.findNextMatch('line$', { lineNumber: 1, column: 4 }, true, false, false);
630+
assert.equal(new Range(1, 10, 1, 14).toString(), actual.toString());
631+
632+
actual = testObject.findNextMatch('line$', actual.getEndPosition(), true, false, false);
633+
assert.equal(new Range(2, 5, 2, 9).toString(), actual.toString());
634+
635+
actual = testObject.findNextMatch('line$', actual.getEndPosition(), true, false, false);
636+
assert.equal(new Range(1, 10, 1, 14).toString(), actual.toString());
637+
});
558638
});
559639

560640
suite('TextModel.getLineIndentGuide', () => {

0 commit comments

Comments
 (0)