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 0c68b793747..ef7f63cf339 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 @@ -539,7 +539,9 @@ public void didClose(DidCloseTextDocumentParams params) { context.closeDocument(documentContext); - diagnosticProvider.publishEmptyDiagnosticList(documentContext); + if (!clientSupportsPullDiagnostics) { + diagnosticProvider.publishEmptyDiagnosticList(documentContext); + } } @Override 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 de2ed976057..f7a4655ad87 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 @@ -23,10 +23,13 @@ import com.github._1c_syntax.bsl.languageserver.context.ServerContext; import com.github._1c_syntax.bsl.languageserver.jsonrpc.DiagnosticParams; +import com.github._1c_syntax.bsl.languageserver.providers.DiagnosticProvider; import com.github._1c_syntax.bsl.languageserver.util.CleanupContextBeforeClassAndAfterClass; import com.github._1c_syntax.bsl.languageserver.utils.Ranges; import com.github._1c_syntax.utils.Absolute; import org.apache.commons.io.FileUtils; +import org.eclipse.lsp4j.ClientCapabilities; +import org.eclipse.lsp4j.DiagnosticCapabilities; import org.eclipse.lsp4j.DidChangeTextDocumentParams; import org.eclipse.lsp4j.DidCloseTextDocumentParams; import org.eclipse.lsp4j.DidOpenTextDocumentParams; @@ -36,6 +39,7 @@ import org.eclipse.lsp4j.Position; import org.eclipse.lsp4j.PrepareRenameParams; import org.eclipse.lsp4j.RenameParams; +import org.eclipse.lsp4j.TextDocumentClientCapabilities; import org.eclipse.lsp4j.TextDocumentContentChangeEvent; import org.eclipse.lsp4j.TextDocumentIdentifier; import org.eclipse.lsp4j.TextDocumentItem; @@ -51,10 +55,16 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.concurrent.ExecutionException; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.clearInvocations; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @SpringBootTest @CleanupContextBeforeClassAndAfterClass @@ -64,6 +74,11 @@ class BSLTextDocumentServiceTest { private BSLTextDocumentService textDocumentService; @MockitoSpyBean private ServerContext serverContext; + @MockitoSpyBean + private DiagnosticProvider diagnosticProvider; + @MockitoSpyBean + private ClientCapabilitiesHolder clientCapabilitiesHolder; + @Test void didOpen() throws IOException { @@ -186,6 +201,58 @@ void didClose() { textDocumentService.didClose(params); } + @Test + void didClosePublishesEmptyDiagnosticsWhenClientDoesNotSupportPullDiagnostics() throws IOException { + // given - open a document + var textDocumentItem = getTextDocumentItem(); + var didOpenParams = new DidOpenTextDocumentParams(textDocumentItem); + textDocumentService.didOpen(didOpenParams); + + // Simulate client without pull diagnostics support + var capabilities = new ClientCapabilities(); + // No TextDocumentClientCapabilities.diagnostic set + when(clientCapabilitiesHolder.getCapabilities()).thenReturn(Optional.of(capabilities)); + textDocumentService.handleInitializeEvent(null); + + // Clear any invocations from didOpen + clearInvocations(diagnosticProvider); + + // when + var closeParams = new DidCloseTextDocumentParams(); + closeParams.setTextDocument(new TextDocumentIdentifier(textDocumentItem.getUri())); + textDocumentService.didClose(closeParams); + + // then - publishEmptyDiagnosticList should be called + verify(diagnosticProvider).publishEmptyDiagnosticList(any()); + } + + @Test + void didCloseDoesNotPublishEmptyDiagnosticsWhenClientSupportsPullDiagnostics() throws IOException { + // given - open a document + var textDocumentItem = getTextDocumentItem(); + var didOpenParams = new DidOpenTextDocumentParams(textDocumentItem); + textDocumentService.didOpen(didOpenParams); + + // Simulate client with pull diagnostics support + var capabilities = new ClientCapabilities(); + var textDocumentCapabilities = new TextDocumentClientCapabilities(); + textDocumentCapabilities.setDiagnostic(new DiagnosticCapabilities()); + capabilities.setTextDocument(textDocumentCapabilities); + when(clientCapabilitiesHolder.getCapabilities()).thenReturn(Optional.of(capabilities)); + textDocumentService.handleInitializeEvent(null); + + // Clear any invocations from didOpen + clearInvocations(diagnosticProvider); + + // when + var closeParams = new DidCloseTextDocumentParams(); + closeParams.setTextDocument(new TextDocumentIdentifier(textDocumentItem.getUri())); + textDocumentService.didClose(closeParams); + + // then - publishEmptyDiagnosticList should NOT be called + verify(diagnosticProvider, never()).publishEmptyDiagnosticList(any()); + } + @Test void didSave() { DidSaveTextDocumentParams params = new DidSaveTextDocumentParams();