From 652435a58d7260eeddae9f4cdcee52c21ca28d02 Mon Sep 17 00:00:00 2001 From: Kamil Patryk Kozakowski Date: Tue, 23 Jun 2026 22:31:47 +0200 Subject: [PATCH] test --- .../analysis/resolver/ConstantResolver.java | 59 +++++++++++++------ 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/resolver/ConstantResolver.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/resolver/ConstantResolver.java index 759288f..a0e25d9 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/resolver/ConstantResolver.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/resolver/ConstantResolver.java @@ -157,22 +157,34 @@ public class ConstantResolver { private String evaluateMethodOutput(MethodInvocation mi, MethodDeclaration md, CodebaseContext context, Set visited) { if (md.getBody() == null || mi.arguments().size() != md.parameters().size()) return null; - java.util.Map localVars = new java.util.HashMap<>(); - java.util.Set declaredLocals = new java.util.HashSet<>(); - - for (int i = 0; i < mi.arguments().size(); i++) { - Expression arg = (Expression) mi.arguments().get(i); - String val = resolveInternal(arg, context, visited); - if (val != null) { - org.eclipse.jdt.core.dom.SingleVariableDeclaration param = - (org.eclipse.jdt.core.dom.SingleVariableDeclaration) md.parameters().get(i); - String paramName = param.getName().getIdentifier(); - localVars.put(paramName, val); - declaredLocals.add(paramName); - } + TypeDeclaration td = findEnclosingType(md); + if (td == null) return null; + String methodFqn = context.getFqn(td) + "." + md.getName().getIdentifier(); + + if (!visited.add(methodFqn)) { + return null; // Cycle detected in method evaluation } - return evaluateBody(md.getBody(), localVars, declaredLocals, context, visited); + try { + java.util.Map localVars = new java.util.HashMap<>(); + java.util.Set declaredLocals = new java.util.HashSet<>(); + + for (int i = 0; i < mi.arguments().size(); i++) { + Expression arg = (Expression) mi.arguments().get(i); + String val = resolveInternal(arg, context, visited); + if (val != null) { + org.eclipse.jdt.core.dom.SingleVariableDeclaration param = + (org.eclipse.jdt.core.dom.SingleVariableDeclaration) md.parameters().get(i); + String paramName = param.getName().getIdentifier(); + localVars.put(paramName, val); + declaredLocals.add(paramName); + } + } + + return evaluateBody(md.getBody(), localVars, declaredLocals, context, visited); + } finally { + visited.remove(methodFqn); + } } /** @@ -187,9 +199,22 @@ public class ConstantResolver { CodebaseContext context, Set visited) { if (md.getBody() == null) return null; - java.util.Map localVars = new java.util.HashMap<>(prebuiltLocals); - java.util.Set declaredLocals = new java.util.HashSet<>(prebuiltLocals.keySet()); - return evaluateBody(md.getBody(), localVars, declaredLocals, context, visited); + + TypeDeclaration td = findEnclosingType(md); + if (td == null) return null; + String methodFqn = context.getFqn(td) + "." + md.getName().getIdentifier(); + + if (!visited.add(methodFqn)) { + return null; // Cycle detected in method evaluation + } + + try { + java.util.Map localVars = new java.util.HashMap<>(prebuiltLocals); + java.util.Set declaredLocals = new java.util.HashSet<>(prebuiltLocals.keySet()); + return evaluateBody(md.getBody(), localVars, declaredLocals, context, visited); + } finally { + visited.remove(methodFqn); + } } /**