Skip to content

Commit 859c5db

Browse files
authored
Merge pull request #4828 from dotty-staging/release/vscode-dotty-0.1.5
Upgrade IDE dependencies, release vscode-dotty 0.1.5
2 parents ec94614 + aa70ed3 commit 859c5db

File tree

9 files changed

+561
-1178
lines changed

9 files changed

+561
-1178
lines changed

language-server/src/dotty/tools/languageserver/DottyLanguageServer.scala

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ class DottyLanguageServer extends LanguageServer
222222

223223

224224
// FIXME: share code with messages.NotAMember
225-
override def completion(params: TextDocumentPositionParams) = computeAsync { cancelToken =>
225+
override def completion(params: CompletionParams) = computeAsync { cancelToken =>
226226
val uri = new URI(params.getTextDocument.getUri)
227227
val driver = driverFor(uri)
228228
implicit val ctx = driver.currentCtx
@@ -344,12 +344,12 @@ class DottyLanguageServer extends LanguageServer
344344
val tp = Interactive.enclosingType(trees, pos)
345345
val tpw = tp.widenTermRefExpr
346346

347-
if (tpw == NoType) new Hover
347+
if (tpw == NoType) null // null here indicates that no response should be sent
348348
else {
349349
val symbol = Interactive.enclosingSourceSymbol(trees, pos)
350350
val docComment = ctx.docCtx.flatMap(_.docstring(symbol))
351-
val markedStrings = docMarkedStrings(docComment, tpw.show.toString)
352-
new Hover(markedStrings.map(JEither.forRight(_)).asJava, null)
351+
val content = hoverContent(tpw.show, docComment)
352+
new Hover(content, null)
353353
}
354354
}
355355

@@ -459,26 +459,31 @@ object DottyLanguageServer {
459459
CIK.Field
460460
}
461461

462-
val label = sym.name.show.toString
462+
val label = sym.name.show
463463
val item = new lsp4j.CompletionItem(label)
464-
item.setDetail(sym.info.widenTermRefExpr.show.toString)
464+
item.setDetail(sym.info.widenTermRefExpr.show)
465465
item.setKind(completionItemKind(sym))
466466
item
467467
}
468468

