diff --git a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/core/manipulation/JavaElementPropertyTester.java b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/core/manipulation/JavaElementPropertyTester.java index b840f8a4fa3..9c74ab3378f 100644 --- a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/core/manipulation/JavaElementPropertyTester.java +++ b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/core/manipulation/JavaElementPropertyTester.java @@ -23,6 +23,7 @@ import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; +import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; /** @@ -87,8 +88,13 @@ public class JavaElementPropertyTester extends PropertyTester { public static final String PROJECT_OPTION = "projectOption"; //$NON-NLS-1$ + @SuppressWarnings("boxing") @Override public boolean test(Object receiver, String method, Object[] args, Object expectedValue) { + return JavaCore.callReadOnly(() -> testCached(receiver, method, args, expectedValue)); + } + + private boolean testCached(Object receiver, String method, Object[] args, Object expectedValue) { if (!(receiver instanceof IJavaElement)) { return false; } diff --git a/org.eclipse.jdt.ui/META-INF/MANIFEST.MF b/org.eclipse.jdt.ui/META-INF/MANIFEST.MF index 0e3b2cb01b6..ad6c5e56335 100644 --- a/org.eclipse.jdt.ui/META-INF/MANIFEST.MF +++ b/org.eclipse.jdt.ui/META-INF/MANIFEST.MF @@ -97,7 +97,7 @@ Require-Bundle: org.eclipse.core.filesystem;bundle-version="[1.2.0,2.0.0)", org.eclipse.core.resources;bundle-version="[3.14.0,4.0.0)", org.eclipse.core.variables;bundle-version="[3.2.200,4.0.0)", - org.eclipse.jdt.core;bundle-version="[3.36.0,4.0.0)", + org.eclipse.jdt.core;bundle-version="[3.37.0,4.0.0)", org.eclipse.search;bundle-version="[3.10.0,4.0.0)", org.eclipse.debug.core;bundle-version="[3.10.0,4.0.0)", org.eclipse.debug.ui;bundle-version="[3.11.0,4.0.0)", diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/actions/SelectionConverter.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/actions/SelectionConverter.java index ea7cec6bf21..3b0762507cd 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/actions/SelectionConverter.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/actions/SelectionConverter.java @@ -38,6 +38,7 @@ import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.ITypeRoot; +import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.corext.util.JavaModelUtil; @@ -249,7 +250,7 @@ final class CodeResolveRunnable implements IRunnableWithProgress { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException { try { - result= codeResolve(input, selection); + result= JavaCore.callReadOnly(() -> codeResolve(input, selection)); } catch (JavaModelException e) { throw new InvocationTargetException(e); } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/callhierarchy/CallHierarchyViewer.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/callhierarchy/CallHierarchyViewer.java index d143c2d97d2..f2a64e3e94a 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/callhierarchy/CallHierarchyViewer.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/callhierarchy/CallHierarchyViewer.java @@ -21,6 +21,7 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Tree; +import org.eclipse.swt.widgets.Widget; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.MenuManager; @@ -30,6 +31,8 @@ import org.eclipse.ui.IWorkbenchPartSite; +import org.eclipse.jdt.core.JavaCore; + import org.eclipse.jdt.internal.corext.callhierarchy.CallerMethodWrapper; import org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper; @@ -197,4 +200,10 @@ void expandConstructorNode() { fConstructorToExpand= null; } } + + @Override + protected void internalAdd(Widget widget, Object parentElement, Object[] childElements) { + JavaCore.runReadOnly(() -> super.internalAdd(widget, parentElement, childElements)); + } + } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/callhierarchy/DeferredMethodWrapper.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/callhierarchy/DeferredMethodWrapper.java index 301048a69dc..0332c2df3ee 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/callhierarchy/DeferredMethodWrapper.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/callhierarchy/DeferredMethodWrapper.java @@ -23,6 +23,8 @@ import org.eclipse.ui.progress.IDeferredWorkbenchAdapter; import org.eclipse.ui.progress.IElementCollector; +import org.eclipse.jdt.core.JavaCore; + import org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper; import org.eclipse.jdt.internal.ui.JavaPlugin; @@ -75,7 +77,7 @@ public void fetchDeferredChildren(Object object, IElementCollector collector, IP final DeferredMethodWrapper deferredMethodWrapper= (DeferredMethodWrapper)object; try { fProvider.startFetching(); - collector.add((Object[]) deferredMethodWrapper.getCalls(monitor), monitor); + JavaCore.runReadOnly(() -> collector.add((Object[]) deferredMethodWrapper.getCalls(monitor), monitor)); collector.done(); } catch (OperationCanceledException e) { final MethodWrapper methodWrapper= deferredMethodWrapper.getMethodWrapper(); diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/dialogs/FilteredTypesSelectionDialog.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/dialogs/FilteredTypesSelectionDialog.java index ce02738590f..acc1a5b8f56 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/dialogs/FilteredTypesSelectionDialog.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/dialogs/FilteredTypesSelectionDialog.java @@ -438,7 +438,7 @@ public int open() { } } } - return super.open(); + return JavaCore.callReadOnly(super::open).intValue(); } /** diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/ClassFileEditor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/ClassFileEditor.java index 7a685484dd1..8ba16f2fa1f 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/ClassFileEditor.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/ClassFileEditor.java @@ -60,8 +60,10 @@ import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IWorkbenchCommandConstants; +import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.actions.ActionContext; import org.eclipse.ui.actions.ActionGroup; @@ -649,11 +651,18 @@ protected IEditorInput transformEditorInput(IEditorInput input) { return input; } + @Override + public void init(IEditorSite site, IEditorInput input) throws PartInitException { + JavaCore.runReadOnly(() -> super.init(site, input)); + } /* * @see AbstractTextEditor#doSetInput(IEditorInput) */ @Override protected void doSetInput(IEditorInput input) throws CoreException { + JavaCore.runReadOnly(() -> doSetInputCached(input)); + } + private void doSetInputCached(IEditorInput input) throws CoreException { uninstallOccurrencesFinder(); input= transformEditorInput(input); @@ -736,11 +745,19 @@ protected IStatus run(IProgressMonitor monitor) { job.schedule(); } + @Override + protected void selectionChanged() { + JavaCore.runReadOnly(() -> super.selectionChanged()); + } /* * @see IWorkbenchPart#createPartControl(Composite) */ @Override public void createPartControl(Composite parent) { + JavaCore.runReadOnly(() -> createPartControlCached(parent)); + } + + private void createPartControlCached(Composite parent) { fParent= new Composite(parent, SWT.NONE); fStackLayout= new StackLayout(); fParent.setLayout(fStackLayout); @@ -949,7 +966,7 @@ public void dispose() { */ @Override public void setFocus() { - super.setFocus(); + JavaCore.runReadOnly(super::setFocus); if (fSourceAttachmentForm != null && !fSourceAttachmentForm.isDisposed()) { fSourceAttachmentForm.setFocus(); diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/ClassFileEditorInputFactory.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/ClassFileEditorInputFactory.java index 4bc004b5765..d2c568e101c 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/ClassFileEditorInputFactory.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/ClassFileEditorInputFactory.java @@ -45,8 +45,13 @@ public ClassFileEditorInputFactory() { @Override public IAdaptable createElement(IMemento memento) { String identifier= memento.getString(KEY); - if (identifier == null) + if (identifier == null) { return null; + } + return JavaCore.callReadOnly(() -> createElementCached(identifier)); + } + + private IAdaptable createElementCached(String identifier) { IJavaElement element= JavaCore.create(identifier); try { diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaEditor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaEditor.java index 4fd48400325..888058b459b 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaEditor.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaEditor.java @@ -21,6 +21,7 @@ import java.lang.StackWalker.StackFrame; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.text.BreakIterator; import java.text.CharacterIterator; import java.util.ArrayList; import java.util.HashMap; @@ -30,8 +31,6 @@ import java.util.Map.Entry; import java.util.function.Predicate; -import java.text.BreakIterator; - import org.osgi.service.prefs.BackingStoreException; import org.eclipse.help.IContextProvider; @@ -1210,15 +1209,19 @@ private class ActivationListener implements IWindowListener { @Override public void windowActivated(IWorkbenchWindow window) { if (window == getEditorSite().getWorkbenchWindow() && fMarkOccurrenceAnnotations && isActivePart()) { - fForcedMarkOccurrencesSelection= getSelectionProvider().getSelection(); - ITypeRoot inputJavaElement= getInputJavaElement(); - if (inputJavaElement != null) { - IProgressMonitor monitor = getProgressMonitor(); - try { - updateOccurrenceAnnotations((ITextSelection)fForcedMarkOccurrencesSelection, SharedASTProviderCore.getAST(inputJavaElement, SharedASTProviderCore.WAIT_NO, monitor)); - } finally { - monitor.done(); - } + JavaCore.runReadOnly(this::windowActivatedCached); + } + } + + private void windowActivatedCached() { + fForcedMarkOccurrencesSelection= getSelectionProvider().getSelection(); + ITypeRoot inputJavaElement= getInputJavaElement(); + if (inputJavaElement != null) { + IProgressMonitor monitor = getProgressMonitor(); + try { + updateOccurrenceAnnotations((ITextSelection)fForcedMarkOccurrencesSelection, SharedASTProviderCore.getAST(inputJavaElement, SharedASTProviderCore.WAIT_NO, monitor)); + } finally { + monitor.done(); } } } @@ -2174,9 +2177,13 @@ public void synchronizeOutlinePageSelection() { synchronizeOutlinePage(computeHighlightRangeSourceReference()); } - @SuppressWarnings("unchecked") @Override public T getAdapter(Class required) { + return JavaCore.callReadOnly(() -> getAdapterCached(required)); + } + + @SuppressWarnings("unchecked") + private T getAdapterCached(Class required) { if (IContentOutlinePage.class.equals(required)) { if (fOutlinePage == null && getSourceViewer() != null && isCalledByOutline()) @@ -3070,8 +3077,10 @@ public Object getViewPartInput() { */ @Override protected void doSetSelection(ISelection selection) { - super.doSetSelection(selection); - synchronizeOutlinePageSelection(); + JavaCore.runReadOnly(() -> { + super.doSetSelection(selection); + synchronizeOutlinePageSelection(); + }); } boolean isFoldingEnabled() { diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaElementHyperlinkDetector.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaElementHyperlinkDetector.java index 6ffc3c4005a..397a7c989df 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaElementHyperlinkDetector.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaElementHyperlinkDetector.java @@ -33,6 +33,7 @@ import org.eclipse.jdt.core.ICodeAssist; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.ITypeRoot; +import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.BreakStatement; @@ -81,6 +82,10 @@ public class JavaElementHyperlinkDetector extends AbstractHyperlinkDetector { */ @Override public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { + return JavaCore.callReadOnly(() -> detectHyperlinksCached(region)); + } + + private IHyperlink[] detectHyperlinksCached(IRegion region) { ITextEditor textEditor= getAdapter(ITextEditor.class); if (region == null || !(textEditor instanceof JavaEditor)) return null; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaOutlinePage.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaOutlinePage.java index 8a713adfd4d..3d65289fa77 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaOutlinePage.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaOutlinePage.java @@ -930,6 +930,10 @@ private void registerToolbarActions(IActionBars actionBars) { */ @Override public void createControl(Composite parent) { + JavaCore.runReadOnly(() -> createControlCached(parent)); + } + + private void createControlCached(Composite parent) { Tree tree= new Tree(parent, SWT.MULTI); diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaSourceViewer.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaSourceViewer.java index cc1868c7927..c26a80da77e 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaSourceViewer.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/JavaSourceViewer.java @@ -157,6 +157,10 @@ public IFormattingContext createFormattingContext() { */ @Override public void doOperation(int operation) { + JavaCore.runReadOnly(()->doOperationCached(operation)); + } + + private void doOperationCached(int operation) { if (getTextWidget() == null) return; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightingReconciler.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightingReconciler.java index 526981ab1a0..0c8c665cde6 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightingReconciler.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightingReconciler.java @@ -34,6 +34,7 @@ import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.jdt.core.ITypeRoot; +import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.CompilationUnit; @@ -621,8 +622,10 @@ protected IStatus run(IProgressMonitor monitor) { } if (monitor.isCanceled()) return Status.CANCEL_STATUS; - CompilationUnit ast= SharedASTProviderCore.getAST(element, SharedASTProviderCore.WAIT_YES, monitor); - reconciled(ast, false, monitor); + JavaCore.runReadOnly(() -> { + CompilationUnit ast= SharedASTProviderCore.getAST(element, SharedASTProviderCore.WAIT_YES, monitor); + reconciled(ast, false, monitor); + }); synchronized (fJobLock) { // allow the job to be gc'ed if (fJob == this) diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/ShowInBreadcrumbAction.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/ShowInBreadcrumbAction.java index df7d543d777..cf1170647e5 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/ShowInBreadcrumbAction.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/ShowInBreadcrumbAction.java @@ -18,6 +18,8 @@ import org.eclipse.ui.PlatformUI; +import org.eclipse.jdt.core.JavaCore; + import org.eclipse.jdt.internal.ui.IJavaHelpContextIds; import org.eclipse.jdt.internal.ui.JavaPlugin; import org.eclipse.jdt.internal.ui.javaeditor.breadcrumb.IBreadcrumb; @@ -48,9 +50,10 @@ public void run() { IBreadcrumb breadcrumb= fEditor.getBreadcrumb(); if (breadcrumb == null) return; - - IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore(); - store.setValue(getPreferenceKey(), true); + JavaCore.runReadOnly(() -> { + IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore(); + store.setValue(getPreferenceKey(), true); + }); breadcrumb.activate(); } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/TogglePresentationAction.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/TogglePresentationAction.java index 3c3134e8bd9..3cf215fcec8 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/TogglePresentationAction.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/TogglePresentationAction.java @@ -29,6 +29,7 @@ import org.eclipse.ui.texteditor.TextEditorAction; import org.eclipse.jdt.core.IClassFile; +import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.ui.IWorkingCopyManager; import org.eclipse.jdt.ui.PreferenceConstants; @@ -126,7 +127,7 @@ public void setEditor(ITextEditor editor) { fStore= null; } - update(); + JavaCore.runReadOnly(() -> update()); } /** diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/hover/BestMatchHover.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/hover/BestMatchHover.java index d2be867c37b..8c7edbfc6f8 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/hover/BestMatchHover.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/hover/BestMatchHover.java @@ -26,6 +26,8 @@ import org.eclipse.ui.IEditorPart; +import org.eclipse.jdt.core.JavaCore; + import org.eclipse.jdt.ui.PreferenceConstants; import org.eclipse.jdt.ui.text.java.hover.IJavaEditorTextHover; @@ -127,7 +129,7 @@ public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) { */ @Override public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) { - return getHoverInfo2(textViewer, hoverRegion, false); + return JavaCore.callReadOnly(() -> getHoverInfo2(textViewer, hoverRegion, false)); } /** diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/hover/JavadocHover.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/hover/JavadocHover.java index 29501ab9c71..75c5d6b1368 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/hover/JavadocHover.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/hover/JavadocHover.java @@ -664,7 +664,7 @@ public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) { } private JavadocBrowserInformationControlInput internalGetHoverInfo(ITextViewer textViewer, IRegion hoverRegion) { - IJavaElement[] elements= getJavaElementsAt(textViewer, hoverRegion); + IJavaElement[] elements= JavaCore.callReadOnly(() -> getJavaElementsAt(textViewer, hoverRegion)); if (elements == null || elements.length == 0) return null; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/HierarchyInformationControl.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/HierarchyInformationControl.java index 634bb6934f4..fe4cf55e3ad 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/HierarchyInformationControl.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/HierarchyInformationControl.java @@ -24,9 +24,9 @@ import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; +import org.eclipse.jface.bindings.TriggerSequence; import org.eclipse.jface.bindings.keys.KeySequence; import org.eclipse.jface.bindings.keys.SWTKeySupport; -import org.eclipse.jface.bindings.TriggerSequence; import org.eclipse.jface.viewers.AbstractTreeViewer; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; @@ -41,6 +41,7 @@ import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.ITypeHierarchy; +import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.Signature; @@ -208,6 +209,10 @@ private IMethod findMethod(IMethod filterMethod, IType typeToFindIn) throws Java @Override public void setInput(Object information) { + JavaCore.runReadOnly(() -> setInputCached(information)); + } + + private void setInputCached(Object information) { if (!(information instanceof IJavaElement)) { inputChanged(null, null); return; diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TraditionalHierarchyViewer.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TraditionalHierarchyViewer.java index f5036430215..8a36755745e 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TraditionalHierarchyViewer.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TraditionalHierarchyViewer.java @@ -16,11 +16,13 @@ import java.util.Arrays; import java.util.List; +import org.eclipse.swt.events.TreeEvent; import org.eclipse.swt.widgets.Composite; import org.eclipse.jdt.core.Flags; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.ITypeHierarchy; +import org.eclipse.jdt.core.JavaCore; /** * A TypeHierarchyViewer that looks like the type hierarchy view of VA/Java: @@ -176,4 +178,9 @@ protected IType getParentType(IType type) { } } + + @Override + protected void handleTreeExpand(TreeEvent event) { + JavaCore.runReadOnly(()->super.handleTreeExpand(event)); + } } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyLifeCycle.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyLifeCycle.java index fa9244a58d7..4936704d67c 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyLifeCycle.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyLifeCycle.java @@ -280,8 +280,10 @@ protected void doHierarchyRefreshBackground(final IJavaElement[] elements, final } if (pm.isCanceled()) return; - fTypeHierarchyViewPart.setViewersInput(); - fTypeHierarchyViewPart.updateViewers(); + JavaCore.runReadOnly(() -> { + fTypeHierarchyViewPart.setViewersInput(); + fTypeHierarchyViewPart.updateViewers(); + }); }); } } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewPart.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewPart.java index 1dbe445fc90..315a641c6eb 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewPart.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewPart.java @@ -1210,7 +1210,7 @@ private void updateHierarchyViewer(final boolean doExpand) { fPagebook.showPage(fNoHierarchyShownLabel); } else { if (getCurrentViewer().containsElements() != null) { - Runnable runnable= () -> getCurrentViewer().updateContent(doExpand); + Runnable runnable= () -> JavaCore.runReadOnly(() -> getCurrentViewer().updateContent(doExpand)); BusyIndicator.showWhile(getDisplay(), runnable); if (!isChildVisible(fViewerbook, getCurrentViewer().getControl())) { setViewerVisibility(true); @@ -1686,7 +1686,7 @@ private void doRestoreInBackground(final IMemento memento, final IJavaElement[] Display.getDefault().asyncExec(() -> { // running async: check first if view still exists if (fPagebook != null && !fPagebook.isDisposed()) { - doRestoreState(memento, hierarchyInput); + JavaCore.runReadOnly(() -> doRestoreState(memento, hierarchyInput)); } }); } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/DecoratingJavaLabelProvider.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/DecoratingJavaLabelProvider.java index 54e760a8cf6..2f30d4ab1f8 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/DecoratingJavaLabelProvider.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/DecoratingJavaLabelProvider.java @@ -14,9 +14,12 @@ package org.eclipse.jdt.internal.ui.viewsupport; import org.eclipse.jface.viewers.DecorationContext; +import org.eclipse.jface.viewers.LabelProviderChangedEvent; import org.eclipse.ui.PlatformUI; +import org.eclipse.jdt.core.JavaCore; + import org.eclipse.jdt.ui.ProblemsLabelDecorator; import org.eclipse.jdt.internal.ui.packageview.HierarchicalDecorationContext; @@ -71,5 +74,8 @@ public void setFlatPackageMode(boolean enable) { setDecorationContext(HierarchicalDecorationContext.getContext()); } } - + @Override + protected void fireLabelProviderChanged(LabelProviderChangedEvent event) { + JavaCore.runReadOnly(() -> super.fireLabelProviderChanged(event)); + } } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/SelectionListenerWithASTManager.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/SelectionListenerWithASTManager.java index 61814202484..4bc80262a51 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/SelectionListenerWithASTManager.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/SelectionListenerWithASTManager.java @@ -36,6 +36,7 @@ import org.eclipse.ui.texteditor.ITextEditor; import org.eclipse.jdt.core.ITypeRoot; +import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.manipulation.SharedASTProviderCore; @@ -144,11 +145,8 @@ public void firePostSelectionChanged(final ITextSelection selection) { fCurrentJob= new Job(JavaUIMessages.SelectionListenerWithASTManager_job_title) { @Override public IStatus run(IProgressMonitor monitor) { - if (monitor == null) { - monitor= new NullProgressMonitor(); - } synchronized (fJobLock) { - return calculateASTandInform(typeRoot, selection, monitor); + return JavaCore.callReadOnly(() -> calculateASTandInform(typeRoot, selection, monitor)); } } }; @@ -158,6 +156,9 @@ public IStatus run(IProgressMonitor monitor) { } protected IStatus calculateASTandInform(ITypeRoot input, ITextSelection selection, IProgressMonitor monitor) { + if (monitor == null) { + monitor= new NullProgressMonitor(); + } if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/SelectionProviderMediator.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/SelectionProviderMediator.java index 579791ffdd9..2f91715c352 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/SelectionProviderMediator.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/SelectionProviderMediator.java @@ -29,6 +29,8 @@ import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.StructuredViewer; +import org.eclipse.jdt.core.JavaCore; + /** * A selection provider for view parts with more that one viewer. * Tracks the focus of the viewers to provide the correct selection. @@ -128,6 +130,10 @@ final void propagateFocusChanged(StructuredViewer viewer) { } private void fireSelectionChanged() { + JavaCore.runReadOnly(this::fireSelectionChangedCached); + } + + private void fireSelectionChangedCached() { if (fSelectionChangedListeners != null) { SelectionChangedEvent event= new SelectionChangedEvent(this, getSelection()); diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/OverrideIndicatorLabelDecorator.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/OverrideIndicatorLabelDecorator.java index 4ae2eef7fe3..7215d253420 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/OverrideIndicatorLabelDecorator.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/OverrideIndicatorLabelDecorator.java @@ -27,6 +27,7 @@ import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.ITypeHierarchy; +import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.CompilationUnit; @@ -124,28 +125,31 @@ public Image decorateImage(Image image, Object element) { * * @noreference This method is not intended to be referenced by clients. */ + @SuppressWarnings("boxing") public int computeAdornmentFlags(Object element) { - if (element instanceof IMethod) { - try { - IMethod method= (IMethod) element; - if (!method.getJavaProject().isOnClasspath(method)) { - return 0; - } - int flags= method.getFlags(); - if (!method.isConstructor() && !Flags.isPrivate(flags) && !Flags.isStatic(flags)) { - int res= getOverrideIndicators(method); - if (res != 0 && Flags.isSynchronized(flags)) { - return res | JavaElementImageDescriptor.SYNCHRONIZED; + return JavaCore.callReadOnly(() -> { + if (element instanceof IMethod) { + try { + IMethod method= (IMethod) element; + if (!method.getJavaProject().isOnClasspath(method)) { + return 0; + } + int flags= method.getFlags(); + if (!method.isConstructor() && !Flags.isPrivate(flags) && !Flags.isStatic(flags)) { + int res= getOverrideIndicators(method); + if (res != 0 && Flags.isSynchronized(flags)) { + return res | JavaElementImageDescriptor.SYNCHRONIZED; + } + return res; + } + } catch (JavaModelException e) { + if (!e.isDoesNotExist()) { + JavaPlugin.log(e); } - return res; - } - } catch (JavaModelException e) { - if (!e.isDoesNotExist()) { - JavaPlugin.log(e); } } - } - return 0; + return 0; + }); } /** diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/OpenAction.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/OpenAction.java index 824ce4d17aa..5ae6a4b83d0 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/OpenAction.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/OpenAction.java @@ -45,6 +45,7 @@ import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.ISourceReference; import org.eclipse.jdt.core.ITypeRoot; +import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.core.manipulation.search.IOccurrencesFinder.OccurrenceLocation; @@ -251,7 +252,7 @@ private IJavaElement[] selectOpenableElements(IJavaElement[] elements) { public void run(IStructuredSelection selection) { if (!checkEnabled(selection)) return; - run(selection.toArray()); + JavaCore.runReadOnly(() -> run(selection.toArray())); } /** diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/SelectionDispatchAction.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/SelectionDispatchAction.java index 9cc2d8bddc7..f46a33cebf4 100644 --- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/SelectionDispatchAction.java +++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/SelectionDispatchAction.java @@ -28,6 +28,8 @@ import org.eclipse.ui.IWorkbenchSite; +import org.eclipse.jdt.core.JavaCore; + import org.eclipse.jdt.internal.ui.javaeditor.JavaTextSelection; /** @@ -249,7 +251,7 @@ public void run(ISelection selection) { @Override public void run() { - dispatchRun(getSelection()); + JavaCore.runReadOnly(() -> dispatchRun(getSelection())); } @Override