feat(Parser): improve error handling
This commit is contained in:
parent
ac060ed405
commit
977bc77c96
|
@ -6,6 +6,10 @@ export class AST {
|
|||
throw new BaseException("Not supported");
|
||||
}
|
||||
|
||||
get isAssignable() {
|
||||
return false;
|
||||
}
|
||||
|
||||
assign(context, value) {
|
||||
throw new BaseException("Not supported");
|
||||
}
|
||||
|
@ -75,6 +79,10 @@ export class FieldRead extends AST {
|
|||
return this.getter(this.receiver.eval(context));
|
||||
}
|
||||
|
||||
get isAssignable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
assign(context, value) {
|
||||
return this.setter(this.receiver.eval(context), value);
|
||||
}
|
||||
|
@ -101,6 +109,11 @@ export class KeyedAccess extends AST {
|
|||
throw new BaseException(`Cannot access ${key} on ${obj}`);
|
||||
}
|
||||
}
|
||||
|
||||
get isAssignable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
assign(context, value) {
|
||||
var obj = this.obj.eval(context);
|
||||
var key = this.key.eval(context);
|
||||
|
|
|
@ -150,9 +150,16 @@ class _ParseAST {
|
|||
}
|
||||
|
||||
parseExpression() {
|
||||
var start = this.inputIndex;
|
||||
var result = this.parseConditional();
|
||||
|
||||
while (this.next.isOperator('=')) {
|
||||
if (!result.isAssignable) {
|
||||
var end = this.inputIndex;
|
||||
var expression = this.input.substring(start, end);
|
||||
this.error(`Expression ${expression} is not assignable`);
|
||||
}
|
||||
|
||||
this.expectOperator('=');
|
||||
result = new Assignment(result, this.parseConditional());
|
||||
}
|
||||
|
|
|
@ -179,6 +179,10 @@ export function main() {
|
|||
expect(MapWrapper.get(context.a[0], "key")).toEqual(200);
|
||||
});
|
||||
|
||||
it('should throw on bad assignment', () => {
|
||||
expectEvalError("5=4").toThrowError(new RegExp("Expression 5 is not assignable"));
|
||||
});
|
||||
|
||||
it('should evaluate array', () => {
|
||||
expectEval("[1][0]").toEqual(1);
|
||||
expectEval("[[1]][0][0]").toEqual(1);
|
||||
|
@ -188,7 +192,7 @@ export function main() {
|
|||
});
|
||||
|
||||
it("should error when unfinished exception", () => {
|
||||
expectEvalError('a[0 = 200').toThrowError(new RegExp("Missing expected ]"));
|
||||
expectEvalError('a[0').toThrowError(new RegExp("Missing expected ]"));
|
||||
});
|
||||
|
||||
it('should evaluate map', () => {
|
||||
|
@ -201,8 +205,6 @@ export function main() {
|
|||
});
|
||||
|
||||
describe("parseBinding", () => {
|
||||
//throw on assignment
|
||||
|
||||
it("should parse formatters", function () {
|
||||
var exp = parseBinding("'Foo'|uppercase");
|
||||
expect(exp).toBeAnInstanceOf(Formatter);
|
||||
|
|
Loading…
Reference in New Issue