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 <cursoragent@cursor.com>
This commit is contained in:
2026-07-14 05:49:26 +02:00
parent 6401a58c20
commit 8869ebc706
2 changed files with 17 additions and 5 deletions

View File

@@ -380,7 +380,14 @@ public class CallGraphPathFinder {
String simpleClassNeighbor = classNeighbor != null && classNeighbor.contains(".") ? classNeighbor.substring(classNeighbor.lastIndexOf('.') + 1) : classNeighbor; String simpleClassNeighbor = classNeighbor != null && classNeighbor.contains(".") ? classNeighbor.substring(classNeighbor.lastIndexOf('.') + 1) : classNeighbor;
if (simpleClassNeighbor != null && simpleClassTarget != null) { 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" // e.g. "this" vs "com.example.Machine"
if (simpleClassNeighbor.equals("this") || simpleClassNeighbor.equals("super")) return true; if (simpleClassNeighbor.equals("this") || simpleClassNeighbor.equals("super")) return true;
return false; return false;

View File

@@ -632,9 +632,7 @@ public class VariableTracer {
String classTarget = target.substring(0, target.lastIndexOf('.')); String classTarget = target.substring(0, target.lastIndexOf('.'));
if (classNeighbor.equals(classTarget)) return true; if (classNeighbor.equals(classTarget)) return true;
String simpleClassNeighbor = classNeighbor.contains(".") ? classNeighbor.substring(classNeighbor.lastIndexOf('.') + 1) : classNeighbor; if (context.areSameTypeOrUnambiguousSimpleMatch(classNeighbor, classTarget)) return true;
String simpleClassTarget = classTarget.contains(".") ? classTarget.substring(classTarget.lastIndexOf('.') + 1) : classTarget;
if (simpleClassNeighbor.equals(simpleClassTarget)) return true;
List<String> impls = context.getImplementations(classTarget); List<String> impls = context.getImplementations(classTarget);
if (impls != null) { if (impls != null) {
@@ -662,7 +660,14 @@ public class VariableTracer {
String simpleClassNeighbor = classNeighbor != null && classNeighbor.contains(".") ? classNeighbor.substring(classNeighbor.lastIndexOf('.') + 1) : classNeighbor; String simpleClassNeighbor = classNeighbor != null && classNeighbor.contains(".") ? classNeighbor.substring(classNeighbor.lastIndexOf('.') + 1) : classNeighbor;
if (simpleClassNeighbor != null && simpleClassTarget != null) { 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; if (simpleClassNeighbor.equals("this") || simpleClassNeighbor.equals("super")) return true;
return false; return false;
} }