1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-21 21:52:10 +02:00

Bug 558664 - Cquery integration should be extracted from LSP Core

Part 1: rework "$cquery/progress" notification handling to be reusable

Change-Id: I6995594e51289e7f8a516ffc2cc2ec8bda88f919
Signed-off-by: Alexander Fedorov <alexander.fedorov@arsysop.ru>
This commit is contained in:
Alexander Fedorov 2020-08-18 17:03:19 +03:00
parent 240ca9085c
commit afaa593d34
8 changed files with 150 additions and 29 deletions

View file

@ -0,0 +1,41 @@
/*******************************************************************************
* Copyright (c) 2020 ArSysOp and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Alexander Fedorov (ArSysOp) - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.lsp.core.tests;
import static org.junit.Assert.assertEquals;
import org.eclipse.cdt.lsp.internal.core.LspCoreMessages;
import org.eclipse.cdt.lsp.internal.core.ShowStatus;
import org.eclipse.osgi.util.NLS;
import org.junit.Test;
public class ShowStatusTest {
@Test
public void busy() {
StringBuilder sb = new StringBuilder();
ShowStatus show = new ShowStatus(() -> "Busy", sb::append);
show.accept(() -> 100500);
assertEquals(NLS.bind(LspCoreMessages.ShowStatus_busy, "Busy", 100500), sb.toString());
}
@Test
public void idle() {
StringBuilder sb = new StringBuilder();
ShowStatus show = new ShowStatus(() -> "Idle", sb::append);
show.accept(() -> 0);
assertEquals(NLS.bind(LspCoreMessages.ShowStatus_idle, "Idle"), sb.toString());
}
}

View file

@ -24,8 +24,7 @@ public class CqueryMessages extends NLS {
}
public static String CquerySymbolKind_e_illegal_value;
public static String Server2ClientProtocolExtension_cquery_busy;
public static String Server2ClientProtocolExtension_cquery_idle;
public static String Server2ClientProtocolExtension_cquery_name;
public static String StorageClass_e_illegal_value;
private CqueryMessages() {

View file

@ -13,6 +13,5 @@
###############################################################################
CquerySymbolKind_e_illegal_value=Illegal value {0} for cquery symbol kind
Server2ClientProtocolExtension_cquery_busy=CQuery : Busy | {0} Jobs
Server2ClientProtocolExtension_cquery_idle=CQuery : Idle
Server2ClientProtocolExtension_cquery_name=CQuery
StorageClass_e_illegal_value=Illegal enum value: {0}

View file

@ -28,11 +28,11 @@ import org.eclipse.cdt.internal.cquery.CqueryMessages;
import org.eclipse.cdt.internal.cquery.ui.HighlightingNames;
import org.eclipse.cdt.internal.ui.editor.SemanticHighlightingManager.HighlightedPosition;
import org.eclipse.cdt.internal.ui.editor.SemanticHighlightingManager.HighlightingStyle;
import org.eclipse.cdt.lsp.internal.core.ShowStatus;
import org.eclipse.cdt.lsp.internal.text.ResolveDocumentUri;
import org.eclipse.cdt.lsp.internal.ui.StatusLineMessage;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.jface.action.StatusLineContributionItem;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.text.BadLocationException;
@ -45,45 +45,26 @@ import org.eclipse.jface.text.TextPresentation;
import org.eclipse.lsp4e.LanguageClientImpl;
import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.WorkbenchWindow;
//FIXME: AF: currently this extension is cquery-specific and it should be contributed from cquery-specific part
@SuppressWarnings("restriction")
public class Server2ClientProtocolExtension extends LanguageClientImpl {
private final ResolveDocumentUri uri;
private final ShowStatus progress;
public Server2ClientProtocolExtension() {
this.uri = new ResolveDocumentUri();
this.progress = new ShowStatus(() -> CqueryMessages.Server2ClientProtocolExtension_cquery_name,
new StatusLineMessage());
}
@JsonNotification("$cquery/progress")
public final void indexingProgress(IndexingProgressStats stats) {
Display.getDefault().asyncExec(() -> {
final String cqueryStatusFieldId = "org.eclipse.cdt.lsp.core.status"; //$NON-NLS-1$
final int width = 28;
IWorkbenchWindow[] workbenchWindows = PlatformUI.getWorkbench().getWorkbenchWindows();
for (IWorkbenchWindow window : workbenchWindows) {
StatusLineManager statusLine = ((WorkbenchWindow) window).getStatusLineManager();
StatusLineContributionItem cqueryStatusField = (StatusLineContributionItem) statusLine
.find(cqueryStatusFieldId);
if (cqueryStatusField == null) {
cqueryStatusField = new StatusLineContributionItem(cqueryStatusFieldId, width);
statusLine.add(cqueryStatusField);
}
String msg = stats.getTotalJobs() > 0
? NLS.bind(CqueryMessages.Server2ClientProtocolExtension_cquery_busy, stats.getTotalJobs())
: CqueryMessages.Server2ClientProtocolExtension_cquery_idle;
cqueryStatusField.setText(msg);
}
});
progress.accept(stats::getTotalJobs);
}
@JsonNotification("$cquery/setInactiveRegions")

View file

@ -24,6 +24,8 @@ public class LspCoreMessages extends NLS {
}
public static String CPPStreamConnectionProvider_e_unsupported;
public static String ShowStatus_busy;
public static String ShowStatus_idle;
private LspCoreMessages() {
}

View file

@ -13,3 +13,5 @@
###############################################################################
CPPStreamConnectionProvider_e_unsupported=Unsupported Language Server
ShowStatus_busy={0} : Busy | {1} Jobs
ShowStatus_idle={0} : Idle

View file

@ -0,0 +1,42 @@
/*******************************************************************************
* Copyright (c) 2020 ArSysOp and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Alexander Fedorov (ArSysOp) - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.lsp.internal.core;
import java.util.function.Consumer;
import java.util.function.Supplier;
import org.eclipse.osgi.util.NLS;
public final class ShowStatus implements Consumer<Supplier<Integer>> {
private final Supplier<String> name;
private final Consumer<String> target;
public ShowStatus(Supplier<String> name, Consumer<String> target) {
this.name = name;
this.target = target;
}
@Override
public void accept(Supplier<Integer> jobs) {
target.accept(message(jobs.get()));
}
private String message(int total) {
return total > 0 ? //
NLS.bind(LspCoreMessages.ShowStatus_busy, name.get(), total) : //
NLS.bind(LspCoreMessages.ShowStatus_idle, name.get());
}
}

View file

@ -0,0 +1,55 @@
/*******************************************************************************
* Copyright (c) 2020 ArSysOp and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Alexander Fedorov (ArSysOp) - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.lsp.internal.ui;
import java.util.Arrays;
import java.util.Optional;
import java.util.function.Consumer;
import org.eclipse.jface.action.StatusLineContributionItem;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.WorkbenchWindow;
@SuppressWarnings("restriction")
public class StatusLineMessage implements Consumer<String> {
private final int width = 28;
private final String id = "org.eclipse.cdt.lsp.ui.status"; //$NON-NLS-1$
@Override
public void accept(String message) {
Display.getDefault().asyncExec(() -> //
Arrays.stream(PlatformUI.getWorkbench().getWorkbenchWindows())//
.map(this::ensure)//
.forEach(item -> item.setText(message)));
}
private StatusLineContributionItem ensure(IWorkbenchWindow window) {
//FIXME: find via MToolControl with "org.eclipse.ui.StatusLine" identifier
StatusLineManager line = ((WorkbenchWindow) window).getStatusLineManager();
return Optional.ofNullable(line.find(id))//
.filter(StatusLineContributionItem.class::isInstance)//
.map(StatusLineContributionItem.class::cast)//
.orElseGet(() -> create(line));
}
private StatusLineContributionItem create(StatusLineManager line) {
StatusLineContributionItem item = new StatusLineContributionItem(id, width);
line.add(item);
return item;
}
}