Skip to content

Commit 189bf3e

Browse files
committed
Support go to definition in non-top-level imports
This still doesn't work for top level imports, because we do not keep those trees around.
1 parent f54e7aa commit 189bf3e

File tree

1 file changed

+34
-12
lines changed

1 file changed

+34
-12
lines changed

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

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -251,18 +251,40 @@ class DottyLanguageServer extends LanguageServer
251251
val enclTree = Interactive.enclosingTree(driver.openedTrees(uri), pos)
252252
val sym = Interactive.sourceSymbol(enclTree.symbol)
253253

254-
if (sym == NoSymbol) Nil.asJava
255-
else {
256-
val (trees, include) =
257-
if (enclTree.isInstanceOf[MemberDef])
258-
(driver.allTreesContaining(sym.name.sourceModuleName.toString),
259-
Include.overriding | Include.overridden)
260-
else
261-
(SourceTree.fromSymbol(sym.topLevelClass.asClass).toList,
262-
Include.overriding)
263-
val defs = Interactive.namedTrees(trees, include, sym)
264-
defs.map(d => location(d.namePos)).asJava
265-
}
254+
val defs =
255+
if (sym == NoSymbol) Nil
256+
else enclTree match {
257+
case imp: Import =>
258+
def lookup(name: Name): Symbol = {
259+
imp.expr.tpe.member(name).symbol
260+
}
261+
val importedSyms = imp.selectors.flatMap {
262+
case id: Ident if id.pos.contains(pos.pos) =>
263+
lookup(id.name) :: lookup(id.name.toTypeName) :: Nil
264+
case thicket @ Thicket((id: Ident) :: (_: Ident) :: Nil) if thicket.pos.contains(pos.pos) =>
265+
lookup(id.name) :: lookup(id.name.toTypeName) :: Nil
266+
case _ =>
267+
Nil
268+
}
269+
270+
importedSyms.flatMap { sym =>
271+
val trees = driver.allTreesContaining(sym.name.sourceModuleName.toString)
272+
val defSymbol = if (sym is Flags.ModuleVal) sym.moduleClass else sym
273+
Interactive.namedTrees(trees, Include.overriding, defSymbol)
274+
}
275+
276+
case _ =>
277+
val (trees, include) =
278+
if (enclTree.isInstanceOf[MemberDef])
279+
(driver.allTreesContaining(sym.name.sourceModuleName.toString),
280+
Include.overriding | Include.overridden)
281+
else
282+
(SourceTree.fromSymbol(sym.topLevelClass.asClass).toList,
283+
Include.overriding)
284+
Interactive.namedTrees(trees, include, sym)
285+
}
286+
287+
defs.map(d => location(d.namePos)).asJava
266288
}
267289

268290
override def references(params: ReferenceParams) = computeAsync { cancelToken =>

0 commit comments

Comments
 (0)