Skip to content

Commit a11189a

Browse files
authored
Merge pull request #3721 from 1c-syntax/copilot/check-empty-publish-diagnostics
Skip empty publishDiagnostics on didClose when client supports pull diagnostics
2 parents 69ef76f + bdd0d41 commit a11189a

File tree

2 files changed

+70
-1
lines changed

2 files changed

+70
-1
lines changed

src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,9 @@ public void didClose(DidCloseTextDocumentParams params) {
539539

540540
context.closeDocument(documentContext);
541541

542-
diagnosticProvider.publishEmptyDiagnosticList(documentContext);
542+
if (!clientSupportsPullDiagnostics) {
543+
diagnosticProvider.publishEmptyDiagnosticList(documentContext);
544+
}
543545
}
544546

545547
@Override

src/test/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentServiceTest.java

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,13 @@
2323

2424
import com.github._1c_syntax.bsl.languageserver.context.ServerContext;
2525
import com.github._1c_syntax.bsl.languageserver.jsonrpc.DiagnosticParams;
26+
import com.github._1c_syntax.bsl.languageserver.providers.DiagnosticProvider;
2627
import com.github._1c_syntax.bsl.languageserver.util.CleanupContextBeforeClassAndAfterClass;
2728
import com.github._1c_syntax.bsl.languageserver.utils.Ranges;
2829
import com.github._1c_syntax.utils.Absolute;
2930
import org.apache.commons.io.FileUtils;
31+
import org.eclipse.lsp4j.ClientCapabilities;
32+
import org.eclipse.lsp4j.DiagnosticCapabilities;
3033
import org.eclipse.lsp4j.DidChangeTextDocumentParams;
3134
import org.eclipse.lsp4j.DidCloseTextDocumentParams;
3235
import org.eclipse.lsp4j.DidOpenTextDocumentParams;
@@ -36,6 +39,7 @@
3639
import org.eclipse.lsp4j.Position;
3740
import org.eclipse.lsp4j.PrepareRenameParams;
3841
import org.eclipse.lsp4j.RenameParams;
42+
import org.eclipse.lsp4j.TextDocumentClientCapabilities;
3943
import org.eclipse.lsp4j.TextDocumentContentChangeEvent;
4044
import org.eclipse.lsp4j.TextDocumentIdentifier;
4145
import org.eclipse.lsp4j.TextDocumentItem;
@@ -51,10 +55,16 @@
5155
import java.nio.charset.StandardCharsets;
5256
import java.util.ArrayList;
5357
import java.util.List;
58+
import java.util.Optional;
5459
import java.util.concurrent.ExecutionException;
5560

5661
import static org.assertj.core.api.Assertions.assertThat;
5762
import static org.awaitility.Awaitility.await;
63+
import static org.mockito.ArgumentMatchers.any;
64+
import static org.mockito.Mockito.clearInvocations;
65+
import static org.mockito.Mockito.never;
66+
import static org.mockito.Mockito.verify;
67+
import static org.mockito.Mockito.when;
5868

5969
@SpringBootTest
6070
@CleanupContextBeforeClassAndAfterClass
@@ -64,6 +74,11 @@ class BSLTextDocumentServiceTest {
6474
private BSLTextDocumentService textDocumentService;
6575
@MockitoSpyBean
6676
private ServerContext serverContext;
77+
@MockitoSpyBean
78+
private DiagnosticProvider diagnosticProvider;
79+
@MockitoSpyBean
80+
private ClientCapabilitiesHolder clientCapabilitiesHolder;
81+
6782

6883
@Test
6984
void didOpen() throws IOException {
@@ -186,6 +201,58 @@ void didClose() {
186201
textDocumentService.didClose(params);
187202
}
188203

204+
@Test
205+
void didClosePublishesEmptyDiagnosticsWhenClientDoesNotSupportPullDiagnostics() throws IOException {
206+
// given - open a document
207+
var textDocumentItem = getTextDocumentItem();
208+
var didOpenParams = new DidOpenTextDocumentParams(textDocumentItem);
209+
textDocumentService.didOpen(didOpenParams);
210+
211+
// Simulate client without pull diagnostics support
212+
var capabilities = new ClientCapabilities();
213+
// No TextDocumentClientCapabilities.diagnostic set
214+
when(clientCapabilitiesHolder.getCapabilities()).thenReturn(Optional.of(capabilities));
215+
textDocumentService.handleInitializeEvent(null);
216+
217+
// Clear any invocations from didOpen
218+
clearInvocations(diagnosticProvider);
219+
220+
// when
221+
var closeParams = new DidCloseTextDocumentParams();
222+
closeParams.setTextDocument(new TextDocumentIdentifier(textDocumentItem.getUri()));
223+
textDocumentService.didClose(closeParams);
224+
225+
// then - publishEmptyDiagnosticList should be called
226+
verify(diagnosticProvider).publishEmptyDiagnosticList(any());
227+
}
228+
229+
@Test
230+
void didCloseDoesNotPublishEmptyDiagnosticsWhenClientSupportsPullDiagnostics() throws IOException {
231+
// given - open a document
232+
var textDocumentItem = getTextDocumentItem();
233+
var didOpenParams = new DidOpenTextDocumentParams(textDocumentItem);
234+
textDocumentService.didOpen(didOpenParams);
235+
236+
// Simulate client with pull diagnostics support
237+
var capabilities = new ClientCapabilities();
238+
var textDocumentCapabilities = new TextDocumentClientCapabilities();
239+
textDocumentCapabilities.setDiagnostic(new DiagnosticCapabilities());
240+
capabilities.setTextDocument(textDocumentCapabilities);
241+
when(clientCapabilitiesHolder.getCapabilities()).thenReturn(Optional.of(capabilities));
242+
textDocumentService.handleInitializeEvent(null);
243+
244+
// Clear any invocations from didOpen
245+
clearInvocations(diagnosticProvider);
246+
247+
// when
248+
var closeParams = new DidCloseTextDocumentParams();
249+
closeParams.setTextDocument(new TextDocumentIdentifier(textDocumentItem.getUri()));
250+
textDocumentService.didClose(closeParams);
251+
252+
// then - publishEmptyDiagnosticList should NOT be called
253+
verify(diagnosticProvider, never()).publishEmptyDiagnosticList(any());
254+
}
255+
189256
@Test
190257
void didSave() {
191258
DidSaveTextDocumentParams params = new DidSaveTextDocumentParams();

0 commit comments

Comments
 (0)