Skip to content

Commit fc922c7

Browse files
travkin79rubenporras
authored andcommitted
Replace inheritance with composition
Move common label provider methods for determining document symbol images to a customizable, but non-abstract, non-LabelProvider class that is used by LabelProviders through composition instead of inheritance.
1 parent 185ef18 commit fc922c7

6 files changed

Lines changed: 56 additions & 30 deletions

File tree

org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/utils/LSPImagesTest.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,13 @@
1111
*******************************************************************************/
1212
package org.eclipse.lsp4e.test.utils;
1313

14-
import static org.junit.jupiter.api.Assertions.*;
14+
import static org.junit.jupiter.api.Assertions.assertNotNull;
1515

1616
import java.util.List;
1717

18-
import org.eclipse.jdt.annotation.Nullable;
1918
import org.eclipse.jface.resource.ImageDescriptor;
20-
import org.eclipse.lsp4e.ui.AbstractLsp4eLabelProvider;
2119
import org.eclipse.lsp4e.ui.LSPImages;
20+
import org.eclipse.lsp4e.ui.SymbolIconProvider;
2221
import org.eclipse.lsp4j.CompletionItem;
2322
import org.eclipse.lsp4j.CompletionItemKind;
2423
import org.eclipse.lsp4j.SymbolKind;
@@ -48,21 +47,13 @@ public void testAllOverlayImagesForSymbolTagAvailable(SymbolTag tag) {
4847
assertNotNull(img);
4948
}
5049

