Skip to content

Commit 8adb263

Browse files
committed
GH-1449: webflux index elements gets updated correctly on file changes
Fixes GH-1449
1 parent 2416437 commit 8adb263

File tree

2 files changed

+44
-10
lines changed

2 files changed

+44
-10
lines changed

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.eclipse.jdt.core.dom.ASTNode;
2020
import org.eclipse.jdt.core.dom.Annotation;
21+
import org.eclipse.jdt.core.dom.Block;
2122
import org.eclipse.jdt.core.dom.IAnnotationBinding;
2223
import org.eclipse.jdt.core.dom.ITypeBinding;
2324
import org.eclipse.jdt.core.dom.MethodDeclaration;
@@ -62,7 +63,6 @@
6263
public class BeansSymbolProvider extends AbstractSymbolProvider {
6364

6465
private static final Logger log = LoggerFactory.getLogger(BeansSymbolProvider.class);
65-
6666
private static final String[] NAME_ATTRIBUTES = {"value", "name"};
6767

6868
@Override
@@ -73,21 +73,23 @@ public void addSymbols(Annotation node, ITypeBinding typeBinding, Collection<ITy
7373
if (parent == null || !(parent instanceof MethodDeclaration)) return;
7474

7575
MethodDeclaration method = (MethodDeclaration) parent;
76-
7776
if (isMethodAbstract(method)) return;
7877

78+
List<SpringIndexElement> childElements = new ArrayList<>();
79+
7980
boolean isWebfluxRouter = WebfluxRouterSymbolProvider.isWebfluxRouterBean(method);
8081

8182
// for webflux details, we need full method body ASTs
82-
if (isWebfluxRouter && SCAN_PASS.ONE.equals(context.getPass())) {
83-
context.getNextPassFiles().add(context.getFile());
84-
return;
85-
}
86-
87-
List<SpringIndexElement> childElements = new ArrayList<>();
88-
8983
if (isWebfluxRouter) {
90-
WebfluxRouterSymbolProvider.createWebfluxElements(method, context, doc, childElements);
84+
Block methodBody = method.getBody();
85+
if ((methodBody == null || methodBody.statements() == null || methodBody.statements().size() == 0)
86+
&& SCAN_PASS.ONE.equals(context.getPass())) {
87+
context.getNextPassFiles().add(context.getFile());
88+
return;
89+
}
90+
else {
91+
WebfluxRouterSymbolProvider.createWebfluxElements(method, context, doc, childElements);
92+
}
9193
}
9294

9395
boolean isFunction = isFunctionBean(method);

headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/WebFluxMappingSymbolProviderTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,16 @@
1414
import static org.junit.jupiter.api.Assertions.assertTrue;
1515

1616
import java.io.File;
17+
import java.net.URI;
18+
import java.nio.charset.Charset;
1719
import java.util.Arrays;
1820
import java.util.Iterator;
1921
import java.util.List;
2022
import java.util.concurrent.CompletableFuture;
2123
import java.util.concurrent.TimeUnit;
2224
import java.util.stream.Collectors;
2325

26+
import org.apache.commons.io.FileUtils;
2427
import org.eclipse.lsp4j.TextDocumentIdentifier;
2528
import org.eclipse.lsp4j.WorkspaceSymbol;
2629
import org.junit.jupiter.api.BeforeEach;
@@ -36,6 +39,7 @@
3639
import org.springframework.ide.vscode.commons.java.IJavaProject;
3740
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
3841
import org.springframework.ide.vscode.commons.protocol.spring.Bean;
42+
import org.springframework.ide.vscode.commons.protocol.spring.InjectionPoint;
3943
import org.springframework.ide.vscode.commons.protocol.spring.SpringIndexElement;
4044
import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness;
4145
import org.springframework.ide.vscode.project.harness.ProjectsHarness;
@@ -284,6 +288,34 @@ void testNestedRoutesMappingSymbols3() throws Exception {
284288
assertEquals("org.test.PersonHandler3", handlerElement6.getHandlerClass());
285289
assertEquals("public Mono<org.springframework.web.reactive.function.server.ServerResponse> deletePerson(org.springframework.web.reactive.function.server.ServerRequest)", handlerElement6.getHandlerMethod());
286290
}
291+
292+
@Test
293+
void testUpdatedRouteInChangedDocument() throws Exception {
294+
// update document and update index
295+
String changedDocURI = directory.toPath().resolve("src/main/java/org/test/QuoteRouter.java").toUri().toString();
296+
297+
String newContent = FileUtils.readFileToString(new File(new URI(changedDocURI)), Charset.defaultCharset()).replace("/hello", "/hello-updated");
298+
CompletableFuture<Void> updateFuture = indexer.updateDocument(changedDocURI, newContent, "test triggered");
299+
updateFuture.get(5, TimeUnit.SECONDS);
300+
301+
Bean[] routeBeans = springIndex.getBeansWithName(project.getElementName(), "route");
302+
assertEquals(1, routeBeans.length);
303+
assertEquals("route", routeBeans[0].getName());
304+
305+
SpringIndexElement[] children = routeBeans[0].getChildren();
306+
assertEquals(8, children.length);
307+
308+
WebfluxHandlerMethodIndexElement handlerElement1 = getWebfluxIndexElements(children, "/hello-updated", "GET").get(0);
309+
assertEquals("/hello-updated", handlerElement1.getPath());
310+
assertEquals("[GET]", Arrays.toString(handlerElement1.getHttpMethods()));
311+
assertEquals(0, handlerElement1.getContentTypes().length);
312+
assertEquals("[TEXT_PLAIN]", Arrays.toString(handlerElement1.getAcceptTypes()));
313+
assertEquals("org.test.QuoteHandler", handlerElement1.getHandlerClass());
314+
assertEquals("public Mono<org.springframework.web.reactive.function.server.ServerResponse> hello(org.springframework.web.reactive.function.server.ServerRequest)", handlerElement1.getHandlerMethod());
315+
316+
}
317+
318+
287319

288320
private boolean containsSymbol(List<? extends WorkspaceSymbol> symbols, String name, String uri, int startLine, int startCHaracter, int endLine, int endCharacter) {
289321
for (Iterator<? extends WorkspaceSymbol> iterator = symbols.iterator(); iterator.hasNext();) {

0 commit comments

Comments
 (0)