Skip to content

Commit 8cf3836

Browse files
committed
GH-1536: include signature information in query method index nodes
1 parent 1ce3f1b commit 8cf3836

File tree

6 files changed

+74
-11
lines changed

6 files changed

+74
-11
lines changed

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

+34-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.eclipse.jdt.core.dom.NormalAnnotation;
2323
import org.eclipse.jdt.core.dom.SimpleName;
2424
import org.eclipse.jdt.core.dom.SingleMemberAnnotation;
25+
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
2526
import org.eclipse.jdt.core.dom.TypeDeclaration;
2627
import org.eclipse.lsp4j.Location;
2728
import org.eclipse.lsp4j.Range;
@@ -108,14 +109,15 @@ private void indexQueryMethods(Bean beanDefinition, TypeDeclaration typeDeclarat
108109

109110
if (nameNode != null) {
110111
String methodName = nameNode.getFullyQualifiedName();
111-
DocumentRegion nodeRegion = ASTUtils.nodeRegion(doc, method);
112+
DocumentRegion nodeRegion = ASTUtils.nodeRegion(doc, nameNode);
112113

113114
try {
114115
Range range = doc.toRange(nodeRegion);
115116

116117
if (methodName != null) {
117118
String queryString = identifyQueryString(method, annotationHierarchies);
118-
beanDefinition.addChild(new QueryMethodIndexElement(methodName, queryString, range));
119+
String methodSignature = identifyMethodSignature(method);
120+
beanDefinition.addChild(new QueryMethodIndexElement(methodSignature, queryString, range));
119121
}
120122

121123
} catch (BadLocationException e) {
@@ -125,6 +127,36 @@ private void indexQueryMethods(Bean beanDefinition, TypeDeclaration typeDeclarat
125127
}
126128
}
127129

130+
private String identifyMethodSignature(MethodDeclaration method) {
131+
StringBuilder result = new StringBuilder();
132+
133+
// method name
134+
String name = method.getName().getFullyQualifiedName();
135+
result.append(name);
136+
137+
// params
138+
result.append("(");
139+
140+
@SuppressWarnings("unchecked")
141+
List<SingleVariableDeclaration> parameters = method.parameters();
142+
String[] paramNames = new String[parameters.size()];
143+
144+
for (int i = 0; i < parameters.size(); i++) {
145+
ITypeBinding type = parameters.get(i).getType().resolveBinding();
146+
paramNames[i] = type.getName();
147+
}
148+
result.append(String.join(", ", paramNames));
149+
150+
result.append(") : ");
151+
152+
// return type
153+
ITypeBinding returnType = method.getReturnType2().resolveBinding();
154+
String returnTypeName = returnType.getName();
155+
result.append(returnTypeName);
156+
157+
return result.toString();
158+
}
159+
128160
private List<MethodDeclaration> identifyQueryMethods(TypeDeclaration type, AnnotationHierarchies annotationHierarchies) {
129161
List<MethodDeclaration> result = new ArrayList<>();
130162

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public class SpringIndexerJava implements SpringIndexer {
9292

9393
// whenever the implementation of the indexer changes in a way that the stored data in the cache is no longer valid,
9494
// we need to change the generation - this will result in a re-indexing due to no up-to-date cache data being found
95-
private static final String GENERATION = "GEN-19";
95+
private static final String GENERATION = "GEN-20";
9696
private static final String INDEX_FILES_TASK_ID = "index-java-source-files-task-";
9797

9898
private static final String SYMBOL_KEY = "symbols";

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

+21-6
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ void testSimpleRepositoryElements() throws Exception {
8484
assertEquals("org.test.CustomerRepository", repoBean[0].getType());
8585

8686
Bean[] matchingBeans = springIndex.getMatchingBeans("test-spring-data-symbols", "org.springframework.data.repository.CrudRepository");
87-
assertEquals(4, matchingBeans.length);
87+
assertEquals(5, matchingBeans.length);
8888
ArrayUtils.contains(matchingBeans, repoBean[0]);
8989
}
9090

@@ -100,7 +100,22 @@ void testSimpleQueryMethodElements() throws Exception {
100100
assertEquals(1, queryMethods.size());
101101

102102
QueryMethodIndexElement queryMethod = (QueryMethodIndexElement) queryMethods.get(0);
103-
assertEquals("findByLastName", queryMethod.getMethodName());
103+
assertEquals("findByLastName(String) : List<Customer>", queryMethod.getMethodName());
104+
}
105+
106+
@Test
107+
void testSimpleQueryMethodElementsWithTwoParams() throws Exception {
108+
String docUri = directory.toPath().resolve("src/main/java/org/test/CustomerRepositoryWithTwoParamsMethod.java").toUri().toString();
109+
110+
DocumentElement document = springIndex.getDocument(docUri);
111+
List<SpringIndexElement> children = document.getChildren();
112+
Bean repositoryElement = (Bean) children.get(0);
113+
114+
List<SpringIndexElement> queryMethods = repositoryElement.getChildren();
115+
assertEquals(1, queryMethods.size());
116+
117+
QueryMethodIndexElement queryMethod = (QueryMethodIndexElement) queryMethods.get(0);
118+
assertEquals("findByLastNameAndStatus(String, Status) : List<Customer>", queryMethod.getMethodName());
104119
}
105120

106121
@Test
@@ -115,7 +130,7 @@ void testQueryMethodElementWithQueryString() throws Exception {
115130
assertEquals(1, queryMethods.size());
116131

117132
QueryMethodIndexElement queryMethod = (QueryMethodIndexElement) queryMethods.get(0);
118-
assertEquals("findPetTypes", queryMethod.getMethodName());
133+
assertEquals("findPetTypes() : List<Object>", queryMethod.getMethodName());
119134
assertEquals("SELECT ptype FROM PetType ptype ORDER BY ptype.name", queryMethod.getQueryString());
120135
}
121136

@@ -140,11 +155,11 @@ void testQueryMethodsFromParentInterfaces() throws Exception {
140155
assertEquals(2, queryMethods.size());
141156

142157
QueryMethodIndexElement queryMethod = (QueryMethodIndexElement) queryMethods.get(0);
143-
assertEquals("findConcretePetTypes", queryMethod.getMethodName());
158+
assertEquals("findConcretePetTypes() : List<Object>", queryMethod.getMethodName());
144159
assertEquals("CONCRETE REPO SELECT STATEMENT", queryMethod.getQueryString());
145-
160+
146161
QueryMethodIndexElement parentQueryMethod = (QueryMethodIndexElement) queryMethods.get(1);
147-
assertEquals("findParentPetTypes", parentQueryMethod.getMethodName());
162+
assertEquals("findParentPetTypes() : List<Object>", parentQueryMethod.getMethodName());
148163
assertEquals("PARENT REPO INTERFACE QUERY STATEMENT", parentQueryMethod.getQueryString());
149164
}
150165

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ void testDocumentSymbolsForRepository() throws Exception {
9292
DocumentSymbol documentSymbol = symbols.get(0);
9393
List<DocumentSymbol> children = documentSymbol.getChildren();
9494
DocumentSymbol childSymbol = children.get(0);
95-
assertEquals("findByLastName", childSymbol.getName());
95+
assertEquals("findByLastName(String) : List<Customer>", childSymbol.getName());
9696

9797
assertEquals(1, children.size());
9898
}
@@ -107,7 +107,7 @@ void testNestedDocumentSymbolsForRepositoryWithQuery() throws Exception {
107107
DocumentSymbol documentSymbol = symbols.get(0);
108108
List<DocumentSymbol> children = documentSymbol.getChildren();
109109
DocumentSymbol queryMethodSymbol = children.get(0);
110-
assertEquals("findPetTypes", queryMethodSymbol.getName());
110+
assertEquals("findPetTypes() : List<Object>", queryMethodSymbol.getName());
111111
assertEquals(1, children.size());
112112

113113
List<DocumentSymbol> queryChildren = queryMethodSymbol.getChildren();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.test;
2+
3+
import java.util.List;
4+
5+
import org.springframework.data.repository.CrudRepository;
6+
7+
public interface CustomerRepositoryWithTwoParamsMethod extends CrudRepository<Customer, Long> {
8+
9+
List<Customer> findByLastNameAndStatus(String lastName, Status status);
10+
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.test;
2+
3+
public class Status {
4+
5+
}

0 commit comments

Comments
 (0)