GH-1405: take setter injection into account while indexing injection points

This commit is contained in:
Martin Lippert
2024-11-13 15:48:12 +01:00
parent b5fff4e5f1
commit 899b7372e4
4 changed files with 194 additions and 63 deletions

View File

@@ -35,6 +35,7 @@ import org.springframework.ide.vscode.boot.app.SpringSymbolIndex;
import org.springframework.ide.vscode.boot.bootiful.BootLanguageServerTest;
import org.springframework.ide.vscode.boot.bootiful.SymbolProviderTestConf;
import org.springframework.ide.vscode.boot.index.SpringMetamodelIndex;
import org.springframework.ide.vscode.boot.java.Annotations;
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
import org.springframework.ide.vscode.commons.protocol.spring.AnnotationAttributeValue;
import org.springframework.ide.vscode.commons.protocol.spring.AnnotationMetadata;
@@ -186,6 +187,53 @@ public class SpringMetamodelIndexerBeansTest {
assertEquals(ip2Location, injectionPoints[1].getLocation());
}
@Test
void testSetterInjectionPointsFromConstructor() {
Bean[] beans = springIndex.getBeansWithName("test-spring-indexing", "setterInjectionService");
assertEquals(1, beans.length);
String docUri = directory.toPath().resolve("src/main/java/org/test/injections/SetterInjectionService.java").toUri().toString();
InjectionPoint[] injectionPoints = beans[0].getInjectionPoints();
assertEquals(2, injectionPoints.length);
assertEquals("bean1", injectionPoints[0].getName());
assertEquals("org.test.BeanClass1", injectionPoints[0].getType());
assertEquals(new Location(docUri, new Range(new Position(21, 33), new Position(21, 38))), injectionPoints[0].getLocation());
AnnotationMetadata[] point1Annotations = injectionPoints[0].getAnnotations();
assertEquals(2, point1Annotations.length);
assertEquals(Annotations.AUTOWIRED, point1Annotations[0].getAnnotationType());
assertEquals(new Location(docUri, new Range(new Position(19, 1), new Position(19, 11))), point1Annotations[0].getLocation());
assertEquals(0, point1Annotations[0].getAttributes().size());
assertEquals(Annotations.QUALIFIER, point1Annotations[1].getAnnotationType());
assertEquals(new Location(docUri, new Range(new Position(20, 1), new Position(20, 41))), point1Annotations[1].getLocation());
assertEquals(1, point1Annotations[1].getAttributes().size());
assertEquals(1, point1Annotations[1].getAttributes().get("value").length);
assertEquals("setter-injection-qualifier", point1Annotations[1].getAttributes().get("value")[0].getName());
assertEquals(new Location(docUri, new Range(new Position(20, 12), new Position(20, 40))), point1Annotations[1].getAttributes().get("value")[0].getLocation());
assertEquals("bean2", injectionPoints[1].getName());
assertEquals("org.test.BeanClass2", injectionPoints[1].getType());
assertEquals(new Location(docUri, new Range(new Position(26, 83), new Position(26, 88))), injectionPoints[1].getLocation());
AnnotationMetadata[] point2Annotations = injectionPoints[1].getAnnotations();
assertEquals(2, point2Annotations.length);
assertEquals(Annotations.AUTOWIRED, point2Annotations[0].getAnnotationType());
assertEquals(new Location(docUri, new Range(new Position(25, 1), new Position(25, 11))), point2Annotations[0].getLocation());
assertEquals(0, point2Annotations[0].getAttributes().size());
assertEquals(Annotations.QUALIFIER, point2Annotations[1].getAnnotationType());
assertEquals(new Location(docUri, new Range(new Position(26, 22), new Position(26, 71))), point2Annotations[1].getLocation());
assertEquals(1, point2Annotations[1].getAttributes().size());
assertEquals(1, point2Annotations[1].getAttributes().get("value").length);
assertEquals("setter-injection-qualifier-on-param", point2Annotations[1].getAttributes().get("value")[0].getName());
assertEquals(new Location(docUri, new Range(new Position(26, 33), new Position(26, 70))), point2Annotations[1].getAttributes().get("value")[0].getLocation());
}
@Test
void testBeanInjectionPointsFromAutowiredFields() {
Bean[] beans = springIndex.getBeansWithName("test-spring-indexing", "autowiredInjectionService");

View File

@@ -18,12 +18,12 @@ import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang3.ArrayUtils;
import org.eclipse.lsp4j.Location;
import org.eclipse.lsp4j.Position;
import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.TextDocumentIdentifier;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
@@ -58,10 +58,8 @@ public class NamedReferencesProviderTest {
private File directory;
private IJavaProject project;
private Bean bean1;
private Bean bean2;
private String tempJavaDocUri1;
private String tempJavaDocUri2;
private String tempJavaDocUri;
@BeforeEach
@@ -78,12 +76,11 @@ public class NamedReferencesProviderTest {
tempJavaDocUri = directory.toPath().resolve("src/main/java/org/test/TestDependsOnClass.java").toUri().toString();
tempJavaDocUri1 = directory.toPath().resolve("src/main/java/org/test/TempClass1.java").toUri().toString();
tempJavaDocUri2 = directory.toPath().resolve("src/main/java/org/test/TempClass2.java").toUri().toString();
bean1 = new Bean("bean1", "type1", new Location(tempJavaDocUri1, new Range(new Position(1,1), new Position(1, 20))), null, null, new AnnotationMetadata[] {});
bean2 = new Bean("bean2", "type2", new Location(tempJavaDocUri2, new Range(new Position(1,1), new Position(1, 20))), null, null, new AnnotationMetadata[] {});
springIndex.updateBeans(project.getElementName(), new Bean[] {bean1, bean2});
Bean[] beans = ArrayUtils.add(springIndex.getBeansOfProject(project.getElementName()), bean1);
springIndex.updateBeans(project.getElementName(), beans);
}
@Test
@@ -111,7 +108,6 @@ public class NamedReferencesProviderTest {
}
@Test
@Disabled // TODO: need to include setter injection in spring index as a first step, then resurrect this test case
public void testNamedRefersToOtherNamedValues() throws Exception {
Editor editor = harness.newEditor(LanguageId.JAVA, """
package org.test;
@@ -124,11 +120,11 @@ public class NamedReferencesProviderTest {
String expectedDefinitionUri1 = directory.toPath().resolve("src/main/java/org/test/jakarta/SimpleMovieLister.java").toUri().toString();
Location expectedLocation1 = new Location(expectedDefinitionUri1,
new Range(new Position(24, 38), new Position(24, 62)));
new Range(new Position(27, 45), new Position(27, 61)));
String expectedDefinitionUri2 = directory.toPath().resolve("src/main/java/org/test/javax/SimpleMovieLister.java").toUri().toString();
Location expectedLocation2 = new Location(expectedDefinitionUri2,
new Range(new Position(24, 38), new Position(24, 62)));
new Range(new Position(27, 45), new Position(27, 61)));
List<? extends Location> references = editor.getReferences();
assertEquals(2, references.size());

View File

@@ -0,0 +1,35 @@
package org.test.injections;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.test.BeanClass1;
import org.test.BeanClass2;
@Service
public class SetterInjectionService {
private BeanClass1 bean1;
private BeanClass2 bean2;
private BeanClass1 somethingElse;
public SetterInjectionService() {
}
@Autowired
@Qualifier("setter-injection-qualifier")
public void setBean1(BeanClass1 bean1) {
this.bean1 = bean1;
}
@Autowired
public void setBean2(@Qualifier("setter-injection-qualifier-on-param") BeanClass2 bean2) {
this.bean2 = bean2;
}
public void setSomethingElse(BeanClass1 somethingElseNotInjected) {
this.somethingElse = somethingElseNotInjected;
}
}