2017-02-06 12:40:24 +00:00

64 lines
2.2 KiB
JavaScript

define(function(require, exports, module) {
var index = require("./semantic_index");
var fileIndexer = require("./file_indexer");
var workerUtil = require("plugins/c9.ide.language/worker_util");
var handler;
var lastSummary;
module.exports.init = function(_handler) {
handler = _handler;
};
module.exports.getRefactorings = function(doc, fullAst, pos, options, callback) {
findEntries(doc, fullAst, pos, function(pos, identifier, hasEntries) {
callback({ refactorings: hasEntries ? ["renameVariable"] : []});
});
};
module.exports.getRenamePositions = function(doc, fullAst, pos, options, callback) {
findEntries(doc, fullAst, pos, function(pos, identifier, hasEntries) {
if (!hasEntries)
return callback();
workerUtil.getTokens(doc, [identifier, identifier + "()"], function(err, results) {
if (err)
callback();
callback({
length: identifier.length,
pos: pos,
others: results,
isGeneric: true
});
});
});
};
module.exports.commitRename = function(doc, oldId, newName, isGeneric, callback) {
if (!isGeneric)
return callback();
if (!lastSummary)
return callback();
var matchingDef = !!Object.keys(index.findEntries(lastSummary, newName)).length;
callback(matchingDef && "Name '" + newName + "' is already used.");
};
function findEntries(doc, fullAst, pos, callback) {
if (handler.language === "javascript") // optimization
return callback();
var docValue = doc.getValue();
var line = doc.getLine(pos.row);
var identifier = workerUtil.getIdentifier(line, pos.column);
var prefix = workerUtil.getPrecedingIdentifier(line, pos.column);
var realPos = { row: pos.row, column: pos.column - prefix.length };
fileIndexer.analyzeCurrent(handler.path, docValue, fullAst, { service: "refactor" }, function(err, result) {
if (err)
console.log("[jsonalyzer] Warning: could not analyze " + handler.path + ": " + err);
lastSummary = result;
callback(realPos, identifier, index.hasEntries(result, identifier));
});
}
});