-
Notifications
You must be signed in to change notification settings - Fork 315
/
InlayHintsBench.scala
126 lines (113 loc) Β· 3.38 KB
/
InlayHintsBench.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package bench
import java.net.URI
import java.nio.charset.StandardCharsets
import java.util.concurrent.TimeUnit
import scala.meta.internal.io.FileIO
import scala.meta.internal.metals.CompilerInlayHintsParams
import scala.meta.internal.metals.CompilerRangeParams
import scala.meta.internal.metals.EmptyCancelToken
import scala.meta.internal.metals.MetalsEnrichments._
import scala.meta.internal.parsing.Trees
import scala.meta.io.AbsolutePath
import org.openjdk.jmh.annotations.Benchmark
import org.openjdk.jmh.annotations.BenchmarkMode
import org.openjdk.jmh.annotations.Mode
import org.openjdk.jmh.annotations.OutputTimeUnit
import org.openjdk.jmh.annotations.Param
import org.openjdk.jmh.annotations.Scope
import org.openjdk.jmh.annotations.State
@State(Scope.Benchmark)
class InlayHintsBench extends PcBenchmark {
var inlayHintsRequests: Map[String, CodeWithRanges] = Map.empty
private def fromZipPath(zip: AbsolutePath, path: String) = {
FileIO.withJarFileSystem(zip, create = false, close = true)(root =>
FileIO.slurp(root.resolve(path), StandardCharsets.UTF_8)
)
}
var trees: Trees = _
def beforeAll(): Unit = {
val akka = Corpus.akka()
val replicator =
"akka-2.5.19/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala"
val scala = Corpus.scala()
val typers =
s"scala-${bench.BuildInfo.scalaVersion}/src/compiler/scala/tools/nsc/typechecker/Typers.scala"
val fastparse = Corpus.fastparse()
val exprs =
"fastparse-2.1.0/scalaparse/src/scalaparse/Exprs.scala"
inlayHintsRequests = Map(
"ClusterDaemon.scala" -> CodeWithRanges(
fromZipPath(
akka,
replicator,
)
),
"Typers.scala" -> CodeWithRanges(
fromZipPath(
scala,
typers,
)
),
"Exprs.scala" -> CodeWithRanges(
fromZipPath(
fastparse,
exprs,
)
),
)
}
@Param(
Array("ClusterDaemon.scala", "Typers.scala", "Exprs.scala")
)
var currentInlayHintsRequest: String = _
@Param(Array("3.3.1", "2.13.12"))
var scalaVersion: String = _
@Benchmark
@BenchmarkMode(Array(Mode.SingleShotTime))
@OutputTimeUnit(TimeUnit.MILLISECONDS)
def inlayHints(): Unit = {
val pc = presentationCompiler(scalaVersion)
val text = currentInlayHints.code
val uri = URI.create(s"file:///${currentInlayHintsRequest}")
for {
range <- currentInlayHints.ranges
} yield {
val rangeParams = CompilerRangeParams(
uri,
text,
range._1,
range._2,
EmptyCancelToken,
)
val pcParams = CompilerInlayHintsParams(
rangeParams,
true,
true,
true,
true,
true,
)
pc.inlayHints(pcParams).get().asScala.toList
}
}
def currentInlayHints: CodeWithRanges = inlayHintsRequests(
currentInlayHintsRequest
)
case class CodeWithRanges(
code: String,
ranges: List[(Int, Int)],
)
object CodeWithRanges {
def apply(code: String): CodeWithRanges = {
val sliceLengths =
code.split("\n", -1).grouped(300).map(_.map(_.length).sum)
val ranges = sliceLengths.foldLeft(List.empty[(Int, Int)]) {
case (acc, sliceLength) =>
val start = acc.lastOption.map(_._2).getOrElse(0)
val end = start + sliceLength
acc :+ (start, end)
}
CodeWithRanges(code, ranges)
}
}
}