diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/.classpath b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/.classpath new file mode 100644 index 0000000000..16d067f284 --- /dev/null +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/.project b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/.project new file mode 100644 index 0000000000..d469a46440 --- /dev/null +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/.project @@ -0,0 +1,28 @@ + + + org.springframework.tooling.ls.eclipse.gotosymbol.test + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/META-INF/MANIFEST.MF b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..1ffadbdc19 --- /dev/null +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/META-INF/MANIFEST.MF @@ -0,0 +1,8 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Goto Symbol Tests +Bundle-SymbolicName: org.springframework.tooling.ls.eclipse.gotosymbol.test +Bundle-Version: 5.4.0.qualifier +Fragment-Host: org.springframework.tooling.ls.eclipse.gotosymbol +Bundle-RequiredExecutionEnvironment: JavaSE-21 +Require-Bundle: org.junit diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/build.properties b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/build.properties new file mode 100644 index 0000000000..34d2e4d2da --- /dev/null +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/pom.xml b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/pom.xml new file mode 100644 index 0000000000..325c2785f2 --- /dev/null +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + org.springframework.boot.ide + org.springframework.boot.ide.servers + 5.4.0-SNAPSHOT + ../pom.xml + + + org.springframework.tooling.ls.eclipse.gotosymbol.test + eclipse-test-plugin + + + + + org.eclipse.tycho + tycho-surefire-plugin + ${tycho-version} + + **/*Test.java + + + + + diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/GotoSymbolDialogModelTest.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/GotoSymbolDialogModelTest.java new file mode 100644 index 0000000000..f2f5859ca6 --- /dev/null +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol.test/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/GotoSymbolDialogModelTest.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * Copyright (c) 2026 Broadcom, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Broadcom, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.tooling.ls.eclipse.gotosymbol.dialogs; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; + +import java.util.Collections; +import java.util.List; + +import org.junit.Test; + +/** + * Tests the scope selection of the go-to-symbol dialog model. + * + * @author Broadcom, Inc. + */ +public class GotoSymbolDialogModelTest { + + @Test + public void startsWithRememberedSymbolsProvider() { + SymbolsProvider workspace = provider("Workspace"); + SymbolsProvider project = provider("Project"); + SymbolsProvider file = provider("File"); + + GotoSymbolDialogModel model = new GotoSymbolDialogModel(null, 1, workspace, project, file); + + assertSame(project, model.currentSymbolsProvider.getValue()); + assertEquals(1, model.getCurrentSymbolsProviderIndex()); + } + + @Test + public void togglesFromRememberedSymbolsProvider() { + SymbolsProvider workspace = provider("Workspace"); + SymbolsProvider project = provider("Project"); + SymbolsProvider file = provider("File"); + GotoSymbolDialogModel model = new GotoSymbolDialogModel(null, 1, workspace, project, file); + + model.toggleSymbolsProvider(); + + assertSame(file, model.currentSymbolsProvider.getValue()); + assertEquals(2, model.getCurrentSymbolsProviderIndex()); + } + + private SymbolsProvider provider(String name) { + return new SymbolsProvider() { + + @Override + public String getName() { + return name; + } + + @Override + public List fetchFor(String query) { + return Collections.emptyList(); + } + + @Override + public boolean fromFile(SymbolContainer symbol) { + return false; + } + }; + } +} diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/GotoSymbolDialogModel.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/GotoSymbolDialogModel.java index e3231f2f0a..9d967f5975 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/GotoSymbolDialogModel.java +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/GotoSymbolDialogModel.java @@ -238,11 +238,16 @@ private List> computeMatches(Collection private FavouritesPreference favourites = null; public GotoSymbolDialogModel(String keyBindings, SymbolsProvider... symbolsProviders) { + this(keyBindings, 0, symbolsProviders); + } + + public GotoSymbolDialogModel(String keyBindings, int initialSymbolsProviderIndex, SymbolsProvider... symbolsProviders) { this.keyBindings = keyBindings; - Assert.isLegal(symbolsProviders.length>0); + Assert.isLegal(symbolsProviders.length>0); + Assert.isLegal(initialSymbolsProviderIndex >= 0 && initialSymbolsProviderIndex < symbolsProviders.length); this.symbolsProviders = symbolsProviders; - this.currentSymbolsProviderIndex = 0; - this.currentSymbolsProvider.setValue(symbolsProviders[0]); + this.currentSymbolsProviderIndex = initialSymbolsProviderIndex; + this.currentSymbolsProvider.setValue(symbolsProviders[initialSymbolsProviderIndex]); } public GotoSymbolDialogModel setFavourites(FavouritesPreference favourites) { @@ -279,6 +284,10 @@ public SymbolsProvider[] getSymbolsProviders() { return symbolsProviders; } + public int getCurrentSymbolsProviderIndex() { + return currentSymbolsProviderIndex; + } + /** * Set an ok handler. The handler is meant to be called by the UI when user request to * execute the dialogs action on its current selection. For example, by pressing 'ENTER' diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/handlers/GotoSymbolHandler.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/handlers/GotoSymbolHandler.java index 7c91412b54..bd3ee79d92 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/handlers/GotoSymbolHandler.java +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/handlers/GotoSymbolHandler.java @@ -46,6 +46,7 @@ private static void debug(String string) { } } private static GotoSymbolDialogModel currentDialog = null; + private static int lastSymbolsProviderIndex = 0; public GotoSymbolHandler() { debug("Creating GotoSymbolHandler"); @@ -63,16 +64,17 @@ public Object execute(ExecutionEvent event) throws ExecutionException { final Shell shell = HandlerUtil.getActiveShell(event); final ITextEditor textEditor = (ITextEditor) part; - GotoSymbolDialogModel model = new GotoSymbolDialogModel(getKeybindings(event), InWorkspaceSymbolsProvider.createFor(event), InProjectSymbolsProvider.createFor(event), InFileSymbolsProvider.createFor(textEditor)) + GotoSymbolDialogModel model = new GotoSymbolDialogModel(getKeybindings(event), lastSymbolsProviderIndex, InWorkspaceSymbolsProvider.createFor(event), InProjectSymbolsProvider.createFor(event), InFileSymbolsProvider.createFor(textEditor)) .setOkHandler(GotoSymbolDialogModel.OPEN_IN_EDITOR_OK_HANDLER); GotoSymbolDialog dialog = new GotoSymbolDialog(shell, textEditor, model, /*alignRight*/ false); currentDialog = model; - dialog.open(); - debug("GotoSymbolDialog opened"); dialog.getShell().addDisposeListener(de -> { debug("GotoSymbolDialog closed!"); + lastSymbolsProviderIndex = model.getCurrentSymbolsProviderIndex(); currentDialog = null; }); + dialog.open(); + debug("GotoSymbolDialog opened"); } debug("<<org.springframework.tooling.cloudfoundry.manifest.ls.integration.feature org.springframework.tooling.ls.eclipse.gotosymbol + org.springframework.tooling.ls.eclipse.gotosymbol.test org.springframework.tooling.boot.ls org.springframework.tooling.boot.ls.feature