/*******************************************************************************
* Copyright (c) 2012-2017 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.editor;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.assistedinject.Assisted;
import org.eclipse.che.ide.api.editor.annotation.AnnotationModel;
import org.eclipse.che.ide.api.editor.codeassist.CodeAssistProcessor;
import org.eclipse.che.ide.api.editor.editorconfig.DefaultTextEditorConfiguration;
import org.eclipse.che.ide.api.editor.formatter.ContentFormatter;
import org.eclipse.che.ide.api.editor.partition.DocumentPartitioner;
import org.eclipse.che.ide.api.editor.partition.DocumentPositionMap;
import org.eclipse.che.ide.api.editor.quickfix.QuickAssistProcessor;
import org.eclipse.che.ide.api.editor.reconciler.Reconciler;
import org.eclipse.che.ide.api.editor.reconciler.ReconcilerWithAutoSave;
import org.eclipse.che.ide.api.editor.signature.SignatureHelpProvider;
import org.eclipse.che.ide.api.editor.texteditor.TextEditor;
import org.eclipse.che.plugin.languageserver.ide.editor.quickassist.LanguageServerQuickAssistProcessor;
import org.eclipse.che.plugin.languageserver.ide.editor.quickassist.LanguageServerQuickAssistProcessorFactory;
import org.eclipse.che.plugin.languageserver.ide.editor.signature.LanguageServerSignatureHelpFactory;
import org.eclipse.lsp4j.ServerCapabilities;
import java.util.HashMap;
import java.util.Map;
/**
* Configure editor with LS support
*/
public class LanguageServerEditorConfiguration extends DefaultTextEditorConfiguration {
public static final int INITIAL_DOCUMENT_VERSION = 0;
private final ServerCapabilities serverCapabilities;
private final AnnotationModel annotationModel;
private final ReconcilerWithAutoSave reconciler;
private final LanguageServerCodeassistProcessorFactory codeAssistProcessorFactory;
private final SignatureHelpProvider signatureHelpProvider;
private final LanguageServerFormatter formatter;
private final LanguageServerQuickAssistProcessor quickAssistProcessor;
@Inject
public LanguageServerEditorConfiguration(@Assisted TextEditor editor,
LanguageServerCodeassistProcessorFactory codeAssistProcessor,
LanguageServerQuickAssistProcessorFactory quickAssistProcessorFactory,
Provider<DocumentPositionMap> docPositionMapProvider,
LanguageServerAnnotationModelFactory annotationModelFactory,
LanguageServerReconcileStrategyFactory reconcileStrategyProviderFactory,
LanguageServerFormatterFactory formatterFactory,
LanguageServerSignatureHelpFactory signatureHelpFactory,
@Assisted ServerCapabilities serverCapabilities) {
codeAssistProcessorFactory = codeAssistProcessor;
quickAssistProcessor = quickAssistProcessorFactory.create(editor);
if ((serverCapabilities.getDocumentFormattingProvider() != null && serverCapabilities.getDocumentFormattingProvider())
|| (serverCapabilities.getDocumentRangeFormattingProvider() != null && serverCapabilities.getDocumentRangeFormattingProvider())
|| serverCapabilities.getDocumentOnTypeFormattingProvider() != null) {
this.formatter = formatterFactory.create(serverCapabilities);
} else {
this.formatter = null;
}
this.serverCapabilities = serverCapabilities;
DocumentPositionMap documentPositionMap = docPositionMapProvider.get();
documentPositionMap.addPositionCategory(DocumentPositionMap.Categories.DEFAULT_CATEGORY);
this.annotationModel = annotationModelFactory.get(documentPositionMap);
this.reconciler = new ReconcilerWithAutoSave(DocumentPartitioner.DEFAULT_CONTENT_TYPE, getPartitioner());
reconciler.addReconcilingStrategy(DocumentPartitioner.DEFAULT_CONTENT_TYPE,
reconcileStrategyProviderFactory.build(serverCapabilities));
if (serverCapabilities.getSignatureHelpProvider() != null) {
signatureHelpProvider = signatureHelpFactory.create(serverCapabilities);
} else {
signatureHelpProvider = null;
}
}
@Override
public Map<String, CodeAssistProcessor> getContentAssistantProcessors() {
if (serverCapabilities.getCompletionProvider() != null) {
Map<String, CodeAssistProcessor> map = new HashMap<>();
map.put(DocumentPartitioner.DEFAULT_CONTENT_TYPE, codeAssistProcessorFactory.create(serverCapabilities));
return map;
}
return null;
}
@Override
public QuickAssistProcessor getQuickAssistProcessor() {
return quickAssistProcessor;
}
@Override
public AnnotationModel getAnnotationModel() {
return annotationModel;
}
@Override
public Reconciler getReconciler() {
return reconciler;
}
@Override
public ContentFormatter getContentFormatter() {
return formatter;
}
public ServerCapabilities getServerCapabilities() {
return serverCapabilities;
}
@Override
public SignatureHelpProvider getSignatureHelpProvider() {
return signatureHelpProvider;
}
}