diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/VariableTracer.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/VariableTracer.java index 6cb13f2..bc91aa4 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/VariableTracer.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/VariableTracer.java @@ -413,6 +413,33 @@ public class VariableTracer { public Map buildParameterValuesMap(String caller, String target, Map> callGraph, List path, int pathIndex) { Map paramValues = new HashMap<>(); List edges = callGraph.get(caller); + + boolean hasEdge = false; + if (edges != null) { + for (CallEdge edge : edges) { + if (edge.getTargetMethod().equals(target) || isHeuristicMatch(edge.getTargetMethod(), target)) { + hasEdge = true; + break; + } + } + } + + // Bridge polymorphic interfaces to implementations without graph edges + if (!hasEdge) { + String callerSimple = caller.contains(".") ? caller.substring(caller.lastIndexOf('.') + 1) : caller; + String targetSimple = target.contains(".") ? target.substring(target.lastIndexOf('.') + 1) : target; + if (callerSimple.equals(targetSimple)) { + List callerParams = getParameterNames(caller); + List targetParams = getParameterNames(target); + if (callerParams != null && targetParams != null && callerParams.size() == targetParams.size()) { + for (int i = 0; i < callerParams.size(); i++) { + paramValues.put(targetParams.get(i), callerParams.get(i)); + } + return paramValues; + } + } + } + if (edges == null) { return paramValues; } @@ -453,6 +480,26 @@ public class VariableTracer { return paramValues; } + private List getParameterNames(String methodFqn) { + int lastDot = methodFqn.lastIndexOf('.'); + if (lastDot < 0) return null; + String className = methodFqn.substring(0, lastDot); + String methodName = methodFqn.substring(lastDot + 1); + + TypeDeclaration td = context.getTypeDeclaration(className); + if (td == null) return null; + + MethodDeclaration md = context.findMethodDeclaration(td, methodName, true); + if (md == null) return null; + + List paramNames = new ArrayList<>(); + for (Object paramObj : md.parameters()) { + SingleVariableDeclaration param = (SingleVariableDeclaration) paramObj; + paramNames.add(param.getName().getIdentifier()); + } + return paramNames; + } + public String resolveArgumentValue(String argValue, String callerMethod, List path, int pathIndex, Map> callGraph) { if (argValue == null) return null; if (argValue.contains(".") || argValue.startsWith("new ") || argValue.matches(".*[0-9].*")) {