diff --git a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/JdtDataFlowModel.java b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/JdtDataFlowModel.java index 41a060d..8874006 100644 --- a/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/JdtDataFlowModel.java +++ b/state_machine_exporter/src/main/java/click/kamil/springstatemachineexporter/ast/common/JdtDataFlowModel.java @@ -115,7 +115,7 @@ public class JdtDataFlowModel implements DataFlowModel { // Handle ClassInstanceCreation if (expr instanceof ClassInstanceCreation cic) { - objectFieldBindings.computeIfAbsent(cic, k -> buildFieldBindingsFromCic(cic, paramBindings, instanceFieldBindings)); + getOrCreateFieldBindings(cic, paramBindings, instanceFieldBindings); visited.remove(expr); return List.of(cic); } @@ -310,6 +310,31 @@ public class JdtDataFlowModel implements DataFlowModel { return null; } + private Map getOrCreateFieldBindings( + ClassInstanceCreation cic, + Map paramBindings, + Map instanceFieldBindings) { + Map bindings = objectFieldBindings.get(cic); + if (bindings == null) { + bindings = new HashMap<>(); + objectFieldBindings.put(cic, bindings); + Map built = buildFieldBindingsFromCic(cic, paramBindings, instanceFieldBindings); + bindings.putAll(built); + } + return bindings; + } + + private Map getOrCreateFieldBindings(ClassInstanceCreation cic) { + Map bindings = objectFieldBindings.get(cic); + if (bindings == null) { + bindings = new HashMap<>(); + objectFieldBindings.put(cic, bindings); + Map built = buildFieldBindingsFromCic(cic); + bindings.putAll(built); + } + return bindings; + } + private Map buildFieldBindingsFromCic(ClassInstanceCreation cic) { return buildFieldBindingsFromCic(cic, new HashMap<>(), new HashMap<>()); } @@ -472,7 +497,7 @@ public class JdtDataFlowModel implements DataFlowModel { MethodDeclaration md = findMethodDeclarationInType(concreteType, mb); if (md != null) { Map concreteFieldBindings = - objectFieldBindings.computeIfAbsent(cic, k -> buildFieldBindingsFromCic((ClassInstanceCreation) k)); + getOrCreateFieldBindings(cic); // Apply flow-sensitive intermediate local variable mutations if (receiver instanceof SimpleName sn) {