From 8869ebc7066bef3fe60a8432a834f57e2f507ef1 Mon Sep 17 00:00:00 2001 From: Kamil Patryk Kozakowski Date: Tue, 14 Jul 2026 05:49:26 +0200 Subject: [PATCH] Align call-graph class matching with ambiguous simple-name guard Use package-aware simple-name compatibility in VariableTracer and preserve case-insensitive field-to-type matching only when the simple name is unambiguous. Co-authored-by: Cursor --- .../analysis/service/CallGraphPathFinder.java | 9 ++++++++- .../analysis/service/VariableTracer.java | 13 +++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/CallGraphPathFinder.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/CallGraphPathFinder.java index 6a716a7..cf6885d 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/CallGraphPathFinder.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/analysis/service/CallGraphPathFinder.java @@ -380,7 +380,14 @@ public class CallGraphPathFinder { String simpleClassNeighbor = classNeighbor != null && classNeighbor.contains(".") ? classNeighbor.substring(classNeighbor.lastIndexOf('.') + 1) : classNeighbor; if (simpleClassNeighbor != null && simpleClassTarget != null) { - if (simpleClassNeighbor.equalsIgnoreCase(simpleClassTarget)) return true; + String leftClass = classNeighbor != null ? classNeighbor : simpleClassNeighbor; + String rightClass = classTarget != null ? classTarget : simpleClassTarget; + if (context.areSameTypeOrUnambiguousSimpleMatch(leftClass, rightClass)) return true; + if (!context.isAmbiguousSimpleName(simpleClassNeighbor) + && !context.isAmbiguousSimpleName(simpleClassTarget) + && simpleClassNeighbor.equalsIgnoreCase(simpleClassTarget)) { + return true; + } // e.g. "this" vs "com.example.Machine" if (simpleClassNeighbor.equals("this") || simpleClassNeighbor.equals("super")) return true; return false; 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 a2d1a90..2267405 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 @@ -632,9 +632,7 @@ public class VariableTracer { String classTarget = target.substring(0, target.lastIndexOf('.')); if (classNeighbor.equals(classTarget)) return true; - String simpleClassNeighbor = classNeighbor.contains(".") ? classNeighbor.substring(classNeighbor.lastIndexOf('.') + 1) : classNeighbor; - String simpleClassTarget = classTarget.contains(".") ? classTarget.substring(classTarget.lastIndexOf('.') + 1) : classTarget; - if (simpleClassNeighbor.equals(simpleClassTarget)) return true; + if (context.areSameTypeOrUnambiguousSimpleMatch(classNeighbor, classTarget)) return true; List impls = context.getImplementations(classTarget); if (impls != null) { @@ -662,7 +660,14 @@ public class VariableTracer { String simpleClassNeighbor = classNeighbor != null && classNeighbor.contains(".") ? classNeighbor.substring(classNeighbor.lastIndexOf('.') + 1) : classNeighbor; if (simpleClassNeighbor != null && simpleClassTarget != null) { - if (simpleClassNeighbor.equalsIgnoreCase(simpleClassTarget)) return true; + String leftClass = classNeighbor != null ? classNeighbor : simpleClassNeighbor; + String rightClass = classTarget != null ? classTarget : simpleClassTarget; + if (context.areSameTypeOrUnambiguousSimpleMatch(leftClass, rightClass)) return true; + if (!context.isAmbiguousSimpleName(simpleClassNeighbor) + && !context.isAmbiguousSimpleName(simpleClassTarget) + && simpleClassNeighbor.equalsIgnoreCase(simpleClassTarget)) { + return true; + } if (simpleClassNeighbor.equals("this") || simpleClassNeighbor.equals("super")) return true; return false; }