Skip to content

Commit 8213555

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

File tree

3 files changed

+40
-22
lines changed

3 files changed

+40
-22
lines changed

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

Lines changed: 26 additions & 12 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
}
@@ -321,29 +326,37 @@ object Interactive {
321326
*
322327
* @param includeReferences If true, include references and not just definitions
323328
*/
324-
def namedTrees(trees: List[SourceTree], include: Include.Set, treePredicate: NameTree => Boolean)
325-
(implicit ctx: Context): List[SourceTree] = safely {
329+
def namedTrees(trees: List[SourceTree],
330+
include: Include.Set,
331+
treePredicate: NameTree => Boolean = util.common.alwaysTrue
332+
)(implicit ctx: Context): List[SourceTree] = safely {
326333
val buf = new mutable.ListBuffer[SourceTree]
327334

328335
def traverser(source: SourceFile) = {
329336
new untpd.TreeTraverser {
337+
private def handle(utree: untpd.NameTree): Unit = {
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)
347+
}
330348
override def traverse(tree: untpd.Tree)(implicit ctx: Context) = {
331349
tree match {
332350
case imp: untpd.Import if include.isImports && tree.hasType =>
333351
val tree = imp.asInstanceOf[tpd.Import]
334352
val selections = tpd.importSelections(tree)
335353
traverse(imp.expr)
336354
selections.foreach(traverse)
355+
case utree: untpd.ValOrDefDef if tree.hasType =>
356+
handle(utree)
357+
if (include.isLocal) traverseChildren(tree)
337358
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)
359+
handle(utree)
347360
traverseChildren(tree)
348361
case tree: untpd.Inlined =>
349362
traverse(tree.call)
@@ -474,6 +487,7 @@ object Interactive {
474487
def findDefinitions(path: List[Tree], pos: SourcePosition, driver: InteractiveDriver)(implicit ctx: Context): List[SourceTree] = {
475488
enclosingSourceSymbols(path, pos).flatMap { sym =>
476489
val enclTree = enclosingTree(path)
490+
val includeLocal = if (sym.exists && sym.isLocal) Include.local else Include.empty
477491

478492
val (trees, include) =
479493
if (enclTree.isInstanceOf[MemberDef])
@@ -492,7 +506,7 @@ object Interactive {
492506
(Nil, Include.empty)
493507
}
494508

495-
findTreesMatching(trees, include, sym)
509+
findTreesMatching(trees, include | includeLocal, sym)
496510
}
497511
}
498512

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)
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)