@@ -24,6 +24,7 @@ import classpath.ClassPathEntries
24
24
import reporting ._ , reporting .diagnostic .MessageContainer
25
25
import util ._
26
26
import interactive ._ , interactive .InteractiveDriver ._
27
+ import Interactive .Include
27
28
28
29
import languageserver .config .ProjectConfig
29
30
@@ -207,24 +208,27 @@ class DottyLanguageServer extends LanguageServer
207
208
/* isIncomplete = */ false , items.map(completionItem).asJava))
208
209
}
209
210
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
+ */
210
217
override def definition (params : TextDocumentPositionParams ) = computeAsync { cancelToken =>
211
218
val uri = new URI (params.getTextDocument.getUri)
212
219
val driver = driverFor(uri)
213
220
implicit val ctx = driver.currentCtx
214
221
215
222
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)
217
225
218
226
if (sym == NoSymbol ) Nil .asJava
219
227
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.
226
228
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)
228
232
defs.map(d => location(d.namePos)).asJava
229
233
}
230
234
}
@@ -246,7 +250,7 @@ class DottyLanguageServer extends LanguageServer
246
250
val trees = driver.allTreesContaining(sym.name.sourceModuleName.toString)
247
251
val refs = Interactive .namedTrees(trees, includeReferences = true , (tree : tpd.NameTree ) =>
248
252
(includeDeclaration || ! Interactive .isDefinition(tree))
249
- && Interactive .matchSymbol(tree, sym, includeOverridden = true ))
253
+ && Interactive .matchSymbol(tree, sym, Include .overriding ))
250
254
251
255
refs.map(ref => location(ref.namePos)).asJava
252
256
}
@@ -267,8 +271,8 @@ class DottyLanguageServer extends LanguageServer
267
271
val newName = params.getNewName
268
272
269
273
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 ))))
272
276
273
277
val changes = refs.groupBy(ref => toUri(ref.source).toString).mapValues(_.map(ref => new TextEdit (range(ref.namePos), newName)).asJava)
274
278
@@ -287,7 +291,7 @@ class DottyLanguageServer extends LanguageServer
287
291
288
292
if (sym == NoSymbol ) Nil .asJava
289
293
else {
290
- val refs = Interactive .namedTrees(uriTrees, includeReferences = true , includeOverridden = true , sym)
294
+ val refs = Interactive .namedTrees(uriTrees, Include .references | Include .overriding , sym)
291
295
refs.map(ref => new DocumentHighlight (range(ref.namePos), DocumentHighlightKind .Read )).asJava
292
296
}
293
297
}
0 commit comments