Skip to content

Commit

Permalink
Параметры inlay hints, поддержка inlayhint/refresh
Browse files Browse the repository at this point in the history
  • Loading branch information
nixel2007 committed Apr 1, 2023
1 parent 6372e30 commit 3fcefc1
Show file tree
Hide file tree
Showing 8 changed files with 277 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import com.github._1c_syntax.bsl.languageserver.configuration.diagnostics.DiagnosticsOptions;
import com.github._1c_syntax.bsl.languageserver.configuration.documentlink.DocumentLinkOptions;
import com.github._1c_syntax.bsl.languageserver.configuration.formating.FormattingOptions;
import com.github._1c_syntax.bsl.languageserver.configuration.inlayhints.InlayHintsOptions;
import com.github._1c_syntax.utils.Absolute;
import edu.umd.cs.findbugs.annotations.Nullable;
import lombok.AccessLevel;
Expand Down Expand Up @@ -90,6 +91,10 @@ public class LanguageServerConfiguration {
@Setter(value = AccessLevel.NONE)
private DocumentLinkOptions documentLinkOptions = new DocumentLinkOptions();

@JsonProperty("inlayHint")
@Setter(value = AccessLevel.NONE)
private InlayHintsOptions inlayHintsOptions = new InlayHintsOptions();

@JsonProperty("formatting")
@Setter(value = AccessLevel.NONE)
private FormattingOptions formattingOptions = new FormattingOptions();
Expand Down Expand Up @@ -217,7 +222,7 @@ private void loadConfigurationFile(File configurationFile) {
private void copyPropertiesFrom(LanguageServerConfiguration configuration) {
// todo: refactor
PropertyUtils.copyProperties(this, configuration);
PropertyUtils.copyProperties(this.codeLensOptions, configuration.codeLensOptions);
PropertyUtils.copyProperties(this.inlayHintsOptions, configuration.inlayHintsOptions);
PropertyUtils.copyProperties(this.diagnosticsOptions, configuration.diagnosticsOptions);
PropertyUtils.copyProperties(this.documentLinkOptions, configuration.documentLinkOptions);
PropertyUtils.copyProperties(this.formattingOptions, configuration.formattingOptions);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*
* This file is a part of BSL Language Server.
*
* Copyright (c) 2018-2023
* Alexey Sosnoviy <[email protected]>, Nikita Fedkin <[email protected]> and contributors
*
* SPDX-License-Identifier: LGPL-3.0-or-later
*
* BSL Language Server is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3.0 of the License, or (at your option) any later version.
*
* BSL Language Server is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BSL Language Server.
*/
package com.github._1c_syntax.bsl.languageserver.configuration.inlayhints;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.github._1c_syntax.bsl.languageserver.configuration.databind.ParametersDeserializer;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.eclipse.lsp4j.jsonrpc.messages.Either;

import java.util.HashMap;
import java.util.Map;

/**
* Корневой класс для настройки {@link com.github._1c_syntax.bsl.languageserver.providers.InlayHintProvider}
*/
@Data
@AllArgsConstructor(onConstructor = @__({@JsonCreator(mode = JsonCreator.Mode.DISABLED)}))
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class InlayHintsOptions {

/**
* Параметры сапплаеров inlay hints.
*/
@JsonDeserialize(using = ParametersDeserializer.class)
private Map<String, Either<Boolean, Map<String, Object>>> parameters = new HashMap<>();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* This file is a part of BSL Language Server.
*
* Copyright (c) 2018-2023
* Alexey Sosnoviy <[email protected]>, Nikita Fedkin <[email protected]> and contributors
*
* SPDX-License-Identifier: LGPL-3.0-or-later
*
* BSL Language Server is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3.0 of the License, or (at your option) any later version.
*
* BSL Language Server is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BSL Language Server.
*/
/**
* Пакет содержит настройки {@link com.github._1c_syntax.bsl.languageserver.providers.InlayHintProvider}
*/
@DefaultAnnotation(NonNull.class)
package com.github._1c_syntax.bsl.languageserver.configuration.inlayhints;

import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
import edu.umd.cs.findbugs.annotations.NonNull;
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.eclipse.lsp4j.InlayHint;
import org.eclipse.lsp4j.InlayHintParams;

import java.beans.Introspector;
import java.util.List;

/**
Expand All @@ -33,6 +34,23 @@
*/
public interface InlayHintSupplier {

String INLAY_HINT_SUPPLIER = "InlayHintSupplier";

/**
* Идентификатор сапплаера.
*
* @return Идентификатор сапплаера.
*/
default String getId() {
String simpleName = getClass().getSimpleName();
if (simpleName.endsWith(INLAY_HINT_SUPPLIER)) {
simpleName = simpleName.substring(0, simpleName.length() - INLAY_HINT_SUPPLIER.length());
simpleName = Introspector.decapitalize(simpleName);
}

return simpleName;
}

/**
* Получить inlay hints, доступные в документе.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/*
* This file is a part of BSL Language Server.
*
* Copyright (c) 2018-2023
* Alexey Sosnoviy <[email protected]>, Nikita Fedkin <[email protected]> and contributors
*
* SPDX-License-Identifier: LGPL-3.0-or-later
*
* BSL Language Server is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3.0 of the License, or (at your option) any later version.
*
* BSL Language Server is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BSL Language Server.
*/
package com.github._1c_syntax.bsl.languageserver.inlayhints.infrastructure;

import com.github._1c_syntax.bsl.languageserver.configuration.LanguageServerConfiguration;
import com.github._1c_syntax.bsl.languageserver.inlayhints.InlayHintSupplier;
import org.eclipse.lsp4j.jsonrpc.messages.Either;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

import static org.springframework.beans.factory.config.BeanDefinition.SCOPE_PROTOTYPE;

/**
* Spring-конфигурация для определения бинов
* пакета {@link com.github._1c_syntax.bsl.languageserver.inlayhints}.
*/
@Configuration
public class InlayHintsConfiguration {

/**
* Получить список сапплаеров inlay hints в разрезе их идентификаторов.
*
* @param inlayHintSuppliers Плоский список сапплаеров.
* @return Список сапплаеров inlay hints в разрезе их идентификаторов.
*/
@Bean
public Map<String, InlayHintSupplier> inlayHintSuppliersById(
Collection<InlayHintSupplier> inlayHintSuppliers
) {
return inlayHintSuppliers.stream()
.collect(Collectors.toMap(InlayHintSupplier::getId, Function.identity()));
}

/**
* Получить список активированных в данный момент сапплаеров inlay hints.
*
* @param configuration Конфигурация сервера.
* @param inlayHintSuppliersById Список сапплаеров inlay hints в разрезе из идентификаторов.
* @return Список активированных в данный момент сапплаеров inlay hints.
*/
@Bean
@Scope(SCOPE_PROTOTYPE)
public List<InlayHintSupplier> enabledInlayHintSuppliers(
LanguageServerConfiguration configuration,
@Qualifier("inlayHintSuppliersById") Map<String, InlayHintSupplier> inlayHintSuppliersById
) {
var parameters = configuration.getInlayHintsOptions().getParameters();
return inlayHintSuppliersById.values().stream()
.filter(supplier -> supplierIsEnabled(supplier.getId(), parameters))
.collect(Collectors.toList());
}

private static boolean supplierIsEnabled(
String supplierId,
Map<String, Either<Boolean, Map<String, Object>>> parameters
) {
var supplierConfig = parameters.getOrDefault(supplierId, Either.forLeft(true));
return supplierConfig.isRight() || supplierConfig.getLeft();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* This file is a part of BSL Language Server.
*
* Copyright (c) 2018-2023
* Alexey Sosnoviy <[email protected]>, Nikita Fedkin <[email protected]> and contributors
*
* SPDX-License-Identifier: LGPL-3.0-or-later
*
* BSL Language Server is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3.0 of the License, or (at your option) any later version.
*
* BSL Language Server is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BSL Language Server.
*/
/**
* Spring-специфичные классы для настройки внутренней инфраструктуры
* пакета {@link com.github._1c_syntax.bsl.languageserver.inlayhints}.
*/
@DefaultAnnotation(NonNull.class)
package com.github._1c_syntax.bsl.languageserver.inlayhints.infrastructure;

import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
import edu.umd.cs.findbugs.annotations.NonNull;
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* This file is a part of BSL Language Server.
*
* Copyright (c) 2018-2023
* Alexey Sosnoviy <[email protected]>, Nikita Fedkin <[email protected]> and contributors
*
* SPDX-License-Identifier: LGPL-3.0-or-later
*
* BSL Language Server is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3.0 of the License, or (at your option) any later version.
*
* BSL Language Server is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BSL Language Server.
*/
/**
* Пакет предназначен для реализации inlay hints,
* предоставляемых {@link com.github._1c_syntax.bsl.languageserver.providers.InlayHintProvider}.
*/
@DefaultAnnotation(NonNull.class)
package com.github._1c_syntax.bsl.languageserver.inlayhints;

import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
import edu.umd.cs.findbugs.annotations.NonNull;
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

import com.github._1c_syntax.bsl.languageserver.ClientCapabilitiesHolder;
import com.github._1c_syntax.bsl.languageserver.LanguageClientHolder;
import com.github._1c_syntax.bsl.languageserver.configuration.events.LanguageServerConfigurationChangedEvent;
import com.github._1c_syntax.bsl.languageserver.context.DocumentContext;
import com.github._1c_syntax.bsl.languageserver.inlayhints.InlayHintSupplier;
import lombok.RequiredArgsConstructor;
Expand All @@ -32,8 +33,11 @@
import org.eclipse.lsp4j.InlayHintWorkspaceCapabilities;
import org.eclipse.lsp4j.WorkspaceClientCapabilities;
import org.eclipse.lsp4j.services.LanguageClient;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
Expand All @@ -48,11 +52,17 @@
@RequiredArgsConstructor
public class InlayHintProvider {

private final Collection<InlayHintSupplier> suppliers;

private final ObjectProvider<List<InlayHintSupplier>> enabledInlayHintSuppliersProvider;
private final ClientCapabilitiesHolder clientCapabilitiesHolder;
private final LanguageClientHolder clientHolder;

private List<InlayHintSupplier> enabledInlayHintSuppliers;

@PostConstruct
protected void init() {
enabledInlayHintSuppliers = enabledInlayHintSuppliersProvider.getObject();
}

/**
* Получить список inlay hints в документе.
*
Expand All @@ -61,12 +71,26 @@ public class InlayHintProvider {
* @return Список inlay hints в документе
*/
public List<InlayHint> getInlayHint(DocumentContext documentContext, InlayHintParams params) {
return suppliers.stream()
return enabledInlayHintSuppliers.stream()
.map(supplier -> supplier.getInlayHints(documentContext, params))
.flatMap(Collection::stream)
.collect(Collectors.toList());
}

/**
* Обработчик события {@link LanguageServerConfigurationChangedEvent}.
* <p>
* В случае поддержки запроса подключенным клиентом инициирует запрос {@code workspace/inlayHint/refresh}.
*
* @param event Событие
*/
@EventListener
public void handleEvent(LanguageServerConfigurationChangedEvent event) {
enabledInlayHintSuppliers = enabledInlayHintSuppliersProvider.getObject();

refreshInlayHints();
}

/**
* Отправить запрос на обновление inlay hints.
*/
Expand Down

0 comments on commit 3fcefc1

Please sign in to comment.