mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44:20 +03:00
Исправлено подключение нескольких модулей сразу
This commit is contained in:
parent
c73844fd51
commit
3f129a14b8
@ -50,18 +50,15 @@ public final class UseStatement extends InterruptableNode implements Statement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void loadConstants() {
|
public void loadConstants() {
|
||||||
final Value value = expression.eval();
|
if (expression instanceof ArrayExpression) {
|
||||||
switch (value.type()) {
|
ArrayExpression ae = (ArrayExpression) expression;
|
||||||
case Types.ARRAY:
|
for (Expression expr : ae.elements) {
|
||||||
for (Value module : ((ArrayValue) value)) {
|
loadConstants(expr.eval().asString());
|
||||||
loadConstants(module.asString());
|
}
|
||||||
}
|
}
|
||||||
break;
|
if (expression instanceof ValueExpression) {
|
||||||
case Types.STRING:
|
ValueExpression ve = (ValueExpression) expression;
|
||||||
loadConstants(value.asString());
|
loadConstants(ve.value.asString());
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw typeException(value);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.annimon.ownlang.parser.linters;
|
package com.annimon.ownlang.parser.linters;
|
||||||
|
|
||||||
import com.annimon.ownlang.Console;
|
import com.annimon.ownlang.Console;
|
||||||
import com.annimon.ownlang.lib.ArrayValue;
|
|
||||||
import com.annimon.ownlang.lib.Types;
|
import com.annimon.ownlang.lib.Types;
|
||||||
import com.annimon.ownlang.lib.Value;
|
import com.annimon.ownlang.lib.Value;
|
||||||
import com.annimon.ownlang.parser.ast.*;
|
import com.annimon.ownlang.parser.ast.*;
|
||||||
@ -17,28 +16,34 @@ public final class UseWithNonStringValueValidator extends LintVisitor {
|
|||||||
@Override
|
@Override
|
||||||
public void visit(UseStatement st) {
|
public void visit(UseStatement st) {
|
||||||
super.visit(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(
|
Console.error(String.format(
|
||||||
"Warning: `use` with %s, not ValueExpression", st.expression.getClass().getSimpleName()));
|
"Warning: `use` with %s, not ValueExpression", expr.getClass().getSimpleName()));
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Value value = ((ValueExpression) st.expression).value;
|
final Value value = ((ValueExpression) expr).value;
|
||||||
switch (value.type()) {
|
if (value.type() != Types.STRING) {
|
||||||
case Types.STRING:
|
warnWrongType(value);
|
||||||
// ok
|
return false;
|
||||||
break;
|
|
||||||
case Types.ARRAY:
|
|
||||||
// ok, need additional check
|
|
||||||
for (Value module : ((ArrayValue) value)) {
|
|
||||||
if (module.type() != Types.STRING) {
|
|
||||||
warnWrongType(module);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
warnWrongType(value);
|
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void warnWrongType(Value value) {
|
private void warnWrongType(Value value) {
|
||||||
|
@ -2,20 +2,7 @@ package com.annimon.ownlang.parser.optimization;
|
|||||||
|
|
||||||
import com.annimon.ownlang.lib.Value;
|
import com.annimon.ownlang.lib.Value;
|
||||||
import com.annimon.ownlang.lib.Variables;
|
import com.annimon.ownlang.lib.Variables;
|
||||||
import com.annimon.ownlang.parser.ast.Accessible;
|
import com.annimon.ownlang.parser.ast.*;
|
||||||
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 static com.annimon.ownlang.parser.visitors.VisitorUtils.isValue;
|
import static com.annimon.ownlang.parser.visitors.VisitorUtils.isValue;
|
||||||
import static com.annimon.ownlang.parser.visitors.VisitorUtils.isVariable;
|
import static com.annimon.ownlang.parser.visitors.VisitorUtils.isVariable;
|
||||||
import java.util.HashMap;
|
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.
|
// To get module variables we need to store current variables, clear all, then load module.
|
||||||
final Map<String, Value> currentVariables = new HashMap<>(Variables.variables());
|
final Map<String, Value> currentVariables = new HashMap<>(Variables.variables());
|
||||||
Variables.variables().clear();
|
Variables.variables().clear();
|
||||||
if (isValue(s.expression)) {
|
if (canLoadConstants(s.expression)) {
|
||||||
s.loadConstants();
|
s.loadConstants();
|
||||||
}
|
}
|
||||||
// Grab module variables
|
// Grab module variables
|
||||||
@ -131,6 +118,19 @@ public class VariablesGrabber extends OptimizationVisitor<Map<String, VariableIn
|
|||||||
return super.visit(s, t);
|
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
|
@Override
|
||||||
protected boolean visit(Arguments in, Arguments out, Map<String, VariableInfo> t) {
|
protected boolean visit(Arguments in, Arguments out, Map<String, VariableInfo> t) {
|
||||||
for (Argument argument : in) {
|
for (Argument argument : in) {
|
||||||
@ -159,4 +159,4 @@ public class VariablesGrabber extends OptimizationVisitor<Map<String, VariableIn
|
|||||||
}
|
}
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
package com.annimon.ownlang.parser.visitors;
|
package com.annimon.ownlang.parser.visitors;
|
||||||
|
|
||||||
import com.annimon.ownlang.lib.ArrayValue;
|
import com.annimon.ownlang.parser.ast.ArrayExpression;
|
||||||
import com.annimon.ownlang.lib.Types;
|
import com.annimon.ownlang.parser.ast.Expression;
|
||||||
import com.annimon.ownlang.lib.Value;
|
|
||||||
import com.annimon.ownlang.parser.ast.Statement;
|
import com.annimon.ownlang.parser.ast.Statement;
|
||||||
import com.annimon.ownlang.parser.ast.UseStatement;
|
import com.annimon.ownlang.parser.ast.UseStatement;
|
||||||
import com.annimon.ownlang.parser.ast.ValueExpression;
|
import com.annimon.ownlang.parser.ast.ValueExpression;
|
||||||
@ -24,15 +23,15 @@ public class ModuleDetector extends AbstractVisitor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(UseStatement st) {
|
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) {
|
if (st.expression instanceof ValueExpression) {
|
||||||
ValueExpression ve = (ValueExpression) st.expression;
|
ValueExpression ve = (ValueExpression) st.expression;
|
||||||
if (ve.value.type() == Types.ARRAY) {
|
modules.add(ve.value.asString());
|
||||||
for (Value module : ((ArrayValue) ve.value)) {
|
|
||||||
modules.add(module.asString());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
modules.add(ve.value.asString());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
super.visit(st);
|
super.visit(st);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user