From 15548fff7ff6c52ab4d292d3b61e31b1d7eb13f6 Mon Sep 17 00:00:00 2001 From: fedejeanne Date: Wed, 6 Aug 2025 14:41:14 +0200 Subject: [PATCH] Show progress when pre-calculating the AST during save #2414 Fixes https://github.com/eclipse-jdt/eclipse.jdt.ui/issues/2414 --- .../corext/fix/CleanUpPostSaveListener.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/CleanUpPostSaveListener.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/CleanUpPostSaveListener.java index 53cb2de4b43..258781a1af0 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/CleanUpPostSaveListener.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/CleanUpPostSaveListener.java @@ -13,12 +13,14 @@ *******************************************************************************/ package org.eclipse.jdt.internal.corext.fix; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; @@ -60,6 +62,7 @@ import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.window.Window; import org.eclipse.jface.text.BadLocationException; @@ -71,7 +74,9 @@ import org.eclipse.jface.text.Position; import org.eclipse.jface.text.Region; +import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.PreferencesUtil; +import org.eclipse.ui.progress.IProgressService; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.CompositeChange; @@ -375,7 +380,9 @@ public void saved(ICompilationUnit unit, IRegion[] changedRegions, IProgressMoni CompilationUnit ast= null; if (requiresAST(cleanUps)) { - ast= createAst(unit, options, Progress.subMonitor(monitor, 10)); + AtomicReference ref = new AtomicReference<>(); + runUsingProgressService(m -> ref.set(createAst(unit, options, m))); + ast= ref.get(); } CleanUpContext context; @@ -583,6 +590,24 @@ private boolean requiresChangedRegions(ICleanUp[] cleanUps) { return false; } + private static void runUsingProgressService(IRunnableWithProgress runnable) { + try { + IProgressService progressService= PlatformUI.getWorkbench().getProgressService(); + progressService.run(true, false, runnable); + } catch (InvocationTargetException e) { + if (e instanceof InvocationTargetException ite && ite.getCause() instanceof RuntimeException rte) + // Something happened inside the call, re-throw + throw rte; + + // Other kind of exceptions are simply logged + JavaPlugin.log(e); + } catch (InterruptedException e) { + // This currently doesn't happen since canceling the monitor does not throw an OperationCanceledException. + // ... but better safe than sorry, so log it. + JavaPlugin.log(e); + } + } + private CompilationUnit createAst(ICompilationUnit unit, Map cleanUpOptions, IProgressMonitor monitor) { IJavaProject project= unit.getJavaProject(); if (compatibleOptions(project, cleanUpOptions)) {