GH-1536: include signature information in query method index nodes
This commit is contained in:
@@ -22,6 +22,7 @@ import org.eclipse.jdt.core.dom.Modifier;
|
|||||||
import org.eclipse.jdt.core.dom.NormalAnnotation;
|
import org.eclipse.jdt.core.dom.NormalAnnotation;
|
||||||
import org.eclipse.jdt.core.dom.SimpleName;
|
import org.eclipse.jdt.core.dom.SimpleName;
|
||||||
import org.eclipse.jdt.core.dom.SingleMemberAnnotation;
|
import org.eclipse.jdt.core.dom.SingleMemberAnnotation;
|
||||||
|
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
|
||||||
import org.eclipse.jdt.core.dom.TypeDeclaration;
|
import org.eclipse.jdt.core.dom.TypeDeclaration;
|
||||||
import org.eclipse.lsp4j.Location;
|
import org.eclipse.lsp4j.Location;
|
||||||
import org.eclipse.lsp4j.Range;
|
import org.eclipse.lsp4j.Range;
|
||||||
@@ -108,14 +109,15 @@ public class DataRepositorySymbolProvider implements SymbolProvider {
|
|||||||
|
|
||||||
if (nameNode != null) {
|
if (nameNode != null) {
|
||||||
String methodName = nameNode.getFullyQualifiedName();
|
String methodName = nameNode.getFullyQualifiedName();
|
||||||
DocumentRegion nodeRegion = ASTUtils.nodeRegion(doc, method);
|
DocumentRegion nodeRegion = ASTUtils.nodeRegion(doc, nameNode);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Range range = doc.toRange(nodeRegion);
|
Range range = doc.toRange(nodeRegion);
|
||||||
|
|
||||||
if (methodName != null) {
|
if (methodName != null) {
|
||||||
String queryString = identifyQueryString(method, annotationHierarchies);
|
String queryString = identifyQueryString(method, annotationHierarchies);
|
||||||
beanDefinition.addChild(new QueryMethodIndexElement(methodName, queryString, range));
|
String methodSignature = identifyMethodSignature(method);
|
||||||
|
beanDefinition.addChild(new QueryMethodIndexElement(methodSignature, queryString, range));
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (BadLocationException e) {
|
} catch (BadLocationException e) {
|
||||||
@@ -125,6 +127,36 @@ public class DataRepositorySymbolProvider implements SymbolProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String identifyMethodSignature(MethodDeclaration method) {
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
|
||||||
|
// method name
|
||||||
|
String name = method.getName().getFullyQualifiedName();
|
||||||
|
result.append(name);
|
||||||
|
|
||||||
|
// params
|
||||||
|
result.append("(");
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
List<SingleVariableDeclaration> parameters = method.parameters();
|
||||||
|
String[] paramNames = new String[parameters.size()];
|
||||||
|
|
||||||
|
for (int i = 0; i < parameters.size(); i++) {
|
||||||
|
ITypeBinding type = parameters.get(i).getType().resolveBinding();
|
||||||
|
paramNames[i] = type.getName();
|
||||||
|
}
|
||||||
|
result.append(String.join(", ", paramNames));
|
||||||
|
|
||||||
|
result.append(") : ");
|
||||||
|
|
||||||
|
// return type
|
||||||
|
ITypeBinding returnType = method.getReturnType2().resolveBinding();
|
||||||
|
String returnTypeName = returnType.getName();
|
||||||
|
result.append(returnTypeName);
|
||||||
|
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
private List<MethodDeclaration> identifyQueryMethods(TypeDeclaration type, AnnotationHierarchies annotationHierarchies) {
|
private List<MethodDeclaration> identifyQueryMethods(TypeDeclaration type, AnnotationHierarchies annotationHierarchies) {
|
||||||
List<MethodDeclaration> result = new ArrayList<>();
|
List<MethodDeclaration> result = new ArrayList<>();
|
||||||
|
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ public class SpringIndexerJava implements SpringIndexer {
|
|||||||
|
|
||||||
// whenever the implementation of the indexer changes in a way that the stored data in the cache is no longer valid,
|
// whenever the implementation of the indexer changes in a way that the stored data in the cache is no longer valid,
|
||||||
// we need to change the generation - this will result in a re-indexing due to no up-to-date cache data being found
|
// we need to change the generation - this will result in a re-indexing due to no up-to-date cache data being found
|
||||||
private static final String GENERATION = "GEN-19";
|
private static final String GENERATION = "GEN-20";
|
||||||
private static final String INDEX_FILES_TASK_ID = "index-java-source-files-task-";
|
private static final String INDEX_FILES_TASK_ID = "index-java-source-files-task-";
|
||||||
|
|
||||||
private static final String SYMBOL_KEY = "symbols";
|
private static final String SYMBOL_KEY = "symbols";
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ public class DataRepositoryIndexElementsTest {
|
|||||||
assertEquals("org.test.CustomerRepository", repoBean[0].getType());
|
assertEquals("org.test.CustomerRepository", repoBean[0].getType());
|
||||||
|
|
||||||
Bean[] matchingBeans = springIndex.getMatchingBeans("test-spring-data-symbols", "org.springframework.data.repository.CrudRepository");
|
Bean[] matchingBeans = springIndex.getMatchingBeans("test-spring-data-symbols", "org.springframework.data.repository.CrudRepository");
|
||||||
assertEquals(4, matchingBeans.length);
|
assertEquals(5, matchingBeans.length);
|
||||||
ArrayUtils.contains(matchingBeans, repoBean[0]);
|
ArrayUtils.contains(matchingBeans, repoBean[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,7 +100,22 @@ public class DataRepositoryIndexElementsTest {
|
|||||||
assertEquals(1, queryMethods.size());
|
assertEquals(1, queryMethods.size());
|
||||||
|
|
||||||
QueryMethodIndexElement queryMethod = (QueryMethodIndexElement) queryMethods.get(0);
|
QueryMethodIndexElement queryMethod = (QueryMethodIndexElement) queryMethods.get(0);
|
||||||
assertEquals("findByLastName", queryMethod.getMethodName());
|
assertEquals("findByLastName(String) : List<Customer>", queryMethod.getMethodName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testSimpleQueryMethodElementsWithTwoParams() throws Exception {
|
||||||
|
String docUri = directory.toPath().resolve("src/main/java/org/test/CustomerRepositoryWithTwoParamsMethod.java").toUri().toString();
|
||||||
|
|
||||||
|
DocumentElement document = springIndex.getDocument(docUri);
|
||||||
|
List<SpringIndexElement> children = document.getChildren();
|
||||||
|
Bean repositoryElement = (Bean) children.get(0);
|
||||||
|
|
||||||
|
List<SpringIndexElement> queryMethods = repositoryElement.getChildren();
|
||||||
|
assertEquals(1, queryMethods.size());
|
||||||
|
|
||||||
|
QueryMethodIndexElement queryMethod = (QueryMethodIndexElement) queryMethods.get(0);
|
||||||
|
assertEquals("findByLastNameAndStatus(String, Status) : List<Customer>", queryMethod.getMethodName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -115,7 +130,7 @@ public class DataRepositoryIndexElementsTest {
|
|||||||
assertEquals(1, queryMethods.size());
|
assertEquals(1, queryMethods.size());
|
||||||
|
|
||||||
QueryMethodIndexElement queryMethod = (QueryMethodIndexElement) queryMethods.get(0);
|
QueryMethodIndexElement queryMethod = (QueryMethodIndexElement) queryMethods.get(0);
|
||||||
assertEquals("findPetTypes", queryMethod.getMethodName());
|
assertEquals("findPetTypes() : List<Object>", queryMethod.getMethodName());
|
||||||
assertEquals("SELECT ptype FROM PetType ptype ORDER BY ptype.name", queryMethod.getQueryString());
|
assertEquals("SELECT ptype FROM PetType ptype ORDER BY ptype.name", queryMethod.getQueryString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,11 +155,11 @@ public class DataRepositoryIndexElementsTest {
|
|||||||
assertEquals(2, queryMethods.size());
|
assertEquals(2, queryMethods.size());
|
||||||
|
|
||||||
QueryMethodIndexElement queryMethod = (QueryMethodIndexElement) queryMethods.get(0);
|
QueryMethodIndexElement queryMethod = (QueryMethodIndexElement) queryMethods.get(0);
|
||||||
assertEquals("findConcretePetTypes", queryMethod.getMethodName());
|
assertEquals("findConcretePetTypes() : List<Object>", queryMethod.getMethodName());
|
||||||
assertEquals("CONCRETE REPO SELECT STATEMENT", queryMethod.getQueryString());
|
assertEquals("CONCRETE REPO SELECT STATEMENT", queryMethod.getQueryString());
|
||||||
|
|
||||||
QueryMethodIndexElement parentQueryMethod = (QueryMethodIndexElement) queryMethods.get(1);
|
QueryMethodIndexElement parentQueryMethod = (QueryMethodIndexElement) queryMethods.get(1);
|
||||||
assertEquals("findParentPetTypes", parentQueryMethod.getMethodName());
|
assertEquals("findParentPetTypes() : List<Object>", parentQueryMethod.getMethodName());
|
||||||
assertEquals("PARENT REPO INTERFACE QUERY STATEMENT", parentQueryMethod.getQueryString());
|
assertEquals("PARENT REPO INTERFACE QUERY STATEMENT", parentQueryMethod.getQueryString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ public class DataRepositorySymbolProviderTest {
|
|||||||
DocumentSymbol documentSymbol = symbols.get(0);
|
DocumentSymbol documentSymbol = symbols.get(0);
|
||||||
List<DocumentSymbol> children = documentSymbol.getChildren();
|
List<DocumentSymbol> children = documentSymbol.getChildren();
|
||||||
DocumentSymbol childSymbol = children.get(0);
|
DocumentSymbol childSymbol = children.get(0);
|
||||||
assertEquals("findByLastName", childSymbol.getName());
|
assertEquals("findByLastName(String) : List<Customer>", childSymbol.getName());
|
||||||
|
|
||||||
assertEquals(1, children.size());
|
assertEquals(1, children.size());
|
||||||
}
|
}
|
||||||
@@ -107,7 +107,7 @@ public class DataRepositorySymbolProviderTest {
|
|||||||
DocumentSymbol documentSymbol = symbols.get(0);
|
DocumentSymbol documentSymbol = symbols.get(0);
|
||||||
List<DocumentSymbol> children = documentSymbol.getChildren();
|
List<DocumentSymbol> children = documentSymbol.getChildren();
|
||||||
DocumentSymbol queryMethodSymbol = children.get(0);
|
DocumentSymbol queryMethodSymbol = children.get(0);
|
||||||
assertEquals("findPetTypes", queryMethodSymbol.getName());
|
assertEquals("findPetTypes() : List<Object>", queryMethodSymbol.getName());
|
||||||
assertEquals(1, children.size());
|
assertEquals(1, children.size());
|
||||||
|
|
||||||
List<DocumentSymbol> queryChildren = queryMethodSymbol.getChildren();
|
List<DocumentSymbol> queryChildren = queryMethodSymbol.getChildren();
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package org.test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.data.repository.CrudRepository;
|
||||||
|
|
||||||
|
public interface CustomerRepositoryWithTwoParamsMethod extends CrudRepository<Customer, Long> {
|
||||||
|
|
||||||
|
List<Customer> findByLastNameAndStatus(String lastName, Status status);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package org.test;
|
||||||
|
|
||||||
|
public class Status {
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user