Skip to content

Commit 41430b9

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 41430b9

1 file changed

Lines changed: 24 additions & 1 deletion

File tree

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

Lines changed: 24 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 canUseCommonViewerComparator = 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,25 @@ 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 (canUseCommonViewerComparator) {
139+
try {
140+
return new CommonViewerComparator();
141+
} catch (Exception e) {
142+
// CommonViewerComparator is not available, fallback to CommonViewerSorter
143+
canUseCommonViewerComparator = false;
144+
}
145+
}
146+
// Can be removed if Eclipse 4.38 is no longer supported
147+
return new CommonViewerSorter();
148+
}
149+
127150
/**
128151
* Returns the range of the given selection and null otherwise.
129152
*

0 commit comments

Comments
 (0)