5
5
import java .util .Arrays ;
6
6
import java .util .Date ;
7
7
import java .util .HashSet ;
8
+ import java .util .LinkedHashSet ;
8
9
import java .util .Objects ;
9
10
import java .util .Set ;
10
11
import java .util .concurrent .CompletableFuture ;
32
33
import ch .epfl .scala .bsp4j .MessageType ;
33
34
import ch .epfl .scala .bsp4j .PublishDiagnosticsParams ;
34
35
import ch .epfl .scala .bsp4j .ShowMessageParams ;
36
+ import ch .epfl .scala .bsp4j .StatusCode ;
35
37
import ch .epfl .scala .bsp4j .TaskDataKind ;
36
38
import ch .epfl .scala .bsp4j .TaskFinishParams ;
37
39
import ch .epfl .scala .bsp4j .TaskProgressParams ;
@@ -60,6 +62,8 @@ public class GradleBuildClient implements BuildClient {
60
62
61
63
private final JavaLanguageClient lsClient ;
62
64
65
+ private final LruCache <String > failedTaskCache = new LruCache <>(16 );
66
+
63
67
public GradleBuildClient () {
64
68
this .lsClient = JavaLanguageServerPlugin .getProjectsManager ().getConnection ();
65
69
}
@@ -70,8 +74,12 @@ public void onBuildLogMessage(LogMessageParams params) {
70
74
if (type == MessageType .LOG ) {
71
75
Utils .sendTelemetry (this .lsClient , params .getMessage ());
72
76
} else {
73
- this .lsClient .sendNotification (new ExecuteCommandParams (CLIENT_BUILD_LOG_CMD ,
74
- Arrays .asList (params .getMessage ())));
77
+ String command = CLIENT_BUILD_LOG_CMD ;
78
+ if (type == MessageType .ERROR && failedTaskCache .contains (params .getTask ().getId ())) {
79
+ // append the compilation failure message to the build output channel.
80
+ command = CLIENT_APPEND_BUILD_LOG_CMD ;
81
+ }
82
+ this .lsClient .sendNotification (new ExecuteCommandParams (command , Arrays .asList (params .getMessage ())));
75
83
}
76
84
}
77
85
@@ -154,6 +162,9 @@ public void onBuildTaskFinish(TaskFinishParams params) {
154
162
if (Objects .equals (params .getDataKind (), TaskDataKind .COMPILE_REPORT )) {
155
163
String msg = params .getMessage () + "\n ------\n " ;
156
164
lsClient .sendNotification (new ExecuteCommandParams (CLIENT_APPEND_BUILD_LOG_CMD , Arrays .asList (msg )));
165
+ if (params .getStatus () == StatusCode .ERROR ) {
166
+ failedTaskCache .addAll ((params .getTaskId ().getParents ()));
167
+ }
157
168
} else {
158
169
Either <String , Integer > id = Either .forLeft (params .getTaskId ().getId ());
159
170
WorkDoneProgressEnd workDoneProgressEnd = new WorkDoneProgressEnd ();
@@ -162,4 +173,22 @@ public void onBuildTaskFinish(TaskFinishParams params) {
162
173
lsClient .notifyProgress (new ProgressParams (id , Either .forLeft (workDoneProgressEnd )));
163
174
}
164
175
}
176
+
177
+ private class LruCache <T > extends LinkedHashSet <T > {
178
+ private final int maxSize ;
179
+
180
+ public LruCache (int maxSize ) {
181
+ super (maxSize );
182
+ this .maxSize = maxSize ;
183
+ }
184
+
185
+ @ Override
186
+ public boolean add (T element ) {
187
+ if (size () >= maxSize ) {
188
+ T oldestElement = iterator ().next ();
189
+ remove (oldestElement );
190
+ }
191
+ return super .add (element );
192
+ }
193
+ }
165
194
}
0 commit comments