Reactive-Extensions/RxJS

View on GitHub
src/core/expressions/compiler.js

Summary

Maintainability
F
3 wks
Test Coverage
File `compiler.js` has 1050 lines of code (exceeds 250 allowed). Consider refactoring.
var __extends = this.__extends || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
__.prototype = b.prototype;
d.prototype = new __();
};
Function `Expression` has 107 lines of code (exceeds 25 allowed). Consider refactoring.
Function `Expression` has a Cognitive Complexity of 10 (exceeds 5 allowed). Consider refactoring.
var Expression = (function () {
function Expression(nodeType) {
this.nodeType = nodeType;
}
Expression.prototype.accept = function (visitor) {
throw new Error("not implemented");
};
Expression.prototype.acceptGeneric = function (visitor) {
throw new Error("not implemented");
};
Expression.prototype.toString = function () {
return new PrintVisitor().visit(this);
};
Expression.prototype.toBonsai = function () {
return new BonsaiVisitor().visit(this);
};
Expression.constant = function (value) {
return new ConstantExpression(value);
};
Expression.parameter = function (name) {
return new ParameterExpression(name);
};
Expression.condition = function (test, ifTrue, ifFalse) {
return new ConditionalExpression(test, ifTrue, ifFalse);
};
Expression.add = function (left, right) {
return new BinaryExpression(3 /* Add */, left, right);
};
Expression.subtract = function (left, right) {
return new BinaryExpression(4 /* Subtract */, left, right);
};
Expression.multiply = function (left, right) {
return new BinaryExpression(5 /* Multiply */, left, right);
};
Expression.divide = function (left, right) {
return new BinaryExpression(6 /* Divide */, left, right);
};
Expression.modulo = function (left, right) {
return new BinaryExpression(7 /* Modulo */, left, right);
};
Expression.and = function (left, right) {
return new BinaryExpression(8 /* And */, left, right);
};
Expression.andAlso = function (left, right) {
return new BinaryExpression(10 /* AndAlso */, left, right);
};
Expression.or = function (left, right) {
return new BinaryExpression(9 /* Or */, left, right);
};
Expression.orElse = function (left, right) {
return new BinaryExpression(11 /* OrElse */, left, right);
};
Expression.exclusiveOr = function (left, right) {
return new BinaryExpression(12 /* ExclusiveOr */, left, right);
};
Expression.equal = function (left, right) {
return new BinaryExpression(13 /* Equal */, left, right);
};
Expression.notEqual = function (left, right) {
return new BinaryExpression(14 /* NotEqual */, left, right);
};
Expression.lessThan = function (left, right) {
return new BinaryExpression(15 /* LessThan */, left, right);
};
Expression.lessThanOrEqual = function (left, right) {
return new BinaryExpression(16 /* LessThanOrEqual */, left, right);
};
Expression.greaterThan = function (left, right) {
return new BinaryExpression(17 /* GreaterThan */, left, right);
};
Expression.greaterThanOrEqual = function (left, right) {
return new BinaryExpression(18 /* GreaterThanOrEqual */, left, right);
};
Expression.leftShift = function (left, right) {
return new BinaryExpression(19 /* LeftShift */, left, right);
};
Expression.rightShift = function (left, right) {
return new BinaryExpression(20 /* RightShift */, left, right);
};
Expression.not = function (operand) {
return new UnaryExpression(22 /* Not */, operand);
};
Expression.unaryPlus = function (operand) {
return new UnaryExpression(24 /* UnaryPlus */, operand);
};
Expression.negate = function (operand) {
return new UnaryExpression(23 /* Negate */, operand);
};
Expression.onesComplement = function (operand) {
return new UnaryExpression(25 /* OnesComplement */, operand);
};
Similar blocks of code found in 4 locations. Consider refactoring.
Expression.lambda = function (body) {
var parameters = [];
for (var _i = 1; _i < arguments.length; _i++) {
parameters[_i - 1] = arguments[_i];
}
return new LambdaExpression(body, parameters);
};
Similar blocks of code found in 4 locations. Consider refactoring.
Expression.invoke = function (expression) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
return new InvocationExpression(expression, args);
};
Similar blocks of code found in 4 locations. Consider refactoring.
Expression.new = function (typeName) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
return new NewExpression(typeName, args);
};
Expression.functionCall = function (obj, methodName) {
var args = [];
for (var _i = 2; _i < arguments.length; _i++) {
args[_i - 2] = arguments[_i];
}
return new FunctionCallExpression(obj, methodName, args);
};
Expression.member = function (obj, memberName) {
return new MemberExpression(obj, memberName);
};
Similar blocks of code found in 4 locations. Consider refactoring.
Expression.index = function (obj) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
return new IndexExpression(obj, args);
};
return Expression;
})();
Function `ExpressionVisitorGeneric` has 51 lines of code (exceeds 25 allowed). Consider refactoring.
var ExpressionVisitorGeneric = (function () {
function ExpressionVisitorGeneric() {
}
Similar blocks of code found in 2 locations. Consider refactoring.
ExpressionVisitorGeneric.prototype.visit = function (node) {
if (node === null) {
return null;
}
return node.acceptGeneric(this);
};
ExpressionVisitorGeneric.prototype.visitConstant = function (node) {
throw new Error("not implemented");
};
ExpressionVisitorGeneric.prototype.visitParameter = function (node) {
throw new Error("not implemented");
};
ExpressionVisitorGeneric.prototype.visitBinary = function (node) {
throw new Error("not implemented");
};
ExpressionVisitorGeneric.prototype.visitUnary = function (node) {
throw new Error("not implemented");
};
ExpressionVisitorGeneric.prototype.visitConditional = function (node) {
throw new Error("not implemented");
};
ExpressionVisitorGeneric.prototype.visitLambda = function (node) {
throw new Error("not implemented");
};
ExpressionVisitorGeneric.prototype.visitInvoke = function (node) {
throw new Error("not implemented");
};
ExpressionVisitorGeneric.prototype.visitCall = function (node) {
throw new Error("not implemented");
};
ExpressionVisitorGeneric.prototype.visitNew = function (node) {
throw new Error("not implemented");
};
ExpressionVisitorGeneric.prototype.visitMember = function (node) {
throw new Error("not implemented");
};
ExpressionVisitorGeneric.prototype.visitIndex = function (node) {
throw new Error("not implemented");
};
Similar blocks of code found in 2 locations. Consider refactoring.
ExpressionVisitorGeneric.prototype.visitMany = function (nodes) {
var res = new Array(nodes.length);
for (var i = 0; i < nodes.length; i++) {
var oldNode = nodes[i];
var newNode = this.visit(oldNode);
res[i] = newNode;
}
return res;
};
return ExpressionVisitorGeneric;
})();
Function `ExpressionVisitor` has 51 lines of code (exceeds 25 allowed). Consider refactoring.
var ExpressionVisitor = (function () {
function ExpressionVisitor() {
}
Similar blocks of code found in 2 locations. Consider refactoring.
ExpressionVisitor.prototype.visit = function (node) {
if (node === null) {
return null;
}
return node.accept(this);
};
ExpressionVisitor.prototype.visitConstant = function (node) {
return node;
};
ExpressionVisitor.prototype.visitParameter = function (node) {
return node;
};
Similar blocks of code found in 5 locations. Consider refactoring.
ExpressionVisitor.prototype.visitBinary = function (node) {
return node.update(this.visit(node.left), this.visit(node.right));
};
ExpressionVisitor.prototype.visitUnary = function (node) {
return node.update(this.visit(node.operand));
};
ExpressionVisitor.prototype.visitConditional = function (node) {
return node.update(this.visit(node.test), this.visit(node.ifTrue), this.visit(node.ifFalse));
};
Similar blocks of code found in 5 locations. Consider refactoring.
ExpressionVisitor.prototype.visitLambda = function (node) {
return node.update(this.visit(node.body), this.visitMany(node.parameters));
};
Similar blocks of code found in 5 locations. Consider refactoring.
ExpressionVisitor.prototype.visitInvoke = function (node) {
return node.update(this.visit(node.expression), this.visitMany(node.args));
};
Similar blocks of code found in 5 locations. Consider refactoring.
ExpressionVisitor.prototype.visitCall = function (node) {
return node.update(this.visit(node.obj), this.visitMany(node.args));
};
ExpressionVisitor.prototype.visitNew = function (node) {
return node.update(this.visitMany(node.args));
};
ExpressionVisitor.prototype.visitMember = function (node) {
return node.update(this.visit(node.obj));
};
Similar blocks of code found in 5 locations. Consider refactoring.
ExpressionVisitor.prototype.visitIndex = function (node) {
return node.update(this.visit(node.obj), this.visitMany(node.args));
};
Similar blocks of code found in 2 locations. Consider refactoring.
ExpressionVisitor.prototype.visitMany = function (nodes) {
var res = new Array(nodes.length);
for (var i = 0; i < nodes.length; i++) {
var oldNode = nodes[i];
var newNode = this.visit(oldNode);
res[i] = newNode;
}
return res;
};
return ExpressionVisitor;
})();
Similar blocks of code found in 2 locations. Consider refactoring.
var ConstantExpression = (function (_super) {
__extends(ConstantExpression, _super);
function ConstantExpression(value) {
_super.call(this, 0 /* Constant */);
this._value = value;
}
Object.defineProperty(ConstantExpression.prototype, "value", {
get: function () {
return this._value;
},
enumerable: true,
configurable: true
});
ConstantExpression.prototype.accept = function (visitor) {
return visitor.visitConstant(this);
};
ConstantExpression.prototype.acceptGeneric = function (visitor) {
return visitor.visitConstant(this);
};
return ConstantExpression;
})(Expression);
Similar blocks of code found in 2 locations. Consider refactoring.
var ParameterExpression = (function (_super) {
__extends(ParameterExpression, _super);
function ParameterExpression(name) {
_super.call(this, 1 /* Parameter */);
this._name = name;
}
Object.defineProperty(ParameterExpression.prototype, "name", {
get: function () {
return this._name;
},
enumerable: true,
configurable: true
});
ParameterExpression.prototype.accept = function (visitor) {
return visitor.visitParameter(this);
};
ParameterExpression.prototype.acceptGeneric = function (visitor) {
return visitor.visitParameter(this);
};
return ParameterExpression;
})(Expression);
var UnaryExpression = (function (_super) {
__extends(UnaryExpression, _super);
function UnaryExpression(nodeType, operand) {
_super.call(this, nodeType);
this._operand = operand;
}
Object.defineProperty(UnaryExpression.prototype, "operand", {
get: function () {
return this._operand;
},
enumerable: true,
configurable: true
});
UnaryExpression.prototype.accept = function (visitor) {
return visitor.visitUnary(this);
};
UnaryExpression.prototype.acceptGeneric = function (visitor) {
return visitor.visitUnary(this);
};
Similar blocks of code found in 2 locations. Consider refactoring.
UnaryExpression.prototype.update = function (operand) {
if (operand !== this._operand) {
return new UnaryExpression(this.nodeType, operand);
}
return this;
};
return UnaryExpression;
})(Expression);
Function `BinaryExpression` has 33 lines of code (exceeds 25 allowed). Consider refactoring.
var BinaryExpression = (function (_super) {
__extends(BinaryExpression, _super);
function BinaryExpression(nodeType, left, right) {
_super.call(this, nodeType);
this._left = left;
this._right = right;
}
Object.defineProperty(BinaryExpression.prototype, "left", {
get: function () {
return this._left;
},
enumerable: true,
configurable: true
});
Object.defineProperty(BinaryExpression.prototype, "right", {
get: function () {
return this._right;
},
enumerable: true,
configurable: true
});
BinaryExpression.prototype.accept = function (visitor) {
return visitor.visitBinary(this);
};
BinaryExpression.prototype.acceptGeneric = function (visitor) {
return visitor.visitBinary(this);
};
BinaryExpression.prototype.update = function (left, right) {
if (left !== this._left || right !== this._right) {
return new BinaryExpression(this.nodeType, left, right);
}
return this;
};
return BinaryExpression;
})(Expression);
Function `ConditionalExpression` has 40 lines of code (exceeds 25 allowed). Consider refactoring.
var ConditionalExpression = (function (_super) {
__extends(ConditionalExpression, _super);
Similar blocks of code found in 2 locations. Consider refactoring.
function ConditionalExpression(test, ifTrue, ifFalse) {
_super.call(this, 26 /* Condition */);
this._test = test;
this._ifTrue = ifTrue;
this._ifFalse = ifFalse;
}
Object.defineProperty(ConditionalExpression.prototype, "test", {
get: function () {
return this._test;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ConditionalExpression.prototype, "ifTrue", {
get: function () {
return this._ifTrue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ConditionalExpression.prototype, "ifFalse", {
get: function () {
return this._ifTrue;
},
enumerable: true,
configurable: true
});
ConditionalExpression.prototype.accept = function (visitor) {
return visitor.visitConditional(this);
};
ConditionalExpression.prototype.acceptGeneric = function (visitor) {
return visitor.visitConditional(this);
};
ConditionalExpression.prototype.update = function (test, ifTrue, ifFalse) {
if (test !== this._test || ifTrue !== this._ifTrue || ifFalse !== this._ifFalse) {
return new ConditionalExpression(test, ifTrue, ifFalse);
}
return this;
};
return ConditionalExpression;
})(Expression);
Function `LambdaExpression` has 48 lines of code (exceeds 25 allowed). Consider refactoring.
var LambdaExpression = (function (_super) {
__extends(LambdaExpression, _super);
function LambdaExpression(body, parameters) {
_super.call(this, 2 /* Lambda */);
this._body = body;
this._parameters = parameters;
}
Object.defineProperty(LambdaExpression.prototype, "body", {
get: function () {
return this._body;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LambdaExpression.prototype, "parameters", {
get: function () {
return this._parameters;
},
enumerable: true,
configurable: true
});
LambdaExpression.prototype.accept = function (visitor) {
return visitor.visitLambda(this);
};
LambdaExpression.prototype.acceptGeneric = function (visitor) {
return visitor.visitLambda(this);
};
LambdaExpression.prototype.update = function (body, parameters) {
if (body !== this._body || parameters !== this._parameters) {
return new LambdaExpression(body, parameters);
}
return this;
};
LambdaExpression.prototype.compileToFunction = function (debug) {
var comp = new LambdaCompiler();
comp.visit(this);
var code = comp.code;
code = code.replace(/\"/g, "\\\""); // TODO: more escape sequences
code = "new Function(\"return " + code + ";\")";
code = code.replace(/\r?\n|\r/g, "");
if (debug) {
alert(code);
}
return code;
};
LambdaExpression.prototype.compile = function (debug) {
var code = this.compileToFunction(debug);
return eval(code)();
};
return LambdaExpression;
})(Expression);
Function `InvocationExpression` has 32 lines of code (exceeds 25 allowed). Consider refactoring.
Similar blocks of code found in 2 locations. Consider refactoring.
var InvocationExpression = (function (_super) {
__extends(InvocationExpression, _super);
function InvocationExpression(expression, args) {
_super.call(this, 21 /* Invoke */);
this._expression = expression;
this._args = args;
}
Object.defineProperty(InvocationExpression.prototype, "expression", {
get: function () {
return this._expression;
},
enumerable: true,
configurable: true
});
Object.defineProperty(InvocationExpression.prototype, "args", {
get: function () {
return this._args;
},
enumerable: true,
configurable: true
});
InvocationExpression.prototype.accept = function (visitor) {
return visitor.visitInvoke(this);
};
InvocationExpression.prototype.acceptGeneric = function (visitor) {
return visitor.visitInvoke(this);
};
InvocationExpression.prototype.update = function (expression, args) {
if (expression !== this._expression || args !== this._args) {
return new InvocationExpression(expression, args);
}
return this;
};
return InvocationExpression;
})(Expression);
Function `FunctionCallExpression` has 40 lines of code (exceeds 25 allowed). Consider refactoring.
var FunctionCallExpression = (function (_super) {
__extends(FunctionCallExpression, _super);
Similar blocks of code found in 2 locations. Consider refactoring.
function FunctionCallExpression(expression, methodName, args) {
_super.call(this, 28 /* Call */);
this._expression = expression;
this._method = methodName;
this._args = args;
}
Object.defineProperty(FunctionCallExpression.prototype, "obj", {
get: function () {
return this._expression;
},
enumerable: true,
configurable: true
});
Object.defineProperty(FunctionCallExpression.prototype, "method", {
get: function () {
return this._method;
},
enumerable: true,
configurable: true
});
Object.defineProperty(FunctionCallExpression.prototype, "args", {
get: function () {
return this._args;
},
enumerable: true,
configurable: true
});
FunctionCallExpression.prototype.accept = function (visitor) {
return visitor.visitCall(this);
};
FunctionCallExpression.prototype.acceptGeneric = function (visitor) {
return visitor.visitCall(this);
};
FunctionCallExpression.prototype.update = function (expression, args) {
if (expression !== this._expression || args !== this._args) {
return new FunctionCallExpression(expression, this._method, args);
}
return this;
};
return FunctionCallExpression;
})(Expression);
Function `IndexExpression` has 32 lines of code (exceeds 25 allowed). Consider refactoring.
Similar blocks of code found in 2 locations. Consider refactoring.
var IndexExpression = (function (_super) {
__extends(IndexExpression, _super);
function IndexExpression(expression, args) {
_super.call(this, 30 /* Index */);
this._expression = expression;
this._args = args;
}
Object.defineProperty(IndexExpression.prototype, "obj", {
get: function () {
return this._expression;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IndexExpression.prototype, "args", {
get: function () {
return this._args;
},
enumerable: true,
configurable: true
});
IndexExpression.prototype.accept = function (visitor) {
return visitor.visitIndex(this);
};
IndexExpression.prototype.acceptGeneric = function (visitor) {
return visitor.visitIndex(this);
};
IndexExpression.prototype.update = function (expression, args) {
if (expression !== this._expression || args !== this._args) {
return new IndexExpression(expression, args);
}
return this;
};
return IndexExpression;
})(Expression);
Function `NewExpression` has 32 lines of code (exceeds 25 allowed). Consider refactoring.
var NewExpression = (function (_super) {
__extends(NewExpression, _super);
function NewExpression(typeName, args) {
_super.call(this, 27 /* New */);
this._type = typeName;
this._args = args;
}
Object.defineProperty(NewExpression.prototype, "type", {
get: function () {
return this._type;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NewExpression.prototype, "args", {
get: function () {
return this._args;
},
enumerable: true,
configurable: true
});
NewExpression.prototype.accept = function (visitor) {
return visitor.visitNew(this);
};
NewExpression.prototype.acceptGeneric = function (visitor) {
return visitor.visitNew(this);
};
Similar blocks of code found in 2 locations. Consider refactoring.
NewExpression.prototype.update = function (args) {
if (args !== this._args) {
return new NewExpression(this._type, args);
}
return this;
};
return NewExpression;
})(Expression);
Function `MemberExpression` has 32 lines of code (exceeds 25 allowed). Consider refactoring.
var MemberExpression = (function (_super) {
__extends(MemberExpression, _super);
function MemberExpression(obj, memberName) {
_super.call(this, 29 /* Member */);
this._obj = obj;
this._member = memberName;
}
Object.defineProperty(MemberExpression.prototype, "obj", {
get: function () {
return this._obj;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MemberExpression.prototype, "member", {
get: function () {
return this._member;
},
enumerable: true,
configurable: true
});
MemberExpression.prototype.accept = function (visitor) {
return visitor.visitMember(this);
};
MemberExpression.prototype.acceptGeneric = function (visitor) {
return visitor.visitMember(this);
};
MemberExpression.prototype.update = function (obj) {
if (obj !== this._obj) {
return new MemberExpression(obj, this._member);
}
return this;
};
return MemberExpression;
})(Expression);
Function `LambdaCompiler` has 194 lines of code (exceeds 25 allowed). Consider refactoring.
Function `LambdaCompiler` has a Cognitive Complexity of 25 (exceeds 5 allowed). Consider refactoring.
var LambdaCompiler = (function (_super) {
__extends(LambdaCompiler, _super);
function LambdaCompiler() {
_super.call(this);
this._stack = new Array();
}
Object.defineProperty(LambdaCompiler.prototype, "code", {
get: function () {
if (this._stack.length != 1)
throw new Error("invalid code generation");
return this._stack[0];
},
enumerable: true,
configurable: true
});
LambdaCompiler.prototype.visitConstant = function (node) {
var value = "";
if (typeof node.value == "string") {
value = "\"" + node.value + "\""; // TODO: escape characters
}
else if (node.value instanceof Array) {
value = JSON.stringify(node.value);
}
else if (node.value === undefined) {
value = "undefined";
}
else {
value = node.value.toString(); // TODO
}
this._stack.push(value);
return node;
};
LambdaCompiler.prototype.visitUnary = function (node) {
this.visit(node.operand);
var o = this._stack.pop();
var i = "";
Identical blocks of code found in 2 locations. Consider refactoring.
switch (node.nodeType) {
case 23 /* Negate */:
i = "-";
break;
case 24 /* UnaryPlus */:
i = "+";
break;
case 22 /* Not */:
i = "!";
break;
case 25 /* OnesComplement */:
i = "~";
break;
}
var res = "(" + i + "" + o + ")";
this._stack.push(res);
return node;
};
Function `visitBinary` has 46 lines of code (exceeds 25 allowed). Consider refactoring.
LambdaCompiler.prototype.visitBinary = function (node) {
this.visit(node.left);
this.visit(node.right);
var r = this._stack.pop();
var l = this._stack.pop();
var i = "";
Identical blocks of code found in 2 locations. Consider refactoring.
switch (node.nodeType) {
case 3 /* Add */:
i = "+";
break;
case 4 /* Subtract */:
i = "-";
break;
case 5 /* Multiply */:
i = "*";
break;
case 6 /* Divide */:
i = "/";
break;
case 7 /* Modulo */:
i = "%";
break;
case 8 /* And */:
i = "&";
break;
case 9 /* Or */:
i = "|";
break;
case 10 /* AndAlso */:
i = "&&";
break;
case 11 /* OrElse */:
i = "||";
break;
case 12 /* ExclusiveOr */:
i = "^";
break;
case 13 /* Equal */:
i = "===";
break;
case 14 /* NotEqual */:
i = "!==";
break;
case 15 /* LessThan */:
i = "<";
break;
case 16 /* LessThanOrEqual */:
i = "<=";
break;
case 17 /* GreaterThan */:
i = ">";
break;
case 18 /* GreaterThanOrEqual */:
i = ">=";
break;
case 19 /* LeftShift */:
i = "<<";
break;
case 20 /* RightShift */:
i = ">>";
break;
}
var res = "(" + l + " " + i + " " + r + ")";
this._stack.push(res);
return node;
};
LambdaCompiler.prototype.visitConditional = function (node) {
this.visit(node.test);
this.visit(node.ifTrue);
this.visit(node.ifFalse);
var f = this._stack.pop();
var t = this._stack.pop();
var c = this._stack.pop();
var res = "(" + c + " ? " + t + " : " + f + ")";
this._stack.push(res);
return node;
};
LambdaCompiler.prototype.visitParameter = function (node) {
this._stack.push(node.name);
return node;
};
LambdaCompiler.prototype.visitLambda = function (node) {
this.visitMany(node.parameters);
this.visit(node.body);
var body = this._stack.pop();
var n = node.parameters.length;
var args = new Array(n);
Identical blocks of code found in 5 locations. Consider refactoring.
for (var i = 0; i < n; i++) {
args[n - i - 1] = this._stack.pop();
}
var allArgs = args.join(", ");
var res = "function(" + allArgs + ") { return " + body + "; }";
this._stack.push(res);
return node;
};
LambdaCompiler.prototype.visitInvoke = function (node) {
this.visit(node.expression);
this.visitMany(node.args);
var n = node.args.length;
var args = new Array(n);
Identical blocks of code found in 5 locations. Consider refactoring.
for (var i = 0; i < n; i++) {
args[n - i - 1] = this._stack.pop();
}
var argList = args.join(", ");
var func = this._stack.pop();
var res = func + "(" + argList + ")";
this._stack.push(res);
return node;
};
LambdaCompiler.prototype.visitCall = function (node) {
var res = "";
Identical blocks of code found in 2 locations. Consider refactoring.
if (node.obj !== null) {
this.visit(node.obj);
res = this._stack.pop() + ".";
}
this.visitMany(node.args);
var n = node.args.length;
var args = new Array(n);
Identical blocks of code found in 5 locations. Consider refactoring.
for (var i = 0; i < n; i++) {
args[n - i - 1] = this._stack.pop();
}
var argList = args.join(", ");
res += node.method + "(" + argList + ")";
this._stack.push(res);
return node;
};
LambdaCompiler.prototype.visitNew = function (node) {
this.visitMany(node.args);
var n = node.args.length;
var args = new Array(n);
Identical blocks of code found in 5 locations. Consider refactoring.
for (var i = 0; i < n; i++) {
args[n - i - 1] = this._stack.pop();
}
var argList = args.join(", ");
var res = "new " + node.type + "(" + argList + ")";
this._stack.push(res);
return node;
};
LambdaCompiler.prototype.visitMember = function (node) {
var res = "";
Identical blocks of code found in 2 locations. Consider refactoring.
if (node.obj !== null) {
this.visit(node.obj);
res = this._stack.pop() + ".";
}
res += node.member;
this._stack.push(res);
return node;
};
LambdaCompiler.prototype.visitIndex = function (node) {
this.visit(node.obj);
var res = this._stack.pop();
this.visitMany(node.args);
var n = node.args.length;
var args = new Array(n);
Identical blocks of code found in 5 locations. Consider refactoring.
for (var i = 0; i < n; i++) {
args[n - i - 1] = this._stack.pop();
}
var argList = args.join(", ");
res += "[" + argList + "]";
this._stack.push(res);
return node;
};
return LambdaCompiler;
})(ExpressionVisitor);
Function `FreeVariableScanner` has 33 lines of code (exceeds 25 allowed). Consider refactoring.
Function `FreeVariableScanner` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.
var FreeVariableScanner = (function (_super) {
__extends(FreeVariableScanner, _super);
function FreeVariableScanner() {
_super.call(this);
this._stack = new Array();
this._result = new Array();
}
Object.defineProperty(FreeVariableScanner.prototype, "result", {
get: function () {
return this._result;
},
enumerable: true,
configurable: true
});
FreeVariableScanner.prototype.visitParameter = function (node) {
var found = false;
Identical blocks of code found in 2 locations. Consider refactoring.
for (var i = this._stack.length - 1; i >= 0; i--) {
if (this._stack[i].indexOf(node) >= 0) {
found = true;
break;
}
}
if (!found) {
this._result.push(node);
}
return node;
};
Similar blocks of code found in 2 locations. Consider refactoring.
FreeVariableScanner.prototype.visitLambda = function (node) {
this._stack.push(node.parameters);
this.visit(node.body);
this._stack.pop();
return node;
};
return FreeVariableScanner;
})(ExpressionVisitor);
var ExpressionType;
(function (ExpressionType) {
ExpressionType[ExpressionType["Constant"] = 0] = "Constant";
ExpressionType[ExpressionType["Parameter"] = 1] = "Parameter";
ExpressionType[ExpressionType["Lambda"] = 2] = "Lambda";
ExpressionType[ExpressionType["Add"] = 3] = "Add";
ExpressionType[ExpressionType["Subtract"] = 4] = "Subtract";
ExpressionType[ExpressionType["Multiply"] = 5] = "Multiply";
ExpressionType[ExpressionType["Divide"] = 6] = "Divide";
ExpressionType[ExpressionType["Modulo"] = 7] = "Modulo";
ExpressionType[ExpressionType["And"] = 8] = "And";
ExpressionType[ExpressionType["Or"] = 9] = "Or";
ExpressionType[ExpressionType["AndAlso"] = 10] = "AndAlso";
ExpressionType[ExpressionType["OrElse"] = 11] = "OrElse";
ExpressionType[ExpressionType["ExclusiveOr"] = 12] = "ExclusiveOr";
ExpressionType[ExpressionType["Equal"] = 13] = "Equal";
ExpressionType[ExpressionType["NotEqual"] = 14] = "NotEqual";
ExpressionType[ExpressionType["LessThan"] = 15] = "LessThan";
ExpressionType[ExpressionType["LessThanOrEqual"] = 16] = "LessThanOrEqual";
ExpressionType[ExpressionType["GreaterThan"] = 17] = "GreaterThan";
ExpressionType[ExpressionType["GreaterThanOrEqual"] = 18] = "GreaterThanOrEqual";
ExpressionType[ExpressionType["LeftShift"] = 19] = "LeftShift";
ExpressionType[ExpressionType["RightShift"] = 20] = "RightShift";
ExpressionType[ExpressionType["Invoke"] = 21] = "Invoke";
ExpressionType[ExpressionType["Not"] = 22] = "Not";
ExpressionType[ExpressionType["Negate"] = 23] = "Negate";
ExpressionType[ExpressionType["UnaryPlus"] = 24] = "UnaryPlus";
ExpressionType[ExpressionType["OnesComplement"] = 25] = "OnesComplement";
ExpressionType[ExpressionType["Condition"] = 26] = "Condition";
ExpressionType[ExpressionType["New"] = 27] = "New";
ExpressionType[ExpressionType["Call"] = 28] = "Call";
ExpressionType[ExpressionType["Member"] = 29] = "Member";
ExpressionType[ExpressionType["Index"] = 30] = "Index";
})(ExpressionType || (ExpressionType = {}));
Function `Binder` has 26 lines of code (exceeds 25 allowed). Consider refactoring.
Function `Binder` has a Cognitive Complexity of 7 (exceeds 5 allowed). Consider refactoring.
var Binder = (function (_super) {
__extends(Binder, _super);
function Binder(resources) {
_super.call(this);
this._stack = new Array();
this._resources = resources;
}
Binder.prototype.visitParameter = function (node) {
var found = false;
Identical blocks of code found in 2 locations. Consider refactoring.
for (var i = this._stack.length - 1; i >= 0; i--) {
if (this._stack[i].indexOf(node) >= 0) {
found = true;
break;
}
}
if (!found) {
return Expression.constant(this._resources[node.name]);
}
return node;
};
Similar blocks of code found in 2 locations. Consider refactoring.
Binder.prototype.visitLambda = function (node) {
this._stack.push(node.parameters);
this.visit(node.body);
this._stack.pop();
return node;
};
return Binder;
})(ExpressionVisitor);
Function `PrintVisitor` has 60 lines of code (exceeds 25 allowed). Consider refactoring.
Function `PrintVisitor` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.
var PrintVisitor = (function (_super) {
__extends(PrintVisitor, _super);
function PrintVisitor() {
_super.apply(this, arguments);
}
PrintVisitor.prototype.visitConstant = function (node) {
return "Constant(" + node.value + ")";
};
PrintVisitor.prototype.visitParameter = function (node) {
return "Parameter(" + node.name + ")";
};
PrintVisitor.prototype.visitBinary = function (node) {
return ExpressionType[node.nodeType] + "(" + this.visit(node.left) + ", " + this.visit(node.right) + ")";
};
PrintVisitor.prototype.visitUnary = function (node) {
return ExpressionType[node.nodeType] + "(" + this.visit(node.operand) + ")";
};
PrintVisitor.prototype.visitConditional = function (node) {
return "Conditional(" + this.visit(node.test) + ", " + this.visit(node.ifTrue) + ", " + this.visit(node.ifFalse) + ")";
};
Similar blocks of code found in 2 locations. Consider refactoring.
PrintVisitor.prototype.visitLambda = function (node) {
var body = this.visit(node.body);
var children = this.visitMany(node.parameters);
children.unshift(body);
return "Lambda(" + children.join(", ") + ")";
};
Similar blocks of code found in 2 locations. Consider refactoring.
PrintVisitor.prototype.visitInvoke = function (node) {
var expression = this.visit(node.expression);
var children = this.visitMany(node.args);
children.unshift(expression);
return "Invoke(" + children.join(", ") + ")";
};
PrintVisitor.prototype.visitCall = function (node) {
var children = this.visitMany(node.args);
if (node.obj != null) {
children.unshift(this.visit(node.obj));
}
children.unshift(node.method);
return "Call(" + children.join(", ") + ")";
};
PrintVisitor.prototype.visitNew = function (node) {
var children = this.visitMany(node.args);
children.unshift(node.type);
return "New(" + children.join(", ") + ")";
};
PrintVisitor.prototype.visitMember = function (node) {
var children = [];
if (node.obj != null) {
children.unshift(this.visit(node.obj));
}
children.unshift(node.member);
return "Member(" + children.join(", ") + ")";
};
PrintVisitor.prototype.visitIndex = function (node) {
var children = this.visitMany(node.args);
if (node.obj != null) {
children.unshift(this.visit(node.obj));
}
return "Index(" + children.join(", ") + ")";
};
return PrintVisitor;
})(ExpressionVisitorGeneric);
Function `BonsaiVisitor` has 100 lines of code (exceeds 25 allowed). Consider refactoring.
Function `BonsaiVisitor` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.
var BonsaiVisitor = (function (_super) {
__extends(BonsaiVisitor, _super);
function BonsaiVisitor() {
_super.apply(this, arguments);
}
BonsaiVisitor.prototype.visitConstant = function (node) {
return [":", node.value];
};
BonsaiVisitor.prototype.visitParameter = function (node) {
return ["$", node.name];
};
Function `visitBinary` has 40 lines of code (exceeds 25 allowed). Consider refactoring.
BonsaiVisitor.prototype.visitBinary = function (node) {
var i = "";
Identical blocks of code found in 2 locations. Consider refactoring.
switch (node.nodeType) {
case 3 /* Add */:
i = "+";
break;
case 4 /* Subtract */:
i = "-";
break;
case 5 /* Multiply */:
i = "*";
break;
case 6 /* Divide */:
i = "/";
break;
case 7 /* Modulo */:
i = "%";
break;
case 8 /* And */:
i = "&";
break;
case 9 /* Or */:
i = "|";
break;
case 10 /* AndAlso */:
i = "&&";
break;
case 11 /* OrElse */:
i = "||";
break;
case 12 /* ExclusiveOr */:
i = "^";
break;
case 13 /* Equal */:
i = "===";
break;
case 14 /* NotEqual */:
i = "!==";
break;
case 15 /* LessThan */:
i = "<";
break;
case 16 /* LessThanOrEqual */:
i = "<=";
break;
case 17 /* GreaterThan */:
i = ">";
break;
case 18 /* GreaterThanOrEqual */:
i = ">=";
break;
case 19 /* LeftShift */:
i = "<<";
break;
case 20 /* RightShift */:
i = ">>";
break;
}
return [i, this.visit(node.left), this.visit(node.right)];
};
BonsaiVisitor.prototype.visitUnary = function (node) {
var i = "";
Identical blocks of code found in 2 locations. Consider refactoring.
switch (node.nodeType) {
case 23 /* Negate */:
i = "-";
break;
case 24 /* UnaryPlus */:
i = "+";
break;
case 22 /* Not */:
i = "!";
break;
case 25 /* OnesComplement */:
i = "~";
break;
}
return [i, this.visit(node.operand)];
};
BonsaiVisitor.prototype.visitConditional = function (node) {
return ["?:", this.visit(node.test), this.visit(node.ifTrue), this.visit(node.ifFalse)];
};
BonsaiVisitor.prototype.visitLambda = function (node) {
return ["=>", this.visit(node.body), this.visitMany(node.parameters)];
};
BonsaiVisitor.prototype.visitInvoke = function (node) {
var expression = this.visit(node.expression);
var args = this.visitMany(node.args);
return ["()", expression, args];
};
BonsaiVisitor.prototype.visitCall = function (node) {
var args = [];
if (node.obj != null) {
args.unshift(this.visit(node.obj));
}
args.unshift(this.visitMany(node.args));
return [".()", node.method, args];
};
BonsaiVisitor.prototype.visitNew = function (node) {
var args = this.visitMany(node.args);
return ["new", args];
};
BonsaiVisitor.prototype.visitMember = function (node) {
var res = [".", node.member];
if (node.obj != null) {
res.unshift(this.visit(node.obj));
}
return res;
};
BonsaiVisitor.prototype.visitIndex = function (node) {
throw new Error("not implemented");
};
return BonsaiVisitor;
})(ExpressionVisitorGeneric);
//# sourceMappingURL=compiler.js.map