Skip to content

Commit 47a33d3

Browse files
committed
fix: returns wrong variable names when expression contains new statement, #476
1 parent 6a87eb8 commit 47a33d3

5 files changed

Lines changed: 21 additions & 4 deletions

File tree

src/main/java/com/googlecode/aviator/BaseExpression.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.googlecode.aviator.exception.ExpressionNotFoundException;
1818
import com.googlecode.aviator.lexer.SymbolTable;
1919
import com.googlecode.aviator.lexer.token.Variable;
20+
import com.googlecode.aviator.parser.CompileTypes;
2021
import com.googlecode.aviator.parser.VariableMeta;
2122
import com.googlecode.aviator.runtime.FunctionArgument;
2223
import com.googlecode.aviator.runtime.LambdaFunctionBootstrap;
@@ -149,8 +150,8 @@ public Map<String, VariableMeta> getFullNameMetas() {
149150
for (VariableMeta m : this.vars) {
150151
final String name = m.getName();
151152
String[] tmps = Constants.SPLIT_PAT.split(name);
152-
if (!m.isInit() && !definedVars.contains(tmps[0]) && !definedVars.contains(name)
153-
&& m.getFirstIndex() >= 0) {
153+
if (!m.isInit() && m.getType() != CompileTypes.Class && !definedVars.contains(tmps[0])
154+
&& !definedVars.contains(name) && m.getFirstIndex() >= 0) {
154155
fullNames.put(name, m);
155156
} else if (m.getFirstIndex() >= 0) {
156157
// It's defined in current scope

src/main/java/com/googlecode/aviator/parser/CompileTypes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77
*
88
*/
99
public enum CompileTypes {
10-
Function, Array;
10+
Function, Array, Class,
1111
}

src/main/java/com/googlecode/aviator/parser/ExpressionParser.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1565,7 +1565,8 @@ private void newStatement() {
15651565
reportSyntaxError("invalid class name");
15661566
}
15671567
checkVariableName(this.lookhead);
1568-
getCodeGeneratorWithTimes().onConstant(this.lookhead);
1568+
getCodeGeneratorWithTimes()
1569+
.onConstant(this.lookhead.withMeta(Constants.TYPE_META, CompileTypes.Class));
15691570
getCodeGeneratorWithTimes().onMethodParameter(this.lookhead);
15701571
move(true);
15711572

src/test/java/com/googlecode/aviator/AviatorEvaluatorInstanceCompatibleUnitTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ public void testMaxLoopCount() {
2323
super.testMaxLoopCount();
2424
}
2525

26+
@Override
27+
@Test
28+
public void testIssue476() {
29+
// ignore
30+
}
31+
2632
@Override
2733
@Test
2834
public void testClassAllowList() {

src/test/java/com/googlecode/aviator/AviatorEvaluatorInstanceUnitTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import static org.junit.Assert.fail;
2626
import java.io.ByteArrayOutputStream;
2727
import java.math.MathContext;
28+
import java.util.Arrays;
2829
import java.util.HashMap;
2930
import java.util.HashSet;
3031
import java.util.List;
@@ -58,6 +59,14 @@ public void setup() {
5859
this.instance = AviatorEvaluator.newInstance();
5960
}
6061

62+
@Test
63+
public void testIssue476() {
64+
Expression expr = instance.compile("let abc = new String('abc');");
65+
assertTrue(expr.getVariableFullNames().isEmpty());
66+
expr = instance.compile("let abc = new String('abc'); abc + x");
67+
assertEquals(expr.getVariableFullNames(), Arrays.asList("x"));
68+
}
69+
6170
@SuppressWarnings("unchecked")
6271
@Test
6372
public void testIssue466() {

0 commit comments

Comments
 (0)