Skip to content

Commit 80c8dc8

Browse files
committed
language-server: Simplify position mapping for worksheets
Instead of having a positionMapper argument for `range`, `location`, etc, choose the right `positionMapper` in range directly
1 parent 3dce19e commit 80c8dc8

File tree

1 file changed

+30
-27
lines changed

1 file changed

+30
-27
lines changed

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

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -240,17 +240,20 @@ class DottyLanguageServer extends LanguageServer
240240
val document = params.getTextDocument
241241
val uri = new URI(document.getUri)
242242
val driver = driverFor(uri)
243+
implicit val ctx = driver.currentCtx
243244
val worksheetMode = isWorksheet(uri)
244245

245-
val (text, positionMapper) =
246-
if (worksheetMode) (wrapWorksheet(document.getText), Some(toUnwrappedPosition _))
247-
else (document.getText, None)
246+
val text =
247+
if (worksheetMode)
248+
wrapWorksheet(document.getText)
249+
else
250+
document.getText
248251

249252
val diags = driver.run(uri, text)
250253

251254
client.publishDiagnostics(new PublishDiagnosticsParams(
252255
document.getUri,
253-
diags.flatMap(diagnostic(_, positionMapper)(driver.currentCtx)).asJava))
256+
diags.flatMap(diagnostic).asJava))
254257
}
255258

256259
override def didChange(params: DidChangeTextDocumentParams): Unit = {
@@ -262,19 +265,22 @@ class DottyLanguageServer extends LanguageServer
262265
checkMemory()
263266

264267
val driver = driverFor(uri)
268+
implicit val ctx = driver.currentCtx
265269

266270
val change = params.getContentChanges.get(0)
267271
assert(change.getRange == null, "TextDocumentSyncKind.Incremental support is not implemented")
268272

269-
val (text, positionMapper) =
270-
if (worksheetMode) (wrapWorksheet(change.getText), Some(toUnwrappedPosition _))
271-
else (change.getText, None)
273+
val text =
274+
if (worksheetMode)
275+
wrapWorksheet(change.getText)
276+
else
277+
change.getText
272278

273279
val diags = driver.run(uri, text)
274280

275281
client.publishDiagnostics(new PublishDiagnosticsParams(
276282
document.getUri,
277-
diags.flatMap(diagnostic(_, positionMapper)(driver.currentCtx)).asJava))
283+
diags.flatMap(diagnostic).asJava))
278284
}
279285
}
280286

@@ -324,7 +330,7 @@ class DottyLanguageServer extends LanguageServer
324330
val path = Interactive.pathTo(driver.openedTrees(uri), pos)
325331

326332
val definitions = Interactive.findDefinitions(path, pos, driver).toList
327-
definitions.flatMap(d => location(d.namePos, positionMapperFor(d.source))).asJava
333+
definitions.flatMap(d => location(d.namePos)).asJava
328334
}
329335

330336
override def references(params: ReferenceParams) = computeAsync { cancelToken =>
@@ -359,7 +365,7 @@ class DottyLanguageServer extends LanguageServer
359365
val name = definition.name(ctx).sourceModuleName.toString
360366
val trees = remoteDriver.sourceTreesContaining(name)(ctx)
361367
val matches = Interactive.findTreesMatching(trees, includes, definition)(ctx)
362-
matches.map(tree => location(tree.namePos(ctx), positionMapperFor(tree.source)))
368+
matches.map(tree => location(tree.namePos(ctx)))
363369
}
364370
}
365371
}.toList
@@ -429,7 +435,7 @@ class DottyLanguageServer extends LanguageServer
429435
.flatMap((uriOpt, ref) => uriOpt.map(uri => (uri.toString, ref)))
430436
.mapValues(refs =>
431437
refs.flatMap(ref =>
432-
range(ref.namePos, positionMapperFor(ref.source)).map(nameRange => new TextEdit(nameRange, newName))).distinct.asJava)
438+
range(ref.namePos).map(nameRange => new TextEdit(nameRange, newName))).distinct.asJava)
433439

434440
new WorkspaceEdit(changes.asJava)
435441
}
@@ -449,7 +455,7 @@ class DottyLanguageServer extends LanguageServer
449455
val refs = Interactive.findTreesMatching(uriTrees, includes, sym)
450456
(for {
451457
ref <- refs
452-
nameRange <- range(ref.namePos, positionMapperFor(ref.source))
458+
nameRange <- range(ref.namePos)
453459
} yield new DocumentHighlight(nameRange, DocumentHighlightKind.Read))
454460
}.distinct.asJava
455461
}
@@ -488,7 +494,7 @@ class DottyLanguageServer extends LanguageServer
488494
val defs = Interactive.namedTrees(uriTrees, Include.empty)
489495
(for {
490496
d <- defs if !isWorksheetWrapper(d)
491-
info <- symbolInfo(d.tree.symbol, d.namePos, positionMapperFor(d.source))
497+
info <- symbolInfo(d.tree.symbol, d.namePos)
492498
} yield JEither.forLeft(info)).asJava
493499
}
494500

