Skip to content

Commit f29358e

Browse files
committed
fix: add ViewerComparator compatibility workaround for Outline view
CommonViewerComparator was introduced in Eclipse 4.39 and so Outline can't use this class on older Eclipse versions. Let use old CommonViewerSorter for compatibility with older Eclipse releases. See eclipse-platform/eclipse.platform.ui#3621 Fixes #1515
1 parent 2380ada commit f29358e

1 file changed

Lines changed: 23 additions & 1 deletion

File tree

org.eclipse.lsp4e/src/org/eclipse/lsp4e/outline/CNFOutlinePage.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.eclipse.jface.viewers.TreePath;
4141
import org.eclipse.jface.viewers.TreeSelection;
4242
import org.eclipse.jface.viewers.TreeViewer;
43+
import org.eclipse.jface.viewers.ViewerComparator;
4344
import org.eclipse.lsp4e.LSPEclipseUtils;
4445
import org.eclipse.lsp4e.LanguageServerPlugin;
4546
import org.eclipse.lsp4e.LanguageServerWrapper;
@@ -54,6 +55,7 @@
5455
import org.eclipse.ui.IActionBars;
5556
import org.eclipse.ui.navigator.CommonViewer;
5657
import org.eclipse.ui.navigator.CommonViewerComparator;
58+
import org.eclipse.ui.navigator.CommonViewerSorter;
5759
import org.eclipse.ui.texteditor.ITextEditor;
5860
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
5961

@@ -75,6 +77,8 @@ public class CNFOutlinePage implements IContentOutlinePage, ILabelProviderListen
7577

7678
private final LanguageServerWrapper wrapper;
7779

80+
private static boolean canUseViewerComparator = true;
81+
7882
public CNFOutlinePage(LanguageServerWrapper wrapper, @Nullable ITextEditor textEditor) {
7983
preferences = InstanceScope.INSTANCE.getNode(LanguageServerPlugin.PLUGIN_ID);
8084
preferences.addPreferenceChangeListener(this);
@@ -90,7 +94,7 @@ public void createControl(final Composite parent) {
9094
if (document != null) {
9195
outlineViewer.setInput(new OutlineViewerInput(document, wrapper, textEditor));
9296
}
93-
outlineViewer.setComparator(new CommonViewerComparator());
97+
outlineViewer.setComparator(createComparator());
9498
outlineViewer.getLabelProvider().addListener(this);
9599
final var textEditor = this.textEditor;
96100
if (textEditor != null) {
@@ -124,6 +128,24 @@ public void createControl(final Composite parent) {
124128
}
125129
}
126130

131+
/**
132+
* Try to be compatible with older Eclipse versions (before 4.39) where
133+
* CommonViewerComparator is not available.
134+
*
135+
* @return comparator for the outline
136+
*/
137+
private static ViewerComparator createComparator() {
138+
if (canUseViewerComparator) {
139+
try {
140+
return new CommonViewerComparator();
141+
} catch (NoClassDefFoundError e) {
142+
// CommonViewerComparator is not available, fallback to no comparator and log the error.
143+
canUseViewerComparator = false;
144+
}
145+
}
146+
return new CommonViewerSorter();
147+
}
148+
127149
/**
128150
* Returns the range of the given selection and null otherwise.
129151
*

0 commit comments

Comments
 (0)