From f5cc9868547e7967f8dc7f1215417a5d554efa36 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Mon, 10 Feb 2025 15:15:27 +0100 Subject: [PATCH] GH-1424: bean index elements now childs of surrounding config node --- .../boot/java/beans/BeansSymbolProvider.java | 24 ++++++++++++++++++- .../test/SpringMetamodelIndexerBeansTest.java | 11 +++++++++ .../beans/test/SpringIndexerBeansTest.java | 10 ++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java index 1d548a4778..22cd7bbf54 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java @@ -89,6 +89,9 @@ public void addSymbols(Annotation node, ITypeBinding typeBinding, Collection nameAndRegion : BeanUtils.getBeanNamesFromBeanAnnotationWithRegions(node, doc)) { try { @@ -116,7 +119,13 @@ public void addSymbols(Annotation node, ITypeBinding typeBinding, Collection beans, String docURI) { + int i = beans.size() - 1; + + while (i >= 0 && beans.get(i).getDocURI().equals(docURI)) { + if (beans.get(i).getBean() instanceof Bean bean && bean.isConfiguration() && docURI.equals(docURI)) { + return beans.get(i).getBean(); + } + i--; + } + + return null; + } + @Override protected void addSymbolsPass1(TypeDeclaration typeDeclaration, SpringIndexerJavaContext context, TextDocument doc) { // this checks function beans that are defined as implementations of Function interfaces diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/index/test/SpringMetamodelIndexerBeansTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/index/test/SpringMetamodelIndexerBeansTest.java index 8f7ac041bc..1ef7b3ac04 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/index/test/SpringMetamodelIndexerBeansTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/index/test/SpringMetamodelIndexerBeansTest.java @@ -17,6 +17,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.File; +import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -41,6 +42,7 @@ import org.springframework.ide.vscode.commons.protocol.spring.Bean; import org.springframework.ide.vscode.commons.protocol.spring.DefaultValues; import org.springframework.ide.vscode.commons.protocol.spring.InjectionPoint; +import org.springframework.ide.vscode.commons.protocol.spring.SpringIndexElement; import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness; import org.springframework.ide.vscode.project.harness.ProjectsHarness; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -135,6 +137,10 @@ void testBeansDefinitionLocationFromConfigurationAnnotatedClass() { String docUri = directory.toPath().resolve("src/main/java/org/test/injections/ConfigurationWithoutInjection.java").toUri().toString(); assertEquals(docUri, beans[0].getLocation().getUri()); + + List children = beans[0].getChildren(); + assertEquals(1, children.size()); + assertEquals("beanWithoutInjections", ((Bean) children.get(0)).getName()); } @Test @@ -461,6 +467,11 @@ void testAnnotationMetadataFromComponentClass() { Location runtimeHintsValueLocation = new Location(bean.getLocation().getUri(), new Range(new Position(13, 20), new Position(13, 52))); assertEquals("org.test.injections.DummyRuntimeHintsRegistrar", runtimeHintsValueAttribute[0].getName()); assertEquals(runtimeHintsValueLocation, runtimeHintsValueAttribute[0].getLocation()); + + // child bean + List children = bean.getChildren(); + assertEquals(1, children.size()); + assertEquals("beanWithAnnotationsOnInjectionPoints", ((Bean) children.get(0)).getName()); } @Test diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java index db78c45b41..19960ac818 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java @@ -10,10 +10,13 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.java.beans.test; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.File; import java.util.Arrays; +import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -29,6 +32,7 @@ import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.protocol.spring.Bean; +import org.springframework.ide.vscode.commons.protocol.spring.SpringIndexElement; import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness; import org.springframework.ide.vscode.project.harness.ProjectsHarness; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -78,7 +82,13 @@ void testScanSimpleConfigurationClass() throws Exception { Bean simpleBean = Arrays.stream(beans).filter(bean -> bean.getName().equals("simpleBean")).findFirst().get(); assertEquals("org.test.SimpleConfiguration", simpleConfigBean.getType()); + assertTrue(simpleConfigBean.isConfiguration()); + assertEquals("org.test.BeanClass", simpleBean.getType()); + + List children = simpleConfigBean.getChildren(); + assertEquals(1, children.size()); + assertSame(simpleBean, children.get(0)); } @Test