From bd8fbb66f526797d6ee777dc129d562b974c6917 Mon Sep 17 00:00:00 2001 From: Lars Vogel Date: Thu, 14 May 2026 06:32:50 +0200 Subject: [PATCH] Fix SubMonitor misuse in UndoablePackageDeleteChange The perform() method mixed pm.worked() with SubMonitor.convert() on the same monitor, and called SubMonitor.convert(pm, 1) inside a loop. Both patterns corrupt progress reporting: convert() resets the monitor's remaining work, so repeated calls in a loop or after worked() discard already-reported progress. Replace pm.beginTask/worked/done and the in-loop SubMonitor.convert() calls with a single SubMonitor.convert() up front, then split() for each unit of work. --- .../changes/UndoablePackageDeleteChange.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/org.eclipse.jdt.core.manipulation/refactoring/org/eclipse/jdt/internal/corext/refactoring/changes/UndoablePackageDeleteChange.java b/org.eclipse.jdt.core.manipulation/refactoring/org/eclipse/jdt/internal/corext/refactoring/changes/UndoablePackageDeleteChange.java index 41f10f38979..f81854c1e3e 100644 --- a/org.eclipse.jdt.core.manipulation/refactoring/org/eclipse/jdt/internal/corext/refactoring/changes/UndoablePackageDeleteChange.java +++ b/org.eclipse.jdt.core.manipulation/refactoring/org/eclipse/jdt/internal/corext/refactoring/changes/UndoablePackageDeleteChange.java @@ -39,19 +39,17 @@ public UndoablePackageDeleteChange(String name, List packageDeletes) @Override public Change perform(IProgressMonitor pm) throws CoreException { int count= fPackageDeletes.size(); - pm.beginTask("", count * 3); //$NON-NLS-1$ + SubMonitor subMonitor= SubMonitor.convert(pm, count * 3); List> snapshots = new ArrayList<>(); - for (int i= 0; i < fPackageDeletes.size(); i++) { - IResource resource= fPackageDeletes.get(i); + for (IResource resource : fPackageDeletes) { snapshots.add(ResourceSnapshotFactory.fromResource(resource)); - pm.worked(1); + subMonitor.split(1); } - DynamicValidationStateChange result= (DynamicValidationStateChange) super.perform(SubMonitor.convert(pm, count)); + DynamicValidationStateChange result= (DynamicValidationStateChange) super.perform(subMonitor.split(count)); - for (int i= 0; i < fPackageDeletes.size(); i++) { - IResourceSnapshot resourceDescription= snapshots.get(i); - resourceDescription.recordStateFromHistory(SubMonitor.convert(pm, 1)); + for (IResourceSnapshot resourceDescription : snapshots) { + resourceDescription.recordStateFromHistory(subMonitor.split(1)); result.add(new UndoDeleteResourceChange(resourceDescription)); } return result;