Skip to content

Commit

Permalink
Всплывающая подсказка и переход к определениям для аннотаций в OneScript
Browse files Browse the repository at this point in the history
  • Loading branch information
nixel2007 committed Nov 12, 2024
1 parent e436d19 commit fe53693
Show file tree
Hide file tree
Showing 13 changed files with 727 additions and 308 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* This file is a part of BSL Language Server.
*
* Copyright (c) 2018-2024
* 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.context.symbol;

import com.github._1c_syntax.bsl.languageserver.context.DocumentContext;
import com.github._1c_syntax.bsl.languageserver.context.symbol.annotations.Annotation;
import com.github._1c_syntax.bsl.languageserver.context.symbol.description.MethodDescription;
import com.github._1c_syntax.bsl.languageserver.context.symbol.variable.VariableDescription;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.Value;
import lombok.experimental.NonFinal;
import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.SymbolKind;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Value
@Builder
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@ToString(exclude = {"children", "parent"})
public class AnnotationSymbol implements SourceDefinedSymbol, Describable {

String name;

SymbolKind symbolKind;

@EqualsAndHashCode.Include
DocumentContext owner;

Range range;

@EqualsAndHashCode.Include
Range selectionRange;

@Setter
@NonFinal
@Builder.Default
Optional<SourceDefinedSymbol> parent = Optional.empty();

@Builder.Default
List<SourceDefinedSymbol> children = new ArrayList<>();

Optional<MethodDescription> description;

@Override
public void accept(SymbolTreeVisitor visitor) {
// no-op
}

public static AnnotationSymbol from(String name, MethodSymbol methodSymbol) {
return AnnotationSymbol.builder()
.name(name)
.symbolKind(SymbolKind.TypeParameter)
.owner(methodSymbol.getOwner())
.range(methodSymbol.getRange())
.selectionRange(methodSymbol.getSelectionRange())
.description(methodSymbol.getDescription())
.parent(Optional.of(methodSymbol))
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
/*
* This file is a part of BSL Language Server.
*
* Copyright (c) 2018-2024
* 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.hover;

import com.github._1c_syntax.bsl.languageserver.context.symbol.AnnotationSymbol;
import com.github._1c_syntax.bsl.languageserver.context.symbol.MethodSymbol;
import com.github._1c_syntax.bsl.languageserver.context.symbol.ParameterDefinition;
import com.github._1c_syntax.bsl.languageserver.context.symbol.description.MethodDescription;
import com.github._1c_syntax.bsl.languageserver.context.symbol.description.ParameterDescription;
import com.github._1c_syntax.bsl.languageserver.context.symbol.description.TypeDescription;
import com.github._1c_syntax.bsl.languageserver.utils.MdoRefBuilder;
import com.github._1c_syntax.bsl.languageserver.utils.Resources;
import lombok.RequiredArgsConstructor;
import org.eclipse.lsp4j.MarkupContent;
import org.eclipse.lsp4j.MarkupKind;
import org.eclipse.lsp4j.SymbolKind;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringJoiner;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
* Построитель контента для всплывающего окна для {@link AnnotationSymbol}.
*/
@Component
@RequiredArgsConstructor
public class AnnotationSymbolMarkupContentBuilder implements MarkupContentBuilder<AnnotationSymbol> {

private final DescriptionFormatter descriptionFormatter;

@Override
public MarkupContent getContent(AnnotationSymbol symbol) {
var maybeMethodSymbol = symbol.getParent();
if (maybeMethodSymbol.filter(MethodSymbol.class::isInstance).isEmpty()) {
return new MarkupContent(MarkupKind.MARKDOWN, "");
}

var markupBuilder = new StringJoiner("\n");
var methodSymbol = (MethodSymbol) maybeMethodSymbol.get();

// сигнатура
// местоположение метода
// описание метода
// параметры
// примеры
// варианты вызова

// сигнатура
String signature = descriptionFormatter.getSignature(symbol, methodSymbol);
descriptionFormatter.addSectionIfNotEmpty(markupBuilder, signature);

// местоположение метода
String methodLocation = descriptionFormatter.getLocation(methodSymbol);
descriptionFormatter.addSectionIfNotEmpty(markupBuilder, methodLocation);

// описание метода
String purposeSection = descriptionFormatter.getPurposeSection(methodSymbol);
descriptionFormatter.addSectionIfNotEmpty(markupBuilder, purposeSection);

// параметры
String parametersSection = descriptionFormatter.getParametersSection(methodSymbol);
descriptionFormatter.addSectionIfNotEmpty(markupBuilder, parametersSection);

// примеры
String examplesSection = descriptionFormatter.getExamplesSection(methodSymbol);
descriptionFormatter.addSectionIfNotEmpty(markupBuilder, examplesSection);

// варианты вызова
String callOptionsSection = descriptionFormatter.getCallOptionsSection(methodSymbol);
descriptionFormatter.addSectionIfNotEmpty(markupBuilder, callOptionsSection);

String content = markupBuilder.toString();

return new MarkupContent(MarkupKind.MARKDOWN, content);
}

@Override
public SymbolKind getSymbolKind() {
return SymbolKind.TypeParameter;
}

}
Loading

0 comments on commit fe53693

Please sign in to comment.