@@ -24,6 +24,7 @@ import classpath.ClassPathEntries
2424import reporting ._ , reporting .diagnostic .MessageContainer
2525import util ._
2626import interactive ._ , interactive .InteractiveDriver ._
27+ import Interactive .Include
2728
2829import languageserver .config .ProjectConfig
2930
@@ -207,24 +208,27 @@ class DottyLanguageServer extends LanguageServer
207208 /* isIncomplete = */ false , items.map(completionItem).asJava))
208209 }
209210
211+ /** If cursor is on a reference, show its definition and all overriding definitions.
212+ * If cursor is on a definition, show this definition together with all overridden
213+ * and overriding definitions.
214+ * For performance reasons we currently look for overrides only in the file
215+ * where `sym` is defined.
216+ */
210217 override def definition (params : TextDocumentPositionParams ) = computeAsync { cancelToken =>
211218 val uri = new URI (params.getTextDocument.getUri)
212219 val driver = driverFor(uri)
213220 implicit val ctx = driver.currentCtx
214221
215222 val pos = sourcePosition(driver, uri, params.getPosition)
216- val sym = Interactive .enclosingSourceSymbol(driver.openedTrees(uri), pos)
223+ val enclTree = Interactive .enclosingTree(driver.openedTrees(uri), pos)
224+ val sym = Interactive .sourceSymbol(enclTree.symbol)
217225
218226 if (sym == NoSymbol ) Nil .asJava
219227 else {
220- // This returns the position of sym as well as the overrides of sym, but
221- // for performance we only look for overrides in the file where sym is
222- // defined.
223- // We need a configuration option to choose how "go to definition" should
224- // behave with respect to overriding and overriden definitions, ideally
225- // this should be part of the LSP protocol.
226228 val trees = SourceTree .fromSymbol(sym.topLevelClass.asClass).toList
227- val defs = Interactive .namedTrees(trees, includeReferences = false , includeOverridden = true , sym)
229+ var include = Include .overriding
230+ if (enclTree.isInstanceOf [MemberDef ]) include |= Include .overridden
231+ val defs = Interactive .namedTrees(trees, include, sym)
228232 defs.map(d => location(d.namePos)).asJava
229233 }
230234 }
@@ -246,7 +250,7 @@ class DottyLanguageServer extends LanguageServer
246250 val trees = driver.allTreesContaining(sym.name.sourceModuleName.toString)
247251 val refs = Interactive .namedTrees(trees, includeReferences = true , (tree : tpd.NameTree ) =>
248252 (includeDeclaration || ! Interactive .isDefinition(tree))
249- && Interactive .matchSymbol(tree, sym, includeOverridden = true ))
253+ && Interactive .matchSymbol(tree, sym, Include .overriding ))
250254
251255 refs.map(ref => location(ref.namePos)).asJava
252256 }
@@ -267,8 +271,8 @@ class DottyLanguageServer extends LanguageServer
267271 val newName = params.getNewName
268272
269273 val refs = Interactive .namedTrees(trees, includeReferences = true , tree =>
270- (Interactive .matchSymbol(tree, sym, includeOverridden = true )
271- || (linkedSym != NoSymbol && Interactive .matchSymbol(tree, linkedSym, includeOverridden = true ))))
274+ (Interactive .matchSymbol(tree, sym, Include .overriding )
275+ || (linkedSym != NoSymbol && Interactive .matchSymbol(tree, linkedSym, Include .overriding ))))
272276
273277 val changes = refs.groupBy(ref => toUri(ref.source).toString).mapValues(_.map(ref => new TextEdit (range(ref.namePos), newName)).asJava)
274278
@@ -287,7 +291,7 @@ class DottyLanguageServer extends LanguageServer
287291
288292 if (sym == NoSymbol ) Nil .asJava
289293 else {
290- val refs = Interactive .namedTrees(uriTrees, includeReferences = true , includeOverridden = true , sym)
294+ val refs = Interactive .namedTrees(uriTrees, Include .references | Include .overriding , sym)
291295 refs.map(ref => new DocumentHighlight (range(ref.namePos), DocumentHighlightKind .Read )).asJava
292296 }
293297 }
0 commit comments