aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--example/tweeter/style.css7
-rw-r--r--example/tweeter/tweeter_addressbook.html12
-rw-r--r--src/Parser.js28
-rw-r--r--test/ParserTest.js8
4 files changed, 40 insertions, 15 deletions
diff --git a/example/tweeter/style.css b/example/tweeter/style.css
index 769a6f45..0f2aaecd 100644
--- a/example/tweeter/style.css
+++ b/example/tweeter/style.css
@@ -84,4 +84,11 @@ label {
.editor TEXTAREA {
height: 50px;
+}
+
+.debug{
+ font-size: .7em;
+ white-space: pre;
+ padding: 0;
+ margin: 0;
} \ No newline at end of file
diff --git a/example/tweeter/tweeter_addressbook.html b/example/tweeter/tweeter_addressbook.html
index d8b8b893..70068b0a 100644
--- a/example/tweeter/tweeter_addressbook.html
+++ b/example/tweeter/tweeter_addressbook.html
@@ -39,6 +39,18 @@
<input type="button" ng-action="$anchor.edituser=undefined" value="Close"/>
</div>
</div>
+ <hr/>
+ <div class="debug">
+userFilter={{userFilter|json}}
+
+tweetFilter={{tweetFilter|json}}
+
+$anchor={{$anchor}}
+
+users={{users}}
+
+tweets={{tweets}}
+ </div>
</div>
<div class="tweeter box">
<h1>Tweets: {{$anchor.user}}</h1>
diff --git a/src/Parser.js b/src/Parser.js
index 333b8413..840f5541 100644
--- a/src/Parser.js
+++ b/src/Parser.js
@@ -294,15 +294,13 @@ Parser.prototype = {
}
},
- _unary: function(fn, parse) {
- var right = parse.apply(this);
+ _unary: function(fn, right) {
return function(self) {
return fn(self, right(self));
};
},
- _binary: function(left, fn, parse) {
- var right = parse.apply(this);
+ _binary: function(left, fn, right) {
return function(self) {
return fn(self, left(self), right(self));
};
@@ -343,7 +341,7 @@ Parser.prototype = {
var token;
while(true) {
if ((token = this.expect('|'))) {
- left = this._binary(left, token.fn, this.filter);
+ left = this._binary(left, token.fn, this.filter());
} else {
return left;
}
@@ -405,7 +403,7 @@ Parser.prototype = {
this.text.substring(token.index) + "' is not assignable.";
}
var ident = function(){return left.isAssignable;};
- return this._binary(ident, token.fn, this.logicalOR);
+ return this._binary(ident, token.fn, this.logicalOR());
} else {
return left;
}
@@ -416,7 +414,7 @@ Parser.prototype = {
var token;
while(true) {
if ((token = this.expect('||'))) {
- left = this._binary(left, token.fn, this.logicalAND);
+ left = this._binary(left, token.fn, this.logicalAND());
} else {
return left;
}
@@ -428,7 +426,7 @@ Parser.prototype = {
var token;
while(true) {
if ((token = this.expect('&&'))) {
- left = this._binary(left, token.fn, this.negated);
+ left = this._binary(left, token.fn, this.negated());
} else {
return left;
}
@@ -438,9 +436,9 @@ Parser.prototype = {
negated: function(){
var token;
if (token = this.expect('!')) {
- return this._unary(token.fn, this.equality);
+ return this._unary(token.fn, this.assignment());
} else {
- return this.equality();
+ return this.equality();
}
},
@@ -449,7 +447,7 @@ Parser.prototype = {
var token;
while(true) {
if ((token = this.expect('==','!='))) {
- left = this._binary(left, token.fn, this.relational);
+ left = this._binary(left, token.fn, this.relational());
} else {
return left;
}
@@ -461,7 +459,7 @@ Parser.prototype = {
var token;
while(true) {
if ((token = this.expect('<', '>', '<=', '>='))) {
- left = this._binary(left, token.fn, this.additive);
+ left = this._binary(left, token.fn, this.additive());
} else {
return left;
}
@@ -472,7 +470,7 @@ Parser.prototype = {
var left = this.multiplicative();
var token;
while(token = this.expect('+','-')) {
- left = this._binary(left, token.fn, this.multiplicative);
+ left = this._binary(left, token.fn, this.multiplicative());
}
return left;
},
@@ -481,7 +479,7 @@ Parser.prototype = {
var left = this.unary();
var token;
while(token = this.expect('*','/','%')) {
- left = this._binary(left, token.fn, this.unary);
+ left = this._binary(left, token.fn, this.unary());
}
return left;
},
@@ -491,7 +489,7 @@ Parser.prototype = {
if (this.expect('+')) {
return this.primary();
} else if (token = this.expect('-')) {
- return this._binary(Parser.ZERO, token.fn, this.multiplicative);
+ return this._binary(Parser.ZERO, token.fn, this.multiplicative());
} else {
return this.primary();
}
diff --git a/test/ParserTest.js b/test/ParserTest.js
index 058010f3..fbd9f508 100644
--- a/test/ParserTest.js
+++ b/test/ParserTest.js
@@ -460,3 +460,11 @@ ParserTest.prototype.testReturnFunctionsAreNotBound = function(){
assertEquals("direct Group.all", "function", typeof Group.query);
};
+ParserTest.prototype.testDoubleNegationBug = function (){
+ var scope = new Scope();
+ assertEquals(true, scope.eval('true'));
+ assertEquals(false, scope.eval('!true'));
+ assertEquals(true, scope.eval('!!true'));
+ assertEquals('a', scope.eval('{true:"a", false:"b"}[!!true]'));
+};
+