diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CodeActionProvider.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CodeActionProvider.java index 441e4690ebc..e4dca5e0282 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CodeActionProvider.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CodeActionProvider.java @@ -39,6 +39,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; @Component @@ -72,6 +73,9 @@ public static List createCodeActions( codeAction.setDiagnostics(diagnostics); codeAction.setEdit(edit); codeAction.setKind(CodeActionKind.QuickFix); + if (diagnostics.size() == 1) { + codeAction.setIsPreferred(Boolean.TRUE); + } return Collections.singletonList(codeAction); @@ -82,8 +86,12 @@ public List> getCodeActions( DocumentContext documentContext ) { + List only = Optional.ofNullable(params.getContext().getOnly()) + .orElse(Collections.emptyList()); + return codeActionSuppliers.stream() .flatMap(codeActionSupplier -> codeActionSupplier.getCodeActions(params, documentContext).stream()) + .filter(codeAction -> only.isEmpty() || only.contains(codeAction.getKind())) .map(Either::forRight) .collect(Collectors.toList()); } diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/CodeActionProviderTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/CodeActionProviderTest.java index ea659abfc26..36ae7ae92a9 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/CodeActionProviderTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/CodeActionProviderTest.java @@ -36,11 +36,13 @@ import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.TextDocumentIdentifier; import org.eclipse.lsp4j.jsonrpc.messages.Either; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; +import javax.annotation.CheckForNull; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -56,13 +58,18 @@ class CodeActionProviderTest { @Autowired private LanguageServerConfiguration configuration; + private DocumentContext documentContext; + + @BeforeEach + void init() { + String filePath = "./src/test/resources/providers/codeAction.bsl"; + documentContext = TestUtils.getDocumentContextFromFile(filePath); + } + @Test void testGetCodeActions() { // given - String filePath = "./src/test/resources/providers/codeAction.bsl"; - DocumentContext documentContext = TestUtils.getDocumentContextFromFile(filePath); - DiagnosticInfo diagnosticInfo = new DiagnosticInfo( CanonicalSpellingKeywordsDiagnostic.class, configuration @@ -96,15 +103,13 @@ void testGetCodeActions() { .anyMatch(codeAction -> codeAction.getDiagnostics().contains(diagnostics.get(0))) .anyMatch(codeAction -> codeAction.getDiagnostics().contains(diagnostics.get(1))) .anyMatch(codeAction -> codeAction.getKind().equals(CodeActionKind.QuickFix)) + .allMatch(codeAction -> (codeAction.getDiagnostics().size() == 1) == toBoolean(codeAction.getIsPreferred())) ; } @Test void testEmptyDiagnosticList() { // given - String filePath = "./src/test/resources/providers/codeAction.bsl"; - DocumentContext documentContext = TestUtils.getDocumentContextFromFile(filePath); - CodeActionParams params = new CodeActionParams(); TextDocumentIdentifier textDocumentIdentifier = new TextDocumentIdentifier(documentContext.getUri().toString()); @@ -124,4 +129,47 @@ void testEmptyDiagnosticList() { .filteredOn(codeAction -> codeAction.getRight().getKind().equals(CodeActionKind.QuickFix)) .isEmpty(); } + + @Test + void testOnly() { + // given + CodeActionParams params = new CodeActionParams(); + TextDocumentIdentifier textDocumentIdentifier = new TextDocumentIdentifier(documentContext.getUri().toString()); + + DiagnosticInfo diagnosticInfo = new DiagnosticInfo( + CanonicalSpellingKeywordsDiagnostic.class, + configuration + ); + DiagnosticCode diagnosticCode = diagnosticInfo.getCode(); + + List diagnostics = documentContext.getDiagnostics().stream() + .filter(diagnostic -> diagnostic.getCode().equals(diagnosticCode)) + .collect(Collectors.toList()); + + CodeActionContext codeActionContext = new CodeActionContext(); + + codeActionContext.setOnly(List.of(CodeActionKind.Refactor)); + codeActionContext.setDiagnostics(diagnostics); + + params.setRange(new Range()); + params.setTextDocument(textDocumentIdentifier); + params.setContext(codeActionContext); + + // when + List> codeActions = codeActionProvider.getCodeActions(params, documentContext); + + // then + assertThat(codeActions) + .extracting(Either::getRight) + .extracting(CodeAction::getKind) + .containsOnly(CodeActionKind.Refactor) + ; + } + + private static boolean toBoolean(@CheckForNull Boolean value) { + if (value == null) { + return false; + } + return value; + } } \ No newline at end of file