下面列出了org.eclipse.lsp4j.jsonrpc.services.JsonRequest#org.eclipse.lsp4j.DocumentSymbolParams 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
public CompletableFuture<List<Either<SymbolInformation, DocumentSymbol>>> documentSymbol(DocumentSymbolParams params) {
JavaSource js = getSource(params.getTextDocument().getUri());
List<Either<SymbolInformation, DocumentSymbol>> result = new ArrayList<>();
try {
js.runUserActionTask(cc -> {
cc.toPhase(JavaSource.Phase.RESOLVED);
for (Element tel : cc.getTopLevelElements()) {
DocumentSymbol ds = element2DocumentSymbol(cc, tel);
if (ds != null)
result.add(Either.forRight(ds));
}
}, true);
} catch (IOException ex) {
//TODO: include stack trace:
client.logMessage(new MessageParams(MessageType.Error, ex.getMessage()));
}
return CompletableFuture.completedFuture(result);
}
@Test
public void testDocumentSymbol() throws Exception {
when(preferenceManager.getClientPreferences().isHierarchicalDocumentSymbolSupported()).thenReturn(Boolean.TRUE);
URI fileURI = openFile("maven/salut4", "src/main/java/java/Foo.java");
TextDocumentIdentifier identifier = new TextDocumentIdentifier(fileURI.toString());
DocumentSymbolParams params = new DocumentSymbolParams(identifier);
List<Either<SymbolInformation, DocumentSymbol>> result = server.documentSymbol(params).join();
assertNotNull(result);
assertEquals(2, result.size());
Either<SymbolInformation, DocumentSymbol> symbol = result.get(0);
assertTrue(symbol.isRight());
assertEquals("java", symbol.getRight().getName());
assertEquals(SymbolKind.Package, symbol.getRight().getKind());
symbol = result.get(1);
assertTrue(symbol.isRight());
assertEquals("Foo", symbol.getRight().getName());
assertEquals(SymbolKind.Class, symbol.getRight().getKind());
List<DocumentSymbol> children = symbol.getRight().getChildren();
assertNotNull(children);
assertEquals(1, children.size());
assertEquals("main(String[])", children.get(0).getName());
assertEquals(SymbolKind.Method, children.get(0).getKind());
}
@Override
public CompletableFuture<List<Either<SymbolInformation, DocumentSymbol>>> documentSymbol(
DocumentSymbolParams params) {
URI uri = URI.create(params.getTextDocument().getUri());
recompileIfContextChanged(uri);
DocumentSymbolProvider provider = new DocumentSymbolProvider(astVisitor);
return provider.provideDocumentSymbols(params.getTextDocument());
}
@Override
public CompletableFuture<List<Either<SymbolInformation, DocumentSymbol>>> documentSymbol(
DocumentSymbolParams params) {
URI uri = getURI(params.getTextDocument());
return openFilesManager.runInOpenFileContext(uri, "documentSymbol", (ofc, ci) -> {
return documentSymbol(ofc, params, ci);
});
}
/**
* Compute the symbol information. Executed in a read request.
*/
protected List<Either<SymbolInformation, DocumentSymbol>> documentSymbol(OpenFileContext ofc,
DocumentSymbolParams params, CancelIndicator cancelIndicator) {
URI uri = ofc.getURI();
IDocumentSymbolService documentSymbolService = getIDocumentSymbolService(getResourceServiceProvider(uri));
if ((documentSymbolService == null)) {
return Collections.emptyList();
}
XtextResource res = ofc.getResource();
XDocument doc = ofc.getDocument();
return documentSymbolService.getSymbols(doc, res, params, cancelIndicator);
}
public List<Either<SymbolInformation, DocumentSymbol>> documentSymbol(DocumentSymbolParams params, IProgressMonitor monitor) {
ITypeRoot unit = JDTUtils.resolveTypeRoot(params.getTextDocument().getUri());
if (unit == null) {
return Collections.emptyList();
}
if (hierarchicalDocumentSymbolSupported) {
List<DocumentSymbol> symbols = this.getHierarchicalOutline(unit, monitor);
return symbols.stream().map(Either::<SymbolInformation, DocumentSymbol>forRight).collect(toList());
} else {
SymbolInformation[] elements = this.getOutline(unit, monitor);
return Arrays.asList(elements).stream().map(Either::<SymbolInformation, DocumentSymbol>forLeft).collect(toList());
}
}
@Override
public CompletableFuture<List<Either<SymbolInformation, DocumentSymbol>>> documentSymbol(DocumentSymbolParams params) {
logInfo(">> document/documentSymbol");
boolean hierarchicalDocumentSymbolSupported = preferenceManager.getClientPreferences().isHierarchicalDocumentSymbolSupported();
DocumentSymbolHandler handler = new DocumentSymbolHandler(hierarchicalDocumentSymbolSupported);
return computeAsync((monitor) -> {
waitForLifecycleJobs(monitor);
return handler.documentSymbol(params, monitor);
});
}
@Override
public CompletableFuture<List<Either<SymbolInformation, DocumentSymbol>>> documentSymbol(DocumentSymbolParams params) {
logInfo(">> document/documentSymbol");
boolean hierarchicalDocumentSymbolSupported = preferenceManager.getClientPreferences().isHierarchicalDocumentSymbolSupported();
DocumentSymbolHandler handler = new DocumentSymbolHandler(hierarchicalDocumentSymbolSupported);
return computeAsync((monitor) -> {
waitForLifecycleJobs(monitor);
return handler.documentSymbol(params, monitor);
});
}
private static List<? extends DocumentSymbol> internalGetHierarchicalSymbols(IProject project, IProgressMonitor monitor, String className)
throws JavaModelException, UnsupportedEncodingException, InterruptedException, ExecutionException {
String uri = ClassFileUtil.getURI(project, className);
TextDocumentIdentifier identifier = new TextDocumentIdentifier(uri);
DocumentSymbolParams params = new DocumentSymbolParams();
params.setTextDocument(identifier);
//@formatter:off
List<DocumentSymbol> symbols = new DocumentSymbolHandler(true)
.documentSymbol(params, monitor).stream()
.map(Either::getRight).collect(toList());
//@formatter:on
assertTrue(symbols.size() > 0);
return symbols;
}
private List<? extends SymbolInformation> getSymbols(String className)
throws JavaModelException, UnsupportedEncodingException, InterruptedException, ExecutionException {
String uri = ClassFileUtil.getURI(project, className);
TextDocumentIdentifier identifier = new TextDocumentIdentifier(uri);
DocumentSymbolParams params = new DocumentSymbolParams();
params.setTextDocument(identifier);
//@formatter:off
List<SymbolInformation> symbols = new DocumentSymbolHandler(false)
.documentSymbol(params, monitor).stream()
.map(Either::getLeft).collect(toList());
//@formatter:on
assertFalse("No symbols found for " + className, symbols.isEmpty());
return symbols;
}
/**
* Searches by name for a symbol in a specific document (not the whole
* workspace)
*/
@Override
public CompletableFuture<List<Either<SymbolInformation, DocumentSymbol>>> documentSymbol(DocumentSymbolParams params)
{
return CompletableFutures.computeAsync(compilerWorkspace.getExecutorService(), cancelToken ->
{
cancelToken.checkCanceled();
//make sure that the latest changes have been passed to
//workspace.fileChanged() before proceeding
if(realTimeProblemsChecker != null)
{
realTimeProblemsChecker.updateNow();
}
compilerWorkspace.startBuilding();
try
{
boolean hierarchicalDocumentSymbolSupport = false;
try
{
hierarchicalDocumentSymbolSupport = clientCapabilities.getTextDocument().getDocumentSymbol().getHierarchicalDocumentSymbolSupport();
}
catch(NullPointerException e)
{
//ignore
}
DocumentSymbolProvider provider = new DocumentSymbolProvider(workspaceFolderManager, hierarchicalDocumentSymbolSupport);
return provider.documentSymbol(params, cancelToken);
}
finally
{
compilerWorkspace.doneBuilding();
}
});
}
protected void testDocumentSymbol(final Procedure1<? super DocumentSymbolConfiguraiton> configurator) {
try {
@Extension
final DocumentSymbolConfiguraiton configuration = new DocumentSymbolConfiguraiton();
configuration.setFilePath(("MyModel." + this.fileExtension));
configurator.apply(configuration);
final String fileUri = this.initializeContext(configuration).getUri();
TextDocumentIdentifier _textDocumentIdentifier = new TextDocumentIdentifier(fileUri);
DocumentSymbolParams _documentSymbolParams = new DocumentSymbolParams(_textDocumentIdentifier);
final CompletableFuture<List<Either<SymbolInformation, DocumentSymbol>>> symbolsFuture = this.languageServer.documentSymbol(_documentSymbolParams);
final List<Either<SymbolInformation, DocumentSymbol>> symbols = symbolsFuture.get();
Procedure1<? super List<Either<SymbolInformation, DocumentSymbol>>> _assertSymbols = configuration.getAssertSymbols();
boolean _tripleNotEquals = (_assertSymbols != null);
if (_tripleNotEquals) {
configuration.getAssertSymbols().apply(symbols);
} else {
final Function1<Either<SymbolInformation, DocumentSymbol>, Object> _function = (Either<SymbolInformation, DocumentSymbol> it) -> {
Object _xifexpression = null;
if (this.hierarchicalDocumentSymbolSupport) {
_xifexpression = it.getRight();
} else {
_xifexpression = it.getLeft();
}
return _xifexpression;
};
final List<Object> unwrappedSymbols = ListExtensions.<Either<SymbolInformation, DocumentSymbol>, Object>map(symbols, _function);
final String actualSymbols = this.toExpectation(unwrappedSymbols);
this.assertEquals(configuration.getExpectedSymbols(), actualSymbols);
}
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
/**
* Compute the symbol information. Executed in a read request.
* @since 2.20
*/
protected List<Either<SymbolInformation, DocumentSymbol>> documentSymbol(DocumentSymbolParams params,
CancelIndicator cancelIndicator) {
URI uri = getURI(params.getTextDocument());
IDocumentSymbolService documentSymbolService = getIDocumentSymbolService(getResourceServiceProvider(uri));
if (documentSymbolService == null) {
return Collections.emptyList();
}
return workspaceManager.doRead(uri,
(document, resource) -> documentSymbolService.getSymbols(document, resource, params, cancelIndicator));
}
@Override
public CompletableFuture<List<Either<SymbolInformation, DocumentSymbol>>> documentSymbol(DocumentSymbolParams params) {
LOGGER.info("documentSymbol: {}", params.getTextDocument());
return new DocumentSymbolProcessor(openedDocuments.get(params.getTextDocument().getUri())).getDocumentSymbols();
}
protected CompletableFuture<List<Either<SymbolInformation,DocumentSymbol>>> getDocumentSymbolFor(CamelLanguageServer camelLanguageServer) {
TextDocumentService textDocumentService = camelLanguageServer.getTextDocumentService();
DocumentSymbolParams params = new DocumentSymbolParams(new TextDocumentIdentifier(DUMMY_URI+extensionUsed));
return textDocumentService.documentSymbol(params);
}
@Override
public CompletableFuture<List<Either<SymbolInformation, DocumentSymbol>>> documentSymbol(
DocumentSymbolParams params) {
LOGGER.debug("documentSymbol: {}", params.getTextDocument());
return CompletableFuture.completedFuture(Collections.emptyList());
}
@Override
public CompletableFuture<List<Either<SymbolInformation, DocumentSymbol>>> documentSymbol(
DocumentSymbolParams params) {
return requestManager.runRead((cancelIndicator) -> documentSymbol(params, cancelIndicator));
}
@Override
public List<Either<SymbolInformation, DocumentSymbol>> getSymbols(Document document, XtextResource resource,
DocumentSymbolParams params, CancelIndicator cancelIndicator) {
return getSymbols(resource, cancelIndicator);
}
@Override
public List<Either<SymbolInformation, DocumentSymbol>> getSymbols(Document document, XtextResource resource,
DocumentSymbolParams params, CancelIndicator cancelIndicator) {
return getSymbols(resource, cancelIndicator);
}
List<Either<SymbolInformation, DocumentSymbol>> getSymbols(Document document, XtextResource resource,
DocumentSymbolParams params, CancelIndicator cancelIndicator);
@Override
public List<Either<SymbolInformation, DocumentSymbol>> getSymbols(Document document, XtextResource resource,
DocumentSymbolParams params, CancelIndicator cancelIndicator) {
return emptyList();
}
/**
* The document symbol request is sent from the client to the server to list all
* symbols found in a given text document.
*
* Registration Options: {@link TextDocumentRegistrationOptions}
*
* <p>
* <b>Caveat</b>: although the return type allows mixing the
* {@link DocumentSymbol} and {@link SymbolInformation} instances into a list do
* not do it because the clients cannot accept a heterogeneous list. A list of
* {@code DocumentSymbol} instances is only a valid return value if the
* {@link DocumentSymbolCapabilities#getHierarchicalDocumentSymbolSupport()
* textDocument.documentSymbol.hierarchicalDocumentSymbolSupport} is
* {@code true}. More details on this difference between the LSP and the LSP4J
* can be found <a href="https://github.com/eclipse/lsp4j/issues/252">here</a>.
* </p>
*/
@JsonRequest
@ResponseJsonAdapter(DocumentSymbolResponseAdapter.class)
default CompletableFuture<List<Either<SymbolInformation, DocumentSymbol>>> documentSymbol(DocumentSymbolParams params) {
throw new UnsupportedOperationException();
}