From 82719489aa1868ea8a8744ca1bbe043be1d9b721 Mon Sep 17 00:00:00 2001 From: Kamil Patryk Kozakowski Date: Mon, 6 Jul 2026 17:43:34 +0200 Subject: [PATCH] 1 --- TestHeuristic.class | Bin 0 -> 952 bytes TestHeuristic.java | 17 ++++++++++ .../analysis/service/CallGraphPathFinder.java | 18 ++++++++-- .../analysis/service/VariableTracer.java | 31 ++++++++++++++++-- 4 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 TestHeuristic.class create mode 100644 TestHeuristic.java diff --git a/TestHeuristic.class b/TestHeuristic.class new file mode 100644 index 0000000000000000000000000000000000000000..b70767a5cf155c193616bccf405e709cee0c0b7b GIT binary patch literal 952 zcmZuv%Tg0T6g|x(OfpPJ3=&?V!RJhjiEmU8#FUh&0?`Vxz|~~ZK;t~(JS?g5N8}sW z=ps@sT)Oa|w7fk)0fn3H+kGGB+%9IuLI#lttjA@JCng6 z!`NzIdEtg1xIAdOU8fcuy)_hYPDN425Y98?R(Tk`!ib7d9b*`082S$(2DK~cIUYmGSU1-)xIpDj5IiQA z!9@mE(@@5gipx5#;OglCB)|+A+xH?%cp<~YNn(vHD`@c#G52hq&@1D*jvFu-1{^Dl znqG&0TG^0Hnr2htRCL@#l_49(?eMUA$!Ipsv+c_8nvObdQ%@p%;dY~)L@^pe8FzKu z!+ny{CJqZEkA!Gwc!+5gk90i7lcND8Gn7;vLz~+lWCKpfXU6XoYidLeJ zHWg67*3mLMVaWqT&^aLFG#2M zsy*D=MWL$naAzM6l0RjSD)c2p#|Z<3kSDYfbm}Ju1B2wtW1c)ZQaSbqqfAA4h&Vh; HG8g^ impls = context.getImplementations(classTarget); if (impls != null) { @@ -222,7 +222,21 @@ public class CallGraphPathFinder { String simpleTarget = target.contains(".") ? target.substring(target.lastIndexOf('.') + 1) : target; String simpleNeighbor = neighbor.contains(".") ? neighbor.substring(neighbor.lastIndexOf('.') + 1) : neighbor; - return simpleNeighbor.equals(simpleTarget); + if (!simpleNeighbor.equals(simpleTarget)) return false; + + String classNeighbor = neighbor.contains(".") ? neighbor.substring(0, neighbor.lastIndexOf('.')) : null; + String classTarget = target.contains(".") ? target.substring(0, target.lastIndexOf('.')) : null; + String simpleClassTarget = classTarget != null && classTarget.contains(".") ? classTarget.substring(classTarget.lastIndexOf('.') + 1) : classTarget; + String simpleClassNeighbor = classNeighbor != null && classNeighbor.contains(".") ? classNeighbor.substring(classNeighbor.lastIndexOf('.') + 1) : classNeighbor; + + if (simpleClassNeighbor != null && simpleClassTarget != null) { + if (simpleClassNeighbor.equalsIgnoreCase(simpleClassTarget)) return true; + // e.g. "this" vs "com.example.Machine" + if (simpleClassNeighbor.equals("this") || simpleClassNeighbor.equals("super")) return true; + return false; + } + + return true; } private boolean isFullyQualifiedMethod(String methodFqn) { 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 07d8dea..6cb13f2 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 @@ -525,12 +525,37 @@ public class VariableTracer { if (simpleClassNeighbor.equals(simpleClassTarget)) return true; List impls = context.getImplementations(classTarget); - if (impls != null && impls.contains(classNeighbor)) return true; + if (impls != null) { + for (String impl : impls) { + if (impl.equals(classNeighbor) || impl.endsWith("." + classNeighbor)) return true; + } + } List implsN = context.getImplementations(classNeighbor); - if (implsN != null && implsN.contains(classTarget)) return true; + if (implsN != null) { + for (String impl : implsN) { + if (impl.equals(classTarget) || impl.endsWith("." + classTarget)) return true; + } + } + return false; } - return false; + + String simpleTarget = target.contains(".") ? target.substring(target.lastIndexOf('.') + 1) : target; + String simpleNeighbor = neighbor.contains(".") ? neighbor.substring(neighbor.lastIndexOf('.') + 1) : neighbor; + if (!simpleNeighbor.equals(simpleTarget)) return false; + + String classNeighbor = neighbor.contains(".") ? neighbor.substring(0, neighbor.lastIndexOf('.')) : null; + String classTarget = target.contains(".") ? target.substring(0, target.lastIndexOf('.')) : null; + String simpleClassTarget = classTarget != null && classTarget.contains(".") ? classTarget.substring(classTarget.lastIndexOf('.') + 1) : classTarget; + String simpleClassNeighbor = classNeighbor != null && classNeighbor.contains(".") ? classNeighbor.substring(classNeighbor.lastIndexOf('.') + 1) : classNeighbor; + + if (simpleClassNeighbor != null && simpleClassTarget != null) { + if (simpleClassNeighbor.equalsIgnoreCase(simpleClassTarget)) return true; + if (simpleClassNeighbor.equals("this") || simpleClassNeighbor.equals("super")) return true; + return false; + } + + return true; } private MethodDeclaration findEnclosingMethod(ASTNode node) {