Skip to content

Commit 6f66310

Browse files
committed
GH-1431: let request mapping index elements create document symbols on-demand
1 parent bb51280 commit 6f66310

File tree

2 files changed

+49
-8
lines changed

2 files changed

+49
-8
lines changed

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

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,28 @@
1010
*******************************************************************************/
1111
package org.springframework.ide.vscode.boot.java.requestmapping;
1212

13+
import org.eclipse.lsp4j.DocumentSymbol;
14+
import org.eclipse.lsp4j.Range;
15+
import org.eclipse.lsp4j.SymbolKind;
1316
import org.springframework.ide.vscode.commons.protocol.spring.AbstractSpringIndexElement;
17+
import org.springframework.ide.vscode.commons.protocol.spring.SymbolElement;
1418

15-
public class RequestMappingIndexElement extends AbstractSpringIndexElement {
19+
public class RequestMappingIndexElement extends AbstractSpringIndexElement implements SymbolElement {
1620

1721
private final String path;
1822
private final String[] httpMethods;
1923
private final String[] contentTypes;
2024
private final String[] acceptTypes;
25+
private final String symbolLabel;
26+
private final Range range;
2127

22-
public RequestMappingIndexElement(String path, String[] httpMethods, String[] contentTypes, String[] acceptTypes) {
28+
public RequestMappingIndexElement(String path, String[] httpMethods, String[] contentTypes, String[] acceptTypes, Range range, String symbolLabel) {
2329
this.path = path;
2430
this.httpMethods = httpMethods;
2531
this.contentTypes = contentTypes;
2632
this.acceptTypes = acceptTypes;
33+
this.range = range;
34+
this.symbolLabel = symbolLabel;
2735
}
2836

2937
public String getPath() {
@@ -42,4 +50,16 @@ public String[] getAcceptTypes() {
4250
return acceptTypes;
4351
}
4452

53+
@Override
54+
public DocumentSymbol getDocumentSymbol() {
55+
DocumentSymbol symbol = new DocumentSymbol();
56+
57+
symbol.setName(symbolLabel);
58+
symbol.setKind(SymbolKind.Method);
59+
symbol.setRange(range);
60+
symbol.setSelectionRange(range);
61+
62+
return symbol;
63+
}
64+
4565
}

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

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import org.springframework.ide.vscode.boot.java.utils.ASTUtils;
4040
import org.springframework.ide.vscode.boot.java.utils.CachedSymbol;
4141
import org.springframework.ide.vscode.boot.java.utils.SpringIndexerJavaContext;
42+
import org.springframework.ide.vscode.commons.protocol.spring.Bean;
43+
import org.springframework.ide.vscode.commons.protocol.spring.SpringIndexElement;
4244
import org.springframework.ide.vscode.commons.util.text.TextDocument;
4345

4446
/**
@@ -77,20 +79,39 @@ protected void addSymbolsPass1(Annotation node, ITypeBinding annotationType, Col
7779
context.getGeneratedSymbols().add(new CachedSymbol(context.getDocURI(), context.getLastModified(), symbol));
7880

7981
// index element for request mapping
80-
List<CachedBean> beans = context.getBeans();
81-
if (beans.size() > 0 ) {
82-
CachedBean cachedBean = beans.get(beans.size() - 1);
83-
if (cachedBean.getDocURI().equals(doc.getUri())) {
84-
cachedBean.getBean().addChild(new RequestMappingIndexElement(p, methods, contentTypes, acceptTypes));
85-
}
82+
SpringIndexElement parent = getPotentialParentIndexNode(context);
83+
if (parent != null) {
84+
parent.addChild(new RequestMappingIndexElement(p, methods, contentTypes, acceptTypes, location.getRange(), symbol.getName()));
85+
}
86+
else {
87+
context.getBeans().add(new CachedBean(doc.getUri(), new RequestMappingIndexElement(p, methods, contentTypes, acceptTypes, location.getRange(), symbol.getName())));
8688
}
8789
});
90+
8891
} catch (Exception e) {
8992
log.error("problem occured while scanning for request mapping symbols from " + doc.getUri(), e);
9093
}
9194
}
9295
}
9396

97+
private SpringIndexElement getPotentialParentIndexNode(SpringIndexerJavaContext context) {
98+
List<CachedBean> beans = context.getBeans();
99+
100+
for (int i = beans.size() - 1; i >= 0; i--) {
101+
CachedBean cachedBean = beans.get(i);
102+
103+
if (!cachedBean.getDocURI().equals(context.getDocURI())) {
104+
return null;
105+
}
106+
107+
if (cachedBean.getBean() instanceof Bean bean) {
108+
return bean;
109+
}
110+
}
111+
112+
return null;
113+
}
114+
94115
private String combinePath(String parent, String path) {
95116
String separator = !parent.endsWith("/") && !path.startsWith("/") && !path.isEmpty() ? "/" : "";
96117
String resultPath = parent + separator + path;

0 commit comments

Comments
 (0)