Skip to content

Commit 9c4520e

Browse files
Implement hole hover for website playground (#1010)
Fixes effekt-lang/effekt-website#3.
1 parent e6a3736 commit 9c4520e

File tree

3 files changed

+15
-17
lines changed

3 files changed

+15
-17
lines changed

effekt/js/src/main/scala/effekt/LanguageServer.scala

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,9 @@ class LanguageServer extends Intelligence {
7272
@JSExport
7373
def infoAt(path: String, pos: lsp.Position): String = {
7474
val p = fromLSPPosition(pos, VirtualFileSource(path))
75-
for {
76-
(tree, sym) <- getSymbolAt(p)
77-
info <- getInfoOf(sym)
78-
} yield info.fullDescription
79-
}.orNull
75+
val hover = getSymbolHover(p)(using context) orElse getHoleHover(p)(using context)
76+
hover.orNull
77+
}
8078

8179
@JSExport
8280
def typecheck(path: String): js.Array[lsp.Diagnostic] = {

effekt/jvm/src/main/scala/effekt/Server.scala

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -264,25 +264,14 @@ class Server(config: EffektConfig, compileOnChange: Boolean=false) extends Langu
264264
}
265265
position match
266266
case Some(position) => {
267-
val hover = getSymbolHover(position) orElse getHoleHover(position)
267+
val hover = getSymbolHover(position, settingBool("showExplanations"))(using context) orElse getHoleHover(position)(using context)
268268
val markup = new MarkupContent("markdown", hover.getOrElse(""))
269269
val result = new Hover(markup, new LSPRange(params.getPosition, params.getPosition))
270270
CompletableFuture.completedFuture(result)
271271
}
272272
case None => CompletableFuture.completedFuture(new Hover())
273273
}
274274

275-
def getSymbolHover(position: Position): Option[String] = for {
276-
(tree, sym) <- getSymbolAt(position)(using context)
277-
info <- getInfoOf(sym)(using context)
278-
} yield if (settingBool("showExplanations")) info.fullDescription else info.shortDescription
279-
280-
def getHoleHover(position: Position): Option[String] = for {
281-
trees <- getTreesAt(position)(using context)
282-
tree <- trees.collectFirst { case h: source.Hole => h }
283-
info <- getHoleInfo(tree)(using context)
284-
} yield info
285-
286275
// LSP Document Symbols
287276
//
288277
//

effekt/shared/src/main/scala/effekt/Intelligence.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,17 @@ trait Intelligence {
116116
case s => s
117117
}
118118

119+
def getSymbolHover(position: Position, fullDescription: Boolean = true)(using C: Context): Option[String] = for {
120+
(tree, sym) <- getSymbolAt(position)
121+
info <- getInfoOf(sym)
122+
} yield if (fullDescription) info.fullDescription else info.shortDescription
123+
124+
def getHoleHover(position: Position)(using C: Context): Option[String] = for {
125+
trees <- getTreesAt(position)
126+
tree <- trees.collectFirst { case h: source.Hole => h }
127+
info <- getHoleInfo(tree)
128+
} yield info
129+
119130
def getHoleInfo(hole: source.Hole)(using C: Context): Option[String] = for {
120131
(outerTpe, outerEff) <- C.inferredTypeAndEffectOption(hole)
121132
(innerTpe, innerEff) <- C.inferredTypeAndEffectOption(hole.stmts)

0 commit comments

Comments
 (0)