This commit is contained in:
2026-06-27 20:16:20 +02:00
parent a75b7acfe4
commit df2a596e26

View File

@@ -115,7 +115,7 @@ public class JdtDataFlowModel implements DataFlowModel {
// Handle ClassInstanceCreation // Handle ClassInstanceCreation
if (expr instanceof ClassInstanceCreation cic) { if (expr instanceof ClassInstanceCreation cic) {
objectFieldBindings.computeIfAbsent(cic, k -> buildFieldBindingsFromCic(cic, paramBindings, instanceFieldBindings)); getOrCreateFieldBindings(cic, paramBindings, instanceFieldBindings);
visited.remove(expr); visited.remove(expr);
return List.of(cic); return List.of(cic);
} }
@@ -310,6 +310,31 @@ public class JdtDataFlowModel implements DataFlowModel {
return null; return null;
} }
private Map<IVariableBinding, Expression> getOrCreateFieldBindings(
ClassInstanceCreation cic,
Map<IVariableBinding, Expression> paramBindings,
Map<IVariableBinding, Expression> instanceFieldBindings) {
Map<IVariableBinding, Expression> bindings = objectFieldBindings.get(cic);
if (bindings == null) {
bindings = new HashMap<>();
objectFieldBindings.put(cic, bindings);
Map<IVariableBinding, Expression> built = buildFieldBindingsFromCic(cic, paramBindings, instanceFieldBindings);
bindings.putAll(built);
}
return bindings;
}
private Map<IVariableBinding, Expression> getOrCreateFieldBindings(ClassInstanceCreation cic) {
Map<IVariableBinding, Expression> bindings = objectFieldBindings.get(cic);
if (bindings == null) {
bindings = new HashMap<>();
objectFieldBindings.put(cic, bindings);
Map<IVariableBinding, Expression> built = buildFieldBindingsFromCic(cic);
bindings.putAll(built);
}
return bindings;
}
private Map<IVariableBinding, Expression> buildFieldBindingsFromCic(ClassInstanceCreation cic) { private Map<IVariableBinding, Expression> buildFieldBindingsFromCic(ClassInstanceCreation cic) {
return buildFieldBindingsFromCic(cic, new HashMap<>(), new HashMap<>()); return buildFieldBindingsFromCic(cic, new HashMap<>(), new HashMap<>());
} }
@@ -472,7 +497,7 @@ public class JdtDataFlowModel implements DataFlowModel {
MethodDeclaration md = findMethodDeclarationInType(concreteType, mb); MethodDeclaration md = findMethodDeclarationInType(concreteType, mb);
if (md != null) { if (md != null) {
Map<IVariableBinding, Expression> concreteFieldBindings = Map<IVariableBinding, Expression> concreteFieldBindings =
objectFieldBindings.computeIfAbsent(cic, k -> buildFieldBindingsFromCic((ClassInstanceCreation) k)); getOrCreateFieldBindings(cic);
// Apply flow-sensitive intermediate local variable mutations // Apply flow-sensitive intermediate local variable mutations
if (receiver instanceof SimpleName sn) { if (receiver instanceof SimpleName sn) {