From bd7de6b43b25faf5c449a16838b0204a6e0468ba Mon Sep 17 00:00:00 2001 From: nightwing Date: Tue, 28 Oct 2014 22:01:33 +0400 Subject: [PATCH] fix find next for regexps matching empty range --- lib/ace/search.js | 21 ++++++++++++++------- lib/ace/search_test.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/lib/ace/search.js b/lib/ace/search.js index c5119319..2785640b 100644 --- a/lib/ace/search.js +++ b/lib/ace/search.js @@ -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); } }; }; diff --git a/lib/ace/search_test.js b/lib/ace/search_test.js index 6e12a53e..3c27c4d8 100644 --- a/lib/ace/search_test.js +++ b/lib/ace/search_test.js @@ -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) + } } };