Skip to content

Commit 968c9fb

Browse files
committed
added JS Function errors
1 parent 76193bc commit 968c9fb

File tree

4 files changed

+41
-30
lines changed

4 files changed

+41
-30
lines changed

src/common/utils.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,10 @@ export class JspyEvalError extends Error {
9999
}
100100

101101
export class JspyError extends Error {
102-
public line: number = 0;
103-
public column: number = 0;
104-
public moduleName: string = '';
105-
106-
constructor(public name: string, public message: string) {
102+
103+
constructor(public module: string, public line: number, public column: number, public name: string, public message: string) {
107104
super();
108-
this.message = message;
105+
this.message = jspyErrorMessage("JspyError", module || 'name.jspy', line, column, message);
109106
Object.setPrototypeOf(this, JspyError.prototype);
110107
}
111108
}

src/evaluator/evaluator.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ export class Evaluator {
8080
return this.evalBlock(ast, blockContext);
8181
}
8282

83-
private invokeFunction(func: (...args: unknown[]) => unknown, fps: unknown[]): unknown {
83+
private invokeFunction(func: (...args: unknown[]) => unknown, fps: unknown[],
84+
loc: { moduleName: string, line: number, column: number }): unknown {
8485
try {
8586
if (fps.length === 0) { return func(); }
8687
if (fps.length === 1) { return func(fps[0]); }
@@ -117,7 +118,8 @@ export class Evaluator {
117118
throw Error('Function has too many parameters. Current limitation is 10');
118119
}
119120
} catch (err) {
120-
throw new JspyError('FuncCall', err.message || err);
121+
var jspyError = new JspyError(loc?.moduleName || 'js-func-error.jspy', loc?.line || 0, loc?.column || 0, 'FuncCall', err.message || err);
122+
throw jspyError;
121123
}
122124

123125
}
@@ -145,10 +147,7 @@ export class Evaluator {
145147

146148
if (node.type === 'raise') {
147149
const raiseNode = node as RaiseNode;
148-
const err = new JspyError(raiseNode.errorName, raiseNode.errorMessage || "");
149-
err.line = raiseNode.loc[0];
150-
err.column = raiseNode.loc[1];
151-
err.moduleName = blockContext.moduleName;
150+
const err = new JspyError(blockContext.moduleName, raiseNode.loc[0], raiseNode.loc[1], raiseNode.errorName, raiseNode.errorMessage || "");
152151
throw err;
153152
}
154153

@@ -168,7 +167,7 @@ export class Evaluator {
168167
} else {
169168
const name = (err instanceof JspyError) ? (err as JspyError).name : typeof (err);
170169
const message = (err instanceof JspyError) ? (err as JspyError).message : err ?? err.message;
171-
const moduleName = (err instanceof JspyError) ? (err as JspyError).moduleName : 0;
170+
const moduleName = (err instanceof JspyError) ? (err as JspyError).module : 0;
172171
const line = (err instanceof JspyError) ? (err as JspyError).line : 0;
173172
const column = (err instanceof JspyError) ? (err as JspyError).column : 0;
174173

@@ -295,7 +294,11 @@ export class Evaluator {
295294

296295
const pms = funcCallNode.paramNodes?.map(n => this.evalNode(n, blockContext)) || []
297296

298-
return this.invokeFunction(func, pms);
297+
return this.invokeFunction(func, pms, {
298+
moduleName: blockContext.moduleName,
299+
line: funcCallNode.loc[0],
300+
column: funcCallNode.loc[1]
301+
});
299302
}
300303

301304
if (node.type === "assign") {
@@ -369,7 +372,11 @@ export class Evaluator {
369372
}
370373

371374
const pms = funcCallNode.paramNodes?.map(n => this.evalNode(n, blockContext)) || []
372-
startObject = this.invokeFunction(func.bind(startObject), pms);
375+
startObject = this.invokeFunction(func.bind(startObject), pms, {
376+
moduleName: blockContext.moduleName,
377+
line: funcCallNode.loc[0],
378+
column: funcCallNode.loc[1]
379+
});
373380

374381
} else {
375382
throw Error("Can't resolve dotObjectAccess node")

src/evaluator/evaluatorAsync.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ export class EvaluatorAsync {
8888
return await this.evalBlockAsync(ast, blockContext);
8989
}
9090

91-
private async invokeFunctionAsync(func: (...args: unknown[]) => unknown, fps: unknown[]): Promise<unknown> {
91+
private async invokeFunctionAsync(func: (...args: unknown[]) => unknown, fps: unknown[],
92+
loc?: { moduleName: string, line: number, column: number }): Promise<unknown> {
9293
try {
9394
if (fps.length === 0) { return await func(); }
9495
if (fps.length === 1) { return await func(fps[0]); }
@@ -121,7 +122,8 @@ export class EvaluatorAsync {
121122
return await func(fps[0], fps[1], fps[2], fps[3], fps[4], fps[5], fps[6], fps[7], fps[8], fps[9]);
122123
}
123124
} catch (err) {
124-
throw new JspyError('FuncCall', err.message || err);
125+
var jspyError = new JspyError(loc?.moduleName || 'js-func-error.jspy', loc?.line || 0, loc?.column || 0, 'FuncCall', err.message || err);
126+
throw jspyError;
125127
}
126128

127129
if (fps.length > 10) {
@@ -152,10 +154,7 @@ export class EvaluatorAsync {
152154

153155
if (node.type === 'raise') {
154156
const raiseNode = node as RaiseNode;
155-
const err = new JspyError(raiseNode.errorName, raiseNode.errorMessage || "");
156-
err.line = raiseNode.loc[0];
157-
err.column = raiseNode.loc[1];
158-
err.moduleName = blockContext.moduleName;
157+
const err = new JspyError(blockContext.moduleName, raiseNode.loc[0], raiseNode.loc[1], raiseNode.errorName, raiseNode.errorMessage || "");
159158
throw err;
160159
}
161160

@@ -175,7 +174,7 @@ export class EvaluatorAsync {
175174
} else {
176175
const name = (err instanceof JspyError) ? (err as JspyError).name : typeof (err);
177176
const message = (err instanceof JspyError) ? (err as JspyError).message : err ?? err.message;
178-
const moduleName = (err instanceof JspyError) ? (err as JspyError).moduleName : 0;
177+
const moduleName = (err instanceof JspyError) ? (err as JspyError).module : 0;
179178
const line = (err instanceof JspyError) ? (err as JspyError).line : 0;
180179
const column = (err instanceof JspyError) ? (err as JspyError).column : 0;
181180

@@ -306,7 +305,11 @@ export class EvaluatorAsync {
306305
pms.push(await this.evalNodeAsync(p, blockContext));
307306
}
308307

309-
return await this.invokeFunctionAsync(func, pms);
308+
return await this.invokeFunctionAsync(func, pms, {
309+
moduleName: blockContext.moduleName,
310+
line: funcCallNode.loc[0],
311+
column: funcCallNode.loc[0]
312+
});
310313
}
311314

312315
if (node.type === "assign") {
@@ -383,7 +386,11 @@ export class EvaluatorAsync {
383386
pms.push(await this.evalNodeAsync(p, blockContext));
384387
}
385388

386-
startObject = await this.invokeFunctionAsync(func.bind(startObject), pms);
389+
startObject = await this.invokeFunctionAsync(func.bind(startObject), pms, {
390+
moduleName: blockContext.moduleName,
391+
line: funcCallNode.loc[0],
392+
column: funcCallNode.loc[0]
393+
});
387394

388395
} else {
389396
throw Error("Can't resolve dotObjectAccess node")

src/interpreter.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -438,8 +438,8 @@ describe('Interpreter', () => {
438438
m
439439
`;
440440

441-
expect(await e.evaluate(script)).toBe('My Message');
442-
expect(e.eval(script)).toBe('My Message');
441+
expect(await e.evaluate(script)).toContain('My Message');
442+
expect(e.eval(script)).toContain('My Message');
443443
})
444444

445445
it('try catch errorMessage with alias', async () => {
@@ -453,8 +453,8 @@ describe('Interpreter', () => {
453453
m
454454
`;
455455

456-
expect(await e.evaluate(script)).toBe('My Message');
457-
expect(e.eval(script)).toBe('My Message');
456+
expect(await e.evaluate(script)).toContain('My Message');
457+
expect(e.eval(script)).toContain('My Message');
458458
})
459459

460460
it('try catch JS errorMessage', async () => {
@@ -471,8 +471,8 @@ describe('Interpreter', () => {
471471
const obj = {
472472
func1: () => { throw new Error(jsErrorMessage); }
473473
};
474-
expect(await e.evaluate(script, obj)).toBe(jsErrorMessage);
475-
expect(e.eval(script, obj)).toBe(jsErrorMessage);
474+
expect(await e.evaluate(script, obj)).toContain(jsErrorMessage);
475+
expect(e.eval(script, obj)).toContain(jsErrorMessage);
476476
})
477477

478478

0 commit comments

Comments
 (0)