diff options
| -rw-r--r-- | src/JSON.js | 9 | ||||
| -rw-r--r-- | src/Scope.js | 1 | ||||
| -rw-r--r-- | src/parser.js | 53 | ||||
| -rw-r--r-- | test/BinderSpec.js | 2 | ||||
| -rw-r--r-- | test/JsonSpec.js | 14 | ||||
| -rw-r--r-- | test/ParserSpec.js | 2 | ||||
| -rw-r--r-- | test/widgetsSpec.js | 4 |
7 files changed, 31 insertions, 54 deletions
diff --git a/src/JSON.js b/src/JSON.js index 186bdb1c..942ce7c0 100644 --- a/src/JSON.js +++ b/src/JSON.js @@ -35,19 +35,14 @@ function toJson(obj, pretty) { function fromJson(json, useNative) { if (!isString(json)) return json; - var obj, p, expression; + var obj; try { if (useNative && window.JSON && window.JSON.parse) { obj = JSON.parse(json); return transformDates(obj); } - - p = parser(json, true); - expression = p.primary(); - p.assertAllConsumed(); - return expression(); - + return parser(json, true).primary()(); } catch (e) { error("fromJson error: ", json, e); throw e; diff --git a/src/Scope.js b/src/Scope.js index bf582474..1ab583e8 100644 --- a/src/Scope.js +++ b/src/Scope.js @@ -92,7 +92,6 @@ function expressionCompile(exp){ if (!fn) { var p = parser(exp); var fnSelf = p.statements(); - p.assertAllConsumed(); fn = compileCache[exp] = extend( function(){ return fnSelf(this);}, {fnSelf: fnSelf}); diff --git a/src/parser.js b/src/parser.js index 8d7e607c..59d7899a 100644 --- a/src/parser.js +++ b/src/parser.js @@ -240,22 +240,29 @@ function parser(text, json){ function (){ throwError("is not valid json", {text:text, index:0}); }; } return { - assertAllConsumed: assertAllConsumed, - assignable: assignable, - primary: primary, - statements: statements, - validator: validator, - formatter: formatter, - filter: filter, - //TODO: delete me, since having watch in UI is logic in UI. (leftover form getangular) - watch: watch + assignable: assertConsumed(assignable), + primary: assertConsumed(primary), + statements: assertConsumed(statements), + validator: assertConsumed(validator), + formatter: assertConsumed(formatter), + filter: assertConsumed(filter) }; + function assertConsumed(fn) { + return function(){ + var value = fn(); + if (tokens.length !== 0) { + throwError("is an unexpected token", tokens[0]); + } + return value; + }; + } + /////////////////////////////////// function throwError(msg, token) { - throw Error("Parse Error: Token '" + token.text + + throw Error("Syntax Error: Token '" + token.text + "' " + msg + " at column " + - (token.index + 1) + " of expression [" + + (token.index + 1) + " of the expression [" + text + "] starting at [" + text.substring(token.index) + "]."); } @@ -313,12 +320,6 @@ function parser(text, json){ return tokens.length > 0; } - function assertAllConsumed(){ - if (tokens.length !== 0) { - throwError("is extra token not part of expression", tokens[0]); - } - } - function statements(){ var statements = []; while(true) { @@ -639,24 +640,6 @@ function parser(text, json){ }; } - //TODO: delete me, since having watch in UI is logic in UI. (leftover form getangular) - function watch () { - var decl = []; - while(hasTokens()) { - decl.push(watchDecl()); - if (!expect(';')) { - assertAllConsumed(); - } - } - assertAllConsumed(); - return function (self){ - for ( var i = 0; i < decl.length; i++) { - var d = decl[i](self); - self.addListener(d.name, d.fn); - } - }; - } - function watchDecl () { var anchorName = expect().text; consume(":"); diff --git a/test/BinderSpec.js b/test/BinderSpec.js index dfa388e3..15a1b5c7 100644 --- a/test/BinderSpec.js +++ b/test/BinderSpec.js @@ -581,7 +581,7 @@ describe('Binder', function(){ browserTrigger(second, 'click'); assertTrue(second.hasClass("ng-exception")); - expect(errorLogs.shift()[0]).toMatchError(/Parse Error: Token ':' not a primary expression/); + expect(errorLogs.shift()[0]).toMatchError(/Syntax Error: Token ':' not a primary expression/); }); it('ItShouldSelectTheCorrectRadioBox', function(){ diff --git a/test/JsonSpec.js b/test/JsonSpec.js index 3b81a44f..0dac0318 100644 --- a/test/JsonSpec.js +++ b/test/JsonSpec.js @@ -163,37 +163,37 @@ describe('json', function(){ describe('security', function(){ it('should not allow naked expressions', function(){ expect(function(){fromJson('1+2');}). - toThrow(new Error("Parse Error: Token '+' is extra token not part of expression at column 2 of expression [1+2] starting at [+2].")); + toThrow(new Error("Syntax Error: Token '+' is an unexpected token at column 2 of the expression [1+2] starting at [+2].")); }); it('should not allow naked expressions group', function(){ expect(function(){fromJson('(1+2)');}). - toThrow(new Error("Parse Error: Token '(' is not valid json at column 1 of expression [(1+2)] starting at [(1+2)].")); + toThrow(new Error("Syntax Error: Token '(' is not valid json at column 1 of the expression [(1+2)] starting at [(1+2)].")); }); it('should not allow expressions in objects', function(){ expect(function(){fromJson('{a:abc()}');}). - toThrow(new Error("Parse Error: Token 'abc' is not valid json at column 4 of expression [{a:abc()}] starting at [abc()}].")); + toThrow(new Error("Syntax Error: Token 'abc' is not valid json at column 4 of the expression [{a:abc()}] starting at [abc()}].")); }); it('should not allow expressions in arrays', function(){ expect(function(){fromJson('[1+2]');}). - toThrow(new Error("Parse Error: Token '+' is not valid json at column 3 of expression [[1+2]] starting at [+2]].")); + toThrow(new Error("Syntax Error: Token '+' is not valid json at column 3 of the expression [[1+2]] starting at [+2]].")); }); it('should not allow vars', function(){ expect(function(){fromJson('[1, x]');}). - toThrow(new Error("Parse Error: Token 'x' is not valid json at column 5 of expression [[1, x]] starting at [x]].")); + toThrow(new Error("Syntax Error: Token 'x' is not valid json at column 5 of the expression [[1, x]] starting at [x]].")); }); it('should not allow dereference', function(){ expect(function(){fromJson('["".constructor]');}). - toThrow(new Error("Parse Error: Token '.' is not valid json at column 4 of expression [[\"\".constructor]] starting at [.constructor]].")); + toThrow(new Error("Syntax Error: Token '.' is not valid json at column 4 of the expression [[\"\".constructor]] starting at [.constructor]].")); }); it('should not allow expressions ofter valid json', function(){ expect(function(){fromJson('[].constructor');}). - toThrow(new Error("Parse Error: Token '.' is not valid json at column 3 of expression [[].constructor] starting at [.constructor].")); + toThrow(new Error("Syntax Error: Token '.' is not valid json at column 3 of the expression [[].constructor] starting at [.constructor].")); }); it('should not allow object dereference', function(){ diff --git a/test/ParserSpec.js b/test/ParserSpec.js index 62d6731a..641420cb 100644 --- a/test/ParserSpec.js +++ b/test/ParserSpec.js @@ -200,7 +200,7 @@ describe('parser', function() { expect(function() { scope.$eval("1|nonExistant"); - }).toThrow(new Error("Parse Error: Token 'nonExistant' should be a function at column 3 of expression [1|nonExistant] starting at [nonExistant].")); + }).toThrow(new Error("Syntax Error: Token 'nonExistant' should be a function at column 3 of the expression [1|nonExistant] starting at [nonExistant].")); scope.$set('offset', 3); expect(scope.$eval("'abcd'|upper._case")).toEqual("ABCD"); diff --git a/test/widgetsSpec.js b/test/widgetsSpec.js index 36aabb33..b412cd6d 100644 --- a/test/widgetsSpec.js +++ b/test/widgetsSpec.js @@ -537,7 +537,7 @@ describe("widget", function(){ compile('<input type="text" name="throw \'\'" value="x"/>'); expect(element.hasClass('ng-exception')).toBeTruthy(); expect(scope.$service('$log').error.logs.shift()[0]). - toMatchError(/Parse Error: Token '''' is extra token not part of expression/); + toMatchError(/Syntax Error: Token '''' is an unexpected token/); }); it('should report error on ng:change exception', function(){ @@ -545,7 +545,7 @@ describe("widget", function(){ browserTrigger(element); expect(element.hasClass('ng-exception')).toBeTruthy(); expect(scope.$service('$log').error.logs.shift()[0]). - toMatchError(/Parse Error: Token '=' implies assignment but \[a-2\] can not be assigned to/); + toMatchError(/Syntax Error: Token '=' implies assignment but \[a-2\] can not be assigned to/); }); }); |
