@@ -4,40 +4,82 @@ import ch.epfl.scala.bsp4j.{DependencyModulesParams, DependencyModulesResult}
4
4
import ch .epfl .scala .{bsp4j => b }
5
5
6
6
import java .util .concurrent .CompletableFuture
7
+ import java .util .function .BiFunction
7
8
8
9
trait BuildServerForwardStubs extends b.BuildServer {
9
10
protected def forwardTo : b.BuildServer
11
+
12
+ protected def onFatalError (throwable : Throwable , context : String ): Unit
13
+
14
+ def fatalExceptionHandler [T ](methodName : String , params : Any * ) = new BiFunction [T , Throwable , T ] {
15
+ override def apply (maybeValue : T , maybeException : Throwable ): T =
16
+ maybeException match {
17
+ case null =>
18
+ maybeValue
19
+ case error =>
20
+ val methodContext = s " bloop bsp server, method: $methodName"
21
+ val context =
22
+ if (params.isEmpty) methodContext
23
+ else
24
+ params.mkString(s " $methodContext, with params: " , " , " , " " )
25
+ onFatalError(error, context)
26
+ throw error
27
+ }
28
+ }
29
+
10
30
override def buildShutdown (): CompletableFuture [Object ] =
11
- forwardTo.buildShutdown()
31
+ forwardTo.buildShutdown().handleAsync(fatalExceptionHandler(" buildShutdown" ))
32
+
12
33
override def buildTargetCleanCache (
13
34
params : b.CleanCacheParams
14
35
): CompletableFuture [b.CleanCacheResult ] =
15
36
forwardTo.buildTargetCleanCache(params)
37
+ .handleAsync(fatalExceptionHandler(" buildTargetCleanCache" , params))
38
+
16
39
override def buildTargetCompile (params : b.CompileParams ): CompletableFuture [b.CompileResult ] =
17
40
forwardTo.buildTargetCompile(params)
41
+ .handleAsync(fatalExceptionHandler(" buildTargetCompile" , params))
42
+
18
43
override def buildTargetDependencySources (
19
44
params : b.DependencySourcesParams
20
45
): CompletableFuture [b.DependencySourcesResult ] =
21
46
forwardTo.buildTargetDependencySources(params)
47
+ .handleAsync(fatalExceptionHandler(" buildTargetDependencySources" , params))
48
+
22
49
override def buildTargetInverseSources (
23
50
params : b.InverseSourcesParams
24
51
): CompletableFuture [b.InverseSourcesResult ] =
25
52
forwardTo.buildTargetInverseSources(params)
53
+ .handleAsync(fatalExceptionHandler(" buildTargetInverseSources" , params))
54
+
26
55
override def buildTargetResources (
27
56
params : b.ResourcesParams
28
57
): CompletableFuture [b.ResourcesResult ] =
29
58
forwardTo.buildTargetResources(params)
59
+ .handleAsync(fatalExceptionHandler(" buildTargetResources" , params))
60
+
30
61
override def buildTargetRun (params : b.RunParams ): CompletableFuture [b.RunResult ] =
31
62
forwardTo.buildTargetRun(params)
63
+ .handleAsync(fatalExceptionHandler(" buildTargetRun" , params))
64
+
32
65
override def buildTargetSources (params : b.SourcesParams ): CompletableFuture [b.SourcesResult ] =
33
66
forwardTo.buildTargetSources(params)
67
+ .handleAsync(fatalExceptionHandler(" buildTargetSources" , params))
68
+
34
69
override def buildTargetTest (params : b.TestParams ): CompletableFuture [b.TestResult ] =
35
70
forwardTo.buildTargetTest(params)
71
+ .handleAsync(fatalExceptionHandler(" buildTargetTest" , params))
72
+
36
73
override def workspaceBuildTargets (): CompletableFuture [b.WorkspaceBuildTargetsResult ] =
37
74
forwardTo.workspaceBuildTargets()
75
+ .handleAsync(fatalExceptionHandler(" workspaceBuildTargets" ))
76
+
38
77
override def workspaceReload (): CompletableFuture [Object ] =
39
78
forwardTo.workspaceReload()
79
+ .handleAsync(fatalExceptionHandler(" workspaceReload" ))
80
+
40
81
override def buildTargetDependencyModules (params : DependencyModulesParams )
41
82
: CompletableFuture [DependencyModulesResult ] =
42
83
forwardTo.buildTargetDependencyModules(params)
84
+ .handleAsync(fatalExceptionHandler(" buildTargetDependencyModules" , params))
43
85
}
0 commit comments