From 3d0c30d928ce8513b03e95f55a92fd991bbb8786 Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Thu, 26 May 2022 00:47:34 +0300 Subject: [PATCH 01/14] RenameProvider --- .../bsl/languageserver/BSLLanguageServer.java | 10 +++ .../BSLTextDocumentService.java | 30 +++++++ .../providers/RenameProvider.java | 79 +++++++++++++++++++ 3 files changed, 119 insertions(+) create mode 100644 src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServer.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServer.java index 1fd5a0e9651..8f52cc551c5 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServer.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServer.java @@ -27,6 +27,7 @@ import com.github._1c_syntax.bsl.languageserver.jsonrpc.Diagnostics; import com.github._1c_syntax.bsl.languageserver.jsonrpc.ProtocolExtension; import com.github._1c_syntax.bsl.languageserver.providers.DocumentSymbolProvider; +import com.github._1c_syntax.bsl.languageserver.providers.RenameProvider; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.eclipse.lsp4j.CallHierarchyRegistrationOptions; @@ -44,6 +45,7 @@ import org.eclipse.lsp4j.InitializeParams; import org.eclipse.lsp4j.InitializeResult; import org.eclipse.lsp4j.ReferenceOptions; +import org.eclipse.lsp4j.RenameOptions; import org.eclipse.lsp4j.SaveOptions; import org.eclipse.lsp4j.SelectionRangeRegistrationOptions; import org.eclipse.lsp4j.ServerCapabilities; @@ -101,6 +103,7 @@ public CompletableFuture initialize(InitializeParams params) { capabilities.setCallHierarchyProvider(getCallHierarchyProvider()); capabilities.setSelectionRangeProvider(getSelectionRangeProvider()); capabilities.setColorProvider(getColorProvider()); + capabilities.setRenameProvider(getRenameProvider()); var result = new InitializeResult(capabilities, serverInfo); @@ -273,4 +276,11 @@ private static ColorProviderOptions getColorProvider() { colorProviderOptions.setWorkDoneProgress(Boolean.FALSE); return colorProviderOptions; } + + private static RenameOptions getRenameProvider() { + var renameOptions = new RenameOptions(); + renameOptions.setWorkDoneProgress(Boolean.FALSE); + renameOptions.setPrepareProvider(Boolean.TRUE); + return renameOptions; + } } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java index 44e3f15196e..0d2469a733e 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java @@ -40,6 +40,7 @@ import com.github._1c_syntax.bsl.languageserver.providers.FormatProvider; import com.github._1c_syntax.bsl.languageserver.providers.HoverProvider; import com.github._1c_syntax.bsl.languageserver.providers.ReferencesProvider; +import com.github._1c_syntax.bsl.languageserver.providers.RenameProvider; import com.github._1c_syntax.bsl.languageserver.providers.SelectionRangeProvider; import com.github._1c_syntax.bsl.languageserver.utils.Ranges; import lombok.RequiredArgsConstructor; @@ -75,11 +76,16 @@ import org.eclipse.lsp4j.HoverParams; import org.eclipse.lsp4j.Location; import org.eclipse.lsp4j.LocationLink; +import org.eclipse.lsp4j.PrepareRenameParams; +import org.eclipse.lsp4j.PrepareRenameResult; +import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.ReferenceParams; +import org.eclipse.lsp4j.RenameParams; import org.eclipse.lsp4j.SelectionRange; import org.eclipse.lsp4j.SelectionRangeParams; import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.TextEdit; +import org.eclipse.lsp4j.WorkspaceEdit; import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.eclipse.lsp4j.services.TextDocumentService; import org.springframework.stereotype.Component; @@ -108,6 +114,7 @@ public class BSLTextDocumentService implements TextDocumentService, ProtocolExte private final CallHierarchyProvider callHierarchyProvider; private final SelectionRangeProvider selectionRangeProvider; private final ColorProvider colorProvider; + private final RenameProvider renameProvider; @Override public CompletableFuture hover(HoverParams params) { @@ -367,6 +374,29 @@ public CompletableFuture diagnostics(DiagnosticParams params) { }); } + @Override + public CompletableFuture> prepareRename(PrepareRenameParams params) { + var documentContext = context.getDocument(params.getTextDocument().getUri()); + if (documentContext == null) { + return CompletableFuture.completedFuture(null); + } + + var edits = renameProvider.getPrepareRename(params, documentContext); + return CompletableFuture.completedFuture(Either.forLeft(edits)); + } + + @Override + public CompletableFuture rename(RenameParams params) { + var documentContext = context.getDocument(params.getTextDocument().getUri()); + if (documentContext == null) { + return CompletableFuture.completedFuture(null); + } + + var edits = renameProvider.getRename(params, documentContext); + + return CompletableFuture.completedFuture(edits); + } + public void reset() { context.clear(); } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java new file mode 100644 index 00000000000..8f78ad78daf --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java @@ -0,0 +1,79 @@ +/* + * This file is a part of BSL Language Server. + * + * Copyright (c) 2018-2022 + * Alexey Sosnoviy , Nikita Fedkin 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.providers; + +import com.github._1c_syntax.bsl.languageserver.context.DocumentContext; +import com.github._1c_syntax.bsl.languageserver.references.ReferenceIndex; +import com.github._1c_syntax.bsl.languageserver.references.ReferenceResolver; +import com.github._1c_syntax.bsl.languageserver.references.model.Reference; +import lombok.RequiredArgsConstructor; +import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.PrepareRenameParams; +import org.eclipse.lsp4j.Range; +import org.eclipse.lsp4j.RenameParams; +import org.eclipse.lsp4j.TextEdit; +import org.eclipse.lsp4j.WorkspaceEdit; +import org.springframework.stereotype.Component; + +import java.util.Collection; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Component +@RequiredArgsConstructor +public final class RenameProvider { + + private final ReferenceResolver referenceResolver; + private final ReferenceIndex referenceIndex; + + public WorkspaceEdit getRename(RenameParams params, DocumentContext documentContext) { + + Position position = params.getPosition(); + + var reference = referenceResolver.findReference( + documentContext.getUri(), params.getPosition() + ); + + return new WorkspaceEdit( + Stream.concat( + referenceResolver.findReference(documentContext.getUri(), position) + .flatMap(Reference::getSourceDefinedSymbol) + .stream() + .map(referenceIndex::getReferencesTo) + .flatMap(Collection::stream), + reference.stream()) + .collect(Collectors.groupingBy( + ref -> ref.getUri().toString(), + Collectors.mapping(Reference::getSelectionRange, + Collectors.mapping(range -> new TextEdit(range, params.getNewName()), Collectors.toList()))))); + } + + public Range getPrepareRename( + PrepareRenameParams params, + DocumentContext documentContext) { + + return referenceResolver.findReference( + documentContext.getUri(), params.getPosition()) + .map(Reference::getSelectionRange) + .orElse(null); + } +} From adc51a429706a06071bf41e3537929021300b9bb Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Fri, 27 May 2022 14:03:07 +0300 Subject: [PATCH 02/14] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BD?= =?UTF-8?q?=D0=B0=20renameProvider?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../providers/RenameProviderTest.java | 161 ++++++++++++++++++ src/test/resources/providers/rename.bsl | 7 + 2 files changed, 168 insertions(+) create mode 100644 src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProviderTest.java create mode 100644 src/test/resources/providers/rename.bsl diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProviderTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProviderTest.java new file mode 100644 index 00000000000..84188672389 --- /dev/null +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProviderTest.java @@ -0,0 +1,161 @@ +/* + * This file is a part of BSL Language Server. + * + * Copyright (c) 2018-2022 + * Alexey Sosnoviy , Nikita Fedkin 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.providers; + +import com.github._1c_syntax.bsl.languageserver.context.ServerContext; +import com.github._1c_syntax.bsl.languageserver.util.CleanupContextBeforeClassAndAfterClass; +import com.github._1c_syntax.bsl.languageserver.util.TestUtils; +import com.github._1c_syntax.bsl.languageserver.utils.Ranges; +import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.PrepareRenameParams; +import org.eclipse.lsp4j.RenameParams; +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; + +import javax.annotation.PostConstruct; +import java.nio.file.Paths; + +import static com.github._1c_syntax.bsl.languageserver.util.TestUtils.PATH_TO_METADATA; +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +@CleanupContextBeforeClassAndAfterClass +class RenameProviderTest { + + @Autowired + private RenameProvider renameProvider; + + @Autowired + private ServerContext serverContext; + + private static final String PATH_TO_FILE = "./src/test/resources/providers/rename.bsl"; + + @PostConstruct + void prepareServerContext() { + serverContext.setConfigurationRoot(Paths.get(PATH_TO_METADATA)); + serverContext.populateContext(); + } + + @Test + void testEmptyReferences() { + var documentContext = TestUtils.getDocumentContextFromFile(PATH_TO_FILE); + + var params = new RenameParams(); + params.setPosition(new Position(1, 0)); + + // when + var workspaceEdit = renameProvider.getRename(params, documentContext); + + // then + assertThat(workspaceEdit.getChanges()).isEmpty(); + } + + @Test + void testRenameLocalMethods() { + var documentContext = TestUtils.getDocumentContextFromFile(PATH_TO_FILE); + var newName = "НовоеИмя"; + + var params = new RenameParams(); + params.setPosition(new Position(0, 14)); + params.setNewName(newName); + + // when + var workspaceEdit = renameProvider.getRename(params, documentContext); + + // then + assertThat(workspaceEdit.getChanges().get(documentContext.getUri().toString())) + .hasSize(2) + .contains(new TextEdit(Ranges.create(0, 8, 18), newName)) + .contains(new TextEdit(Ranges.create(5, 0, 10), newName)); + } + + @Test + void testRenameLocalVariable() { + var documentContext = TestUtils.getDocumentContextFromFile(PATH_TO_FILE); + var newName = "НовоеИмя"; + + var params = new RenameParams(); + params.setPosition(new Position(1, 10)); + params.setNewName(newName); + + // when + var workspaceEdit = renameProvider.getRename(params, documentContext); + + // then + assertThat(workspaceEdit.getChanges().get(documentContext.getUri().toString())) + .hasSize(2) + .contains(new TextEdit(Ranges.create(1, 4, 14), newName)) + .contains(new TextEdit(Ranges.create(2, 8, 18), newName)); + } + + @Test + void testRenameParam() { + var documentContext = TestUtils.getDocumentContextFromFile(PATH_TO_FILE); + var newName = "НовоеИмя"; + + var params = new RenameParams(); + params.setPosition(new Position(0, 25)); + params.setNewName(newName); + + // when + var workspaceEdit = renameProvider.getRename(params, documentContext); + + // then + assertThat(workspaceEdit.getChanges().get(documentContext.getUri().toString())) + .hasSize(2) + .contains(new TextEdit(Ranges.create(0, 24, 26), newName)) + .contains(new TextEdit(Ranges.create(1, 17, 19), newName)); + } + + @Test + void testPrepareRenameEmpty() { + var documentContext = TestUtils.getDocumentContextFromFile(PATH_TO_FILE); + + var params = new PrepareRenameParams(); + params.setPosition(new Position(0, 3)); + + // when + var range = renameProvider.getPrepareRename(params, documentContext); + + // then + assertThat(range).isNull(); + + } + + @Test + void testPrepareRenameMethods() { + var documentContext = TestUtils.getDocumentContextFromFile(PATH_TO_FILE); + + var params = new PrepareRenameParams(); + params.setPosition(new Position(0, 14)); + + // when + var range = renameProvider.getPrepareRename(params, documentContext); + + // then + assertThat(range).isEqualTo(Ranges.create(0, 8, 18)); + + } + +} diff --git a/src/test/resources/providers/rename.bsl b/src/test/resources/providers/rename.bsl new file mode 100644 index 00000000000..52b10ba6b80 --- /dev/null +++ b/src/test/resources/providers/rename.bsl @@ -0,0 +1,7 @@ +Функция ИмяФункции(Знач П1) Экспорт + Переменная = П1; + A = Переменная; +КонецФункции + +ИмяФункции(); + From 4a5ad12d419cc48f83150bcc2d58f028cce777d8 Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Fri, 27 May 2022 14:03:34 +0300 Subject: [PATCH 03/14] qf fix --- .../providers/RenameProvider.java | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java index 8f78ad78daf..272527fd80b 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java @@ -26,7 +26,6 @@ import com.github._1c_syntax.bsl.languageserver.references.ReferenceResolver; import com.github._1c_syntax.bsl.languageserver.references.model.Reference; import lombok.RequiredArgsConstructor; -import org.eclipse.lsp4j.Position; import org.eclipse.lsp4j.PrepareRenameParams; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.RenameParams; @@ -35,6 +34,7 @@ import org.springframework.stereotype.Component; import java.util.Collection; +import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -47,32 +47,28 @@ public final class RenameProvider { public WorkspaceEdit getRename(RenameParams params, DocumentContext documentContext) { - Position position = params.getPosition(); - - var reference = referenceResolver.findReference( - documentContext.getUri(), params.getPosition() - ); + var position = params.getPosition(); + Optional reference = referenceResolver.findReference(documentContext.getUri(), position); return new WorkspaceEdit( Stream.concat( - referenceResolver.findReference(documentContext.getUri(), position) + reference .flatMap(Reference::getSourceDefinedSymbol) .stream() .map(referenceIndex::getReferencesTo) .flatMap(Collection::stream), - reference.stream()) + reference.stream().filter(Reference::isSourceDefinedSymbolReference)) .collect(Collectors.groupingBy( ref -> ref.getUri().toString(), Collectors.mapping(Reference::getSelectionRange, Collectors.mapping(range -> new TextEdit(range, params.getNewName()), Collectors.toList()))))); } - public Range getPrepareRename( - PrepareRenameParams params, - DocumentContext documentContext) { + public Range getPrepareRename(PrepareRenameParams params, DocumentContext documentContext) { return referenceResolver.findReference( documentContext.getUri(), params.getPosition()) + .filter(Reference::isSourceDefinedSymbolReference) .map(Reference::getSelectionRange) .orElse(null); } From 7c9769e31814f4eba541533b54c8e2d4560d470f Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Fri, 27 May 2022 15:18:16 +0300 Subject: [PATCH 04/14] Async --- .../bsl/languageserver/BSLTextDocumentService.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java index 0d2469a733e..b1bb64da031 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java @@ -381,8 +381,8 @@ public CompletableFuture> prepareRename(Prepa return CompletableFuture.completedFuture(null); } - var edits = renameProvider.getPrepareRename(params, documentContext); - return CompletableFuture.completedFuture(Either.forLeft(edits)); + return CompletableFuture.supplyAsync(() -> + Either.forLeft(renameProvider.getPrepareRename(params, documentContext))); } @Override @@ -392,9 +392,7 @@ public CompletableFuture rename(RenameParams params) { return CompletableFuture.completedFuture(null); } - var edits = renameProvider.getRename(params, documentContext); - - return CompletableFuture.completedFuture(edits); + return CompletableFuture.supplyAsync(() -> renameProvider.getRename(params, documentContext)); } public void reset() { From 82cf298329f5c4479d4469902157ab86d0d95ef0 Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Fri, 27 May 2022 15:18:42 +0300 Subject: [PATCH 05/14] docs --- docs/en/index.md | 5 +++-- docs/index.md | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/en/index.md b/docs/en/index.md index 49f177a755d..bddae9cae38 100644 --- a/docs/en/index.md +++ b/docs/en/index.md @@ -49,6 +49,7 @@ Perfomance measurement - [SSL 3.1](../bench/index.html) * Quick fixes for several diagnostics * Run diagnostics engine from command line * Run formatter engine from command line +* Rename symbol ## Supported protocol operations @@ -100,8 +101,8 @@ Perfomance measurement - [SSL 3.1](../bench/index.html) | [formatting](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_formatting) | yes | | | | [rangeFormatting](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_rangeFormatting) | yes | | | | [onTypeFormatting](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_onTypeFormatting) | no | | | -| [rename](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_rename) | no | | | -| [prepareRename](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_prepareRename) | no | | | +| [rename](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_rename) | yes | | | +| [prepareRename](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_prepareRename) | yes | | | | [foldingRange](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_foldingRange) | yes | | | | [selectionRange](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_selectionRange) | yes | | | | [prepareCallHierarchy](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_prepareCallHierarchy) | yes | | | diff --git a/docs/index.md b/docs/index.md index a86f0ca6861..84921d3009a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -49,6 +49,7 @@ * "Быстрые исправления" (quick fixes) для ряда диагностик и "быстрые действия" (code actions) * Запуск движка диагностик из командной строки * Запуск форматирования файлов в каталоге из командной строки +* Переименование символов ## Поддерживаемые операции протокола @@ -100,8 +101,8 @@ | [formatting](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_formatting) | yes | | | | [rangeFormatting](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_rangeFormatting) | yes | | | | [onTypeFormatting](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_onTypeFormatting) | no | | | - | [rename](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_rename) | no | | | - | [prepareRename](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_prepareRename) | no | | | + | [rename](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_rename) | yes | | | + | [prepareRename](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_prepareRename) | yes | | | | [foldingRange](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_foldingRange) | yes | | | | [selectionRange](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_selectionRange) | yes | | | | [prepareCallHierarchy](https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_prepareCallHierarchy) | yes | | | From a0ad4ff2ab5f791131879685fa8d0166d35d0256 Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Fri, 27 May 2022 15:19:29 +0300 Subject: [PATCH 06/14] =?UTF-8?q?=D0=94=D1=8B=D0=BC=20=D0=BD=D0=B0=20Docum?= =?UTF-8?q?ebtService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BSLTextDocumentServiceTest.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentServiceTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentServiceTest.java index 9bb0fcdd422..0949d81cc58 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentServiceTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentServiceTest.java @@ -29,6 +29,9 @@ import org.eclipse.lsp4j.DidCloseTextDocumentParams; import org.eclipse.lsp4j.DidOpenTextDocumentParams; import org.eclipse.lsp4j.DidSaveTextDocumentParams; +import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.PrepareRenameParams; +import org.eclipse.lsp4j.RenameParams; import org.eclipse.lsp4j.TextDocumentContentChangeEvent; import org.eclipse.lsp4j.TextDocumentIdentifier; import org.eclipse.lsp4j.TextDocumentItem; @@ -137,6 +140,28 @@ void testDiagnosticsKnownFileFilteredRange() throws ExecutionException, Interrup assertThat(diagnostics.getDiagnostics()).hasSize(2); } + @Test + void testRename() throws ExecutionException, InterruptedException, IOException { + var params = new RenameParams(); + params.setTextDocument(getTextDocumentIdentifier()); + params.setPosition(new Position(0, 16)); + + var result = textDocumentService.rename(params); + + assertThat(result).isNotNull(); + } + + @Test + void testRenamePrepare() throws ExecutionException, InterruptedException, IOException { + var params = new PrepareRenameParams(); + params.setTextDocument(getTextDocumentIdentifier()); + params.setPosition(new Position(0, 16)); + + var result = textDocumentService.prepareRename(params); + + assertThat(result).isNotNull(); + } + private File getTestFile() { return new File("./src/test/resources/BSLTextDocumentServiceTest.bsl"); } From ddf5e4479fe3b405cdc2a36f4917ee2dac2f63bc Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Fri, 27 May 2022 15:29:49 +0300 Subject: [PATCH 07/14] refact --- .../providers/RenameProvider.java | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java index 272527fd80b..1d508e3c275 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java @@ -31,10 +31,14 @@ import org.eclipse.lsp4j.RenameParams; import org.eclipse.lsp4j.TextEdit; import org.eclipse.lsp4j.WorkspaceEdit; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Component; import java.util.Collection; +import java.util.List; +import java.util.Map; import java.util.Optional; +import java.util.stream.Collector; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -50,18 +54,16 @@ public WorkspaceEdit getRename(RenameParams params, DocumentContext documentCont var position = params.getPosition(); Optional reference = referenceResolver.findReference(documentContext.getUri(), position); - return new WorkspaceEdit( - Stream.concat( - reference - .flatMap(Reference::getSourceDefinedSymbol) - .stream() - .map(referenceIndex::getReferencesTo) - .flatMap(Collection::stream), - reference.stream().filter(Reference::isSourceDefinedSymbolReference)) - .collect(Collectors.groupingBy( - ref -> ref.getUri().toString(), - Collectors.mapping(Reference::getSelectionRange, - Collectors.mapping(range -> new TextEdit(range, params.getNewName()), Collectors.toList()))))); + Map> changes = Stream.concat( + reference + .flatMap(Reference::getSourceDefinedSymbol) + .stream() + .map(referenceIndex::getReferencesTo) + .flatMap(Collection::stream), + reference.stream().filter(Reference::isSourceDefinedSymbolReference) + ).collect(Collectors.groupingBy(ref -> ref.getUri().toString(), getTexEdits(params))); + + return new WorkspaceEdit(changes); } public Range getPrepareRename(PrepareRenameParams params, DocumentContext documentContext) { @@ -72,4 +74,18 @@ public Range getPrepareRename(PrepareRenameParams params, DocumentContext docume .map(Reference::getSelectionRange) .orElse(null); } + + @NotNull + private static Collector> getTexEdits(RenameParams params) { + return Collectors.mapping( + Reference::getSelectionRange, + Collectors.mapping(range -> newTextEdit(params, range), Collectors.toList()) + ); + } + + @NotNull + private static TextEdit newTextEdit(RenameParams params, Range range) { + return new TextEdit(range, params.getNewName()); + } + } From 369089e66c6cc88acdf3d5f624548e633c9a18ec Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Fri, 27 May 2022 15:53:07 +0300 Subject: [PATCH 08/14] qfFix --- .../bsl/languageserver/providers/RenameProvider.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java index 1d508e3c275..7397ead18a3 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java @@ -26,9 +26,9 @@ import com.github._1c_syntax.bsl.languageserver.references.ReferenceResolver; import com.github._1c_syntax.bsl.languageserver.references.model.Reference; import lombok.RequiredArgsConstructor; -import org.eclipse.lsp4j.PrepareRenameParams; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.RenameParams; +import org.eclipse.lsp4j.TextDocumentPositionParams; import org.eclipse.lsp4j.TextEdit; import org.eclipse.lsp4j.WorkspaceEdit; import org.jetbrains.annotations.NotNull; @@ -66,7 +66,7 @@ public WorkspaceEdit getRename(RenameParams params, DocumentContext documentCont return new WorkspaceEdit(changes); } - public Range getPrepareRename(PrepareRenameParams params, DocumentContext documentContext) { + public Range getPrepareRename(TextDocumentPositionParams params, DocumentContext documentContext) { return referenceResolver.findReference( documentContext.getUri(), params.getPosition()) From d0275afe484a29c5861d6367f4ef968c981a058c Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Fri, 27 May 2022 17:14:45 +0300 Subject: [PATCH 09/14] =?UTF-8?q?renameOptions=20=D0=BF=D0=BE=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=B0=D0=BC=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B8=D0=B5=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bsl/languageserver/BSLLanguageServer.java | 39 +++++++++++++++---- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServer.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServer.java index 8f52cc551c5..11e6595c7f4 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServer.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServer.java @@ -27,10 +27,10 @@ import com.github._1c_syntax.bsl.languageserver.jsonrpc.Diagnostics; import com.github._1c_syntax.bsl.languageserver.jsonrpc.ProtocolExtension; import com.github._1c_syntax.bsl.languageserver.providers.DocumentSymbolProvider; -import com.github._1c_syntax.bsl.languageserver.providers.RenameProvider; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.eclipse.lsp4j.CallHierarchyRegistrationOptions; +import org.eclipse.lsp4j.ClientCapabilities; import org.eclipse.lsp4j.CodeActionKind; import org.eclipse.lsp4j.CodeActionOptions; import org.eclipse.lsp4j.CodeLensOptions; @@ -45,14 +45,17 @@ import org.eclipse.lsp4j.InitializeParams; import org.eclipse.lsp4j.InitializeResult; import org.eclipse.lsp4j.ReferenceOptions; +import org.eclipse.lsp4j.RenameCapabilities; import org.eclipse.lsp4j.RenameOptions; import org.eclipse.lsp4j.SaveOptions; import org.eclipse.lsp4j.SelectionRangeRegistrationOptions; import org.eclipse.lsp4j.ServerCapabilities; import org.eclipse.lsp4j.ServerInfo; +import org.eclipse.lsp4j.TextDocumentClientCapabilities; import org.eclipse.lsp4j.TextDocumentSyncKind; import org.eclipse.lsp4j.TextDocumentSyncOptions; import org.eclipse.lsp4j.WorkspaceSymbolOptions; +import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.eclipse.lsp4j.services.LanguageServer; import org.eclipse.lsp4j.services.TextDocumentService; import org.eclipse.lsp4j.services.WorkspaceService; @@ -64,6 +67,7 @@ import java.net.URISyntaxException; import java.nio.file.Path; import java.util.List; +import java.util.Optional; import java.util.concurrent.CompletableFuture; @Slf4j @@ -103,7 +107,7 @@ public CompletableFuture initialize(InitializeParams params) { capabilities.setCallHierarchyProvider(getCallHierarchyProvider()); capabilities.setSelectionRangeProvider(getSelectionRangeProvider()); capabilities.setColorProvider(getColorProvider()); - capabilities.setRenameProvider(getRenameProvider()); + capabilities.setRenameProvider(getRenameProvider(params)); var result = new InitializeResult(capabilities, serverInfo); @@ -277,10 +281,31 @@ private static ColorProviderOptions getColorProvider() { return colorProviderOptions; } - private static RenameOptions getRenameProvider() { - var renameOptions = new RenameOptions(); - renameOptions.setWorkDoneProgress(Boolean.FALSE); - renameOptions.setPrepareProvider(Boolean.TRUE); - return renameOptions; + private static Either getRenameProvider(InitializeParams params) { + + if (Boolean.TRUE.equals(getRenamePrepareSupport(params))) { + + var renameOptions = new RenameOptions(); + renameOptions.setWorkDoneProgress(Boolean.FALSE); + renameOptions.setPrepareProvider(Boolean.TRUE); + + return Either.forRight(renameOptions); + + } else { + + return Either.forLeft(Boolean.TRUE); + + } + } + + private static Boolean getRenamePrepareSupport(InitializeParams params) { + return Optional.of(params) + .map(InitializeParams::getCapabilities) + .map(ClientCapabilities::getTextDocument) + .map(TextDocumentClientCapabilities::getRename) + .map(RenameCapabilities::getPrepareSupport) + .orElse(false); + } + } From e7981c5c9878199601096c0dffb6665be9b03c0f Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Fri, 27 May 2022 22:02:13 +0300 Subject: [PATCH 10/14] =?UTF-8?q?=D0=9F=D0=BE=D0=BC=D0=B5=D0=BD=D1=8F?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D1=8B?= =?UTF-8?q?=20=D0=BC=D0=B5=D1=81=D1=82=D0=B0=D0=BC=D0=B8.=20=D0=9F=D0=BE?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B8=D0=B5=20=D0=B4=D0=B6=D0=B0=D0=B2=D0=B0?= =?UTF-8?q?=D0=B4=D0=BE=D0=BA=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BSLTextDocumentService.java | 4 +-- .../providers/RenameProvider.java | 25 +++++++++++++++++-- .../providers/RenameProviderTest.java | 12 ++++----- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java index b1bb64da031..430d71ec260 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java @@ -382,7 +382,7 @@ public CompletableFuture> prepareRename(Prepa } return CompletableFuture.supplyAsync(() -> - Either.forLeft(renameProvider.getPrepareRename(params, documentContext))); + Either.forLeft(renameProvider.getPrepareRename(documentContext, params))); } @Override @@ -392,7 +392,7 @@ public CompletableFuture rename(RenameParams params) { return CompletableFuture.completedFuture(null); } - return CompletableFuture.supplyAsync(() -> renameProvider.getRename(params, documentContext)); + return CompletableFuture.supplyAsync(() -> renameProvider.getRename(documentContext, params)); } public void reset() { diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java index 7397ead18a3..4475bb01269 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java @@ -42,6 +42,13 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +/** + * Провайдер, обрабатывающий запросы {@code textDocument/rename} + * и {@code textDocument/prepareRename}. + * + * @see Rename Request specification. + * @see Prepare Document Request specification. + */ @Component @RequiredArgsConstructor public final class RenameProvider { @@ -49,7 +56,14 @@ public final class RenameProvider { private final ReferenceResolver referenceResolver; private final ReferenceIndex referenceIndex; - public WorkspaceEdit getRename(RenameParams params, DocumentContext documentContext) { + /** + * {@link WorkspaceEdit} + * + * @param documentContext Контекст документа. + * @param params Параметры вызова. + * @return Изменения документов + */ + public WorkspaceEdit getRename(DocumentContext documentContext, RenameParams params) { var position = params.getPosition(); Optional reference = referenceResolver.findReference(documentContext.getUri(), position); @@ -66,7 +80,14 @@ public WorkspaceEdit getRename(RenameParams params, DocumentContext documentCont return new WorkspaceEdit(changes); } - public Range getPrepareRename(TextDocumentPositionParams params, DocumentContext documentContext) { + /** + * {@link Range} + * + * @param documentContext Контекст документа. + * @param params Параметры вызова. + * @return Range + */ + public Range getPrepareRename(DocumentContext documentContext, TextDocumentPositionParams params) { return referenceResolver.findReference( documentContext.getUri(), params.getPosition()) diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProviderTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProviderTest.java index 84188672389..18bb5ab7627 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProviderTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProviderTest.java @@ -65,7 +65,7 @@ void testEmptyReferences() { params.setPosition(new Position(1, 0)); // when - var workspaceEdit = renameProvider.getRename(params, documentContext); + var workspaceEdit = renameProvider.getRename(documentContext, params); // then assertThat(workspaceEdit.getChanges()).isEmpty(); @@ -81,7 +81,7 @@ void testRenameLocalMethods() { params.setNewName(newName); // when - var workspaceEdit = renameProvider.getRename(params, documentContext); + var workspaceEdit = renameProvider.getRename(documentContext, params); // then assertThat(workspaceEdit.getChanges().get(documentContext.getUri().toString())) @@ -100,7 +100,7 @@ void testRenameLocalVariable() { params.setNewName(newName); // when - var workspaceEdit = renameProvider.getRename(params, documentContext); + var workspaceEdit = renameProvider.getRename(documentContext, params); // then assertThat(workspaceEdit.getChanges().get(documentContext.getUri().toString())) @@ -119,7 +119,7 @@ void testRenameParam() { params.setNewName(newName); // when - var workspaceEdit = renameProvider.getRename(params, documentContext); + var workspaceEdit = renameProvider.getRename(documentContext, params); // then assertThat(workspaceEdit.getChanges().get(documentContext.getUri().toString())) @@ -136,7 +136,7 @@ void testPrepareRenameEmpty() { params.setPosition(new Position(0, 3)); // when - var range = renameProvider.getPrepareRename(params, documentContext); + var range = renameProvider.getPrepareRename(documentContext, params); // then assertThat(range).isNull(); @@ -151,7 +151,7 @@ void testPrepareRenameMethods() { params.setPosition(new Position(0, 14)); // when - var range = renameProvider.getPrepareRename(params, documentContext); + var range = renameProvider.getPrepareRename(documentContext, params); // then assertThat(range).isEqualTo(Ranges.create(0, 8, 18)); From f0a231f602d8c3a5397bd7eb2ec61ad64515e779 Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Sat, 28 May 2022 21:32:51 +0300 Subject: [PATCH 11/14] =?UTF-8?q?rename=20=D0=BD=D0=B5=20=D1=82=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=81=20=D0=BE=D0=BF=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=BE=20?= =?UTF-8?q?=D0=B8=20=D1=81=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../providers/RenameProvider.java | 18 +++++++++---- .../providers/RenameProviderTest.java | 25 ++++++++++++++++--- src/test/resources/providers/rename.bsl | 4 +-- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java index 4475bb01269..61f78acc918 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java @@ -22,10 +22,12 @@ package com.github._1c_syntax.bsl.languageserver.providers; import com.github._1c_syntax.bsl.languageserver.context.DocumentContext; +import com.github._1c_syntax.bsl.languageserver.context.symbol.SourceDefinedSymbol; import com.github._1c_syntax.bsl.languageserver.references.ReferenceIndex; import com.github._1c_syntax.bsl.languageserver.references.ReferenceResolver; import com.github._1c_syntax.bsl.languageserver.references.model.Reference; import lombok.RequiredArgsConstructor; +import org.eclipse.lsp4j.Location; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.RenameParams; import org.eclipse.lsp4j.TextDocumentPositionParams; @@ -34,10 +36,10 @@ import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Component; +import java.net.URI; import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.stream.Collector; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -66,20 +68,26 @@ public final class RenameProvider { public WorkspaceEdit getRename(DocumentContext documentContext, RenameParams params) { var position = params.getPosition(); - Optional reference = referenceResolver.findReference(documentContext.getUri(), position); + var sourceDefinedSymbol = referenceResolver.findReference(documentContext.getUri(), position) + .flatMap(Reference::getSourceDefinedSymbol); Map> changes = Stream.concat( - reference - .flatMap(Reference::getSourceDefinedSymbol) + sourceDefinedSymbol .stream() .map(referenceIndex::getReferencesTo) .flatMap(Collection::stream), - reference.stream().filter(Reference::isSourceDefinedSymbolReference) + sourceDefinedSymbol + .stream().map(symbol -> referenceOf(documentContext.getUri(), symbol)) ).collect(Collectors.groupingBy(ref -> ref.getUri().toString(), getTexEdits(params))); return new WorkspaceEdit(changes); } + @NotNull + private static Reference referenceOf(URI uri, SourceDefinedSymbol c) { + return Reference.of(c, c, new Location(uri.toString(), c.getSelectionRange())); + } + /** * {@link Range} * diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProviderTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProviderTest.java index 18bb5ab7627..94b7258a48f 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProviderTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProviderTest.java @@ -87,11 +87,11 @@ void testRenameLocalMethods() { assertThat(workspaceEdit.getChanges().get(documentContext.getUri().toString())) .hasSize(2) .contains(new TextEdit(Ranges.create(0, 8, 18), newName)) - .contains(new TextEdit(Ranges.create(5, 0, 10), newName)); + .contains(new TextEdit(Ranges.create(6, 0, 10), newName)); } @Test - void testRenameLocalVariable() { + void testRenameLocalVariableDeclaration() { var documentContext = TestUtils.getDocumentContextFromFile(PATH_TO_FILE); var newName = "НовоеИмя"; @@ -106,7 +106,26 @@ void testRenameLocalVariable() { assertThat(workspaceEdit.getChanges().get(documentContext.getUri().toString())) .hasSize(2) .contains(new TextEdit(Ranges.create(1, 4, 14), newName)) - .contains(new TextEdit(Ranges.create(2, 8, 18), newName)); + .contains(new TextEdit(Ranges.create(2, 13, 23), newName)); + } + + @Test + void testRenameLocalVariableUse() { + var documentContext = TestUtils.getDocumentContextFromFile(PATH_TO_FILE); + var newName = "НовоеИмя"; + + var params = new RenameParams(); + params.setPosition(new Position(3, 5)); + params.setNewName(newName); + + // when + var workspaceEdit = renameProvider.getRename(documentContext, params); + + // then + assertThat(workspaceEdit.getChanges().get(documentContext.getUri().toString())) + .hasSize(2) + .contains(new TextEdit(Ranges.create(2, 4, 10), newName)) + .contains(new TextEdit(Ranges.create(3, 4, 10), newName)); } @Test diff --git a/src/test/resources/providers/rename.bsl b/src/test/resources/providers/rename.bsl index 52b10ba6b80..b01a6ecefdb 100644 --- a/src/test/resources/providers/rename.bsl +++ b/src/test/resources/providers/rename.bsl @@ -1,7 +1,7 @@ Функция ИмяФункции(Знач П1) Экспорт Переменная = П1; - A = Переменная; + Просто = Переменная; + Просто.Вставить(); КонецФункции ИмяФункции(); - From e45ec1887d6daaf9194f89129a719423c3c6c92b Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Sat, 28 May 2022 22:15:18 +0300 Subject: [PATCH 12/14] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=20=D0=BD=D0=B0?= =?UTF-8?q?=20initializeRename?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../languageserver/BSLLanguageServerTest.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServerTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServerTest.java index 3c5a3a78a0a..43bdf5e4705 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServerTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServerTest.java @@ -24,8 +24,11 @@ import com.ginsberg.junit.exit.ExpectSystemExitWithStatus; import com.github._1c_syntax.bsl.languageserver.util.CleanupContextBeforeClassAndAfterEachTestMethod; import com.github._1c_syntax.utils.Absolute; +import org.eclipse.lsp4j.ClientCapabilities; import org.eclipse.lsp4j.InitializeParams; import org.eclipse.lsp4j.InitializeResult; +import org.eclipse.lsp4j.RenameCapabilities; +import org.eclipse.lsp4j.TextDocumentClientCapabilities; import org.eclipse.lsp4j.WorkspaceFolder; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -61,6 +64,28 @@ void initialize() throws ExecutionException, InterruptedException { assertThat(initialize.getCapabilities().getWorkspaceSymbolProvider().isRight()).isTrue(); } + @Test + void initializeRename() throws ExecutionException, InterruptedException { + // given + InitializeParams params = new InitializeParams(); + + WorkspaceFolder workspaceFolder = new WorkspaceFolder(Absolute.path(PATH_TO_METADATA).toUri().toString()); + List workspaceFolders = List.of(workspaceFolder); + params.setWorkspaceFolders(workspaceFolders); + + var capabilities = new ClientCapabilities(); + params.setCapabilities(capabilities); + capabilities.setTextDocument(new TextDocumentClientCapabilities()); + var textDocument = capabilities.getTextDocument(); + textDocument.setRename(new RenameCapabilities()); + textDocument.getRename().setPrepareSupport(true); + // when + InitializeResult initialize = server.initialize(params).get(); + + // then + assertThat(initialize.getCapabilities().getRenameProvider().isRight()).isTrue(); + } + @Test void shutdown() throws ExecutionException, InterruptedException { CompletableFuture shutdown = server.shutdown(); From 82820457c6bfc310754776cd11bf412d2feeb4fd Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Sun, 29 May 2022 17:13:12 +0300 Subject: [PATCH 13/14] fix uri sourceDefinedSymbol --- .../bsl/languageserver/providers/RenameProvider.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java index 61f78acc918..2db757210e0 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java @@ -33,10 +33,8 @@ import org.eclipse.lsp4j.TextDocumentPositionParams; import org.eclipse.lsp4j.TextEdit; import org.eclipse.lsp4j.WorkspaceEdit; -import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Component; -import java.net.URI; import java.util.Collection; import java.util.List; import java.util.Map; @@ -77,15 +75,14 @@ public WorkspaceEdit getRename(DocumentContext documentContext, RenameParams par .map(referenceIndex::getReferencesTo) .flatMap(Collection::stream), sourceDefinedSymbol - .stream().map(symbol -> referenceOf(documentContext.getUri(), symbol)) + .stream().map(RenameProvider::referenceOf) ).collect(Collectors.groupingBy(ref -> ref.getUri().toString(), getTexEdits(params))); return new WorkspaceEdit(changes); } - @NotNull - private static Reference referenceOf(URI uri, SourceDefinedSymbol c) { - return Reference.of(c, c, new Location(uri.toString(), c.getSelectionRange())); + private static Reference referenceOf(SourceDefinedSymbol symbol) { + return Reference.of(symbol, symbol, new Location(symbol.getOwner().getUri().toString(), symbol.getSelectionRange())); } /** @@ -104,7 +101,6 @@ public Range getPrepareRename(DocumentContext documentContext, TextDocumentPosit .orElse(null); } - @NotNull private static Collector> getTexEdits(RenameParams params) { return Collectors.mapping( Reference::getSelectionRange, @@ -112,7 +108,6 @@ public Range getPrepareRename(DocumentContext documentContext, TextDocumentPosit ); } - @NotNull private static TextEdit newTextEdit(RenameParams params, Range range) { return new TextEdit(range, params.getNewName()); } From a48bd8b69660338fdc6db2348d0fb6a44469e015 Mon Sep 17 00:00:00 2001 From: Alexey Sosnoviy Date: Thu, 2 Jun 2022 16:47:03 +0300 Subject: [PATCH 14/14] OccurrenceType.DEFINITION --- .../bsl/languageserver/providers/RenameProvider.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java index 2db757210e0..38cee8e8570 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java @@ -25,6 +25,7 @@ import com.github._1c_syntax.bsl.languageserver.context.symbol.SourceDefinedSymbol; import com.github._1c_syntax.bsl.languageserver.references.ReferenceIndex; import com.github._1c_syntax.bsl.languageserver.references.ReferenceResolver; +import com.github._1c_syntax.bsl.languageserver.references.model.OccurrenceType; import com.github._1c_syntax.bsl.languageserver.references.model.Reference; import lombok.RequiredArgsConstructor; import org.eclipse.lsp4j.Location; @@ -82,7 +83,12 @@ public WorkspaceEdit getRename(DocumentContext documentContext, RenameParams par } private static Reference referenceOf(SourceDefinedSymbol symbol) { - return Reference.of(symbol, symbol, new Location(symbol.getOwner().getUri().toString(), symbol.getSelectionRange())); + return Reference.of( + symbol, + symbol, + new Location(symbol.getOwner().getUri().toString(), symbol.getSelectionRange()), + OccurrenceType.DEFINITION + ); } /**