Skip to content

Commit 5541cbb

Browse files
Prevent rebuild triggered by type hierarchy restoration
1 parent 89d62b9 commit 5541cbb

2 files changed

Lines changed: 45 additions & 8 deletions

File tree

org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/HistoryAction.java

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,20 +86,32 @@ static StyledString getSingleElementLabel(IJavaElement element) {
8686
* @since 3.7
8787
*/
8888
static String getElementLabel(IJavaElement[] elements) {
89+
return getElementLabel(elements, JavaElementLabels.ALL_DEFAULT | JavaElementLabels.ALL_POST_QUALIFIED | JavaElementLabels.P_COMPRESSED);
90+
}
91+
92+
/**
93+
* Fetches the label for all the java elements.
94+
*
95+
* @param elements the java elements
96+
* @param flags flags for label generation
97+
* @return the label for all the java elements
98+
* @since 3.35
99+
*/
100+
static String getElementLabel(IJavaElement[] elements, long flags) {
89101
switch (elements.length) {
90102
case 0:
91103
Assert.isTrue(false);
92104
return null;
93105

94106
case 1:
95107
return Messages.format(TypeHierarchyMessages.HistoryAction_inputElements_1,
96-
new String[] { getShortLabel(elements[0]) });
108+
new String[] { getShortLabel(elements[0], flags) });
97109
case 2:
98110
return Messages.format(TypeHierarchyMessages.HistoryAction_inputElements_2,
99-
new String[] { getShortLabel(elements[0]), getShortLabel(elements[1]) });
111+
new String[] { getShortLabel(elements[0], flags), getShortLabel(elements[1], flags) });
100112
default:
101113
return Messages.format(TypeHierarchyMessages.HistoryAction_inputElements_more,
102-
new String[] { getShortLabel(elements[0]), getShortLabel(elements[1]), getShortLabel(elements[2]) });
114+
new String[] { getShortLabel(elements[0], flags), getShortLabel(elements[1], flags), getShortLabel(elements[2], flags) });
103115
}
104116
}
105117

@@ -111,7 +123,19 @@ static String getElementLabel(IJavaElement[] elements) {
111123
* @since 3.7
112124
*/
113125
static String getShortLabel(IJavaElement element) {
114-
return JavaElementLabels.getElementLabel(element, JavaElementLabels.ALL_DEFAULT | JavaElementLabels.ALL_POST_QUALIFIED | JavaElementLabels.P_COMPRESSED);
126+
return getShortLabel(element, JavaElementLabels.ALL_DEFAULT | JavaElementLabels.ALL_POST_QUALIFIED | JavaElementLabels.P_COMPRESSED);
127+
}
128+
129+
/**
130+
* Fetches the short label for the java element.
131+
*
132+
* @param element the java element
133+
* @param flags flags for label generation
134+
* @return the short label for the java element
135+
* @since 3.35
136+
*/
137+
static String getShortLabel(IJavaElement element, long flags) {
138+
return JavaElementLabels.getElementLabel(element, flags);
115139
}
116140

117141
}

org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewPart.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.Arrays;
1919
import java.util.Iterator;
2020
import java.util.List;
21+
import java.util.stream.Stream;
2122

2223
import org.eclipse.help.IContextProvider;
2324

@@ -103,6 +104,7 @@
103104
import org.eclipse.ui.part.ViewPart;
104105
import org.eclipse.ui.views.WorkbenchViewerSetup;
105106

107+
import org.eclipse.jdt.core.ClasspathContainerInitializer;
106108
import org.eclipse.jdt.core.IJavaElement;
107109
import org.eclipse.jdt.core.IMember;
108110
import org.eclipse.jdt.core.IType;
@@ -116,6 +118,7 @@
116118

117119
import org.eclipse.jdt.ui.IContextMenuConstants;
118120
import org.eclipse.jdt.ui.ITypeHierarchyViewPart;
121+
import org.eclipse.jdt.ui.JavaElementLabels;
119122
import org.eclipse.jdt.ui.JavaUI;
120123
import org.eclipse.jdt.ui.PreferenceConstants;
121124
import org.eclipse.jdt.ui.actions.CCPActionGroup;
@@ -1643,7 +1646,7 @@ private void restoreState(final IMemento memento) {
16431646
int i= 0;
16441647
while (elementId != null) {
16451648
input= JavaCore.create(elementId);
1646-
if (input == null || !input.exists()) {
1649+
if (input == null) {
16471650
inputList= null;
16481651
break;
16491652
}
@@ -1654,23 +1657,33 @@ private void restoreState(final IMemento memento) {
16541657
doRestoreState(memento, input);
16551658
} else {
16561659
final IJavaElement[] hierarchyInput= inputList.toArray(new IJavaElement[inputList.size()]);
1657-
16581660
synchronized (this) {
1659-
String label= Messages.format(TypeHierarchyMessages.TypeHierarchyViewPart_restoreinput, HistoryAction.getElementLabel(hierarchyInput));
1661+
long flags = JavaElementLabels.M_APP_TYPE_PARAMETERS| JavaElementLabels.M_PARAMETER_TYPES | JavaElementLabels.ALL_POST_QUALIFIED | JavaElementLabels.ALL_POST_QUALIFIED | JavaElementLabels.P_COMPRESSED;
1662+
String label= Messages.format(TypeHierarchyMessages.TypeHierarchyViewPart_restoreinput, HistoryAction.getElementLabel(hierarchyInput, flags));
16601663
fNoHierarchyShownLabel.setText(label);
16611664

16621665
fRestoreStateJob= new Job(label) {
16631666
@Override
16641667
protected IStatus run(IProgressMonitor monitor) {
16651668
try {
1666-
doRestoreInBackground(memento, hierarchyInput, monitor);
1669+
Job.getJobManager().join(ClasspathContainerInitializer.class, monitor);
1670+
IJavaElement[] exsistingHierarchyInput = Stream.of(hierarchyInput).filter(IJavaElement::exists).toArray(length -> new IJavaElement[length]);
1671+
if(exsistingHierarchyInput.length == 0) {
1672+
PlatformUI.getWorkbench().getDisplay().asyncExec(() -> {
1673+
doRestoreState(memento, new IJavaElement[0]);
1674+
});
1675+
} else {
1676+
doRestoreInBackground(memento, exsistingHierarchyInput, monitor);
1677+
}
16671678
} catch (JavaModelException e) {
16681679
return e.getStatus();
16691680
} catch (OperationCanceledException e) {
16701681
if (fRestoreJobCanceledExplicitly) {
16711682
showEmptyViewer();
16721683
}
16731684
return Status.CANCEL_STATUS;
1685+
} catch (InterruptedException e) {
1686+
Thread.currentThread().interrupt();
16741687
}
16751688
return Status.OK_STATUS;
16761689
}

0 commit comments

Comments
 (0)