c9-core/plugins/c9.ide.language.javascript..../immediate_complete.js

65 wiersze
1.6 KiB
JavaScript

define(function(require, exports, module) {
var baseLanguageHandler = require('plugins/c9.ide.language/base_handler');
var handler = module.exports = Object.create(baseLanguageHandler);
handler.handlesLanguage = function(language) {
return language === "javascript";
};
handler.handlesEditor = function() {
return this.HANDLES_IMMEDIATE;
};
var requestId = 0;
handler.complete = function(doc, fullAst, pos, options, callback) {
var currentNode = options.node;
if (!currentNode || !currentNode.getPos())
return callback();
if (!isSafe(currentNode))
return callback();
var expr = getExpression(doc, currentNode.getPos());
var myRequestId = ++requestId;
this.sender.once("js_immediate_complete_results", function(e) {
if (myRequestId !== e.data.id)
return;
callback(e.data.results);
});
this.sender.emit(
"js_immediate_complete",
{
immediateWindow: this.immediateWindow,
expr: expr,
id: myRequestId
}
);
};
function isSafe(node) {
var badNodes = node.collectTopDown(
"Call(x, _)", function(b) {
return !b.x.rewrite('Var("require")');
}
);
return !badNodes.length && ["Call", "PropAccess", "Var"].indexOf(node.cons) > -1;
}
function getExpression(doc, pos) {
if (pos.sl === pos.el) {
return doc.getLine(pos.sl).substring(pos.sc, pos.ec);
}
var result = doc.getLine(pos.sl).substr(pos.sc);
for (var i = pos.sl + 1; i < pos.el; i++) {
result += doc.getLine(i);
}
result += doc.getLine(pos.el).substr(0, pos.ec);
return result;
}
});