@@ -500,7 +506,7 @@ class DottyLanguageServer extends LanguageServer
500506

501507
val trees = driver.sourceTreesContaining(query)
502508
val defs = Interactive.namedTrees(trees, Include.empty, _.name.toString.contains(query))
503-
defs.flatMap(d => symbolInfo(d.tree.symbol, d.namePos, positionMapperFor(d.source)))
509+
defs.flatMap(d => symbolInfo(d.tree.symbol, d.namePos))
504510
}.asJava
505511
}
506512

@@ -528,7 +534,7 @@ class DottyLanguageServer extends LanguageServer
528534
tree => predicates.exists(_(tree))
529535
}
530536
val matches = Interactive.namedTrees(trees, Include.local, predicate)(ctx)
531-
matches.map(tree => location(tree.namePos(ctx), positionMapperFor(tree.source)))
537+
matches.map(tree => location(tree.namePos(ctx)))
532538
}
533539
}.toList
534540

@@ -653,9 +659,9 @@ object DottyLanguageServer {
653659
}
654660

655661
/** Convert a SourcePosition to an lsp4j.Range */
656-
def range(p: SourcePosition, positionMapper: Option[SourcePosition => SourcePosition] = None): Option[lsp4j.Range] =
662+
def range(p: SourcePosition): Option[lsp4j.Range] =
657663
if (p.exists) {
658-
val mappedPosition = positionMapper.map(_(p)).getOrElse(p)
664+
val mappedPosition = positionMapperFor(p.source).map(_(p)).getOrElse(p)
659665
Some(new lsp4j.Range(
660666
new lsp4j.Position(mappedPosition.startLine, mappedPosition.startColumn),
661667
new lsp4j.Position(mappedPosition.endLine, mappedPosition.endColumn)
@@ -664,19 +670,16 @@ object DottyLanguageServer {
664670
None
665671

666672
/** Convert a SourcePosition to an lsp4.Location */
667-
def location(p: SourcePosition, positionMapper: Option[SourcePosition => SourcePosition] = None): Option[lsp4j.Location] =
673+
def location(p: SourcePosition): Option[lsp4j.Location] =
668674
for {
669675
uri <- toUriOption(p.source)
670-
r <- range(p, positionMapper)
676+
r <- range(p)
671677
} yield new lsp4j.Location(uri.toString, r)
672678

673679
/**
674-
* Convert a MessageContainer to an lsp4j.Diagnostic. The positions are transformed vy
675-
* `positionMapper`.
680+
* Convert a MessageContainer to an lsp4j.Diagnostic.
676681
*/
677-
def diagnostic(mc: MessageContainer,
678-
positionMapper: Option[SourcePosition => SourcePosition] = None
679-
)(implicit ctx: Context): Option[lsp4j.Diagnostic] =
682+
def diagnostic(mc: MessageContainer)(implicit ctx: Context): Option[lsp4j.Diagnostic] =
680683
if (!mc.pos.exists)
681684
None // diagnostics without positions are not supported: https://github.com/Microsoft/language-server-protocol/issues/249
682685
else {
@@ -697,7 +700,7 @@ object DottyLanguageServer {
697700
val message = mc.contained()
698701
if (displayMessage(message, mc.pos.source)) {
699702
val code = message.errorId.errorNumber.toString
700-
range(mc.pos, positionMapper).map(r =>
703+
range(mc.pos).map(r =>
701704
new lsp4j.Diagnostic(
702705
r, mc.message, severity(mc.level), /*source =*/ "", code))
703706
} else {
@@ -866,7 +869,7 @@ object DottyLanguageServer {
866869
}
867870

868871
/** Create an lsp4j.SymbolInfo from a Symbol and a SourcePosition */
869-
def symbolInfo(sym: Symbol, pos: SourcePosition, positionMapper: Option[SourcePosition => SourcePosition])(implicit ctx: Context): Option[lsp4j.SymbolInformation] = {
872+
def symbolInfo(sym: Symbol, pos: SourcePosition)(implicit ctx: Context): Option[lsp4j.SymbolInformation] = {
870873
def symbolKind(sym: Symbol)(implicit ctx: Context): lsp4j.SymbolKind = {
871874
import lsp4j.{SymbolKind => SK}
872875

@@ -893,7 +896,7 @@ object DottyLanguageServer {
893896
else
894897
null
895898

896-
location(pos, positionMapper).map(l => new lsp4j.SymbolInformation(name, symbolKind(sym), l, containerName))
899+
location(pos).map(l => new lsp4j.SymbolInformation(name, symbolKind(sym), l, containerName))
897900
}
898901

899902
/** Convert `signature` to a `SignatureInformation` */

0 commit comments

Comments
 (0)