use of org.eclipse.xtext.ide.server.codeActions.ICodeActionService2 in project xtext-core by eclipse.
the class LanguageServerImpl method codeAction.
/**
* Compute the code action commands. Executed in a read request.
* @since 2.20
*/
protected List<Either<Command, CodeAction>> codeAction(CodeActionParams params, CancelIndicator cancelIndicator) {
URI uri = getURI(params.getTextDocument());
IResourceServiceProvider serviceProvider = getResourceServiceProvider(uri);
ICodeActionService2 service2 = getService(serviceProvider, ICodeActionService2.class);
if (service2 == null) {
return Collections.emptyList();
}
return workspaceManager.doRead(uri, (doc, resource) -> {
List<Either<Command, CodeAction>> result = new ArrayList<>();
if (service2 != null) {
ICodeActionService2.Options options = new ICodeActionService2.Options();
options.setDocument(doc);
options.setResource(resource);
options.setLanguageServerAccess(access);
options.setCodeActionParams(params);
options.setCancelIndicator(cancelIndicator);
List<Either<Command, CodeAction>> actions = service2.getCodeActions(options);
if (actions != null) {
result.addAll(actions);
}
}
return result;
});
}
use of org.eclipse.xtext.ide.server.codeActions.ICodeActionService2 in project xtext-core by eclipse.
the class AbstractIdeQuickfixTest method quickfixesAreOffered.
private void quickfixesAreOffered(EObject target, String issueCode, String originalText, QuickfixExpectation... expected) {
List<QuickfixExpectation> expectedSorted = IterableExtensions.sortBy(Arrays.asList(expected), it -> it.label);
ICompositeNode elementNode = NodeModelUtils.getNode(target);
LineAndColumn elementStartPosition = NodeModelUtils.getLineAndColumn(elementNode, elementNode.getOffset());
LineAndColumn elementEndPosition = NodeModelUtils.getLineAndColumn(elementNode, elementNode.getEndOffset());
Position startPos = new Position(elementStartPosition.getLine() - 1, elementStartPosition.getColumn() - 1);
Position endPos = new Position(elementEndPosition.getLine() - 1, elementEndPosition.getColumn() - 1);
Diagnostic issue = new Diagnostic();
issue.setCode(issueCode);
issue.setMessage("error");
issue.setSeverity(DiagnosticSeverity.Error);
issue.setSource("source");
issue.setRange(new Range(startPos, endPos));
ICodeActionService2.Options options = new ICodeActionService2.Options();
options.setCancelIndicator(CancelIndicator.NullImpl);
options.setDocument(new Document(Integer.valueOf(0), originalText));
options.setResource((XtextResource) target.eResource());
options.setLanguageServerAccess(new ILanguageServerAccess() {
@Override
public void addBuildListener(ILanguageServerAccess.IBuildListener listener) {
throw new UnsupportedOperationException();
}
@Override
public <T extends Object> CompletableFuture<T> doRead(String uri, Function<ILanguageServerAccess.Context, T> function) {
ILanguageServerAccess.Context ctx = new ILanguageServerAccess.Context(options.getResource(), options.getDocument(), true, CancelIndicator.NullImpl);
return CompletableFuture.completedFuture(function.apply(ctx));
}
@Override
public <T extends Object> CompletableFuture<T> doReadIndex(Function<? super ILanguageServerAccess.IndexContext, ? extends T> function) {
return null;
}
@Override
public InitializeParams getInitializeParams() {
return null;
}
@Override
public InitializeResult getInitializeResult() {
return null;
}
@Override
public LanguageClient getLanguageClient() {
return null;
}
@Override
public ResourceSet newLiveScopeResourceSet(URI uri) {
// re-using the existing ResourceSet because it contains the URI protocol mapping for "inmemory" resources.
ResourceSet resourceSet = options.getResource().getResourceSet();
return resourceSet;
}
});
CodeActionParams codeActionParams = new CodeActionParams();
codeActionParams.setRange(new Range(startPos, endPos));
codeActionParams.setTextDocument(new TextDocumentIdentifier(target.eResource().getURI().toString()));
CodeActionContext codeActionContext = new CodeActionContext();
codeActionContext.setDiagnostics(Collections.singletonList(issue));
codeActionParams.setContext(codeActionContext);
options.setCodeActionParams(codeActionParams);
List<DiagnosticResolution> actualIssueResolutions = IterableExtensions.sortBy(quickFixProvider.getResolutions(options, issue), DiagnosticResolution::getLabel);
assertEquals("The number of quickfixes does not match!", expectedSorted.size(), actualIssueResolutions.size());
for (int i = 0; i < actualIssueResolutions.size(); i++) {
DiagnosticResolution actualIssueResolution = actualIssueResolutions.get(i);
QuickfixExpectation expectedIssueResolution = expectedSorted.get(i);
assertEquals(expectedIssueResolution.label, actualIssueResolution.getLabel());
assertEquals(expectedIssueResolution.description, actualIssueResolution.getLabel());
assertIssueResolutionResult(toUnixLineSeparator(expectedIssueResolution.getExpectedResult()), actualIssueResolution, originalText, options.getDocument());
}
}
use of org.eclipse.xtext.ide.server.codeActions.ICodeActionService2 in project xtext-core by eclipse.
the class LanguageServerImpl method createServerCapabilities.
/**
* Configure the server capabilities for this instance.
*
* @param params
* the initialization parametrs
* @return the server capabilities
* @since 2.20
*/
protected ServerCapabilities createServerCapabilities(InitializeParams params) {
ServerCapabilities serverCapabilities = new ServerCapabilities();
serverCapabilities.setHoverProvider(true);
serverCapabilities.setDefinitionProvider(true);
serverCapabilities.setReferencesProvider(true);
serverCapabilities.setDocumentSymbolProvider(true);
serverCapabilities.setWorkspaceSymbolProvider(true);
Set<? extends IResourceServiceProvider> allLanguages = getAllLanguages();
if (allLanguages.stream().anyMatch((serviceProvider) -> serviceProvider.get(ICodeLensService.class) != null)) {
CodeLensOptions codeLensOptions = new CodeLensOptions();
codeLensOptions.setResolveProvider(allLanguages.stream().anyMatch((serviceProvider) -> serviceProvider.get(ICodeLensResolver.class) != null));
serverCapabilities.setCodeLensProvider(codeLensOptions);
}
serverCapabilities.setCodeActionProvider(allLanguages.stream().anyMatch((serviceProvider) -> serviceProvider.get(ICodeActionService2.class) != null));
serverCapabilities.setSignatureHelpProvider(new SignatureHelpOptions(ImmutableList.of("(", ",")));
serverCapabilities.setTextDocumentSync(TextDocumentSyncKind.Incremental);
CompletionOptions completionOptions = new CompletionOptions();
completionOptions.setResolveProvider(false);
completionOptions.setTriggerCharacters(ImmutableList.of("."));
serverCapabilities.setCompletionProvider(completionOptions);
serverCapabilities.setDocumentFormattingProvider(true);
serverCapabilities.setDocumentRangeFormattingProvider(true);
serverCapabilities.setDocumentHighlightProvider(true);
ClientCapabilities clientCapabilities = null;
if (params != null) {
clientCapabilities = params.getCapabilities();
}
TextDocumentClientCapabilities textDocument = null;
if (clientCapabilities != null) {
textDocument = clientCapabilities.getTextDocument();
}
RenameCapabilities rename = null;
FoldingRangeCapabilities folding = null;
if (textDocument != null) {
rename = textDocument.getRename();
folding = textDocument.getFoldingRange();
}
if (folding != null) {
serverCapabilities.setFoldingRangeProvider(allLanguages.stream().anyMatch(serviceProvider -> serviceProvider.get(FoldingRangeService.class) != null));
}
Boolean prepareSupport = null;
if (rename != null) {
prepareSupport = rename.getPrepareSupport();
}
boolean clientPrepareSupport = Objects.equal(Boolean.TRUE, prepareSupport);
if (clientPrepareSupport && allLanguages.stream().anyMatch(serviceProvider -> serviceProvider.get(IRenameService2.class) != null)) {
RenameOptions renameOptions = new RenameOptions();
renameOptions.setPrepareProvider(true);
serverCapabilities.setRenameProvider(Either.<Boolean, RenameOptions>forRight(renameOptions));
} else {
serverCapabilities.setRenameProvider(Either.forLeft(allLanguages.stream().anyMatch((serviceProvider) -> serviceProvider.get(IRenameService2.class) != null)));
}
WorkspaceClientCapabilities workspace = null;
if (clientCapabilities != null) {
workspace = clientCapabilities.getWorkspace();
}
ExecuteCommandCapabilities executeCommand = null;
if (workspace != null) {
executeCommand = workspace.getExecuteCommand();
if (workspace.getWorkspaceFolders() == Boolean.TRUE && workspaceManager.isSupportsWorkspaceFolders()) {
WorkspaceFoldersOptions workspaceFoldersOptions = new WorkspaceFoldersOptions();
workspaceFoldersOptions.setSupported(true);
workspaceFoldersOptions.setChangeNotifications(true);
serverCapabilities.setWorkspace(new WorkspaceServerCapabilities(workspaceFoldersOptions));
}
}
if (executeCommand != null) {
commandRegistry.initialize(allLanguages, clientCapabilities, client);
ExecuteCommandOptions executeCommandOptions = new ExecuteCommandOptions();
executeCommandOptions.setCommands(commandRegistry.getCommands());
serverCapabilities.setExecuteCommandProvider(executeCommandOptions);
}
for (IResourceServiceProvider language : allLanguages) {
ICapabilitiesContributor capabilitiesContributor = language.get(ICapabilitiesContributor.class);
if (capabilitiesContributor != null) {
capabilitiesContributor.contribute(serverCapabilities, params);
}
}
return serverCapabilities;
}
Aggregations