fix find next for regexps matching empty range

This commit is contained in:
nightwing 2014-10-28 22:01:33 +04:00
commit bd7de6b43b
2 changed files with 47 additions and 7 deletions

View file

@ -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);
}
};
};

View file

@ -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)
}
}
};