Skip to content

Commit

Permalink
#1809 fix some bugs with symbol navigation
Browse files Browse the repository at this point in the history
  • Loading branch information
Evgen Vidolob committed Sep 7, 2016
1 parent 9da8efd commit 8a2e7b7
Show file tree
Hide file tree
Showing 8 changed files with 174 additions and 79 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
* GinMapBinder.newMapBinder(binder(), String.class, WsAgentComponent.class);
* mapBinder.addBinding("component key").to(YourComponent.class);
* </pre>
* <b>Note:</b> Ws Agent Component start order will be calculated upon component key.
* All keys will be sorted in alphabet order.
*
* @author Artem Zatsarynnyi
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@

import java.util.Iterator;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

/**
* Performs initial application startup.
Expand Down Expand Up @@ -115,7 +117,9 @@ public void apply(WorkspaceDto ws) throws OperationException {

wsAgentStateControllerProvider.get().initialize(devMachine);
wsAgentURLModifier.initialize(devMachine);
startWsAgentComponents(components.values().iterator());
SortedMap<String, Provider<WsAgentComponent>> sortedComponents = new TreeMap<>();
sortedComponents.putAll(components);
startWsAgentComponents(sortedComponents.values().iterator());
}
}).catchError(new Operation<PromiseError>() {
@Override
Expand Down Expand Up @@ -158,6 +162,7 @@ private void startWsAgentComponents(final Iterator<Provider<WsAgentComponent>> c
component.start(new Callback<WsAgentComponent, Exception>() {
@Override
public void onSuccess(WsAgentComponent result) {
Log.error(component.getClass(), result);
startWsAgentComponents(componentProviderIterator);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.client;

import com.google.gwt.core.client.Callback;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;

import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.api.component.WsAgentComponent;
import org.eclipse.che.ide.statepersistance.AppStateManager;

/**
* @author Evgen Vidolob
*/
@Singleton
public class WorkspaceStateRestorer implements WsAgentComponent {

private final Provider<AppStateManager> managerProvider;
private final Provider<AppContext> appContextProvider;

@Inject
public WorkspaceStateRestorer(Provider<AppStateManager> managerProvider, Provider<AppContext> appContextProvider) {
this.managerProvider = managerProvider;
this.appContextProvider = appContextProvider;
}

@Override
public void start(Callback<WsAgentComponent, Exception> callback) {
managerProvider.get().restoreWorkspaceState(appContextProvider.get().getWorkspaceId());
callback.onSuccess(this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,6 @@ public void apply(Project[] projects) throws OperationException {
AppContextImpl.this.projects = projects;
java.util.Arrays.sort(AppContextImpl.this.projects, ResourcePathComparator.getInstance());
eventBus.fireEvent(new WorkspaceReadyEvent(projects));
appStateManager.get().restoreWorkspaceState(getWorkspaceId());
}
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,6 @@
import org.eclipse.che.ide.api.machine.MachineServiceClientImpl;
import org.eclipse.che.ide.api.machine.RecipeServiceClient;
import org.eclipse.che.ide.api.machine.RecipeServiceClientImpl;
import org.eclipse.che.ide.ui.multisplitpanel.SubPanel;
import org.eclipse.che.ide.ui.multisplitpanel.SubPanelFactory;
import org.eclipse.che.ide.ui.multisplitpanel.tab.Tab;
import org.eclipse.che.ide.api.notification.NotificationManager;
import org.eclipse.che.ide.api.oauth.OAuth2Authenticator;
import org.eclipse.che.ide.api.oauth.OAuth2AuthenticatorRegistry;
Expand Down Expand Up @@ -112,6 +109,7 @@
import org.eclipse.che.ide.api.workspace.WorkspaceServiceClient;
import org.eclipse.che.ide.api.workspace.WorkspaceServiceClientImpl;
import org.eclipse.che.ide.client.StartUpActionsProcessor;
import org.eclipse.che.ide.client.WorkspaceStateRestorer;
import org.eclipse.che.ide.context.AppContextImpl;
import org.eclipse.che.ide.editor.EditorAgentImpl;
import org.eclipse.che.ide.editor.EditorRegistryImpl;
Expand Down Expand Up @@ -146,7 +144,6 @@
import org.eclipse.che.ide.jsonrpc.impl.WebSocketJsonRpcResponseTransmitter;
import org.eclipse.che.ide.keybinding.KeyBindingManager;
import org.eclipse.che.ide.machine.CommandPropertyValueProviderRegistryImpl;
import org.eclipse.che.ide.machine.macro.ServerMacroProvider;
import org.eclipse.che.ide.menu.MainMenuView;
import org.eclipse.che.ide.menu.MainMenuViewImpl;
import org.eclipse.che.ide.menu.StatusPanelGroupView;
Expand Down Expand Up @@ -242,10 +239,13 @@
import org.eclipse.che.ide.ui.loaders.initialization.LoaderView;
import org.eclipse.che.ide.ui.loaders.initialization.LoaderViewImpl;
import org.eclipse.che.ide.ui.loaders.request.LoaderFactory;
import org.eclipse.che.ide.ui.multisplitpanel.SubPanel;
import org.eclipse.che.ide.ui.multisplitpanel.SubPanelFactory;
import org.eclipse.che.ide.ui.multisplitpanel.panel.SubPanelPresenter;
import org.eclipse.che.ide.ui.multisplitpanel.panel.SubPanelView;
import org.eclipse.che.ide.ui.multisplitpanel.panel.SubPanelViewFactory;
import org.eclipse.che.ide.ui.multisplitpanel.panel.SubPanelViewImpl;
import org.eclipse.che.ide.ui.multisplitpanel.tab.Tab;
import org.eclipse.che.ide.ui.multisplitpanel.tab.TabItemFactory;
import org.eclipse.che.ide.ui.multisplitpanel.tab.TabWidget;
import org.eclipse.che.ide.ui.toolbar.MainToolbar;
Expand All @@ -261,9 +261,9 @@
import org.eclipse.che.ide.util.executor.UserActivityManager;
import org.eclipse.che.ide.websocket.ng.WebSocketMessageReceiver;
import org.eclipse.che.ide.websocket.ng.WebSocketMessageTransmitter;
import org.eclipse.che.ide.websocket.ng.impl.BasicWebSocketEndpoint;
import org.eclipse.che.ide.websocket.ng.impl.BasicWebSocketMessageTransmitter;
import org.eclipse.che.ide.websocket.ng.impl.BasicWebSocketTransmissionValidator;
import org.eclipse.che.ide.websocket.ng.impl.BasicWebSocketEndpoint;
import org.eclipse.che.ide.websocket.ng.impl.DelayableWebSocket;
import org.eclipse.che.ide.websocket.ng.impl.SessionWebSocketInitializer;
import org.eclipse.che.ide.websocket.ng.impl.WebSocket;
Expand Down Expand Up @@ -426,6 +426,7 @@ private void configureComponents() {
GinMapBinder.newMapBinder(binder(), String.class, WsAgentComponent.class);
wsAgentComponentsBinder.addBinding("Project types").to(ProjectTypeComponent.class);
wsAgentComponentsBinder.addBinding("Start-up actions processor").to(StartUpActionsProcessor.class);
wsAgentComponentsBinder.addBinding("ZZ Restore Workspace State").to(WorkspaceStateRestorer.class);
}

private void configureProjectWizard() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,44 +16,29 @@

import org.eclipse.che.api.promises.client.Operation;
import org.eclipse.che.api.promises.client.OperationException;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.ide.api.action.ActionManager;
import org.eclipse.che.ide.api.action.DefaultActionGroup;
import org.eclipse.che.ide.api.constraints.Anchor;
import org.eclipse.che.ide.api.constraints.Constraints;
import org.eclipse.che.ide.api.editor.EditorRegistry;
import org.eclipse.che.ide.api.event.FileEvent;
import org.eclipse.che.ide.api.extension.Extension;
import org.eclipse.che.ide.api.filetypes.FileType;
import org.eclipse.che.ide.api.filetypes.FileTypeRegistry;
import org.eclipse.che.ide.api.keybinding.KeyBindingAgent;
import org.eclipse.che.ide.api.keybinding.KeyBuilder;
import org.eclipse.che.ide.api.machine.events.WsAgentStateEvent;
import org.eclipse.che.ide.api.machine.events.WsAgentStateHandler;
import org.eclipse.che.ide.dto.DtoFactory;
import org.eclipse.che.ide.editor.orion.client.OrionContentTypeRegistrant;
import org.eclipse.che.ide.editor.orion.client.jso.OrionContentTypeOverlay;
import org.eclipse.che.ide.editor.orion.client.jso.OrionHighlightingConfigurationOverlay;
import org.eclipse.che.ide.util.browser.UserAgent;
import org.eclipse.che.ide.util.input.KeyCodeMap;
import org.eclipse.che.plugin.languageserver.ide.editor.LanguageServerEditorConfiguration;
import org.eclipse.che.plugin.languageserver.ide.editor.LanguageServerEditorProvider;
import org.eclipse.che.plugin.languageserver.ide.navigation.declaration.FindDefinitionAction;
import org.eclipse.che.plugin.languageserver.ide.navigation.references.FindReferencesAction;
import org.eclipse.che.plugin.languageserver.ide.navigation.symbol.GoToSymbolAction;
import org.eclipse.che.plugin.languageserver.ide.navigation.workspace.FindSymbolAction;
import org.eclipse.che.plugin.languageserver.ide.service.LanguageServerRegistryServiceClient;
import org.eclipse.che.plugin.languageserver.ide.service.TextDocumentServiceClient;
import org.eclipse.che.plugin.languageserver.shared.lsapi.DidCloseTextDocumentParamsDTO;
import org.eclipse.che.plugin.languageserver.shared.lsapi.DidOpenTextDocumentParamsDTO;
import org.eclipse.che.plugin.languageserver.shared.lsapi.DidSaveTextDocumentParamsDTO;
import org.eclipse.che.plugin.languageserver.shared.lsapi.LanguageDescriptionDTO;
import org.eclipse.che.plugin.languageserver.shared.lsapi.TextDocumentIdentifierDTO;
import org.eclipse.che.plugin.languageserver.shared.lsapi.TextDocumentItemDTO;

import java.util.List;

import static com.google.common.collect.Lists.newArrayList;
import static org.eclipse.che.ide.api.action.IdeActions.GROUP_ASSISTANT;

@Extension(title = "LanguageServer")
Expand All @@ -68,63 +53,6 @@ protected void injectCss(LanguageServerResources resources) {
resources.quickOpenListCss().ensureInjected();
}

@Inject
protected void configureFileTypes(final FileTypeRegistry fileTypeRegistry,
final LanguageServerResources resources,
final EditorRegistry editorRegistry,
final LanguageServerEditorProvider editorProvider,
final OrionContentTypeRegistrant contentTypeRegistrant,
final LanguageServerRegistryServiceClient serverLanguageRegistry,
final EventBus eventBus) {
eventBus.addHandler(WsAgentStateEvent.TYPE, new WsAgentStateHandler() {

@Override
public void onWsAgentStarted(WsAgentStateEvent event) {
Promise<List<LanguageDescriptionDTO>> registeredLanguages = serverLanguageRegistry.getSupportedLanguages();
registeredLanguages.then(new Operation<List<LanguageDescriptionDTO>>() {
@Override
public void apply(List<LanguageDescriptionDTO> langs) throws OperationException {
if (langs.isEmpty()) {
return;
}
for (LanguageDescriptionDTO lang : langs) {
String primaryExtension = lang.getFileExtensions().get(0);
for (String ext : lang.getFileExtensions()) {
final FileType fileType = new FileType(resources.file(), ext);
fileTypeRegistry.registerFileType(fileType);
editorRegistry.registerDefaultEditor(fileType, editorProvider);
}
List<String> mimeTypes = lang.getMimeTypes();
if (mimeTypes.isEmpty()) {
mimeTypes = newArrayList("text/x-" + lang.getLanguageId());
}
for (String contentTypeId : mimeTypes) {

OrionContentTypeOverlay contentType = OrionContentTypeOverlay.create();
contentType.setId(contentTypeId);
contentType.setName(lang.getLanguageId());
contentType.setExtension(primaryExtension);
contentType.setExtends("text/plain");

// highlighting
OrionHighlightingConfigurationOverlay config = OrionHighlightingConfigurationOverlay
.create();
config.setId(lang.getLanguageId() + ".highlighting");
config.setContentTypes(contentTypeId);
config.setPatterns(lang.getHighlightingConfiguration());

contentTypeRegistrant.registerFileType(contentType, config);
}
}
}
});
}

@Override
public void onWsAgentStopped(WsAgentStateEvent event) { }
});
}

@Inject
protected void registerAction(ActionManager actionManager,
KeyBindingAgent keyBindingManager,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.plugin.languageserver.ide;

import com.google.gwt.core.client.Callback;
import com.google.inject.Inject;
import com.google.inject.Singleton;

import org.eclipse.che.api.promises.client.Operation;
import org.eclipse.che.api.promises.client.OperationException;
import org.eclipse.che.api.promises.client.Promise;
import org.eclipse.che.api.promises.client.PromiseError;
import org.eclipse.che.ide.api.component.WsAgentComponent;
import org.eclipse.che.ide.api.editor.EditorRegistry;
import org.eclipse.che.ide.api.filetypes.FileType;
import org.eclipse.che.ide.api.filetypes.FileTypeRegistry;
import org.eclipse.che.ide.editor.orion.client.OrionContentTypeRegistrant;
import org.eclipse.che.ide.editor.orion.client.jso.OrionContentTypeOverlay;
import org.eclipse.che.ide.editor.orion.client.jso.OrionHighlightingConfigurationOverlay;
import org.eclipse.che.plugin.languageserver.ide.editor.LanguageServerEditorProvider;
import org.eclipse.che.plugin.languageserver.ide.service.LanguageServerRegistryServiceClient;
import org.eclipse.che.plugin.languageserver.shared.lsapi.LanguageDescriptionDTO;

import java.util.List;

import static com.google.common.collect.Lists.newArrayList;

/**
* @author Evgen Vidolob
*/
@Singleton
public class LanguageServerFileTypeRegister implements WsAgentComponent {


private final LanguageServerRegistryServiceClient serverLanguageRegistry;
private final FileTypeRegistry fileTypeRegistry;
private final LanguageServerResources resources;
private final EditorRegistry editorRegistry;
private final OrionContentTypeRegistrant contentTypeRegistrant;
private final LanguageServerEditorProvider editorProvider;

@Inject
public LanguageServerFileTypeRegister(LanguageServerRegistryServiceClient serverLanguageRegistry,
FileTypeRegistry fileTypeRegistry,
LanguageServerResources resources,
EditorRegistry editorRegistry,
OrionContentTypeRegistrant contentTypeRegistrant,
LanguageServerEditorProvider editorProvider) {
this.serverLanguageRegistry = serverLanguageRegistry;
this.fileTypeRegistry = fileTypeRegistry;
this.resources = resources;
this.editorRegistry = editorRegistry;
this.contentTypeRegistrant = contentTypeRegistrant;
this.editorProvider = editorProvider;
}

@Override
public void start(final Callback<WsAgentComponent, Exception> callback) {
Promise<List<LanguageDescriptionDTO>> registeredLanguages = serverLanguageRegistry.getSupportedLanguages();
registeredLanguages.then(new Operation<List<LanguageDescriptionDTO>>() {
@Override
public void apply(List<LanguageDescriptionDTO> langs) throws OperationException {
if (!langs.isEmpty()) {
for (LanguageDescriptionDTO lang : langs) {
String primaryExtension = lang.getFileExtensions().get(0);
for (String ext : lang.getFileExtensions()) {
final FileType fileType = new FileType(resources.file(), ext);
fileTypeRegistry.registerFileType(fileType);
editorRegistry.registerDefaultEditor(fileType, editorProvider);
}
List<String> mimeTypes = lang.getMimeTypes();
if (mimeTypes.isEmpty()) {
mimeTypes = newArrayList("text/x-" + lang.getLanguageId());
}
for (String contentTypeId : mimeTypes) {

OrionContentTypeOverlay contentType = OrionContentTypeOverlay.create();
contentType.setId(contentTypeId);
contentType.setName(lang.getLanguageId());
contentType.setExtension(primaryExtension);
contentType.setExtends("text/plain");

// highlighting
OrionHighlightingConfigurationOverlay config = OrionHighlightingConfigurationOverlay
.create();
config.setId(lang.getLanguageId() + ".highlighting");
config.setContentTypes(contentTypeId);
config.setPatterns(lang.getHighlightingConfiguration());

contentTypeRegistrant.registerFileType(contentType, config);
}
}
}
callback.onSuccess(LanguageServerFileTypeRegister.this);
}
}).catchError(new Operation<PromiseError>() {
@Override
public void apply(PromiseError arg) throws OperationException {
callback.onFailure(new Exception(arg.getMessage(), arg.getCause()));
}
});
}
}
Loading

0 comments on commit 8a2e7b7

Please sign in to comment.