fix find next for regexps matching empty range
This commit is contained in:
parent
aa472742cc
commit
bd7de6b43b
2 changed files with 47 additions and 7 deletions
|
|
@ -102,8 +102,8 @@ var Search = function() {
|
|||
* @returns {Range}
|
||||
**/
|
||||
this.find = function(session) {
|
||||
var iterator = this.$matchIterator(session, this.$options);
|
||||
|
||||
var options = this.$options;
|
||||
var iterator = this.$matchIterator(session, options);
|
||||
if (!iterator)
|
||||
return false;
|
||||
|
||||
|
|
@ -111,7 +111,13 @@ var Search = function() {
|
|||
iterator.forEach(function(range, row, offset) {
|
||||
if (!range.start) {
|
||||
var column = range.offset + (offset || 0);
|
||||
firstRange = new Range(row, column, row, column+range.length);
|
||||
firstRange = new Range(row, column, row, column + range.length);
|
||||
if (!range.length && options.start && options.start.start
|
||||
&& options.skipCurrent != false && firstRange.isEqual(options.start)
|
||||
) {
|
||||
firstRange = null;
|
||||
return false;
|
||||
}
|
||||
} else
|
||||
firstRange = range;
|
||||
return true;
|
||||
|
|
@ -240,8 +246,7 @@ var Search = function() {
|
|||
if (!re)
|
||||
return false;
|
||||
|
||||
var self = this, callback, backwards = options.backwards;
|
||||
|
||||
var callback;
|
||||
if (options.$isMultiLine) {
|
||||
var len = re.length;
|
||||
var matchIterator = function(line, row, offset) {
|
||||
|
|
@ -266,7 +271,7 @@ var Search = function() {
|
|||
if (callback(range))
|
||||
return true;
|
||||
};
|
||||
} else if (backwards) {
|
||||
} else if (options.backwards) {
|
||||
var matchIterator = function(line, row, startIndex) {
|
||||
var matches = lang.getMatchOffsets(line, re);
|
||||
for (var i = matches.length-1; i >= 0; i--)
|
||||
|
|
@ -281,11 +286,13 @@ var Search = function() {
|
|||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
var lineIterator = this.$lineIterator(session, options);
|
||||
|
||||
return {
|
||||
forEach: function(_callback) {
|
||||
callback = _callback;
|
||||
self.$lineIterator(session, options).forEach(matchIterator);
|
||||
lineIterator.forEach(matchIterator);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -36,6 +36,8 @@ define(function(require, exports, module) {
|
|||
"use strict";
|
||||
|
||||
var EditSession = require("./edit_session").EditSession;
|
||||
var MockRenderer = require("./test/mockrenderer").MockRenderer;
|
||||
var Editor = require("./editor").Editor;
|
||||
var Search = require("./search").Search;
|
||||
var assert = require("./test/assertions");
|
||||
|
||||
|
|
@ -451,6 +453,37 @@ module.exports = {
|
|||
assert.position(ranges[1].end, 0, 11);
|
||||
assert.position(ranges[0].start, 0, 0);
|
||||
assert.position(ranges[0].end, 0, 3);
|
||||
},
|
||||
|
||||
"test: find next empty range" : function() {
|
||||
var session = new EditSession("foo foobar foo");
|
||||
var editor = new Editor(new MockRenderer(), session);
|
||||
|
||||
var options = {
|
||||
needle: "o*",
|
||||
wrap: true,
|
||||
regExp: true,
|
||||
backwards: false
|
||||
};
|
||||
var positions = [4, 5.2, 7, 8, 9, 10, 11, 12.2, 14, 0, 1.2, 3];
|
||||
|
||||
session.selection.moveCursorTo(0, 3);
|
||||
for (var i = 0; i < 12; i++) {
|
||||
editor.find(options)
|
||||
var range = editor.selection.getRange();
|
||||
var start = range.start.column;
|
||||
var len = range.end.column - start;
|
||||
assert.equal(start + 0.1 * len, positions[i])
|
||||
}
|
||||
options.backwards = true;
|
||||
positions = [1.2, 1, 0, 14, 12.2, 12, 11, 10, 9, 8, 7, 5.2, 5, 4, 3];
|
||||
for (var i = 0; i < 16; i++) {
|
||||
editor.find(options);
|
||||
var range = editor.selection.getRange();
|
||||
var start = range.start.column;
|
||||
var len = range.end.column - start;
|
||||
console.log(start + 0.1 * len)
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue