Skip to content

Commit

Permalink
Merge pull request #3423 from 1c-syntax/feature/hover-annotation-param
Browse files Browse the repository at this point in the history
Показ ховера при наведении на параметры аннотации.
  • Loading branch information
nixel2007 authored Feb 22, 2025
2 parents fae62a0 + 4e306dd commit bd888c0
Show file tree
Hide file tree
Showing 16 changed files with 437 additions and 37 deletions.
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

0 comments on commit bd888c0

Please sign in to comment.