From 3f129a14b81052faf91f797f02affa34e49ade38 Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 4 Apr 2019 12:48:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B5=D1=81=D0=BA=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=BA=D0=B8=D1=85=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5?= =?UTF-8?q?=D0=B9=20=D1=81=D1=80=D0=B0=D0=B7=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ownlang/parser/ast/UseStatement.java | 21 ++++----- .../UseWithNonStringValueValidator.java | 43 +++++++++++-------- .../parser/optimization/VariablesGrabber.java | 32 +++++++------- .../parser/visitors/ModuleDetector.java | 19 ++++---- 4 files changed, 58 insertions(+), 57 deletions(-) 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 087f03e..79f4e40 100644 --- a/src/main/java/com/annimon/ownlang/parser/ast/UseStatement.java +++ b/src/main/java/com/annimon/ownlang/parser/ast/UseStatement.java @@ -50,18 +50,15 @@ public final class UseStatement extends InterruptableNode implements Statement { } public void loadConstants() { - final Value value = expression.eval(); - switch (value.type()) { - case Types.ARRAY: - for (Value module : ((ArrayValue) value)) { - loadConstants(module.asString()); - } - break; - case Types.STRING: - loadConstants(value.asString()); - break; - default: - throw typeException(value); + if (expression instanceof ArrayExpression) { + ArrayExpression ae = (ArrayExpression) expression; + for (Expression expr : ae.elements) { + loadConstants(expr.eval().asString()); + } + } + if (expression instanceof ValueExpression) { + ValueExpression ve = (ValueExpression) expression; + loadConstants(ve.value.asString()); } } diff --git a/src/main/java/com/annimon/ownlang/parser/linters/UseWithNonStringValueValidator.java b/src/main/java/com/annimon/ownlang/parser/linters/UseWithNonStringValueValidator.java index de1e51b..451be32 100644 --- a/src/main/java/com/annimon/ownlang/parser/linters/UseWithNonStringValueValidator.java +++ b/src/main/java/com/annimon/ownlang/parser/linters/UseWithNonStringValueValidator.java @@ -1,7 +1,6 @@ package com.annimon.ownlang.parser.linters; import com.annimon.ownlang.Console; -import com.annimon.ownlang.lib.ArrayValue; import com.annimon.ownlang.lib.Types; import com.annimon.ownlang.lib.Value; import com.annimon.ownlang.parser.ast.*; @@ -17,28 +16,34 @@ public final class UseWithNonStringValueValidator extends LintVisitor { @Override public void visit(UseStatement st) { super.visit(st); - if (!(st.expression instanceof ValueExpression)) { + + if (st.expression instanceof ArrayExpression) { + ArrayExpression ae = (ArrayExpression) st.expression; + for (Expression expr : ae.elements) { + if (!checkExpression(expr)) { + return; + } + } + } else { + if (!checkExpression(st.expression)) { + return; + } + } + } + + private boolean checkExpression(Expression expr) { + if (!(expr instanceof ValueExpression)) { Console.error(String.format( - "Warning: `use` with %s, not ValueExpression", st.expression.getClass().getSimpleName())); - return; + "Warning: `use` with %s, not ValueExpression", expr.getClass().getSimpleName())); + return false; } - final Value value = ((ValueExpression) st.expression).value; - switch (value.type()) { - case Types.STRING: - // ok - break; - case Types.ARRAY: - // ok, need additional check - for (Value module : ((ArrayValue) value)) { - if (module.type() != Types.STRING) { - warnWrongType(module); - } - } - break; - default: - warnWrongType(value); + final Value value = ((ValueExpression) expr).value; + if (value.type() != Types.STRING) { + warnWrongType(value); + return false; } + return true; } private void warnWrongType(Value value) { diff --git a/src/main/java/com/annimon/ownlang/parser/optimization/VariablesGrabber.java b/src/main/java/com/annimon/ownlang/parser/optimization/VariablesGrabber.java index 7ea484e..1ee1636 100644 --- a/src/main/java/com/annimon/ownlang/parser/optimization/VariablesGrabber.java +++ b/src/main/java/com/annimon/ownlang/parser/optimization/VariablesGrabber.java @@ -2,20 +2,7 @@ package com.annimon.ownlang.parser.optimization; import com.annimon.ownlang.lib.Value; import com.annimon.ownlang.lib.Variables; -import com.annimon.ownlang.parser.ast.Accessible; -import com.annimon.ownlang.parser.ast.Argument; -import com.annimon.ownlang.parser.ast.Arguments; -import com.annimon.ownlang.parser.ast.AssignmentExpression; -import com.annimon.ownlang.parser.ast.ContainerAccessExpression; -import com.annimon.ownlang.parser.ast.DestructuringAssignmentStatement; -import com.annimon.ownlang.parser.ast.ForeachArrayStatement; -import com.annimon.ownlang.parser.ast.ForeachMapStatement; -import com.annimon.ownlang.parser.ast.MatchExpression; -import com.annimon.ownlang.parser.ast.Node; -import com.annimon.ownlang.parser.ast.UnaryExpression; -import com.annimon.ownlang.parser.ast.UseStatement; -import com.annimon.ownlang.parser.ast.ValueExpression; -import com.annimon.ownlang.parser.ast.VariableExpression; +import com.annimon.ownlang.parser.ast.*; import static com.annimon.ownlang.parser.visitors.VisitorUtils.isValue; import static com.annimon.ownlang.parser.visitors.VisitorUtils.isVariable; import java.util.HashMap; @@ -116,7 +103,7 @@ public class VariablesGrabber extends OptimizationVisitor currentVariables = new HashMap<>(Variables.variables()); Variables.variables().clear(); - if (isValue(s.expression)) { + if (canLoadConstants(s.expression)) { s.loadConstants(); } // Grab module variables @@ -131,6 +118,19 @@ public class VariablesGrabber extends OptimizationVisitor t) { for (Argument argument : in) { @@ -159,4 +159,4 @@ public class VariablesGrabber extends OptimizationVisitor