11import java .io .File ;
22import java .net .URI ;
3+ import java .util .HashSet ;
34import java .util .List ;
5+ import java .util .Set ;
46import java .util .concurrent .CompletableFuture ;
57import java .util .concurrent .ExecutorService ;
68import java .util .concurrent .Executors ;
@@ -27,6 +29,7 @@ public class LJDiagnosticsService implements TextDocumentService, WorkspaceServi
2729
2830 private LJLanguageClient client ;
2931 private String workspaceRoot ;
32+ private final Set <String > publishedDiagnosticUris = new HashSet <>();
3033 private final ExecutorService diagnosticsExecutor = Executors .newSingleThreadExecutor (r -> {
3134 Thread thread = new Thread (r , "liquidjava-diagnostics" );
3235 thread .setDaemon (true );
@@ -61,14 +64,26 @@ public void sendDiagnosticsNotification(List<LJDiagnostic> diagnostics) {
6164 */
6265 public void generateDiagnostics (String uri ) {
6366 String path = PathUtils .extractBasePath (uri );
64- LJDiagnostics ljDiagnostics = LJDiagnosticsHandler .getLJDiagnostics (path );
65- List <PublishDiagnosticsParams > nativeDiagnostics = LJDiagnosticsHandler .getNativeDiagnostics (ljDiagnostics , uri );
66- nativeDiagnostics .forEach (params -> {
67- this .client .publishDiagnostics (params );
68- });
69- List <LJDiagnostic > diagnostics = Stream .concat (ljDiagnostics .errors ().stream (), ljDiagnostics .warnings ().stream ()).collect (Collectors .toList ());
70- sendDiagnosticsNotification (diagnostics );
71- this .client .sendContext (ContextHistoryConverter .convertToDTO (ContextHistory .getInstance ()));
67+ clearPublishedDiagnostics (uri );
68+
69+ try {
70+ LJDiagnostics ljDiagnostics = LJDiagnosticsHandler .getLJDiagnostics (path );
71+ List <PublishDiagnosticsParams > nativeDiagnostics = LJDiagnosticsHandler .getNativeDiagnostics (ljDiagnostics , uri );
72+ nativeDiagnostics .forEach (params -> {
73+ this .client .publishDiagnostics (params );
74+ if (!params .getDiagnostics ().isEmpty ()) {
75+ publishedDiagnosticUris .add (params .getUri ());
76+ }
77+ });
78+ List <LJDiagnostic > diagnostics = Stream .concat (ljDiagnostics .errors ().stream (), ljDiagnostics .warnings ().stream ()).collect (Collectors .toList ());
79+ sendDiagnosticsNotification (diagnostics );
80+ this .client .sendContext (ContextHistoryConverter .convertToDTO (ContextHistory .getInstance ()));
81+ } catch (Exception e ) {
82+ System .err .println ("LiquidJava verification crashed while checking: " + path );
83+ e .printStackTrace (System .err );
84+ clearPublishedDiagnostics (uri );
85+ this .client .sendFailure ();
86+ }
7287 }
7388
7489 /**
@@ -93,10 +108,18 @@ public void shutdown() {
93108 */
94109 public void clearDiagnostic (String uri ) {
95110 this .client .publishDiagnostics (LJDiagnosticsHandler .getEmptyDiagnostics (uri ));
111+ publishedDiagnosticUris .remove (uri );
96112 // TODO: fix consistency between native and custom diagnostics
97113 // sendDiagnosticsNotification(List.of());
98114 }
99115
116+ private void clearPublishedDiagnostics (String uri ) {
117+ Set <String > urisToClear = new HashSet <>(publishedDiagnosticUris );
118+ urisToClear .add (uri );
119+ urisToClear .forEach (clearUri -> this .client .publishDiagnostics (LJDiagnosticsHandler .getEmptyDiagnostics (clearUri )));
120+ publishedDiagnosticUris .clear ();
121+ }
122+
100123 /**
101124 * Checks diagnostics when a document is opened
102125 * @param params
0 commit comments