4040import org .eclipse .jface .viewers .TreePath ;
4141import org .eclipse .jface .viewers .TreeSelection ;
4242import org .eclipse .jface .viewers .TreeViewer ;
43+ import org .eclipse .jface .viewers .ViewerComparator ;
4344import org .eclipse .lsp4e .LSPEclipseUtils ;
4445import org .eclipse .lsp4e .LanguageServerPlugin ;
4546import org .eclipse .lsp4e .LanguageServerWrapper ;
5455import org .eclipse .ui .IActionBars ;
5556import org .eclipse .ui .navigator .CommonViewer ;
5657import org .eclipse .ui .navigator .CommonViewerComparator ;
58+ import org .eclipse .ui .navigator .CommonViewerSorter ;
5759import org .eclipse .ui .texteditor .ITextEditor ;
5860import 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