Hierarchical doc symbols in Eclipse by default
This commit is contained in:
@@ -64,7 +64,7 @@ public class PrefsInitializer extends AbstractPreferenceInitializer {
|
|||||||
preferenceStore.setDefault(Constants.PREF_PROPS_COMPLETIONS_ELIDE_PREFIX, false);
|
preferenceStore.setDefault(Constants.PREF_PROPS_COMPLETIONS_ELIDE_PREFIX, false);
|
||||||
preferenceStore.setDefault(Constants.PREF_CRON_INLAY_HINTS, true);
|
preferenceStore.setDefault(Constants.PREF_CRON_INLAY_HINTS, true);
|
||||||
preferenceStore.setDefault(Constants.PREF_COMPLETION_JAVA_INJECT_BEAN, true);
|
preferenceStore.setDefault(Constants.PREF_COMPLETION_JAVA_INJECT_BEAN, true);
|
||||||
preferenceStore.setDefault(Constants.PREF_BEANS_STRUCTURE_TREE, false);
|
preferenceStore.setDefault(Constants.PREF_BEANS_STRUCTURE_TREE, true);
|
||||||
preferenceStore.setDefault(Constants.PREF_SYMBOLS_FROM_NEW_INDEX, true);
|
preferenceStore.setDefault(Constants.PREF_SYMBOLS_FROM_NEW_INDEX, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
|
||||||
org.eclipse.jdt.core.compiler.compliance=11
|
org.eclipse.jdt.core.compiler.compliance=17
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
|
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
|
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
|
||||||
org.eclipse.jdt.core.compiler.release=enabled
|
org.eclipse.jdt.core.compiler.release=enabled
|
||||||
org.eclipse.jdt.core.compiler.source=11
|
org.eclipse.jdt.core.compiler.source=17
|
||||||
|
|||||||
@@ -17,12 +17,18 @@ import java.util.Comparator;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.core.runtime.Assert;
|
import org.eclipse.core.runtime.Assert;
|
||||||
|
import org.eclipse.jface.text.BadLocationException;
|
||||||
|
import org.eclipse.jface.text.IDocument;
|
||||||
import org.eclipse.lsp4e.LSPEclipseUtils;
|
import org.eclipse.lsp4e.LSPEclipseUtils;
|
||||||
|
import org.eclipse.lsp4e.LanguageServerPlugin;
|
||||||
|
import org.eclipse.lsp4e.ui.UI;
|
||||||
import org.eclipse.lsp4j.Location;
|
import org.eclipse.lsp4j.Location;
|
||||||
|
import org.eclipse.lsp4j.Range;
|
||||||
import org.eclipse.lsp4j.WorkspaceSymbolLocation;
|
import org.eclipse.lsp4j.WorkspaceSymbolLocation;
|
||||||
import org.eclipse.lsp4j.jsonrpc.messages.Either;
|
import org.eclipse.lsp4j.jsonrpc.messages.Either;
|
||||||
import org.eclipse.ui.IWorkbenchPage;
|
import org.eclipse.ui.IWorkbenchPage;
|
||||||
import org.eclipse.ui.PlatformUI;
|
import org.eclipse.ui.PlatformUI;
|
||||||
|
import org.eclipse.ui.texteditor.ITextEditor;
|
||||||
import org.springframework.tooling.ls.eclipse.gotosymbol.GotoSymbolPlugin;
|
import org.springframework.tooling.ls.eclipse.gotosymbol.GotoSymbolPlugin;
|
||||||
import org.springframework.tooling.ls.eclipse.gotosymbol.favourites.FavouritesPreference;
|
import org.springframework.tooling.ls.eclipse.gotosymbol.favourites.FavouritesPreference;
|
||||||
import org.springsource.ide.eclipse.commons.core.util.FuzzyMatcher;
|
import org.springsource.ide.eclipse.commons.core.util.FuzzyMatcher;
|
||||||
@@ -59,11 +65,13 @@ public class GotoSymbolDialogModel {
|
|||||||
final double score;
|
final double score;
|
||||||
final String query;
|
final String query;
|
||||||
final T value;
|
final T value;
|
||||||
public Match(double score, String query, T value) {
|
final List<Match<T>> children;
|
||||||
|
public Match(double score, String query, T value, List<Match<T>> children) {
|
||||||
super();
|
super();
|
||||||
this.score = score;
|
this.score = score;
|
||||||
this.query = query;
|
this.query = query;
|
||||||
this.value = value;
|
this.value = value;
|
||||||
|
this.children = children;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -114,6 +122,21 @@ public class GotoSymbolDialogModel {
|
|||||||
|
|
||||||
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
|
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
|
||||||
LSPEclipseUtils.openInEditor(location, page);
|
LSPEclipseUtils.openInEditor(location, page);
|
||||||
|
} else if (symbolInformation.isDocumentSymbol()) {
|
||||||
|
ITextEditor editor = UI.getActiveTextEditor();
|
||||||
|
if (editor != null) {
|
||||||
|
IDocument doc = LSPEclipseUtils.getDocument(editor);
|
||||||
|
if (doc != null) {
|
||||||
|
try {
|
||||||
|
Range range = symbolInformation.getDocumentSymbol().getSelectionRange();
|
||||||
|
int offset = LSPEclipseUtils.toOffset(range.getStart(), doc);
|
||||||
|
int endOffset = LSPEclipseUtils.toOffset(range.getEnd(), doc);
|
||||||
|
editor.selectAndReveal(offset, endOffset - offset);
|
||||||
|
} catch (BadLocationException e) {
|
||||||
|
LanguageServerPlugin.logError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
@@ -185,8 +208,13 @@ public class GotoSymbolDialogModel {
|
|||||||
query = "";
|
query = "";
|
||||||
}
|
}
|
||||||
query = query.toLowerCase();
|
query = query.toLowerCase();
|
||||||
|
|
||||||
|
return computeMatches(unfilteredSymbols.getValues(), query);
|
||||||
|
}
|
||||||
|
private List<Match<SymbolContainer>> computeMatches(Collection<SymbolContainer> c, String query) {
|
||||||
List<Match<SymbolContainer>> matches = new ArrayList<>();
|
List<Match<SymbolContainer>> matches = new ArrayList<>();
|
||||||
for (SymbolContainer symbol : unfilteredSymbols.getValues()) {
|
for (SymbolContainer symbol : c) {
|
||||||
|
|
||||||
String name = symbol.getName();
|
String name = symbol.getName();
|
||||||
|
|
||||||
if (name != null) {
|
if (name != null) {
|
||||||
@@ -194,8 +222,9 @@ public class GotoSymbolDialogModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
double score = FuzzyMatcher.matchScore(query, name);
|
double score = FuzzyMatcher.matchScore(query, name);
|
||||||
if (score != 0.0) {
|
List<Match<SymbolContainer>> childrenMatches = computeMatches(symbol.getChildren(), query);
|
||||||
matches.add(new Match<SymbolContainer>(score, query, symbol));
|
if (score != 0.0 || !childrenMatches.isEmpty()) {
|
||||||
|
matches.add(new Match<SymbolContainer>(score, query, symbol, childrenMatches));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Collections.sort(matches, MATCH_COMPARATOR);
|
Collections.sort(matches, MATCH_COMPARATOR);
|
||||||
|
|||||||
@@ -88,6 +88,9 @@ public class GotoSymbolSection extends WizardPageSection {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object[] getChildren(Object parentElement) {
|
public Object[] getChildren(Object parentElement) {
|
||||||
|
if (parentElement instanceof Match<?> m) {
|
||||||
|
return m.children.toArray(new Object[m.children.size()]);
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,6 +101,9 @@ public class GotoSymbolSection extends WizardPageSection {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasChildren(Object element) {
|
public boolean hasChildren(Object element) {
|
||||||
|
if (element instanceof Match<?> m ) {
|
||||||
|
return !m.children.isEmpty();
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -302,31 +308,6 @@ public class GotoSymbolSection extends WizardPageSection {
|
|||||||
if (!viewer.getControl().isDisposed()) viewer.refresh();
|
if (!viewer.getControl().isDisposed()) viewer.refresh();
|
||||||
})));
|
})));
|
||||||
|
|
||||||
//TODO: somehow show selection in local file, (but not in other file ?)
|
|
||||||
// viewer.addSelectionChangedListener(event -> {
|
|
||||||
// IStructuredSelection selection = (IStructuredSelection) event.getSelection();
|
|
||||||
// if (selection.isEmpty()) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// SymbolInformation symbolInformation = (SymbolInformation) selection.getFirstElement();
|
|
||||||
// Location location = symbolInformation.getLocation();
|
|
||||||
//
|
|
||||||
// IResource targetResource = LSPEclipseUtils.findResourceFor(location.getUri());
|
|
||||||
// if (targetResource == null) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// IDocument targetDocument = FileBuffers.getTextFileBufferManager()
|
|
||||||
// .getTextFileBuffer(targetResource.getFullPath(), LocationKind.IFILE).getDocument();
|
|
||||||
// if (targetDocument != null) {
|
|
||||||
// try {
|
|
||||||
// int offset = LSPEclipseUtils.toOffset(location.getRange().getStart(), targetDocument);
|
|
||||||
// int endOffset = LSPEclipseUtils.toOffset(location.getRange().getEnd(), targetDocument);
|
|
||||||
// fTextEditor.selectAndReveal(offset, endOffset - offset);
|
|
||||||
// } catch (BadLocationException e) {
|
|
||||||
// LanguageServerPlugin.logError(e);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
installWidgetListeners(pattern, viewer);
|
installWidgetListeners(pattern, viewer);
|
||||||
|
|
||||||
//Status label
|
//Status label
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.springframework.tooling.ls.eclipse.gotosymbol.dialogs;
|
package org.springframework.tooling.ls.eclipse.gotosymbol.dialogs;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.lsp4j.DocumentSymbol;
|
import org.eclipse.lsp4j.DocumentSymbol;
|
||||||
import org.eclipse.lsp4j.SymbolInformation;
|
import org.eclipse.lsp4j.SymbolInformation;
|
||||||
import org.eclipse.lsp4j.WorkspaceSymbol;
|
import org.eclipse.lsp4j.WorkspaceSymbol;
|
||||||
@@ -20,6 +22,8 @@ public class SymbolContainer {
|
|||||||
private DocumentSymbol documentSymbol;
|
private DocumentSymbol documentSymbol;
|
||||||
private WorkspaceSymbol workspaceSymbol;
|
private WorkspaceSymbol workspaceSymbol;
|
||||||
|
|
||||||
|
private List<SymbolContainer> children = List.of();
|
||||||
|
|
||||||
public static SymbolContainer fromSymbolInformation(SymbolInformation symbolInformation) {
|
public static SymbolContainer fromSymbolInformation(SymbolInformation symbolInformation) {
|
||||||
return new SymbolContainer(symbolInformation);
|
return new SymbolContainer(symbolInformation);
|
||||||
}
|
}
|
||||||
@@ -38,6 +42,11 @@ public class SymbolContainer {
|
|||||||
|
|
||||||
private SymbolContainer(DocumentSymbol documentSymbol) {
|
private SymbolContainer(DocumentSymbol documentSymbol) {
|
||||||
this.documentSymbol = documentSymbol;
|
this.documentSymbol = documentSymbol;
|
||||||
|
if (documentSymbol.getChildren() == null) {
|
||||||
|
this.children = List.of();
|
||||||
|
} else {
|
||||||
|
this.children = documentSymbol.getChildren().stream().map(SymbolContainer::new).toList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private SymbolContainer(WorkspaceSymbol workspaceSymbol) {
|
private SymbolContainer(WorkspaceSymbol workspaceSymbol) {
|
||||||
@@ -101,4 +110,8 @@ public class SymbolContainer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<SymbolContainer> getChildren() {
|
||||||
|
return children;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user