提交 81557c5e 编写于 作者: S Sandeep Somavarapu

fix #10887

上级 50487cf2
......@@ -884,10 +884,11 @@ export class TextModel extends OrderGuaranteeEventEmitter implements editorCommo
}
private _doFindNextMatchMultiline(searchStart:Position, searchRegex:RegExp): Range {
let deltaOffset = this.getOffsetAt(searchStart);
let text = this.getValueInRange(new Range(searchStart.lineNumber, searchStart.column, this.getLineCount(), this.getLineMaxColumn(this.getLineCount())));
private _doFindNextMatchMultiline(searchStart: Position, searchRegex: RegExp): Range {
let searchTextStart: editorCommon.IPosition = { lineNumber: searchStart.lineNumber, column: 1 };
let deltaOffset = this.getOffsetAt(searchTextStart);
let text = this.getValueInRange(new Range(searchTextStart.lineNumber, searchTextStart.column, this.getLineCount(), this.getLineMaxColumn(this.getLineCount())));
searchRegex.lastIndex = searchStart.column - 1;
let m = searchRegex.exec(text);
if (m) {
let startOffset = deltaOffset + m.index;
......@@ -912,8 +913,8 @@ export class TextModel extends OrderGuaranteeEventEmitter implements editorCommo
let r: Range;
// Look in first line
text = this._lines[startLineNumber - 1].text.substring(searchStart.column - 1);
r = this._findFirstMatchInLine(searchRegex, text, startLineNumber, searchStart.column - 1);
text = this._lines[startLineNumber - 1].text;
r = this._findFirstMatchInLine(searchRegex, text, startLineNumber, searchStart.column);
if (r) {
return r;
}
......@@ -921,7 +922,7 @@ export class TextModel extends OrderGuaranteeEventEmitter implements editorCommo
for (let i = 1; i <= lineCount; i++) {
let lineIndex = (startLineNumber + i - 1) % lineCount;
text = this._lines[lineIndex].text;
r = this._findFirstMatchInLine(searchRegex, text, lineIndex + 1, 0);
r = this._findFirstMatchInLine(searchRegex, text, lineIndex + 1, 1);
if (r) {
return r;
}
......@@ -982,12 +983,11 @@ export class TextModel extends OrderGuaranteeEventEmitter implements editorCommo
return null;
}
private _findFirstMatchInLine(searchRegex:RegExp, text:string, lineNumber:number, deltaOffset:number): Range {
var m = searchRegex.exec(text);
if (!m) {
return null;
}
return new Range(lineNumber, m.index + 1 + deltaOffset, lineNumber, m.index + 1 + m[0].length + deltaOffset);
private _findFirstMatchInLine(searchRegex: RegExp, text: string, lineNumber: number, fromColumn: number): Range {
// Set regex to search from column
searchRegex.lastIndex = fromColumn - 1;
var m: RegExpExecArray = searchRegex.exec(text);
return m ? new Range(lineNumber, m.index + 1, lineNumber, m.index + 1 + m[0].length) : null;
}
private _findLastMatchInLine(searchRegex:RegExp, text:string, lineNumber:number): Range {
......
......@@ -555,6 +555,86 @@ suite('Editor Model - TextModel', () => {
model.dispose();
});
test('findNextMatch without regex', () => {
var testObject = new TextModel([], TextModel.toRawText('line line one\nline two\nthree', TextModel.DEFAULT_CREATION_OPTIONS));
let actual = testObject.findNextMatch('line', { lineNumber: 1, column: 1 }, false, false, false);
assert.equal(new Range(1, 1, 1, 5).toString(), actual.toString());
actual = testObject.findNextMatch('line', actual.getEndPosition(), false, false, false);
assert.equal(new Range(1, 6, 1, 10).toString(), actual.toString());
actual = testObject.findNextMatch('line', {lineNumber: 1, column: 3}, false, false, false);
assert.equal(new Range(1, 6, 1, 10).toString(), actual.toString());
actual = testObject.findNextMatch('line', actual.getEndPosition(), false, false, false);
assert.equal(new Range(2, 1, 2, 5).toString(), actual.toString());
actual = testObject.findNextMatch('line', actual.getEndPosition(), false, false, false);
assert.equal(new Range(1, 1, 1, 5).toString(), actual.toString());
});
test('findNextMatch with beginning boundary regex', () => {
var testObject = new TextModel([], TextModel.toRawText('line one\nline two\nthree', TextModel.DEFAULT_CREATION_OPTIONS));
let actual = testObject.findNextMatch('^line', { lineNumber: 1, column: 1 }, true, false, false);
assert.equal(new Range(1, 1, 1, 5).toString(), actual.toString());
actual = testObject.findNextMatch('^line', actual.getEndPosition(), true, false, false);
assert.equal(new Range(2, 1, 2, 5).toString(), actual.toString());
actual = testObject.findNextMatch('^line', { lineNumber: 1, column: 3 }, true, false, false);
assert.equal(new Range(2, 1, 2, 5).toString(), actual.toString());
actual = testObject.findNextMatch('^line', actual.getEndPosition(), true, false, false);
assert.equal(new Range(1, 1, 1, 5).toString(), actual.toString());
});
test('findNextMatch with beginning boundary regex and line has repetitive beginnings', () => {
var testObject = new TextModel([], TextModel.toRawText('line line one\nline two\nthree', TextModel.DEFAULT_CREATION_OPTIONS));
let actual = testObject.findNextMatch('^line', { lineNumber: 1, column: 1 }, true, false, false);
assert.equal(new Range(1, 1, 1, 5).toString(), actual.toString());
actual = testObject.findNextMatch('^line', actual.getEndPosition(), true, false, false);
assert.equal(new Range(2, 1, 2, 5).toString(), actual.toString());
actual = testObject.findNextMatch('^line', { lineNumber: 1, column: 3 }, true, false, false);
assert.equal(new Range(2, 1, 2, 5).toString(), actual.toString());
actual = testObject.findNextMatch('^line', actual.getEndPosition(), true, false, false);
assert.equal(new Range(1, 1, 1, 5).toString(), actual.toString());
});
test('findNextMatch with beginning boundary multiline regex and line has repetitive beginnings', () => {
var testObject = new TextModel([], TextModel.toRawText('line line one\nline two\nline three', TextModel.DEFAULT_CREATION_OPTIONS));
let actual = testObject.findNextMatch('^line.*\\nline', { lineNumber: 1, column: 1 }, true, false, false);
assert.equal(new Range(1, 1, 2, 5).toString(), actual.toString());
actual = testObject.findNextMatch('^line.*\\nline', actual.getEndPosition(), true, false, false);
assert.equal(new Range(1, 1, 2, 5).toString(), actual.toString());
actual = testObject.findNextMatch('^line.*\\nline', { lineNumber: 2, column: 1 }, true, false, false);
assert.equal(new Range(2, 1, 3, 5).toString(), actual.toString());
});
test('findNextMatch with ending boundary regex', () => {
var testObject = new TextModel([], TextModel.toRawText('one line line\ntwo line\nthree', TextModel.DEFAULT_CREATION_OPTIONS));
let actual = testObject.findNextMatch('line$', { lineNumber: 1, column: 1 }, true, false, false);
assert.equal(new Range(1, 10, 1, 14).toString(), actual.toString());
actual = testObject.findNextMatch('line$', { lineNumber: 1, column: 4 }, true, false, false);
assert.equal(new Range(1, 10, 1, 14).toString(), actual.toString());
actual = testObject.findNextMatch('line$', actual.getEndPosition(), true, false, false);
assert.equal(new Range(2, 5, 2, 9).toString(), actual.toString());
actual = testObject.findNextMatch('line$', actual.getEndPosition(), true, false, false);
assert.equal(new Range(1, 10, 1, 14).toString(), actual.toString());
});
});
suite('TextModel.getLineIndentGuide', () => {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册