Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Показ ховера при наведении на параметры аннотации. #3423

Merged
merged 8 commits into from
Feb 22, 2025
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,12 @@ public List<CodeLens> getCodeLenses(DocumentContext documentContext) {
return Collections.emptyList();
}

var symbolTree = documentContext.getSymbolTree();
var firstMethod = symbolTree.getMethods().get(0);
var methods = documentContext.getSymbolTree().getMethods();
if (methods.isEmpty()) {
return Collections.emptyList();
}

var firstMethod = methods.get(0);

return List.of(toCodeLens(firstMethod, documentContext));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import jakarta.annotation.PostConstruct;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Locked;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
Expand Down Expand Up @@ -111,9 +112,9 @@ public class DocumentContext implements Comparable<DocumentContext> {

@Getter
private FileType fileType;
@Getter
@Getter(onMethod = @__({@Locked("computeLock")}))
private BSLTokenizer tokenizer;
@Getter
@Getter(onMethod = @__({@Locked("computeLock")}))
private SymbolTree symbolTree;

@Getter
Expand Down Expand Up @@ -144,20 +145,24 @@ public ServerContext getServerContext() {
return context;
}

@Locked("computeLock")
public String getContent() {
requireNonNull(content);
return content;
}

@Locked("computeLock")
public String[] getContentList() {
return contentList.getOrCompute();
}

@Locked("computeLock")
public BSLParser.FileContext getAst() {
requireNonNull(content);
return tokenizer.getAst();
}

@Locked("computeLock")
public List<Token> getTokens() {
requireNonNull(content);
return tokenizer.getTokens();
Expand All @@ -173,6 +178,7 @@ public List<Token> getComments() {
.toList();
}

@Locked("computeLock")
public String getText(Range range) {
Position start = range.getStart();
Position end = range.getEnd();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,10 @@ public ParseTree visitForStatement(BSLParser.ForStatementContext ctx) {

@Override
public ParseTree visitForEachStatement(BSLParser.ForEachStatementContext ctx) {
if (ctx.IDENTIFIER() == null) {
return super.visitForEachStatement(ctx);
}

if (
currentMethodVariables.containsKey(ctx.IDENTIFIER().getText())
|| moduleVariables.containsKey(ctx.IDENTIFIER().getText())
Expand Down
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-2025
* 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.description.MethodDescription;
import lombok.Builder;
import lombok.EqualsAndHashCode;
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.Collections;
import java.util.List;
import java.util.Optional;

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

String name;

@EqualsAndHashCode.Include
DocumentContext owner;

Range range;

@EqualsAndHashCode.Include
Range selectionRange;

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

Optional<MethodDescription> description;

@Override
public List<SourceDefinedSymbol> getChildren() {
return Collections.emptyList();
}

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

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

public static AnnotationParamSymbol from(String name, MethodSymbol methodSymbol) {
return AnnotationParamSymbol.builder()
.name(name)
.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
Expand Up @@ -44,8 +44,6 @@ public class AnnotationSymbol implements SourceDefinedSymbol, Describable {

String name;

SymbolKind symbolKind;

@EqualsAndHashCode.Include
DocumentContext owner;

Expand All @@ -66,6 +64,10 @@ public List<SourceDefinedSymbol> getChildren() {
return Collections.emptyList();
}

public SymbolKind getSymbolKind() {
return SymbolKind.Interface;
}

@Override
public void accept(SymbolTreeVisitor visitor) {
// no-op
Expand All @@ -74,7 +76,6 @@ public void accept(SymbolTreeVisitor visitor) {
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())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public class MissingCommonModuleMethodDiagnostic extends AbstractDiagnostic {
private final LocationRepository locationRepository;

private static String getMethodNameByLocation(BSLParserRuleContext node, Range range) {
return Trees.findTerminalNodeContainsPosition(node, range.getEnd())
return Trees.findTerminalNodeContainsPosition(node, range.getStart())
.map(ParseTree::getText)
.orElseThrow();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/*
* This file is a part of BSL Language Server.
*
* Copyright (c) 2018-2025
* 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.AnnotationParamSymbol;
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 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.Optional;
import java.util.StringJoiner;

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

private final DescriptionFormatter descriptionFormatter;

@Override
public MarkupContent getContent(AnnotationParamSymbol 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();
var maybeParameterDefinition = methodSymbol.getParameters().stream()
.filter(parameter -> parameter.getName().equalsIgnoreCase(symbol.getName()))
.findFirst();

if (maybeParameterDefinition.isEmpty()) {
return new MarkupContent(MarkupKind.MARKDOWN, "");
}

var parameterDefinition = maybeParameterDefinition.get();

// описание параметра аннотации
String parameter = descriptionFormatter.parameterToString(parameterDefinition);
descriptionFormatter.addSectionIfNotEmpty(markupBuilder, parameter);

String content = markupBuilder.toString();

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

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

}
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ public MarkupContent getContent(AnnotationSymbol symbol) {

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

}
Loading
Loading