kopia lustrzana https://github.com/c9/core
93 wiersze
2.8 KiB
JavaScript
93 wiersze
2.8 KiB
JavaScript
/**
|
|
* Cloud9 Language Foundation
|
|
*
|
|
* @copyright 2013, Ajax.org B.V.
|
|
*/
|
|
|
|
// contains language specific debugger bindings
|
|
define(function(require, exports, module) {
|
|
|
|
var baseLanguageHandler = require('plugins/c9.ide.language/base_handler');
|
|
|
|
var expressionBuilder = module.exports = Object.create(baseLanguageHandler);
|
|
|
|
/*** publics ***/
|
|
|
|
expressionBuilder.handlesLanguage = function(language) {
|
|
return language === "javascript" || language === "jsx";
|
|
};
|
|
|
|
// builds an expression for the v8 debugger based on a node
|
|
expressionBuilder.getInspectExpression = function(doc, fullAst, pos, options, callback) {
|
|
if (!options.node) return callback();
|
|
|
|
callback(getExpression(options.node));
|
|
};
|
|
|
|
/*** privates ***/
|
|
|
|
// get a string value of any expression
|
|
var getExpression = function(node) {
|
|
if (node.value)
|
|
return { value: node.value, pos: node.getPos() };
|
|
|
|
var result;
|
|
|
|
// TODO: simplify this; we can simply get the string
|
|
|
|
node.rewrite(
|
|
// var someVar = ...
|
|
'VarDeclInit(x, _)', 'ConstDeclInit(x, _)', function(b) {
|
|
node = b.x;
|
|
result = b.x.value;
|
|
},
|
|
// var someVar;
|
|
'VarDecl(x)', 'ConstDecl(x)', function(b) {
|
|
node = b.x;
|
|
result = b.x.value;
|
|
},
|
|
// e.x
|
|
'PropAccess(e, x)', function(b) {
|
|
result = getExpression(b.e) + "." + b.x.value;
|
|
},
|
|
// x
|
|
'Var(x)', function(b) {
|
|
result = b.x.value;
|
|
},
|
|
// 10
|
|
'Num(n)', function(b) {
|
|
result = b.n.value;
|
|
},
|
|
// e[idx]
|
|
'Index(e, idx)', function(b) {
|
|
result = getExpression(b.e) + "[" + getExpression(b.idx) + "]";
|
|
},
|
|
// new SomeThing(arg, ...)
|
|
'New(e, args)', function(b) {
|
|
var method = getExpression(b.e);
|
|
var args = b.args.toArray().map(getExpression).join(", ");
|
|
result = "new " + method + "(" + args + ")";
|
|
},
|
|
// x (function argument)
|
|
'FArg(x)', function(b) {
|
|
result = b.x.value;
|
|
},
|
|
// 10 + 4
|
|
'Op(op, e1, e2)', function(b) {
|
|
result = getExpression(b.e1) + " " + b.op.value + " " + getExpression(b.e2);
|
|
},
|
|
// if nuthin' else matches
|
|
function() {
|
|
if (!result)
|
|
result = "";
|
|
}
|
|
);
|
|
|
|
if (result === "")
|
|
return;
|
|
|
|
return { value: result, pos: node.getPos() };
|
|
};
|
|
|
|
});
|