Skip to content

Commit 3f129a1

Browse files
committed
Исправлено подключение нескольких модулей сразу
1 parent c73844f commit 3f129a1

File tree

4 files changed

+58
-57
lines changed

4 files changed

+58
-57
lines changed

src/main/java/com/annimon/ownlang/parser/ast/UseStatement.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,15 @@ private void loadModule(String name) {
5050
}
5151

5252
public void loadConstants() {
53-
final Value value = expression.eval();
54-
switch (value.type()) {
55-
case Types.ARRAY:
56-
for (Value module : ((ArrayValue) value)) {
57-
loadConstants(module.asString());
58-
}
59-
break;
60-
case Types.STRING:
61-
loadConstants(value.asString());
62-
break;
63-
default:
64-
throw typeException(value);
53+
if (expression instanceof ArrayExpression) {
54+
ArrayExpression ae = (ArrayExpression) expression;
55+
for (Expression expr : ae.elements) {
56+
loadConstants(expr.eval().asString());
57+
}
58+
}
59+
if (expression instanceof ValueExpression) {
60+
ValueExpression ve = (ValueExpression) expression;
61+
loadConstants(ve.value.asString());
6562
}
6663
}
6764

src/main/java/com/annimon/ownlang/parser/linters/UseWithNonStringValueValidator.java

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.annimon.ownlang.parser.linters;
22

33
import com.annimon.ownlang.Console;
4-
import com.annimon.ownlang.lib.ArrayValue;
54
import com.annimon.ownlang.lib.Types;
65
import com.annimon.ownlang.lib.Value;
76
import com.annimon.ownlang.parser.ast.*;
@@ -17,28 +16,34 @@ public void visit(IncludeStatement st) {
1716
@Override
1817
public void visit(UseStatement st) {
1918
super.visit(st);
20-
if (!(st.expression instanceof ValueExpression)) {
19+
20+
if (st.expression instanceof ArrayExpression) {
21+
ArrayExpression ae = (ArrayExpression) st.expression;
22+
for (Expression expr : ae.elements) {
23+
if (!checkExpression(expr)) {
24+
return;
25+
}
26+
}
27+
} else {
28+
if (!checkExpression(st.expression)) {
29+
return;
30+
}
31+
}
32+
}
33+
34+
private boolean checkExpression(Expression expr) {
35+
if (!(expr instanceof ValueExpression)) {
2136
Console.error(String.format(
22-
"Warning: `use` with %s, not ValueExpression", st.expression.getClass().getSimpleName()));
23-
return;
37+
"Warning: `use` with %s, not ValueExpression", expr.getClass().getSimpleName()));
38+
return false;
2439
}
2540

26-
final Value value = ((ValueExpression) st.expression).value;
27-
switch (value.type()) {
28-
case Types.STRING:
29-
// ok
30-
break;
31-
case Types.ARRAY:
32-
// ok, need additional check
33-
for (Value module : ((ArrayValue) value)) {
34-
if (module.type() != Types.STRING) {
35-
warnWrongType(module);
36-
}
37-
}
38-
break;
39-
default:
40-
warnWrongType(value);
41+
final Value value = ((ValueExpression) expr).value;
42+
if (value.type() != Types.STRING) {
43+
warnWrongType(value);
44+
return false;
4145
}
46+
return true;
4247
}
4348

4449
private void warnWrongType(Value value) {

src/main/java/com/annimon/ownlang/parser/optimization/VariablesGrabber.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,7 @@
22

33
import com.annimon.ownlang.lib.Value;
44
import com.annimon.ownlang.lib.Variables;
5-
import com.annimon.ownlang.parser.ast.Accessible;
6-
import com.annimon.ownlang.parser.ast.Argument;
7-
import com.annimon.ownlang.parser.ast.Arguments;
8-
import com.annimon.ownlang.parser.ast.AssignmentExpression;
9-
import com.annimon.ownlang.parser.ast.ContainerAccessExpression;
10-
import com.annimon.ownlang.parser.ast.DestructuringAssignmentStatement;
11-
import com.annimon.ownlang.parser.ast.ForeachArrayStatement;
12-
import com.annimon.ownlang.parser.ast.ForeachMapStatement;
13-
import com.annimon.ownlang.parser.ast.MatchExpression;
14-
import com.annimon.ownlang.parser.ast.Node;
15-
import com.annimon.ownlang.parser.ast.UnaryExpression;
16-
import com.annimon.ownlang.parser.ast.UseStatement;
17-
import com.annimon.ownlang.parser.ast.ValueExpression;
18-
import com.annimon.ownlang.parser.ast.VariableExpression;
5+
import com.annimon.ownlang.parser.ast.*;
196
import static com.annimon.ownlang.parser.visitors.VisitorUtils.isValue;
207
import static com.annimon.ownlang.parser.visitors.VisitorUtils.isVariable;
218
import java.util.HashMap;
@@ -116,7 +103,7 @@ public Node visit(UseStatement s, Map<String, VariableInfo> t) {
116103
// To get module variables we need to store current variables, clear all, then load module.
117104
final Map<String, Value> currentVariables = new HashMap<>(Variables.variables());
118105
Variables.variables().clear();
119-
if (isValue(s.expression)) {
106+
if (canLoadConstants(s.expression)) {
120107
s.loadConstants();
121108
}
122109
// Grab module variables
@@ -131,6 +118,19 @@ public Node visit(UseStatement s, Map<String, VariableInfo> t) {
131118
return super.visit(s, t);
132119
}
133120

121+
private boolean canLoadConstants(Expression expression) {
122+
if (expression instanceof ArrayExpression) {
123+
ArrayExpression ae = (ArrayExpression) expression;
124+
for (Expression expr : ae.elements) {
125+
if (!isValue(expr)) {
126+
return false;
127+
}
128+
}
129+
return true;
130+
}
131+
return isValue(expression);
132+
}
133+
134134
@Override
135135
protected boolean visit(Arguments in, Arguments out, Map<String, VariableInfo> t) {
136136
for (Argument argument : in) {
@@ -159,4 +159,4 @@ private VariableInfo variableInfo(Map<String, VariableInfo> t, final String vari
159159
}
160160
return var;
161161
}
162-
}
162+
}

src/main/java/com/annimon/ownlang/parser/visitors/ModuleDetector.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package com.annimon.ownlang.parser.visitors;
22

3-
import com.annimon.ownlang.lib.ArrayValue;
4-
import com.annimon.ownlang.lib.Types;
5-
import com.annimon.ownlang.lib.Value;
3+
import com.annimon.ownlang.parser.ast.ArrayExpression;
4+
import com.annimon.ownlang.parser.ast.Expression;
65
import com.annimon.ownlang.parser.ast.Statement;
76
import com.annimon.ownlang.parser.ast.UseStatement;
87
import com.annimon.ownlang.parser.ast.ValueExpression;
@@ -24,15 +23,15 @@ public Set<String> detect(Statement s) {
2423

2524
@Override
2625
public void visit(UseStatement st) {
26+
if (st.expression instanceof ArrayExpression) {
27+
ArrayExpression ae = (ArrayExpression) st.expression;
28+
for (Expression expr : ae.elements) {
29+
modules.add(expr.eval().asString());
30+
}
31+
}
2732
if (st.expression instanceof ValueExpression) {
2833
ValueExpression ve = (ValueExpression) st.expression;
29-
if (ve.value.type() == Types.ARRAY) {
30-
for (Value module : ((ArrayValue) ve.value)) {
31-
modules.add(module.asString());
32-
}
33-
} else {
34-
modules.add(ve.value.asString());
35-
}
34+
modules.add(ve.value.asString());
3635
}
3736
super.visit(st);
3837
}

0 commit comments

Comments
 (0)