@@ -17,19 +17,40 @@ class MetalsDriver(
17
17
override val settings : List [String ]
18
18
) extends InteractiveDriver (settings):
19
19
20
+ private val contextCache : TrieMap [URI , Context ] = TrieMap .empty
21
+ private var lastCompiledURI : Option [URI ] = None
22
+
20
23
private def alreadyCompiled (uri : URI , content : Array [Char ]): Boolean =
21
24
compilationUnits.get(uri) match
22
25
case Some (unit) if ju.Arrays .equals(unit.source.content(), content) =>
23
26
true
24
27
case _ => false
25
28
29
+ override def currentCtx : Context =
30
+ (for
31
+ uri <-
32
+ // lastCompiledURI is initialized as null (!?), it might be a bug in scala3
33
+ if lastCompiledURI != null then lastCompiledURI
34
+ else None
35
+ ctx <- contextCache.get(uri)
36
+ yield ctx) match
37
+ case Some (ctx) => ctx
38
+ case None => super .currentCtx
39
+
26
40
override def run (uri : URI , source : SourceFile ): List [Diagnostic ] =
41
+ lastCompiledURI = Some (uri)
27
42
if alreadyCompiled(uri, source.content) then Nil
28
- else super .run(uri, source)
43
+ else
44
+ val diags = super .run(uri, source)
45
+ contextCache.put(uri, currentCtx)
46
+ diags
29
47
30
48
override def run (uri : URI , sourceCode : String ): List [Diagnostic ] =
31
- val contentHash = MD5 .compute(sourceCode )
49
+ lastCompiledURI = Some (uri )
32
50
if alreadyCompiled(uri, sourceCode.toCharArray()) then Nil
33
- else super .run(uri, sourceCode)
51
+ else
52
+ val diags = super .run(uri, sourceCode)
53
+ contextCache.put(uri, currentCtx)
54
+ diags
34
55
35
56
end MetalsDriver
0 commit comments