Skip to content

Commit 647f13c

Browse files
committed
Replace String Check with AST Check
1 parent b7c463a commit 647f13c

2 files changed

Lines changed: 25 additions & 2 deletions

File tree

liquidjava-verifier/src/main/java/liquidjava/rj_language/opt/VariableResolver.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ private static void resolveRecursive(Expression exp, Map<String, Expression> map
7676
}
7777
} else if (left instanceof Var var && canSubstitute(var, right)) {
7878
map.put(var.getName(), right.clone());
79-
} else if (left instanceof FunctionInvocation && !right.toString().contains(leftKey)) {
79+
} else if (left instanceof FunctionInvocation && !containsExpression(right, left)) {
8080
map.put(leftKey, right.clone());
8181
}
8282
}
@@ -147,7 +147,7 @@ private static boolean hasUsage(Expression exp, String name) {
147147
&& (right.isLiteral() || (!(right instanceof Var) && canSubstitute(v, right))))
148148
return false;
149149
if (left instanceof FunctionInvocation && left.toString().equals(name)
150-
&& (right.isLiteral() || (!(right instanceof Var) && !right.toString().contains(name))))
150+
&& (right.isLiteral() || (!(right instanceof Var) && !containsExpression(right, left))))
151151
return false;
152152
if (right instanceof Var v && v.getName().equals(name) && left.isLiteral())
153153
return false;
@@ -210,4 +210,18 @@ private static boolean containsVariable(Expression exp, String name) {
210210
}
211211
return false;
212212
}
213+
214+
private static boolean containsExpression(Expression exp, Expression target) {
215+
if (exp.equals(target))
216+
return true;
217+
218+
if (!exp.hasChildren())
219+
return false;
220+
221+
for (Expression child : exp.getChildren()) {
222+
if (containsExpression(child, target))
223+
return true;
224+
}
225+
return false;
226+
}
213227
}

liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/VariableResolverTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,15 @@ void testFunctionInvocationEqualitiesResolveTransitively() {
134134
assertEquals("1", result.get("func(b)").toString());
135135
}
136136

137+
@Test
138+
void testFunctionInvocationNamesAreMatchedStructurally() {
139+
Expression expression = parse("f(a) > 0 && f(a) == ff(a) + b");
140+
Map<String, Expression> result = VariableResolver.resolve(expression);
141+
142+
assertEquals(1, result.size(), "Should not treat ff(a) as a use of f(a)");
143+
assertEquals("ff(a) + b", result.get("f(a)").toString());
144+
}
145+
137146
@Test
138147
void testUnusedFunctionInvocationEqualityIsIgnored() {
139148
Expression expression = parse("x > 0 && size(stack) == 1");

0 commit comments

Comments
 (0)