From 34298bceb81b0f8c373435305d0784563f533fd6 Mon Sep 17 00:00:00 2001 From: aNNiMON Date: Tue, 3 Oct 2023 22:48:43 +0300 Subject: [PATCH] Fix function call statement passes Variable expression instead of function name value --- .../main/java/com/annimon/ownlang/parser/Parser.java | 8 +++++++- .../ownlang/parser/ast/FunctionalExpression.java | 12 ++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Parser.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Parser.java index 0cc90a2..53950bb 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Parser.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Parser.java @@ -160,7 +160,7 @@ public final class Parser { return classDeclaration(); } if (lookMatch(0, TokenType.WORD) && lookMatch(1, TokenType.LPAREN)) { - return new ExprStatement(functionChain(qualifiedName())); + return functionCallStatement(); } return assignmentStatement(); } @@ -321,6 +321,12 @@ public final class Parser { return statementOrBlock(); } + private ExprStatement functionCallStatement() { + return new ExprStatement( + functionChain(new ValueExpression(consume(TokenType.WORD).text())) + ); + } + private Expression functionChain(Expression qualifiedNameExpr) { // f1()()() || f1().f2().f3() || f1().key final Expression expr = function(qualifiedNameExpr); diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/FunctionalExpression.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/FunctionalExpression.java index 663e865..b84985e 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/FunctionalExpression.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/FunctionalExpression.java @@ -45,15 +45,11 @@ public final class FunctionalExpression extends InterruptableNode implements Exp } private Function consumeFunction(Expression expr) { - try { - final Value value = expr.eval(); - if (value.type() == Types.FUNCTION) { - return ((FunctionValue) value).getValue(); - } - return getFunction(value.asString()); - } catch (VariableDoesNotExistsException ex) { - return getFunction(ex.getVariable()); + final Value value = expr.eval(); + if (value.type() == Types.FUNCTION) { + return ((FunctionValue) value).getValue(); } + return getFunction(value.asString()); } private Function getFunction(String key) {