From e01e99127776aaa3175f76e7523c3197b8453fc8 Mon Sep 17 00:00:00 2001 From: Nikita Ivanchenko Date: Sat, 15 Jul 2023 14:14:30 +0300 Subject: [PATCH 01/11] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codeactions/GenerateFunctionSupplier.java | 19 +++++++++++++++++ .../GenerateFunctionSupplierTest.java | 7 +++++++ .../suppliers/GenerateFunctionSupplier.bsl | 21 +++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java create mode 100644 src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java create mode 100644 src/test/resources/suppliers/GenerateFunctionSupplier.bsl diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java new file mode 100644 index 00000000000..b446a00720a --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java @@ -0,0 +1,19 @@ +package com.github._1c_syntax.bsl.languageserver.codeactions; + +import com.github._1c_syntax.bsl.languageserver.context.DocumentContext; +import lombok.RequiredArgsConstructor; +import org.eclipse.lsp4j.CodeAction; +import org.eclipse.lsp4j.CodeActionParams; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@RequiredArgsConstructor +public class GenerateFunctionSupplier implements CodeActionSupplier { + + @Override + public List getCodeActions(CodeActionParams params, DocumentContext documentContext) { + return null; + } +} diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java new file mode 100644 index 00000000000..1727830b7bc --- /dev/null +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java @@ -0,0 +1,7 @@ +package com.github._1c_syntax.bsl.languageserver.codeactions; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class GenerateFunctionSupplierTest { +} diff --git a/src/test/resources/suppliers/GenerateFunctionSupplier.bsl b/src/test/resources/suppliers/GenerateFunctionSupplier.bsl new file mode 100644 index 00000000000..49bc2338b92 --- /dev/null +++ b/src/test/resources/suppliers/GenerateFunctionSupplier.bsl @@ -0,0 +1,21 @@ + +Функция СуществующийМетод(Параметр) + Возврат Параметр + 1; +КонецФункции + +Процедура СуществующаяПроцедура() + +КонецПроцедуры + +Процедура Инициализация() + + Параметр = СуществующийМетод(1); + СуществующаяПроцедура(); + + НеСуществующийМетод1(Параметр); + + Результат = НеСуществующийМетод1("Строка"); + +КонецПроцедуры + +Инициализация(); \ No newline at end of file From bc71ac5b566cf684fde24445007ade2996968338 Mon Sep 17 00:00:00 2001 From: Nikita Ivanchenko Date: Sat, 15 Jul 2023 14:30:23 +0300 Subject: [PATCH 02/11] =?UTF-8?q?=D0=9A=D1=80=D0=B0=D1=81=D1=8B=D0=BD?= =?UTF-8?q?=D0=B9=20=D1=82=D0=B5=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GenerateFunctionSupplierTest.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java index 1727830b7bc..59bdc1875e6 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java @@ -1,7 +1,59 @@ package com.github._1c_syntax.bsl.languageserver.codeactions; +import com.github._1c_syntax.bsl.languageserver.configuration.Language; +import com.github._1c_syntax.bsl.languageserver.configuration.LanguageServerConfiguration; +import com.github._1c_syntax.bsl.languageserver.util.TestUtils; +import com.github._1c_syntax.bsl.languageserver.utils.Ranges; +import org.eclipse.lsp4j.CodeAction; +import org.eclipse.lsp4j.CodeActionContext; +import org.eclipse.lsp4j.CodeActionParams; +import org.eclipse.lsp4j.Diagnostic; +import org.eclipse.lsp4j.Range; +import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + @SpringBootTest public class GenerateFunctionSupplierTest { + + @Autowired + private LanguageServerConfiguration configuration; + + @Autowired + private GenerateFunctionSupplier codeActionSupplier; + + @Test + void testGetCodeAction() { + // given + configuration.setLanguage(Language.EN); + + String filePath = "./src/test/resources/suppliers/GenerateFunctionSupplier.bsl"; + var documentContext = TestUtils.getDocumentContextFromFile(filePath); + + List diagnostics = new ArrayList<>(); + + TextDocumentIdentifier textDocumentIdentifier = new TextDocumentIdentifier(documentContext.getUri().toString()); + + CodeActionContext codeActionContext = new CodeActionContext(); + codeActionContext.setDiagnostics(diagnostics); + + CodeActionParams params = new CodeActionParams(); + params.setRange(Ranges.create(15 , 5, 34)); + params.setTextDocument(textDocumentIdentifier); + params.setContext(codeActionContext); + + // when + List codeActions = codeActionSupplier.getCodeActions(params, documentContext); + + assertThat(codeActions) + .hasSize(1) + .anyMatch(codeAction -> codeAction.getTitle().equals("Generate function")); + } + } From de13d93b8eb896b20cecfa0622e0366f3133fda6 Mon Sep 17 00:00:00 2001 From: Nikita Ivanchenko Date: Sat, 15 Jul 2023 14:51:15 +0300 Subject: [PATCH 03/11] =?UTF-8?q?=D0=9E=D0=BF=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B5=D1=81=D1=82=D1=8C=20?= =?UTF-8?q?=D0=BB=D0=B8=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codeactions/GenerateFunctionSupplier.java | 23 +++++++++++++++++++ .../GenerateFunctionSupplierTest.java | 3 ++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java index b446a00720a..be60144687c 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java @@ -1,11 +1,17 @@ package com.github._1c_syntax.bsl.languageserver.codeactions; import com.github._1c_syntax.bsl.languageserver.context.DocumentContext; +import com.github._1c_syntax.bsl.languageserver.utils.DiagnosticHelper; +import com.github._1c_syntax.bsl.languageserver.utils.Trees; +import com.github._1c_syntax.bsl.parser.BSLParser; +import com.github._1c_syntax.bsl.parser.BSLParserRuleContext; import lombok.RequiredArgsConstructor; +import org.antlr.v4.runtime.tree.TerminalNode; import org.eclipse.lsp4j.CodeAction; import org.eclipse.lsp4j.CodeActionParams; import org.springframework.stereotype.Component; +import java.util.Collections; import java.util.List; @Component @@ -14,6 +20,23 @@ public class GenerateFunctionSupplier implements CodeActionSupplier { @Override public List getCodeActions(CodeActionParams params, DocumentContext documentContext) { + + var start = params.getRange().getStart(); + if (start == null) { + return Collections.emptyList(); + } + + var parseTree = documentContext.getAst(); + + var maybeDoCall = Trees.findTerminalNodeContainsPosition(parseTree, start) + .map(TerminalNode::getParent) + .filter(BSLParser.TypeNameContext.class::isInstance) + .map(BSLParser.TypeNameContext.class::cast) + .filter(DiagnosticHelper::isStructureType) + .map(BSLParserRuleContext::getParent) + .map(BSLParser.NewExpressionContext.class::cast) + .map(BSLParser.NewExpressionContext::doCall); + return null; } } diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java index 59bdc1875e6..a44572838cd 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java @@ -44,7 +44,8 @@ void testGetCodeAction() { codeActionContext.setDiagnostics(diagnostics); CodeActionParams params = new CodeActionParams(); - params.setRange(Ranges.create(15 , 5, 34)); + //params.setRange(Ranges.create(15 , 5, 34)); + params.setRange(Ranges.create(13 , 5, 23)); params.setTextDocument(textDocumentIdentifier); params.setContext(codeActionContext); From e2da12a2e849e646e35814c4f7a22b4ea2be7cd4 Mon Sep 17 00:00:00 2001 From: Nikita Ivanchenko Date: Sat, 15 Jul 2023 18:23:28 +0300 Subject: [PATCH 04/11] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=BC=D0=B5=D0=B6?= =?UTF-8?q?=D1=83=D1=82=D0=BE=D1=87=D0=BD=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codeactions/GenerateFunctionSupplier.java | 51 +++++++++++++++---- .../GenerateFunctionSupplierTest.java | 4 +- 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java index be60144687c..97260986fcf 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java @@ -8,11 +8,18 @@ import lombok.RequiredArgsConstructor; import org.antlr.v4.runtime.tree.TerminalNode; import org.eclipse.lsp4j.CodeAction; +import org.eclipse.lsp4j.CodeActionKind; import org.eclipse.lsp4j.CodeActionParams; +import org.eclipse.lsp4j.Range; +import org.eclipse.lsp4j.TextEdit; +import org.eclipse.lsp4j.WorkspaceEdit; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.Optional; @Component @RequiredArgsConstructor @@ -28,15 +35,41 @@ public List getCodeActions(CodeActionParams params, DocumentContext var parseTree = documentContext.getAst(); - var maybeDoCall = Trees.findTerminalNodeContainsPosition(parseTree, start) - .map(TerminalNode::getParent) - .filter(BSLParser.TypeNameContext.class::isInstance) - .map(BSLParser.TypeNameContext.class::cast) - .filter(DiagnosticHelper::isStructureType) - .map(BSLParserRuleContext::getParent) - .map(BSLParser.NewExpressionContext.class::cast) - .map(BSLParser.NewExpressionContext::doCall); + var node = Trees.findTerminalNodeContainsPosition(parseTree, start); - return null; + if(nodeIsMethod(node) && (nodeIsImplemented(node, parseTree) == false)){ + + var symbol = node.get().getSymbol(); + + TextEdit textEdit = new TextEdit(); + + textEdit.setRange(new Range()); + textEdit.setNewText("generated function"); + + WorkspaceEdit edit = new WorkspaceEdit(); + + Map> changes = Map.of(documentContext.getUri().toString(), Collections.singletonList(textEdit)); + edit.setChanges(changes); + + String title = "Generate function"; + var codeAction = new CodeAction(title); + codeAction.setKind(CodeActionKind.Refactor); + codeAction.setEdit(edit); + return List.of(codeAction); + } + + return Collections.emptyList(); + } + + private boolean nodeIsImplemented(Optional node, BSLParser.FileContext parseTree) { + return false; + } + + private boolean nodeIsMethod(Optional node){ + + return node + .map(TerminalNode::getParent) + .filter(BSLParser.MethodNameContext.class::isInstance) + .isPresent(); } } diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java index a44572838cd..81e8e0089fb 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java @@ -45,13 +45,15 @@ void testGetCodeAction() { CodeActionParams params = new CodeActionParams(); //params.setRange(Ranges.create(15 , 5, 34)); - params.setRange(Ranges.create(13 , 5, 23)); + params.setRange(Ranges.create(12 , 5, 27)); params.setTextDocument(textDocumentIdentifier); params.setContext(codeActionContext); // when List codeActions = codeActionSupplier.getCodeActions(params, documentContext); + var cahnges = codeActions.get(0).getEdit().getChanges().values().toArray(); + assertThat(codeActions) .hasSize(1) .anyMatch(codeAction -> codeAction.getTitle().equals("Generate function")); From 0f8d39b44de21db605cc0962f2ffc1ce81121384 Mon Sep 17 00:00:00 2001 From: Nikita Ivanchenko Date: Sun, 16 Jul 2023 21:09:06 +0300 Subject: [PATCH 05/11] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=20=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=20=D0=B2=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D0=B5=D1=86=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codeactions/GenerateFunctionSupplier.java | 67 ++++++++++++++----- 1 file changed, 52 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java index 97260986fcf..e7d41dcc8c0 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java @@ -1,7 +1,9 @@ package com.github._1c_syntax.bsl.languageserver.codeactions; +import com.github._1c_syntax.bsl.languageserver.codelenses.CodeLensData; import com.github._1c_syntax.bsl.languageserver.context.DocumentContext; import com.github._1c_syntax.bsl.languageserver.utils.DiagnosticHelper; +import com.github._1c_syntax.bsl.languageserver.utils.Ranges; import com.github._1c_syntax.bsl.languageserver.utils.Trees; import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.bsl.parser.BSLParserRuleContext; @@ -34,31 +36,66 @@ public List getCodeActions(CodeActionParams params, DocumentContext } var parseTree = documentContext.getAst(); - var node = Trees.findTerminalNodeContainsPosition(parseTree, start); if(nodeIsMethod(node) && (nodeIsImplemented(node, parseTree) == false)){ + return codeActions(documentContext, parseTree, node); + } - var symbol = node.get().getSymbol(); + return Collections.emptyList(); + } - TextEdit textEdit = new TextEdit(); + private List codeActions(DocumentContext documentContext, BSLParser.FileContext parseTree, Optional node){ - textEdit.setRange(new Range()); - textEdit.setNewText("generated function"); + var position = getMethodPosition(parseTree); + var methodName = node.get().getText(); - WorkspaceEdit edit = new WorkspaceEdit(); + var funcCodeAction = codeAction(documentContext, position, "Generate function", getMethodContent(methodName, true)); + var procCodeAction = codeAction(documentContext, position, "Generate procedure", getMethodContent(methodName, false)); - Map> changes = Map.of(documentContext.getUri().toString(), Collections.singletonList(textEdit)); - edit.setChanges(changes); + var codeActions = List.of(procCodeAction); + // codeActions.add(procCodeAction); - String title = "Generate function"; - var codeAction = new CodeAction(title); - codeAction.setKind(CodeActionKind.Refactor); - codeAction.setEdit(edit); - return List.of(codeAction); - } + return codeActions; + } + + private CodeAction codeAction(DocumentContext documentContext, Range position, String title ,String methodContent){ + + TextEdit textEdit = new TextEdit(); + + textEdit.setRange(position); + textEdit.setNewText(methodContent); + + WorkspaceEdit edit = new WorkspaceEdit(); + + Map> changes = Map.of(documentContext.getUri().toString(), Collections.singletonList(textEdit)); + edit.setChanges(changes); + + var codeAction = new CodeAction(title); + codeAction.setKind(CodeActionKind.Refactor); + codeAction.setEdit(edit); + + return codeAction; + } + + private String getMethodContent(String methodName, boolean isFunction){ + + var methodText = String.format(isFunction ? functionTemplate() : procedureTemplate(),methodName); + + return methodText; + } + + private String functionTemplate(){ + return "%n%nФункция %s()%n%n //TODO: содержание метода%n%n Возврат Неопределено;%n%nКонецФункции"; + } + + private String procedureTemplate(){ + return "%n%nПроцедура %s()%n%n //TODO: содержание метода%n%nКонецПроцедуры"; + } + private Range getMethodPosition(BSLParser.FileContext parseTree){ + + return Ranges.create(parseTree.getStop()); - return Collections.emptyList(); } private boolean nodeIsImplemented(Optional node, BSLParser.FileContext parseTree) { From 5534e888a10b12ea65c27bcc8530da0653e31dae Mon Sep 17 00:00:00 2001 From: Nikita Ivanchenko Date: Sun, 16 Jul 2023 22:26:48 +0300 Subject: [PATCH 06/11] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D1=83=20?= =?UTF-8?q?=D1=81=D1=83=D1=89=D0=B5=D1=81=D1=82=D0=B2=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codeactions/GenerateFunctionSupplier.java | 38 ++++++++++--------- .../suppliers/GenerateFunctionSupplier.bsl | 2 + 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java index e7d41dcc8c0..67b090564eb 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java @@ -1,23 +1,22 @@ package com.github._1c_syntax.bsl.languageserver.codeactions; -import com.github._1c_syntax.bsl.languageserver.codelenses.CodeLensData; import com.github._1c_syntax.bsl.languageserver.context.DocumentContext; -import com.github._1c_syntax.bsl.languageserver.utils.DiagnosticHelper; +import com.github._1c_syntax.bsl.languageserver.references.ReferenceResolver; import com.github._1c_syntax.bsl.languageserver.utils.Ranges; import com.github._1c_syntax.bsl.languageserver.utils.Trees; import com.github._1c_syntax.bsl.parser.BSLParser; -import com.github._1c_syntax.bsl.parser.BSLParserRuleContext; import lombok.RequiredArgsConstructor; import org.antlr.v4.runtime.tree.TerminalNode; import org.eclipse.lsp4j.CodeAction; import org.eclipse.lsp4j.CodeActionKind; import org.eclipse.lsp4j.CodeActionParams; +import org.eclipse.lsp4j.Position; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.TextEdit; import org.eclipse.lsp4j.WorkspaceEdit; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; @@ -27,6 +26,9 @@ @RequiredArgsConstructor public class GenerateFunctionSupplier implements CodeActionSupplier { + @Autowired + private ReferenceResolver referenceResolver; + @Override public List getCodeActions(CodeActionParams params, DocumentContext documentContext) { @@ -38,7 +40,7 @@ public List getCodeActions(CodeActionParams params, DocumentContext var parseTree = documentContext.getAst(); var node = Trees.findTerminalNodeContainsPosition(parseTree, start); - if(nodeIsMethod(node) && (nodeIsImplemented(node, parseTree) == false)){ + if(nodeIsMethod(node) && (nodeIsImplemented(documentContext, node.get().getText()) == false)){ return codeActions(documentContext, parseTree, node); } @@ -47,13 +49,13 @@ public List getCodeActions(CodeActionParams params, DocumentContext private List codeActions(DocumentContext documentContext, BSLParser.FileContext parseTree, Optional node){ - var position = getMethodPosition(parseTree); + var position = getNewMethodPosition(parseTree); var methodName = node.get().getText(); var funcCodeAction = codeAction(documentContext, position, "Generate function", getMethodContent(methodName, true)); var procCodeAction = codeAction(documentContext, position, "Generate procedure", getMethodContent(methodName, false)); - var codeActions = List.of(procCodeAction); + var codeActions = List.of(funcCodeAction); // codeActions.add(procCodeAction); return codeActions; @@ -81,8 +83,8 @@ private CodeAction codeAction(DocumentContext documentContext, Range position, S private String getMethodContent(String methodName, boolean isFunction){ var methodText = String.format(isFunction ? functionTemplate() : procedureTemplate(),methodName); - return methodText; + } private String functionTemplate(){ @@ -92,21 +94,21 @@ private String functionTemplate(){ private String procedureTemplate(){ return "%n%nПроцедура %s()%n%n //TODO: содержание метода%n%nКонецПроцедуры"; } - private Range getMethodPosition(BSLParser.FileContext parseTree){ - + private Range getNewMethodPosition(BSLParser.FileContext parseTree){ return Ranges.create(parseTree.getStop()); - } - private boolean nodeIsImplemented(Optional node, BSLParser.FileContext parseTree) { - return false; + private boolean nodeIsImplemented(DocumentContext documentContext, String methodName) { + return documentContext.getSymbolTree() + .getMethods() + .stream().filter(s -> s.getName() + .equalsIgnoreCase(methodName)) + .findAny().isPresent(); } private boolean nodeIsMethod(Optional node){ - - return node - .map(TerminalNode::getParent) - .filter(BSLParser.MethodNameContext.class::isInstance) - .isPresent(); + return node.map(TerminalNode::getParent) + .filter(BSLParser.MethodNameContext.class::isInstance) + .isPresent(); } } diff --git a/src/test/resources/suppliers/GenerateFunctionSupplier.bsl b/src/test/resources/suppliers/GenerateFunctionSupplier.bsl index 49bc2338b92..9af29f91203 100644 --- a/src/test/resources/suppliers/GenerateFunctionSupplier.bsl +++ b/src/test/resources/suppliers/GenerateFunctionSupplier.bsl @@ -13,6 +13,8 @@ СуществующаяПроцедура(); НеСуществующийМетод1(Параметр); + НеСуществующийМетод1(Параметр1); + НеСуществующийМетод2(Параметр, ВторойПараметр); Результат = НеСуществующийМетод1("Строка"); From 932094cb1b49767f6f969dd2115091686c5dafe4 Mon Sep 17 00:00:00 2001 From: Nikita Ivanchenko Date: Sun, 16 Jul 2023 22:42:05 +0300 Subject: [PATCH 07/11] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D1=81=D1=83=D1=89=D0=B5=D1=81=D1=82=D0=B2=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B8=20=D0=BE=D1=82=D1=81=D1=83=D1=82?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=B4=D0=B5=D1=88?= =?UTF-8?q?=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GenerateFunctionSupplierTest.java | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java index 81e8e0089fb..caec0b3501e 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java @@ -44,19 +44,43 @@ void testGetCodeAction() { codeActionContext.setDiagnostics(diagnostics); CodeActionParams params = new CodeActionParams(); - //params.setRange(Ranges.create(15 , 5, 34)); - params.setRange(Ranges.create(12 , 5, 27)); + params.setRange(Ranges.create(14 , 5, 24)); params.setTextDocument(textDocumentIdentifier); params.setContext(codeActionContext); // when List codeActions = codeActionSupplier.getCodeActions(params, documentContext); - var cahnges = codeActions.get(0).getEdit().getChanges().values().toArray(); - assertThat(codeActions) .hasSize(1) .anyMatch(codeAction -> codeAction.getTitle().equals("Generate function")); } + @Test + void testGetNoCodeActionOnExistsMethod() { + // given + configuration.setLanguage(Language.EN); + + String filePath = "./src/test/resources/suppliers/GenerateFunctionSupplier.bsl"; + var documentContext = TestUtils.getDocumentContextFromFile(filePath); + + List diagnostics = new ArrayList<>(); + + TextDocumentIdentifier textDocumentIdentifier = new TextDocumentIdentifier(documentContext.getUri().toString()); + + CodeActionContext codeActionContext = new CodeActionContext(); + codeActionContext.setDiagnostics(diagnostics); + + CodeActionParams params = new CodeActionParams(); + params.setRange(Ranges.create(12 , 5, 22)); + params.setTextDocument(textDocumentIdentifier); + params.setContext(codeActionContext); + + // when + List codeActions = codeActionSupplier.getCodeActions(params, documentContext); + + assertThat(codeActions) + .hasSize(0); + } + } From fbcb5f4c4bd2ad8e31d80633ca2763c784561698 Mon Sep 17 00:00:00 2001 From: Nikita Ivanchenko Date: Mon, 17 Jul 2023 00:35:29 +0300 Subject: [PATCH 08/11] =?UTF-8?q?=D0=9F=D0=BE=20=D0=B4=D1=80=D1=83=D0=B3?= =?UTF-8?q?=D0=BE=D0=BC=D1=83=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D1=8F?= =?UTF-8?q?=D1=8E=20=D0=BD=D0=B0=20=D0=BD=D0=B0=D0=BB=D0=B8=D1=87=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codeactions/GenerateFunctionSupplier.java | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java index 67b090564eb..c07646e58b7 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java @@ -10,7 +10,6 @@ import org.eclipse.lsp4j.CodeAction; import org.eclipse.lsp4j.CodeActionKind; import org.eclipse.lsp4j.CodeActionParams; -import org.eclipse.lsp4j.Position; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.TextEdit; import org.eclipse.lsp4j.WorkspaceEdit; @@ -26,8 +25,7 @@ @RequiredArgsConstructor public class GenerateFunctionSupplier implements CodeActionSupplier { - @Autowired - private ReferenceResolver referenceResolver; + final private ReferenceResolver referenceResolver; @Override public List getCodeActions(CodeActionParams params, DocumentContext documentContext) { @@ -40,7 +38,7 @@ public List getCodeActions(CodeActionParams params, DocumentContext var parseTree = documentContext.getAst(); var node = Trees.findTerminalNodeContainsPosition(parseTree, start); - if(nodeIsMethod(node) && (nodeIsImplemented(documentContext, node.get().getText()) == false)){ + if(nodeIsMethod(node) && (referenceResolver.findReference(documentContext.getUri(), start).isEmpty())){ return codeActions(documentContext, parseTree, node); } @@ -98,14 +96,6 @@ private Range getNewMethodPosition(BSLParser.FileContext parseTree){ return Ranges.create(parseTree.getStop()); } - private boolean nodeIsImplemented(DocumentContext documentContext, String methodName) { - return documentContext.getSymbolTree() - .getMethods() - .stream().filter(s -> s.getName() - .equalsIgnoreCase(methodName)) - .findAny().isPresent(); - } - private boolean nodeIsMethod(Optional node){ return node.map(TerminalNode::getParent) .filter(BSLParser.MethodNameContext.class::isInstance) From df54a11c3feded3008fc0cbe072f9e62bd4325a2 Mon Sep 17 00:00:00 2001 From: Nikita Ivanchenko Date: Wed, 26 Jul 2023 12:16:17 +0300 Subject: [PATCH 09/11] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D0=B8?= =?UTF-8?q?=D0=BC=D0=BF=D0=BE=D1=80=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../languageserver/codeactions/GenerateFunctionSupplier.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java index c07646e58b7..f90a8be83ab 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java @@ -13,7 +13,6 @@ import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.TextEdit; import org.eclipse.lsp4j.WorkspaceEdit; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Collections; @@ -80,8 +79,7 @@ private CodeAction codeAction(DocumentContext documentContext, Range position, S private String getMethodContent(String methodName, boolean isFunction){ - var methodText = String.format(isFunction ? functionTemplate() : procedureTemplate(),methodName); - return methodText; + return String.format(isFunction ? functionTemplate() : procedureTemplate(),methodName); } From 380709939857a5ceff12820e7fb9b734e308181b Mon Sep 17 00:00:00 2001 From: Nikita Ivanchenko Date: Tue, 20 Feb 2024 11:05:25 +0300 Subject: [PATCH 10/11] =?UTF-8?q?=D0=9F=D0=BE=D0=B7=D0=B8=D1=86=D0=B8?= =?UTF-8?q?=D0=BE=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE=20=D0=BC=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codeactions/GenerateFunctionSupplier.java | 80 ++++++-- .../GenerateFunctionSupplierTest.java | 182 +++++++++++++++++- .../suppliers/GenerateFunctionSupplier.bsl | 4 +- .../GenerateFunctionSupplier_Empty.bsl | 7 + .../GenerateFunctionSupplier_Use.bsl | 10 + .../GenerateFunctionSupplier_UseAndVars.bsl | 13 ++ 6 files changed, 280 insertions(+), 16 deletions(-) create mode 100644 src/test/resources/suppliers/GenerateFunctionSupplier_Empty.bsl create mode 100644 src/test/resources/suppliers/GenerateFunctionSupplier_Use.bsl create mode 100644 src/test/resources/suppliers/GenerateFunctionSupplier_UseAndVars.bsl diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java index f90a8be83ab..00f488a8286 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java @@ -1,6 +1,8 @@ package com.github._1c_syntax.bsl.languageserver.codeactions; 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.variable.VariableKind; import com.github._1c_syntax.bsl.languageserver.references.ReferenceResolver; import com.github._1c_syntax.bsl.languageserver.utils.Ranges; import com.github._1c_syntax.bsl.languageserver.utils.Trees; @@ -19,6 +21,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.StringJoiner; @Component @RequiredArgsConstructor @@ -46,16 +49,18 @@ public List getCodeActions(CodeActionParams params, DocumentContext private List codeActions(DocumentContext documentContext, BSLParser.FileContext parseTree, Optional node){ - var position = getNewMethodPosition(parseTree); - var methodName = node.get().getText(); + var methodContext = ((BSLParser.GlobalMethodCallContext) node.get().getParent().getParent()); + var methodName = methodContext.methodName().getText(); + var methodParams = getMethodParams(methodContext); - var funcCodeAction = codeAction(documentContext, position, "Generate function", getMethodContent(methodName, true)); - var procCodeAction = codeAction(documentContext, position, "Generate procedure", getMethodContent(methodName, false)); + // TODO: Корректное позиционирование - после текущего метода, после переменных, после инклудов, в начале. + var position = getNewMethodPosition(documentContext, methodContext); - var codeActions = List.of(funcCodeAction); - // codeActions.add(procCodeAction); + // TODO: Двуязычность. + var funcCodeAction = codeAction(documentContext, position, "Generate function", getMethodContent(methodName, methodParams, true)); + var procCodeAction = codeAction(documentContext, position, "Generate procedure", getMethodContent(methodName, methodParams, false)); - return codeActions; + return List.of(funcCodeAction, procCodeAction); } private CodeAction codeAction(DocumentContext documentContext, Range position, String title ,String methodContent){ @@ -77,21 +82,70 @@ private CodeAction codeAction(DocumentContext documentContext, Range position, S return codeAction; } - private String getMethodContent(String methodName, boolean isFunction){ + private String getMethodParams(BSLParser.GlobalMethodCallContext methodContext){ - return String.format(isFunction ? functionTemplate() : procedureTemplate(),methodName); + var callParams = methodContext.doCall().callParamList().callParam(); + var joiner = new StringJoiner(", "); + + for (BSLParser.CallParamContext callParam: callParams) { + joiner.add(callParam.getText()); + } + + return joiner.toString(); + } + + private String getMethodContent(String methodName, String methodParams, boolean isFunction){ + + return String.format(isFunction ? functionTemplate() : procedureTemplate(), methodName, methodParams); } private String functionTemplate(){ - return "%n%nФункция %s()%n%n //TODO: содержание метода%n%n Возврат Неопределено;%n%nКонецФункции"; + return "%nФункция %s(%s)%n%n //TODO: содержание метода%n%n Возврат Неопределено;%n%nКонецФункции%n"; } private String procedureTemplate(){ - return "%n%nПроцедура %s()%n%n //TODO: содержание метода%n%nКонецПроцедуры"; + return "%nПроцедура %s(%s)%n%n //TODO: содержание метода%n%nКонецПроцедуры%n"; } - private Range getNewMethodPosition(BSLParser.FileContext parseTree){ - return Ranges.create(parseTree.getStop()); + private Range getNewMethodPosition(DocumentContext documentContext, BSLParser.GlobalMethodCallContext methodContext){ + + var ancestorRuleSub = Trees.getAncestorByRuleIndex(methodContext, BSLParser.RULE_sub); + + if (ancestorRuleSub != null){ + var line = ancestorRuleSub.getStop().getLine(); + return Ranges.create(line, 1, line, 1); + } + + var methods = documentContext.getSymbolTree().getMethods(); + + if (!methods.isEmpty()){ + var lastMethod = methods.get(methods.size() - 1); + var line = lastMethod.getRange().getEnd().getLine() + 1; + return Ranges.create(line, 1, line, 1); + } + + var variables = documentContext.getSymbolTree().getVariables() + .stream().filter(e -> e.getKind() == VariableKind.MODULE).toList(); + + if (!variables.isEmpty()){ + var lastVariable = variables.get(variables.size() - 1); + var line = lastVariable.getRange().getEnd().getLine() + 1; + return Ranges.create(line, 1, line, 1); + } + + var annotations = documentContext.getAst().moduleAnnotations(); + if (annotations != null) { + var uses = annotations.use(); + + if (!uses.isEmpty()) { + var lastUse = uses.get(uses.size() - 1); + var line = lastUse.stop.getLine(); + return Ranges.create(line, 1, line, 1); + } + } + + return Ranges.create(1, 1, 1, 1); + } private boolean nodeIsMethod(Optional node){ diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java index caec0b3501e..fff72b839bc 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java @@ -10,6 +10,7 @@ import org.eclipse.lsp4j.Diagnostic; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.eclipse.lsp4j.TextEdit; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -52,8 +53,185 @@ void testGetCodeAction() { List codeActions = codeActionSupplier.getCodeActions(params, documentContext); assertThat(codeActions) - .hasSize(1) - .anyMatch(codeAction -> codeAction.getTitle().equals("Generate function")); + .hasSize(2) + .anyMatch(codeAction -> codeAction.getTitle().equals("Generate function")) + .anyMatch(codeAction -> codeAction.getTitle().equals("Generate procedure")); + } + + @Test + void testCodeActionPositionFromBodyEmpty() { + // given + configuration.setLanguage(Language.EN); + + String filePath = "./src/test/resources/suppliers/GenerateFunctionSupplier_Empty.bsl"; + var documentContext = TestUtils.getDocumentContextFromFile(filePath); + + List diagnostics = new ArrayList<>(); + + TextDocumentIdentifier textDocumentIdentifier = new TextDocumentIdentifier(documentContext.getUri().toString()); + + CodeActionContext codeActionContext = new CodeActionContext(); + codeActionContext.setDiagnostics(diagnostics); + + CodeActionParams params = new CodeActionParams(); + params.setRange(Ranges.create(6 , 1, 19)); + params.setTextDocument(textDocumentIdentifier); + params.setContext(codeActionContext); + + // when + List codeActions = codeActionSupplier.getCodeActions(params, documentContext); + + assertThat((((List) (codeActions.get(0).getEdit().getChanges().values()).toArray()[0]))) + .allMatch(textedit -> ((TextEdit) textedit).getRange().getStart().getLine() == 1) + ; + + } + + @Test + void testCodeActionPositionFromBodyUse() { + // given + configuration.setLanguage(Language.EN); + + String filePath = "./src/test/resources/suppliers/GenerateFunctionSupplier_Use.bsl"; + var documentContext = TestUtils.getDocumentContextFromFile(filePath); + + List diagnostics = new ArrayList<>(); + + TextDocumentIdentifier textDocumentIdentifier = new TextDocumentIdentifier(documentContext.getUri().toString()); + + CodeActionContext codeActionContext = new CodeActionContext(); + codeActionContext.setDiagnostics(diagnostics); + + CodeActionParams params = new CodeActionParams(); + params.setRange(Ranges.create(9 , 1, 19)); + params.setTextDocument(textDocumentIdentifier); + params.setContext(codeActionContext); + + // when + List codeActions = codeActionSupplier.getCodeActions(params, documentContext); + + assertThat((((List) (codeActions.get(0).getEdit().getChanges().values()).toArray()[0]))) + .allMatch(textedit -> ((TextEdit) textedit).getRange().getStart().getLine() == 2) + ; + + } + + @Test + void testCodeActionPositionFromBodyVars() { + // given + configuration.setLanguage(Language.EN); + + String filePath = "./src/test/resources/suppliers/GenerateFunctionSupplier_UseAndVars.bsl"; + var documentContext = TestUtils.getDocumentContextFromFile(filePath); + + List diagnostics = new ArrayList<>(); + + TextDocumentIdentifier textDocumentIdentifier = new TextDocumentIdentifier(documentContext.getUri().toString()); + + CodeActionContext codeActionContext = new CodeActionContext(); + codeActionContext.setDiagnostics(diagnostics); + + CodeActionParams params = new CodeActionParams(); + params.setRange(Ranges.create(12 , 1, 19)); + params.setTextDocument(textDocumentIdentifier); + params.setContext(codeActionContext); + + // when + List codeActions = codeActionSupplier.getCodeActions(params, documentContext); + + assertThat((((List) (codeActions.get(0).getEdit().getChanges().values()).toArray()[0]))) + .allMatch(textedit -> ((TextEdit) textedit).getRange().getStart().getLine() == 5) + ; + + } + + @Test + void testCodeActionPositionFromBodyMethod() { + // given + configuration.setLanguage(Language.EN); + + String filePath = "./src/test/resources/suppliers/GenerateFunctionSupplier.bsl"; + var documentContext = TestUtils.getDocumentContextFromFile(filePath); + + List diagnostics = new ArrayList<>(); + + TextDocumentIdentifier textDocumentIdentifier = new TextDocumentIdentifier(documentContext.getUri().toString()); + + CodeActionContext codeActionContext = new CodeActionContext(); + codeActionContext.setDiagnostics(diagnostics); + + CodeActionParams params = new CodeActionParams(); + params.setRange(Ranges.create(24 , 1, 20)); + params.setTextDocument(textDocumentIdentifier); + params.setContext(codeActionContext); + + // when + List codeActions = codeActionSupplier.getCodeActions(params, documentContext); + + assertThat((((List) (codeActions.get(0).getEdit().getChanges().values()).toArray()[0]))) + .allMatch(textedit -> ((TextEdit) textedit).getRange().getStart().getLine() == 21) + ; + + } + + @Test + void testCodeActionPositionFromMethod() { + // given + configuration.setLanguage(Language.EN); + + String filePath = "./src/test/resources/suppliers/GenerateFunctionSupplier.bsl"; + var documentContext = TestUtils.getDocumentContextFromFile(filePath); + + List diagnostics = new ArrayList<>(); + + TextDocumentIdentifier textDocumentIdentifier = new TextDocumentIdentifier(documentContext.getUri().toString()); + + CodeActionContext codeActionContext = new CodeActionContext(); + codeActionContext.setDiagnostics(diagnostics); + + CodeActionParams params = new CodeActionParams(); + params.setRange(Ranges.create(16 , 5, 24)); + params.setTextDocument(textDocumentIdentifier); + params.setContext(codeActionContext); + + // when + List codeActions = codeActionSupplier.getCodeActions(params, documentContext); + + assertThat((((List) (codeActions.get(0).getEdit().getChanges().values()).toArray()[0]))) + .allMatch(textedit -> ((TextEdit) textedit).getRange().getStart().getLine() == 21) + ; + + } + + @Test + void testCodeActionHasParams() { + // given + configuration.setLanguage(Language.EN); + + String filePath = "./src/test/resources/suppliers/GenerateFunctionSupplier.bsl"; + var documentContext = TestUtils.getDocumentContextFromFile(filePath); + + List diagnostics = new ArrayList<>(); + + TextDocumentIdentifier textDocumentIdentifier = new TextDocumentIdentifier(documentContext.getUri().toString()); + + CodeActionContext codeActionContext = new CodeActionContext(); + codeActionContext.setDiagnostics(diagnostics); + + CodeActionParams params = new CodeActionParams(); + params.setRange(Ranges.create(16 , 5, 24)); + params.setTextDocument(textDocumentIdentifier); + params.setContext(codeActionContext); + + // when + List codeActions = codeActionSupplier.getCodeActions(params, documentContext); + + assertThat((((List) (codeActions.get(0).getEdit().getChanges().values()).toArray()[0]))) + .allMatch(textedit -> ((TextEdit) textedit).getNewText().indexOf("Параметр, ВторойПараметр") > 0) + ; + assertThat((((List) (codeActions.get(1).getEdit().getChanges().values()).toArray()[0]))) + .allMatch(textedit -> ((TextEdit) textedit).getNewText().indexOf("Параметр, ВторойПараметр") > 0) + ; } @Test diff --git a/src/test/resources/suppliers/GenerateFunctionSupplier.bsl b/src/test/resources/suppliers/GenerateFunctionSupplier.bsl index 9af29f91203..778c314e2b0 100644 --- a/src/test/resources/suppliers/GenerateFunctionSupplier.bsl +++ b/src/test/resources/suppliers/GenerateFunctionSupplier.bsl @@ -20,4 +20,6 @@ КонецПроцедуры -Инициализация(); \ No newline at end of file +Инициализация(); + +НеСуществующийМетод3(); \ No newline at end of file diff --git a/src/test/resources/suppliers/GenerateFunctionSupplier_Empty.bsl b/src/test/resources/suppliers/GenerateFunctionSupplier_Empty.bsl new file mode 100644 index 00000000000..94d531977d7 --- /dev/null +++ b/src/test/resources/suppliers/GenerateFunctionSupplier_Empty.bsl @@ -0,0 +1,7 @@ +в = 1; + +Если а = 1 Тогда + г = 1; +КонецЕсли; + +НеСуществующийМетод(); \ No newline at end of file diff --git a/src/test/resources/suppliers/GenerateFunctionSupplier_Use.bsl b/src/test/resources/suppliers/GenerateFunctionSupplier_Use.bsl new file mode 100644 index 00000000000..6cff31fa5ce --- /dev/null +++ b/src/test/resources/suppliers/GenerateFunctionSupplier_Use.bsl @@ -0,0 +1,10 @@ +#Использовать "." +#Использовать autumn + +в = 1; + +Если а = 1 Тогда + г = 1; +КонецЕсли; + +НеСуществующийМетод(); \ No newline at end of file diff --git a/src/test/resources/suppliers/GenerateFunctionSupplier_UseAndVars.bsl b/src/test/resources/suppliers/GenerateFunctionSupplier_UseAndVars.bsl new file mode 100644 index 00000000000..a15fbf75302 --- /dev/null +++ b/src/test/resources/suppliers/GenerateFunctionSupplier_UseAndVars.bsl @@ -0,0 +1,13 @@ +#Использовать "." +#Использовать autumn + +Перем а; +Перем б; + +в = 1; + +Если а = 1 Тогда + г = 1; +КонецЕсли; + +НеСуществующийМетод(); \ No newline at end of file From 7481e5b9fc57b5e30dd638832931f4e02c3b554f Mon Sep 17 00:00:00 2001 From: Nikita Ivanchenko Date: Tue, 20 Feb 2024 11:16:33 +0300 Subject: [PATCH 11/11] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=BF=D1=83=D1=81=D1=82=D0=BE=D0=BC=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B4=D1=83=D0=BB=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codeactions/GenerateFunctionSupplier.java | 8 ++++---- .../codeactions/GenerateFunctionSupplierTest.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java index 00f488a8286..892e30a57a9 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplier.java @@ -121,7 +121,7 @@ private Range getNewMethodPosition(DocumentContext documentContext, BSLParser.Gl if (!methods.isEmpty()){ var lastMethod = methods.get(methods.size() - 1); var line = lastMethod.getRange().getEnd().getLine() + 1; - return Ranges.create(line, 1, line, 1); + return Ranges.create(line, 0, line, 0); } var variables = documentContext.getSymbolTree().getVariables() @@ -130,7 +130,7 @@ private Range getNewMethodPosition(DocumentContext documentContext, BSLParser.Gl if (!variables.isEmpty()){ var lastVariable = variables.get(variables.size() - 1); var line = lastVariable.getRange().getEnd().getLine() + 1; - return Ranges.create(line, 1, line, 1); + return Ranges.create(line, 0, line, 0); } var annotations = documentContext.getAst().moduleAnnotations(); @@ -140,11 +140,11 @@ private Range getNewMethodPosition(DocumentContext documentContext, BSLParser.Gl if (!uses.isEmpty()) { var lastUse = uses.get(uses.size() - 1); var line = lastUse.stop.getLine(); - return Ranges.create(line, 1, line, 1); + return Ranges.create(line, 0, line, 0); } } - return Ranges.create(1, 1, 1, 1); + return Ranges.create(0, 0, 0, 0); } diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java index fff72b839bc..6184387b1a0 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/codeactions/GenerateFunctionSupplierTest.java @@ -82,7 +82,7 @@ void testCodeActionPositionFromBodyEmpty() { List codeActions = codeActionSupplier.getCodeActions(params, documentContext); assertThat((((List) (codeActions.get(0).getEdit().getChanges().values()).toArray()[0]))) - .allMatch(textedit -> ((TextEdit) textedit).getRange().getStart().getLine() == 1) + .allMatch(textedit -> ((TextEdit) textedit).getRange().getStart().getLine() == 0) ; }