469-
private def docMarkedStrings(comment: Option[Comment], typeInfo: String): List[lsp4j.MarkedString] = {
470-
471-
val docHover = comment.map { comment =>
472-
new lsp4j.MarkedString("scala", comment.raw)
473-
}
474-
475-
val typeInfoHover = new lsp4j.MarkedString()
476-
typeInfoHover.setValue(typeInfo)
477-
478-
typeInfoHover :: docHover.toList
469+
private def hoverContent(typeInfo: String, comment: Option[Comment]): lsp4j.MarkupContent = {
470+
val markup = new lsp4j.MarkupContent
471+
markup.setKind("markdown")
472+
markup.setValue((
473+
comment.map(_.raw) match {
474+
case Some(comment) =>
475+
s"""```scala
476+
|$typeInfo
477+
|$comment
478+
|```"""
479+
case None =>
480+
s"""```scala
481+
|$typeInfo
482+
|```"""
483+
}).stripMargin)
484+
markup
479485
}
480486

481-
482487
/** Create an lsp4j.SymbolInfo from a Symbol and a SourcePosition */
483488
def symbolInfo(sym: Symbol, pos: SourcePosition)(implicit ctx: Context): lsp4j.SymbolInformation = {
484489
def symbolKind(sym: Symbol)(implicit ctx: Context): lsp4j.SymbolKind = {
@@ -498,10 +503,10 @@ object DottyLanguageServer {
498503
SK.Field
499504
}
500505

501-
val name = sym.name.show.toString
506+
val name = sym.name.show
502507
val containerName =
503508
if (sym.owner.exists && !sym.owner.isEmptyPackage)
504-
sym.owner.name.show.toString
509+
sym.owner.name.show
505510
else
506511
null
507512

language-server/test/dotty/tools/languageserver/HoverTest.scala

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,62 +5,73 @@ import org.junit.Test
55
import dotty.tools.languageserver.util.Code._
66

77
class HoverTest {
8+
def hoverContent(typeInfo: String, comment: String = ""): Option[String] =
9+
Some((
10+
if (comment == "")
11+
s"""```scala
12+
|$typeInfo
13+
|```"""
14+
else
15+
s"""```scala
16+
|$typeInfo
17+
|$comment
18+
|```""").stripMargin)
819

920
@Test def hoverOnWhiteSpace0: Unit =
10-
code"$m1 $m2".withSource.hover(m1 to m2, Nil)
21+
code"$m1 $m2".withSource.hover(m1 to m2, None)
1122

1223
@Test def hoverOnClassShowsDoc: Unit = {
1324
code"""$m1 /** foo */ ${m2}class Foo $m3 $m4""".withSource
14-
.hover(m1 to m2, Nil)
15-
.hover(m2 to m3, List("Foo", "/** foo */"))
16-
.hover(m3 to m4, Nil)
25+
.hover(m1 to m2, None)
26+
.hover(m2 to m3, hoverContent("Foo", "/** foo */"))
27+
.hover(m3 to m4, None)
1728
}
1829

1930
@Test def hoverOnClass0: Unit = {
2031
code"""$m1 ${m2}class Foo $m3 $m4""".withSource
21-
.hover(m1 to m2, Nil)
22-
.hover(m2 to m3, "Foo" :: Nil)
23-
.hover(m3 to m4, Nil)
32+
.hover(m1 to m2, None)
33+
.hover(m2 to m3, hoverContent("Foo"))
34+
.hover(m3 to m4, None)
2435
}
2536

2637
@Test def hoverOnClass1: Unit = {
2738
code"""$m1 ${m2}class Foo { } $m3 $m4""".withSource
28-
.hover(m1 to m2, Nil)
29-
.hover(m2 to m3, "Foo" :: Nil)
30-
.hover(m3 to m4, Nil)
39+
.hover(m1 to m2, None)
40+
.hover(m2 to m3, hoverContent("Foo"))
41+
.hover(m3 to m4, None)
3142
}
3243

3344
@Test def hoverOnValDef0: Unit = {
3445
code"""class Foo {
3546
| ${m1}val x = ${m2}8$m3; ${m4}x$m5
3647
|}""".withSource
37-
.hover(m1 to m2, "Int" :: Nil)
38-
.hover(m2 to m3, "Int(8)" :: Nil)
39-
.hover(m4 to m5, "Int" :: Nil)
48+
.hover(m1 to m2, hoverContent("Int"))
49+
.hover(m2 to m3, hoverContent("Int(8)"))
50+
.hover(m4 to m5, hoverContent("Int"))
4051
}
4152

4253
@Test def hoverOnValDef1: Unit = {
4354
code"""class Foo {
4455
| ${m1}final val x = 8$m2; ${m3}x$m4
4556
|}""".withSource
46-
.hover(m1 to m2, "Int(8)" :: Nil)
47-
.hover(m3 to m4, "Int(8)" :: Nil)
57+
.hover(m1 to m2, hoverContent("Int(8)"))
58+
.hover(m3 to m4, hoverContent("Int(8)"))
4859
}
4960

5061
@Test def hoverOnDefDef0: Unit = {
5162
code"""class Foo {
5263
| ${m1}def x = ${m2}8$m3; ${m4}x$m5
5364
|}""".withSource
54-
.hover(m1 to m2, "Int" :: Nil)
55-
.hover(m2 to m3, "Int(8)" :: Nil)
56-
.hover(m4 to m5, "Int" :: Nil)
65+
.hover(m1 to m2, hoverContent("Int"))
66+
.hover(m2 to m3, hoverContent("Int(8)"))
67+
.hover(m4 to m5, hoverContent("Int"))
5768
}
5869

5970
@Test def hoverMissingRef0: Unit = {
6071
code"""class Foo {
6172
| ${m1}x$m2
6273
|}""".withSource
63-
.hover(m1 to m2, "<error not found: x>" :: Nil)
74+
.hover(m1 to m2, hoverContent("<error not found: x>" ))
6475
}
6576

6677
@Test def hoverFun0: Unit = {
@@ -72,10 +83,10 @@ class HoverTest {
7283
| ${m5}y($m6)$m7
7384
|}
7485
""".withSource
75-
.hover(m1 to m2, "String(\"abc\")" :: Nil)
76-
.hover(m3 to m4, "String" :: Nil)
77-
.hover(m5 to m6, "(): Int" :: Nil)
78-
.hover(m6 to m7, "Int" :: Nil)
86+
.hover(m1 to m2, hoverContent("String(\"abc\")" ))
87+
.hover(m3 to m4, hoverContent("String"))
88+
.hover(m5 to m6, hoverContent("(): Int"))
89+
.hover(m6 to m7, hoverContent("Int"))
7990
}
8091

8192
}

language-server/test/dotty/tools/languageserver/util/CodeTester.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ class CodeTester(sources: List[SourceWithPositions], actions: List[Action]) {
2525
* Perform a hover over `range`, verifies that result matches `expected`.
2626
*
2727
* @param range The range over which to hover.
28-
* @param expected The expected results.
28+
* @param expected The expected result.
2929
*
3030
* @see dotty.tools.languageserver.util.actions.CodeHover
3131
*/
32-
def hover(range: CodeRange, expected: List[String]): this.type =
32+
def hover(range: CodeRange, expected: Option[String]): this.type =
3333
doAction(new CodeHover(range, expected))
3434

3535
/**

language-server/test/dotty/tools/languageserver/util/actions/CodeCompletion.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class CodeCompletion(override val marker: CodeMarker,
2020
expected: Set[(String, CompletionItemKind, String)]) extends ActionOnMarker {
2121

2222
override def execute(): Exec[Unit] = {
23-
val result = server.completion(marker.toTextDocumentPositionParams).get()
23+
val result = server.completion(marker.toCompletionParams).get()
2424
assertTrue(s"Completion results were not 'right': $result", result.isRight)
2525
assertFalse(s"Completion results were 'incomplete': $result", result.getRight.isIncomplete)
2626
val completionResults = result.getRight.getItems.asScala.toSet.map { item =>

language-server/test/dotty/tools/languageserver/util/actions/CodeHover.scala

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,24 @@ import scala.collection.JavaConverters._
1111
* An action requesting for the info shown when `range` is hovered.
1212
* This action corresponds to the `textDocument/hover` method of the Language Server Protocol.
1313
*
14-
* @param range The range of positions that should be hovered.
15-
* @param expected The expected result.
14+
* @param range The range of positions that should be hovered.
15+
* @param expected None if no response is expected, the expected Markdown string otherwise.
1616
*/
17-
class CodeHover(override val range: CodeRange, expected: List[String]) extends ActionOnRange {
17+
class CodeHover(override val range: CodeRange, expectedOpt: Option[String]) extends ActionOnRange {
1818

1919
override def onMarker(marker: CodeMarker): Exec[Unit] = {
2020
val result = server.hover(marker.toTextDocumentPositionParams).get()
21-
assertNull(result.getRange)
22-
if (expected.isEmpty) assertNull(result.getContents)
23-
else {
24-
assertEquals(expected.size, result.getContents.size)
25-
expected.zip(result.getContents.asScala).foreach { case (expected, actual) =>
26-
assertTrue(actual.isRight)
27-
assertEquals(expected, actual.getRight.getValue)
28-
}
21+
expectedOpt match {
22+
case None =>
23+
assertNull(result)
24+
case Some(expected) =>
25+
assertNull(result.getRange)
26+
val contents = result.getContents.getRight
27+
assertEquals(contents.getKind, "markdown")
28+
assertEquals(expected, contents.getValue)
2929
}
3030
}
3131

3232
override def show: PositionContext.PosCtx[String] =
33-
s"CodeHover(${range.show}, $expected)"
33+
s"CodeHover(${range.show}, $expectedOpt)"
3434
}

language-server/test/dotty/tools/languageserver/util/embedded/CodeMarker.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ class CodeMarker(val name: String) extends Embedded {
3131
def toDocumentSymbolParams: PosCtx[DocumentSymbolParams] =
3232
new DocumentSymbolParams(toTextDocumentIdentifier)
3333

34+
def toCompletionParams: PosCtx[CompletionParams] =
35+
new CompletionParams(toTextDocumentIdentifier, toPosition)
36+
3437
def toRenameParams(newName: String): PosCtx[RenameParams] =
3538
new RenameParams(toTextDocumentIdentifier, toPosition, newName)
3639

project/Build.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,7 @@ object Build {
770770
fork in run := true,
771771
fork in Test := true,
772772
libraryDependencies ++= Seq(
773-
"org.eclipse.lsp4j" % "org.eclipse.lsp4j" % "0.3.0",
773+
"org.eclipse.lsp4j" % "org.eclipse.lsp4j" % "0.4.1",
774774
Dependencies.`jackson-databind`
775775
),
776776
javaOptions := (javaOptions in `dotty-compiler-bootstrapped`).value,
@@ -891,7 +891,7 @@ object Build {
891891
settings(commonSettings).
892892
settings(
893893
EclipseKeys.skipProject := true,
894-
version := "0.1.4", // Keep in sync with package.json
894+
version := "0.1.5", // Keep in sync with package.json
895895
autoScalaLibrary := false,
896896
publishArtifact := false,
897897
includeFilter in unmanagedSources := NothingFilter | "*.ts" | "**.json",

0 commit comments

Comments
 (0)