Skip to content

Commit 6f141db

Browse files
committed
Add Include.local
This include flag means that local symbols and trees should be inspected.
1 parent b40313a commit 6f141db

File tree

3 files changed

+36
-20
lines changed

3 files changed

+36
-20
lines changed

compiler/src/dotty/tools/dotc/interactive/Interactive.scala

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import scala.collection._
88
import ast.{NavigateAST, Trees, tpd, untpd}
99
import core._, core.Decorators.{sourcePos => _, _}
1010
import Contexts._, Flags._, Names._, NameOps._, Symbols._, Trees._, Types._
11+
import transform.SymUtils.decorateSymbol
1112
import util.Positions._, util.SourceFile, util.SourcePosition
1213
import core.Denotations.SingleDenotation
1314
import NameKinds.SimpleNameKind
@@ -33,6 +34,7 @@ object Interactive {
3334
def isDefinitions: Boolean = (bits & definitions.bits) != 0
3435
def isLinkedClass: Boolean = (bits & linkedClass.bits) != 0
3536
def isImports: Boolean = (bits & imports.bits) != 0
37+
def isLocal: Boolean = (bits & local.bits) != 0
3638
}
3739

3840
/** The empty set */
@@ -59,6 +61,9 @@ object Interactive {
5961
/** Include imports in the results */
6062
val imports: Set = Set(1 << 5)
6163

64+
/** Include local symbols, inspect local trees */
65+
val local: Set = Set(1 << 6)
66+
6267
/** All the flags */
6368
val all: Set = Set(~0)
6469
}
@@ -327,23 +332,29 @@ object Interactive {
327332

328333
def traverser(source: SourceFile) = {
329334
new untpd.TreeTraverser {
335+
private def handle(utree: untpd.NameTree): Unit = {
336+
val tree = utree.asInstanceOf[tpd.NameTree]
337+
if (tree.symbol.exists
338+
&& !tree.symbol.is(Synthetic)
339+
&& !tree.symbol.isPrimaryConstructor
340+
&& tree.pos.exists
341+
&& !tree.pos.isZeroExtent
342+
&& (include.isReferences || isDefinition(tree))
343+
&& treePredicate(tree))
344+
buf += SourceTree(tree, source)
345+
}
330346
override def traverse(tree: untpd.Tree)(implicit ctx: Context) = {
331347
tree match {
332348
case imp: untpd.Import if include.isImports && tree.hasType =>
333349
val tree = imp.asInstanceOf[tpd.Import]
334350
val selections = tpd.importSelections(tree)
335351
traverse(imp.expr)
336352
selections.foreach(traverse)
353+
case utree: untpd.ValOrDefDef if tree.hasType =>
354+
handle(utree)
355+
if (include.isLocal) traverseChildren(tree)
337356
case utree: untpd.NameTree if tree.hasType =>
338-
val tree = utree.asInstanceOf[tpd.NameTree]
339-
if (tree.symbol.exists
340-
&& !tree.symbol.is(Synthetic)
341-
&& !tree.symbol.isPrimaryConstructor
342-
&& tree.pos.exists
343-
&& !tree.pos.isZeroExtent
344-
&& (include.isReferences || isDefinition(tree))
345-
&& treePredicate(tree))
346-
buf += SourceTree(tree, source)
357+
handle(utree)
347358
traverseChildren(tree)
348359
case tree: untpd.Inlined =>
349360
traverse(tree.call)
@@ -474,6 +485,7 @@ object Interactive {
474485
def findDefinitions(path: List[Tree], pos: SourcePosition, driver: InteractiveDriver)(implicit ctx: Context): List[SourceTree] = {
475486
enclosingSourceSymbols(path, pos).flatMap { sym =>
476487
val enclTree = enclosingTree(path)
488+
val includeLocal = if (sym.exists && sym.isLocal) Include.local else Include.empty
477489

478490
val (trees, include) =
479491
if (enclTree.isInstanceOf[MemberDef])
@@ -492,7 +504,7 @@ object Interactive {
492504
(Nil, Include.empty)
493505
}
494506

495-
findTreesMatching(trees, include, sym)
507+
findTreesMatching(trees, include | includeLocal, sym)
496508
}
497509
}
498510

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

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import core._, core.Decorators.{sourcePos => _, _}
2222
import Comments._, Constants._, Contexts._, Flags._, Names._, NameOps._, Symbols._, SymDenotations._, Trees._, Types._
2323
import classpath.ClassPathEntries
2424
import reporting._, reporting.diagnostic.{Message, MessageContainer, messages}
25-
import transform.SymUtils.decorateSymbol
2625
import typer.Typer
2726
import util.{Set => _, _}
2827
import interactive._, interactive.InteractiveDriver._
@@ -312,7 +311,7 @@ class DottyLanguageServer extends LanguageServer
312311

313312
val includes = {
314313
val includeDeclaration = params.getContext.isIncludeDeclaration
315-
Include.references | Include.overriding | Include.imports |
314+
Include.references | Include.overriding | Include.imports | Include.local |
316315
(if (includeDeclaration) Include.definitions else Include.empty)
317316
}
318317

@@ -457,9 +456,8 @@ class DottyLanguageServer extends LanguageServer
457456
implicit val ctx = driver.currentCtx
458457

459458
val uriTrees = driver.openedTrees(uri)
460-
val predicate = (tree: NameTree) => !tree.symbol.isLocal
461459

462-
val defs = Interactive.namedTrees(uriTrees, Include.empty, predicate)
460+
val defs = Interactive.namedTrees(uriTrees, Include.empty, _ => true)
463461
(for {
464462
d <- defs if !isWorksheetWrapper(d)
465463
info <- symbolInfo(d.tree.symbol, d.namePos, positionMapperFor(d.source))
@@ -468,16 +466,12 @@ class DottyLanguageServer extends LanguageServer
468466

469467
override def symbol(params: WorkspaceSymbolParams) = computeAsync { cancelToken =>
470468
val query = params.getQuery
471-
def predicate(implicit ctx: Context): NameTree => Boolean = { tree =>
472-
val sym = tree.symbol
473-
!sym.isLocal && tree.name.toString.contains(query)
474-
}
475469

476470
drivers.values.toList.flatMap { driver =>
477471
implicit val ctx = driver.currentCtx
478472

479473
val trees = driver.sourceTreesContaining(query)
480-
val defs = Interactive.namedTrees(trees, Include.empty, predicate)
474+
val defs = Interactive.namedTrees(trees, Include.empty, _.name.toString.contains(query))
481475
defs.flatMap(d => symbolInfo(d.tree.symbol, d.namePos, positionMapperFor(d.source)))
482476
}.asJava
483477
}
@@ -505,7 +499,7 @@ class DottyLanguageServer extends LanguageServer
505499
val predicates = definitions.map(Interactive.implementationFilter(_)(ctx))
506500
tree => predicates.exists(_(tree))
507501
}
508-
val matches = Interactive.namedTrees(trees, Include.empty, predicate)(ctx)
502+
val matches = Interactive.namedTrees(trees, Include.local, predicate)(ctx)
509503
matches.map(tree => location(tree.namePos(ctx), positionMapperFor(tree.source)))
510504
}
511505
}.toList

language-server/test/dotty/tools/languageserver/ReferencesTest.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,4 +346,14 @@ class ReferencesTest {
346346
.references(m11 to m12, List(m9 to m10, m11 to m12), withDecl = false)
347347
}
348348

349+
@Test def referenceInsideLocalMember: Unit = {
350+
withSources(
351+
code"""object A {
352+
| val ${m1}foo${m2} = 0
353+
| def fizz = println(${m3}foo${m4})
354+
|}"""
355+
).references(m1 to m2, List(m1 to m2, m3 to m4), withDecl = true)
356+
.references(m1 to m2, List(m3 to m4), withDecl = false)
357+
}
358+
349359
}

0 commit comments

Comments
 (0)