blob: 96ee2b55a822f5d53dafa682dfc32f59cd556ada [file] [log] [blame]
// Copyright (c) 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @constructor
* @param {!CodeMirror} codeMirror
* @param {string=} additionalWordChars
*/
WebInspector.CodeMirrorDictionary = function(codeMirror, additionalWordChars)
{
this._codeMirror = codeMirror;
this._additionalWordChars = new Set(/** @type {!Iterable} */ (additionalWordChars));
this._dictionary = new WebInspector.TextDictionary();
this._addText(this._codeMirror.getValue());
this._changes = this._changes.bind(this);
this._beforeChange = this._beforeChange.bind(this);
this._codeMirror.on("beforeChange", this._beforeChange);
this._codeMirror.on("changes", this._changes);
}
WebInspector.CodeMirrorDictionary.prototype = {
/**
* @param {!CodeMirror} codeMirror
* @param {!CodeMirror.BeforeChangeObject} changeObject
*/
_beforeChange: function(codeMirror, changeObject)
{
this._updatedLines = this._updatedLines || {};
for (var i = changeObject.from.line; i <= changeObject.to.line; ++i)
this._updatedLines[i] = this._codeMirror.getLine(i);
},
/**
* @param {!CodeMirror} codeMirror
* @param {!Array.<!CodeMirror.ChangeObject>} changes
*/
_changes: function(codeMirror, changes)
{
if (!changes.length || !this._updatedLines)
return;
for (var lineNumber in this._updatedLines)
this._removeText(this._updatedLines[lineNumber]);
delete this._updatedLines;
var linesToUpdate = {};
for (var changeIndex = 0; changeIndex < changes.length; ++changeIndex) {
var changeObject = changes[changeIndex];
var editInfo = WebInspector.CodeMirrorUtils.changeObjectToEditOperation(changeObject);
for (var i = editInfo.newRange.startLine; i <= editInfo.newRange.endLine; ++i)
linesToUpdate[i] = this._codeMirror.getLine(i);
}
for (var lineNumber in linesToUpdate)
this._addText(linesToUpdate[lineNumber]);
},
/**
* @param {string} word
* @return {boolean}
*/
_validWord: function(word)
{
return !!word.length && (word[0] < '0' || word[0] > '9');
},
/**
* @param {string} text
*/
_addText: function(text)
{
WebInspector.TextUtils.textToWords(text, this.isWordChar.bind(this), addWord.bind(this));
/**
* @param {string} word
* @this {WebInspector.CodeMirrorDictionary}
*/
function addWord(word)
{
if (this._validWord(word))
this._dictionary.addWord(word);
}
},
/**
* @param {string} text
*/
_removeText: function(text)
{
WebInspector.TextUtils.textToWords(text, this.isWordChar.bind(this), removeWord.bind(this));
/**
* @param {string} word
* @this {WebInspector.CodeMirrorDictionary}
*/
function removeWord(word)
{
if (this._validWord(word))
this._dictionary.removeWord(word);
}
},
/**
* @param {string} char
* @return {boolean}
*/
isWordChar: function(char)
{
return WebInspector.TextUtils.isWordChar(char) || this._additionalWordChars.has(char);
},
/**
* @param {string} prefix
* @return {!Array.<string>}
*/
wordsWithPrefix: function(prefix)
{
return this._dictionary.wordsWithPrefix(prefix);
},
/**
* @param {string} word
* @return {boolean}
*/
hasWord: function(word)
{
return this._dictionary.hasWord(word);
},
/**
* @param {string} word
* @return {number}
*/
wordCount: function(word)
{
return this._dictionary.wordCount(word);
},
dispose: function()
{
this._codeMirror.off("beforeChange", this._beforeChange);
this._codeMirror.off("changes", this._changes);
this._dictionary.reset();
},
}