Skip to content

Commit 0adf847

Browse files
kasiaMarektgodzik
authored andcommitted
add compat
1 parent cea0466 commit 0adf847

File tree

4 files changed

+49
-10
lines changed

4 files changed

+49
-10
lines changed

metals/src/main/scala/scala/meta/internal/metals/Compilers.scala

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,8 @@ class Compilers(
606606
else InlayHintKind.Parameter
607607
hint.setKind(kind)
608608
hint.setData(
609-
internal.pc.InlayHints.toData(params.uri(), List(Left("")))
609+
internal.pc.InlayHints
610+
.toData(params.uri().toString(), List(Left("")))
610611
)
611612
hint
612613
}
@@ -624,7 +625,10 @@ class Compilers(
624625
}
625626
.map { hint =>
626627
hint.setPosition(adjust.adjustPos(hint.getPosition()))
627-
hint
628+
InlayHintCompat.maybeFixInlayHintData(
629+
hint,
630+
params.getTextDocument().getUri(),
631+
)
628632
}
629633
.asJava
630634
}

metals/src/main/scala/scala/meta/internal/metals/InlayHintResolveProvider.scala

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,27 @@ final class InlayHintResolveProvider(
110110
}
111111

112112
}
113+
114+
object InlayHintCompat {
115+
private def parseData(
116+
data: Array[Any]
117+
): List[Either[String, l.Position]] =
118+
data.map {
119+
case data: l.Position => Right(data)
120+
case data: String => Left(data)
121+
}.toList
122+
123+
// for compatibility with old inlay hint data
124+
def maybeFixInlayHintData(hint: InlayHint, uri: String): InlayHint = {
125+
if (hint.getData.isInstanceOf[Array[_]]) {
126+
try {
127+
val labelParts = parseData(hint.getData.asInstanceOf[Array[Any]])
128+
hint.setData(InlayHints.toData(uri, labelParts))
129+
} catch {
130+
case e: Throwable =>
131+
scribe.warn(s"Failed to fix inlay hint data: $e")
132+
}
133+
}
134+
hint
135+
}
136+
}

mtags-shared/src/main/scala/scala/meta/internal/pc/InlayHints.scala

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ case class InlayHints(
4141
hint.setPosition(pos)
4242
val (label, dataInfo) = labelParts.map(lp => (lp.label, lp.data)).unzip
4343
hint.setLabel(label.asJava)
44-
hint.setData(InlayHints.toData(uri, dataInfo))
44+
hint.setData(InlayHints.toData(uri.toString(), dataInfo))
4545
hint.setKind(kind)
4646
hint
4747
}
@@ -96,22 +96,24 @@ object InlayHints {
9696
buffer.toList.filter(_.name.nonEmpty)
9797
}
9898

99-
def toData(uri: URI, data: List[Either[String, l.Position]]): JsonElement =
99+
def toData(uri: String, data: List[Either[String, l.Position]]): JsonElement =
100100
gson.toJsonTree(
101101
InlineHintData(
102102
uri,
103103
data.map {
104104
case Left(str) => LabelPartData("string", str, null)
105105
case Right(pos) => LabelPartData("position", null, pos)
106-
}.asJava
106+
}.toArray
107107
)
108108
)
109109

110-
def fromData(json: JsonElement): (URI, List[Either[String, l.Position]]) = {
110+
def fromData(
111+
json: JsonElement
112+
): (String, List[Either[String, l.Position]]) = {
111113
val data = gson.fromJson(json, classOf[InlineHintData])
112114
(
113115
data.uri,
114-
data.labelParts.asScala.toList.map { part =>
116+
data.labelParts.toList.map { part =>
115117
part.dataType match {
116118
case "position" => Right(part.position)
117119
case "string" => Left(part.string)
@@ -122,8 +124,8 @@ object InlayHints {
122124
}
123125

124126
final case class InlineHintData(
125-
uri: URI,
126-
labelParts: java.util.List[LabelPartData]
127+
uri: String,
128+
labelParts: Array[LabelPartData]
127129
)
128130

129131
// "string" or "position"

tests/unit/src/main/scala/tests/BaseInlayHintsExpectSuite.scala

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package tests
33
import scala.meta.internal.metals.CompilerInlayHintsParams
44
import scala.meta.internal.metals.CompilerRangeParams
55
import scala.meta.internal.metals.EmptyCancelToken
6+
import scala.meta.internal.metals.InlayHintCompat
67
import scala.meta.internal.metals.MetalsEnrichments._
78
import scala.meta.pc.PresentationCompiler
89

@@ -35,7 +36,15 @@ abstract class BaseInlayHintsExpectSuite(
3536
true,
3637
)
3738
val inlayHints =
38-
compiler.inlayHints(pcParams).get().asScala.toList
39+
compiler
40+
.inlayHints(pcParams)
41+
.get()
42+
.asScala
43+
.toList
44+
.map(
45+
InlayHintCompat
46+
.maybeFixInlayHintData(_, file.file.toURI.toString())
47+
)
3948
TestInlayHints.applyInlayHints(file.code, inlayHints)
4049
},
4150
)

0 commit comments

Comments
 (0)