Skip to content

Commit b350c33

Browse files
Prevent rebuild triggered by type hierarchy restoration
Fixes #2305
1 parent 89d62b9 commit b350c33

2 files changed

Lines changed: 44 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: 16 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

@@ -116,6 +117,7 @@
116117

117118
import org.eclipse.jdt.ui.IContextMenuConstants;
118119
import org.eclipse.jdt.ui.ITypeHierarchyViewPart;
120+
import org.eclipse.jdt.ui.JavaElementLabels;
119121
import org.eclipse.jdt.ui.JavaUI;
120122
import org.eclipse.jdt.ui.PreferenceConstants;
121123
import org.eclipse.jdt.ui.actions.CCPActionGroup;
@@ -1643,7 +1645,7 @@ private void restoreState(final IMemento memento) {
16431645
int i= 0;
16441646
while (elementId != null) {
16451647
input= JavaCore.create(elementId);
1646-
if (input == null || !input.exists()) {
1648+
if (input == null) {
16471649
inputList= null;
16481650
break;
16491651
}
@@ -1654,23 +1656,33 @@ private void restoreState(final IMemento memento) {
16541656
doRestoreState(memento, input);
16551657
} else {
16561658
final IJavaElement[] hierarchyInput= inputList.toArray(new IJavaElement[inputList.size()]);
1657-
16581659
synchronized (this) {
1659-
String label= Messages.format(TypeHierarchyMessages.TypeHierarchyViewPart_restoreinput, HistoryAction.getElementLabel(hierarchyInput));
1660+
long flags = JavaElementLabels.M_APP_TYPE_PARAMETERS| JavaElementLabels.M_PARAMETER_TYPES | JavaElementLabels.ALL_POST_QUALIFIED | JavaElementLabels.P_COMPRESSED;
1661+
String label= Messages.format(TypeHierarchyMessages.TypeHierarchyViewPart_restoreinput, HistoryAction.getElementLabel(hierarchyInput, flags));
16601662
fNoHierarchyShownLabel.setText(label);
16611663

16621664
fRestoreStateJob= new Job(label) {
16631665
@Override
16641666
protected IStatus run(IProgressMonitor monitor) {
16651667
try {
1666-
doRestoreInBackground(memento, hierarchyInput, monitor);
1668+
Job.getJobManager().join(JavaUI.ID_PLUGIN, monitor);
1669+
IJavaElement[] existingHierarchyInput = Stream.of(hierarchyInput).filter(IJavaElement::exists).toArray(length -> new IJavaElement[length]);
1670+
if(existingHierarchyInput.length == 0) {
1671+
PlatformUI.getWorkbench().getDisplay().asyncExec(() -> {
1672+
doRestoreState(memento, new IJavaElement[0]);
1673+
});
1674+
} else {
1675+
doRestoreInBackground(memento, existingHierarchyInput, monitor);
1676+
}
16671677
} catch (JavaModelException e) {
16681678
return e.getStatus();
16691679
} catch (OperationCanceledException e) {
16701680
if (fRestoreJobCanceledExplicitly) {
16711681
showEmptyViewer();
16721682
}
16731683
return Status.CANCEL_STATUS;
1684+
} catch (InterruptedException e) {
1685+
showEmptyViewer();
16741686
}
16751687
return Status.OK_STATUS;
16761688
}

0 commit comments

Comments
 (0)