From 4eabeca2aca772fc566565920c4df2f2fab1ea07 Mon Sep 17 00:00:00 2001 From: Victor Date: Fri, 4 Jan 2019 23:40:22 +0200 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE?= =?UTF-8?q?=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../annimon/ownlang/lib/UserDefinedFunction.java | 6 ++++-- .../ownlang/parser/ast/FunctionalExpression.java | 16 ++++++++++++---- .../annimon/ownlang/parser/ast/UseStatement.java | 11 ++++++++--- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/annimon/ownlang/lib/UserDefinedFunction.java b/src/main/java/com/annimon/ownlang/lib/UserDefinedFunction.java index ab954c3..965be46 100644 --- a/src/main/java/com/annimon/ownlang/lib/UserDefinedFunction.java +++ b/src/main/java/com/annimon/ownlang/lib/UserDefinedFunction.java @@ -34,11 +34,13 @@ public final class UserDefinedFunction implements Function { final int size = values.length; final int requiredArgsCount = arguments.getRequiredArgumentsCount(); if (size < requiredArgsCount) { - throw new ArgumentsMismatchException(String.format("Arguments count mismatch. %d < %d", size, requiredArgsCount)); + throw new ArgumentsMismatchException(String.format( + "Arguments count mismatch. Required %d, got %d", requiredArgsCount, size)); } final int totalArgsCount = getArgsCount(); if (size > totalArgsCount) { - throw new ArgumentsMismatchException(String.format("Arguments count mismatch. %d > %d", size, totalArgsCount)); + throw new ArgumentsMismatchException(String.format( + "Arguments count mismatch. Total %d, got %d", totalArgsCount, size)); } try { diff --git a/src/main/java/com/annimon/ownlang/parser/ast/FunctionalExpression.java b/src/main/java/com/annimon/ownlang/parser/ast/FunctionalExpression.java index 672f3f1..103ca47 100644 --- a/src/main/java/com/annimon/ownlang/parser/ast/FunctionalExpression.java +++ b/src/main/java/com/annimon/ownlang/parser/ast/FunctionalExpression.java @@ -1,5 +1,7 @@ package com.annimon.ownlang.parser.ast; +import com.annimon.ownlang.exceptions.ArgumentsMismatchException; +import com.annimon.ownlang.exceptions.TypeException; import com.annimon.ownlang.exceptions.VariableDoesNotExistsException; import com.annimon.ownlang.exceptions.UnknownFunctionException; import com.annimon.ownlang.lib.*; @@ -40,9 +42,13 @@ public final class FunctionalExpression extends InterruptableNode implements Exp } final Function f = consumeFunction(functionExpr); CallStack.enter(functionExpr.toString(), f); - final Value result = f.execute(values); - CallStack.exit(); - return result; + try { + return f.execute(values); + } catch (ArgumentsMismatchException | TypeException | VariableDoesNotExistsException ex) { + throw new RuntimeException(ex.getMessage() + " in function " + functionExpr, ex); + } finally { + CallStack.exit(); + } } private Function consumeFunction(Expression expr) { @@ -58,7 +64,9 @@ public final class FunctionalExpression extends InterruptableNode implements Exp } private Function getFunction(String key) { - if (Functions.isExists(key)) return Functions.get(key); + if (Functions.isExists(key)) { + return Functions.get(key); + } if (Variables.isExists(key)) { final Value variable = Variables.get(key); if (variable.type() == Types.FUNCTION) { diff --git a/src/main/java/com/annimon/ownlang/parser/ast/UseStatement.java b/src/main/java/com/annimon/ownlang/parser/ast/UseStatement.java index 568b63b..087f03e 100644 --- a/src/main/java/com/annimon/ownlang/parser/ast/UseStatement.java +++ b/src/main/java/com/annimon/ownlang/parser/ast/UseStatement.java @@ -36,7 +36,7 @@ public final class UseStatement extends InterruptableNode implements Statement { loadModule(value.asString()); break; default: - throw new TypeException("Array or string required"); + throw typeException(value); } } @@ -45,7 +45,7 @@ public final class UseStatement extends InterruptableNode implements Statement { final Module module = (Module) Class.forName(String.format(PACKAGE, name, name)).newInstance(); module.init(); } catch (Exception ex) { - throw new RuntimeException(ex); + throw new RuntimeException("Unable to load module " + name, ex); } } @@ -61,10 +61,15 @@ public final class UseStatement extends InterruptableNode implements Statement { loadConstants(value.asString()); break; default: - throw new TypeException("Array or string required"); + throw typeException(value); } } + private TypeException typeException(Value value) { + return new TypeException("Array or string required in 'use' statement, " + + "got " + Types.typeToString(value.type()) + " " + value); + } + private void loadConstants(String moduleName) { try { final Class moduleClass = Class.forName(String.format(PACKAGE, moduleName, moduleName));