Исправлено подключение нескольких модулей сразу

This commit is contained in:
Victor 2019-04-04 12:48:43 +03:00
parent c73844fd51
commit 3f129a14b8
4 changed files with 58 additions and 57 deletions

View File

@ -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());
}
}

View File

@ -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) {

View File

@ -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<Map<String, VariableIn
// To get module variables we need to store current variables, clear all, then load module.
final Map<String, Value> 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<Map<String, VariableIn
return super.visit(s, t);
}
private boolean canLoadConstants(Expression expression) {
if (expression instanceof ArrayExpression) {
ArrayExpression ae = (ArrayExpression) expression;
for (Expression expr : ae.elements) {
if (!isValue(expr)) {
return false;
}
}
return true;
}
return isValue(expression);
}
@Override
protected boolean visit(Arguments in, Arguments out, Map<String, VariableInfo> t) {
for (Argument argument : in) {

View File

@ -1,8 +1,7 @@
package com.annimon.ownlang.parser.visitors;
import com.annimon.ownlang.lib.ArrayValue;
import com.annimon.ownlang.lib.Types;
import com.annimon.ownlang.lib.Value;
import com.annimon.ownlang.parser.ast.ArrayExpression;
import com.annimon.ownlang.parser.ast.Expression;
import com.annimon.ownlang.parser.ast.Statement;
import com.annimon.ownlang.parser.ast.UseStatement;
import com.annimon.ownlang.parser.ast.ValueExpression;
@ -24,15 +23,15 @@ public class ModuleDetector extends AbstractVisitor {
@Override
public void visit(UseStatement st) {
if (st.expression instanceof ArrayExpression) {
ArrayExpression ae = (ArrayExpression) st.expression;
for (Expression expr : ae.elements) {
modules.add(expr.eval().asString());
}
}
if (st.expression instanceof ValueExpression) {
ValueExpression ve = (ValueExpression) st.expression;
if (ve.value.type() == Types.ARRAY) {
for (Value module : ((ArrayValue) ve.value)) {
modules.add(module.asString());
}
} else {
modules.add(ve.value.asString());
}
modules.add(ve.value.asString());
}
super.visit(st);
}