51-
private static class TestLabelProvider extends AbstractLsp4eLabelProvider {
52-
// increase method visibility for the following test
53-
@Override
54-
public @Nullable Image getImageFor(@Nullable SymbolKind symbolKind, @Nullable List<SymbolTag> symbolTags) {
55-
return super.getImageFor(symbolKind, symbolTags);
56-
}
57-
}
58-
5950
// Deprecated is used to test the case where no visibility tag is available, that should default to the standard symbol icon
6051
@ParameterizedTest
6152
@EnumSource(value=SymbolTag.class, mode=Mode.INCLUDE, names= { "Private", "Package", "Protected", "Public",
6253
"Internal", "File", "Deprecated"})
6354
public void testVisibilityOverlayImagesForFieldsAndMethodsAvailable(SymbolTag tag) {
6455
var symbolTags = List.of(tag);
65-
TestLabelProvider labelProvider = new TestLabelProvider();
56+
SymbolIconProvider labelProvider = new SymbolIconProvider();
6657

6758
Image fieldImage = labelProvider.getImageFor(SymbolKind.Field, symbolTags);
6859
Image methodImage = labelProvider.getImageFor(SymbolKind.Method, symbolTags);

org.eclipse.lsp4e/src/org/eclipse/lsp4e/callhierarchy/CallHierarchyLabelProvider.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,32 @@
1414

1515
import org.eclipse.jdt.annotation.Nullable;
1616
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
17+
import org.eclipse.jface.viewers.LabelProvider;
1718
import org.eclipse.jface.viewers.StyledString;
18-
import org.eclipse.lsp4e.ui.AbstractLsp4eLabelProvider;
19+
import org.eclipse.lsp4e.ui.SymbolIconProvider;
1920
import org.eclipse.lsp4j.CallHierarchyItem;
2021
import org.eclipse.swt.graphics.Image;
2122

2223
/**
2324
* Label provider for the call hierarchy tree view.
2425
*/
25-
public class CallHierarchyLabelProvider extends AbstractLsp4eLabelProvider implements IStyledLabelProvider {
26+
public class CallHierarchyLabelProvider extends LabelProvider implements IStyledLabelProvider {
27+
28+
private final SymbolIconProvider symbolIconProvider;
29+
30+
public CallHierarchyLabelProvider() {
31+
this(new SymbolIconProvider());
32+
}
33+
34+
public CallHierarchyLabelProvider(SymbolIconProvider symbolIconProvider) {
35+
this.symbolIconProvider = symbolIconProvider;
36+
}
2637

2738
@Override
2839
public @Nullable Image getImage(final @Nullable Object element) {
2940
if (element instanceof CallHierarchyViewTreeNode treeNode) {
3041
CallHierarchyItem callContainer = treeNode.getCallContainer();
31-
Image res = getImageFor(callContainer.getKind(), callContainer.getTags());
42+
Image res = symbolIconProvider.getImageFor(callContainer.getKind(), callContainer.getTags());
3243
if (res != null) {
3344
return res;
3445
}

org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/typeHierarchy/TypeHierarchyItemLabelProvider.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,23 @@
1010

1111
import org.eclipse.jdt.annotation.Nullable;
1212
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
13+
import org.eclipse.jface.viewers.LabelProvider;
1314
import org.eclipse.jface.viewers.StyledString;
14-
import org.eclipse.lsp4e.ui.AbstractLsp4eLabelProvider;
15+
import org.eclipse.lsp4e.ui.SymbolIconProvider;
1516
import org.eclipse.lsp4j.TypeHierarchyItem;
1617
import org.eclipse.swt.graphics.Image;
1718

18-
public class TypeHierarchyItemLabelProvider extends AbstractLsp4eLabelProvider implements IStyledLabelProvider {
19+
public class TypeHierarchyItemLabelProvider extends LabelProvider implements IStyledLabelProvider {
20+
21+
private final SymbolIconProvider symbolIconProvider;
22+
23+
public TypeHierarchyItemLabelProvider() {
24+
this(new SymbolIconProvider());
25+
}
26+
27+
public TypeHierarchyItemLabelProvider(SymbolIconProvider symbolIconProvider) {
28+
this.symbolIconProvider = symbolIconProvider;
29+
}
1930

2031
@Override
2132
public String getText(Object element) {
@@ -28,7 +39,7 @@ public String getText(Object element) {
2839
@Override
2940
public @Nullable Image getImage(@Nullable Object element) {
3041
if (element instanceof TypeHierarchyItem item) {
31-
return getImageFor(item.getKind(), item.getTags());
42+
return symbolIconProvider.getImageFor(item.getKind(), item.getTags());
3243
}
3344
return element == null ? null : super.getImage(element);
3445
}

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
*******************************************************************************/
1313
package org.eclipse.lsp4e.outline;
1414

15-
import static org.eclipse.lsp4e.LSPEclipseUtils.*;
15+
import static org.eclipse.lsp4e.LSPEclipseUtils.findResourceFor;
1616

1717
import java.net.URI;
1818
import java.util.ArrayList;
@@ -38,16 +38,17 @@
3838
import org.eclipse.jface.text.IDocument;
3939
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
4040
import org.eclipse.jface.viewers.ILabelProviderListener;
41+
import org.eclipse.jface.viewers.LabelProvider;
4142
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
4243
import org.eclipse.jface.viewers.StyledString;
4344
import org.eclipse.lsp4e.LSPEclipseUtils;
4445
import org.eclipse.lsp4e.LanguageServerPlugin;
4546
import org.eclipse.lsp4e.internal.StyleUtil;
4647
import org.eclipse.lsp4e.operations.symbols.SymbolsUtil;
4748
import org.eclipse.lsp4e.outline.SymbolsModel.DocumentSymbolWithURI;
48-
import org.eclipse.lsp4e.ui.AbstractLsp4eLabelProvider;
4949
import org.eclipse.lsp4e.ui.LSPImages;
5050
import org.eclipse.lsp4e.ui.Messages;
51+
import org.eclipse.lsp4e.ui.SymbolIconProvider;
5152
import org.eclipse.lsp4j.DocumentSymbol;
5253
import org.eclipse.lsp4j.Location;
5354
import org.eclipse.lsp4j.Range;
@@ -68,9 +69,11 @@
6869
import com.google.common.collect.RangeMap;
6970
import com.google.common.collect.TreeRangeMap;
7071

71-
public class SymbolsLabelProvider extends AbstractLsp4eLabelProvider
72+
public class SymbolsLabelProvider extends LabelProvider
7273
implements ICommonLabelProvider, IStyledLabelProvider, IPreferenceChangeListener {
7374

75+
private final SymbolIconProvider symbolIconProvider;
76+
7477
private final Map<IResource, RangeMap<Integer, Integer>> severities = new HashMap<>();
7578
private final IResourceChangeListener listener = e -> {
7679
try {
@@ -100,8 +103,13 @@ public SymbolsLabelProvider() {
100103
}
101104

102105
public SymbolsLabelProvider(final boolean showLocation, final boolean showKind) {
106+
this(showLocation, showKind, new SymbolIconProvider());
107+
}
108+
109+
public SymbolsLabelProvider(final boolean showLocation, final boolean showKind, SymbolIconProvider symbolIconProvider) {
103110
this.showLocation = showLocation;
104111
this.showKind = showKind;
112+
this.symbolIconProvider = symbolIconProvider;
105113
InstanceScope.INSTANCE.getNode(LanguageServerPlugin.PLUGIN_ID).addPreferenceChangeListener(this);
106114
ResourcesPlugin.getWorkspace().addResourceChangeListener(listener);
107115
}
@@ -162,7 +170,7 @@ public void dispose() {
162170
}
163171

164172
if (actualElement != null && symbolKind != null) {
165-
return getImageFor(symbolKind, symbolTags, getMaxSeverity(actualElement));
173+
return symbolIconProvider.getImageFor(symbolKind, symbolTags, getMaxSeverity(actualElement));
166174
}
167175

168176
return null;

org.eclipse.lsp4e/src/org/eclipse/lsp4e/ui/LSPImages.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -290,10 +290,10 @@ public static ImageRegistry getImageRegistry() {
290290
* @param kind a document symbol's kind
291291
* @return an image representing the given symbol kind or <code>null</code>
292292
*
293+
* @see #getImage(String))
293294
* @see #getImageDescriptor(String)
294-
* @see AbstractLsp4eLabelProvider#getImage(Object)
295-
* @see AbstractLsp4eLabelProvider#getImageFor(SymbolKind, java.util.List)
296-
* @see AbstractLsp4eLabelProvider#getImageFor(SymbolKind, java.util.List, int)
295+
* @see SymbolIconProvider#getImageFor(SymbolKind, java.util.List)
296+
* @see SymbolIconProvider#getImageFor(SymbolKind, java.util.List, int)
297297
*/
298298
public static @Nullable Image imageFromSymbolKind(@Nullable SymbolKind kind) {
299299
if (kind == null) {
@@ -328,7 +328,7 @@ public static ImageRegistry getImageRegistry() {
328328
* @see #getImage(String)
329329
* @see #getImageDescriptor(String)
330330
* @see #getImageWithOverlays(String, ImageDescriptor, ImageDescriptor, ImageDescriptor, ImageDescriptor, ImageDescriptor)
331-
* @see AbstractLsp4eLabelProvider#getImageKeyFromSymbolKindWithVisibility(SymbolKind, java.util.List)
331+
* @see SymbolIconProvider#getImageKeyFromSymbolKindWithVisibility(SymbolKind, java.util.List)
332332
*/
333333
public static String imageKeyFromSymbolKind(SymbolKind kind) {
334334
return switch (kind) {
@@ -486,7 +486,7 @@ private static String imageOverlayKeyFromSymbolTag(SymbolTag symbolTag) {
486486
* @return returns a new or cached image built from the given arguments.
487487
*
488488
* @see #imageKeyFromSymbolKind(SymbolKind)
489-
* @see AbstractLsp4eLabelProvider#getImageKeyFromSymbolKindWithVisibility(SymbolKind, java.util.List)
489+
* @see SymbolIconProvider#getImageKeyFromSymbolKindWithVisibility(SymbolKind, java.util.List)
490490
*/
491491
public static @Nullable Image getImageWithOverlays(String baseImageKey,
492492
@Nullable ImageDescriptor topLeftOverlayDescriptor, @Nullable ImageDescriptor topRightOverlayDescriptor,

org.eclipse.lsp4e/src/org/eclipse/lsp4e/ui/AbstractLsp4eLabelProvider.java renamed to org.eclipse.lsp4e/src/org/eclipse/lsp4e/ui/SymbolIconProvider.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,12 @@
2727
import org.eclipse.swt.graphics.Image;
2828
import org.eclipse.ui.ISharedImages;
2929

30-
public abstract class AbstractLsp4eLabelProvider extends LabelProvider {
30+
31+
/**
32+
* Customizable class for creating document symbol icons with overlays depending on the symbol's
33+
* {@link SymbolKind} and {@link SymbolTag}s. This class is meant to be used with {@link LabelProvider}s.
34+
*/
35+
public class SymbolIconProvider {
3136

3237
/**
3338
* Returns an overlay icon {@link ImageDescriptor} for the given severity.
@@ -189,7 +194,7 @@ protected String getImageKeyFromSymbolKindWithVisibility(SymbolKind kind, List<S
189194
*
190195
* @see #getImageFor(SymbolKind, List, int)
191196
*/
192-
protected @Nullable Image getImageFor(@Nullable SymbolKind symbolKind, @Nullable List<SymbolTag> symbolTags) {
197+
public @Nullable Image getImageFor(@Nullable SymbolKind symbolKind, @Nullable List<SymbolTag> symbolTags) {
193198
return getImageFor(symbolKind, symbolTags, -1);
194199
}
195200

@@ -206,7 +211,7 @@ protected String getImageKeyFromSymbolKindWithVisibility(SymbolKind kind, List<S
206211
*
207212
* @see #getImageFor(SymbolKind, List)
208213
*/
209-
protected @Nullable Image getImageFor(final @Nullable SymbolKind symbolKind,
214+
public @Nullable Image getImageFor(final @Nullable SymbolKind symbolKind,
210215
final @Nullable List<SymbolTag> symbolTags, int severity) {
211216

212217
if (symbolKind == null) {

0 commit comments

Comments
 (0)