Skip to content

Commit 74dc610

Browse files
committed
IDE: Improve Include flags
1 parent 179452b commit 74dc610

File tree

2 files changed

+49
-24
lines changed

2 files changed

+49
-24
lines changed

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

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,42 @@ import StdNames.nme
2121
object Interactive {
2222
import ast.tpd._
2323

24-
object Include { // should be an enum, really.
25-
type Set = Int
26-
val overridden: Int = 1 // include trees whose symbol is overridden by `sym`
27-
val overriding: Int = 2 // include trees whose symbol overrides `sym` (but for performance only in same source file)
28-
val references: Int = 4 // include references
29-
val definitions: Int = 8 // include definitions
30-
val linkedClass: Int = 16 // include `symbol.linkedClass`
31-
val imports: Int = 32 // include imports in the results
24+
object Include {
25+
case class Set private (val bits: Int) extends AnyVal {
26+
def | (that: Set): Set = Set(bits | that.bits)
27+
28+
def isEmpty: Boolean = bits == 0
29+
def isOverridden: Boolean = (bits & overridden.bits) != 0
30+
def isOverriding: Boolean = (bits & overriding.bits) != 0
31+
def isReferences: Boolean = (bits & references.bits) != 0
32+
def isDefinitions: Boolean = (bits & definitions.bits) != 0
33+
def isLinkedClass: Boolean = (bits & linkedClass.bits) != 0
34+
def isImports: Boolean = (bits & imports.bits) != 0
35+
}
36+
37+
/** The empty set */
38+
val empty: Set = Set(0)
39+
40+
/** Include trees whose symbol is overridden by `sym` */
41+
val overridden: Set = Set(1 << 0)
42+
43+
/**
44+
* Include trees whose symbol overrides `sym` (but for performance only in same source
45+
* file)
46+
*/
47+
val overriding: Set = Set(1 << 1)
48+
49+
/** Include references */
50+
val references: Set = Set(1 << 2)
51+
52+
/** Include definitions */
53+
val definitions: Set = Set(1 << 3)
54+
55+
/** Include `sym.linkedClass */
56+
val linkedClass: Set = Set(1 << 4)
57+
58+
/** Include imports in the results */
59+
val imports: Set = Set(1 << 5)
3260
}
3361

3462
/** Does this tree define a symbol ? */
@@ -112,9 +140,9 @@ object Interactive {
112140

113141
( sym == tree.symbol
114142
|| sym.exists && sym == tree.symbol.sourceSymbol
115-
|| include != 0 && sym.name == tree.symbol.name && sym.maybeOwner != tree.symbol.maybeOwner
116-
&& ( (include & Include.overridden) != 0 && overrides(sym, tree.symbol)
117-
|| (include & Include.overriding) != 0 && overrides(tree.symbol, sym)
143+
|| !include.isEmpty && sym.name == tree.symbol.name && sym.maybeOwner != tree.symbol.maybeOwner
144+
&& ( include.isOverridden && overrides(sym, tree.symbol)
145+
|| include.isOverriding && overrides(tree.symbol, sym)
118146
)
119147
)
120148
}
@@ -290,7 +318,7 @@ object Interactive {
290318
def namedTrees(trees: List[SourceTree], nameSubstring: String)
291319
(implicit ctx: Context): List[SourceTree] = {
292320
val predicate: NameTree => Boolean = _.name.toString.contains(nameSubstring)
293-
namedTrees(trees, 0, predicate)
321+
namedTrees(trees, Include.empty, predicate)
294322
}
295323

296324
/** Find named trees with a non-empty position satisfying `treePredicate` in `trees`.
@@ -299,15 +327,13 @@ object Interactive {
299327
*/
300328
def namedTrees(trees: List[SourceTree], include: Include.Set, treePredicate: NameTree => Boolean)
301329
(implicit ctx: Context): List[SourceTree] = safely {
302-
val includeReferences = (include & Include.references) != 0
303-
val includeImports = (include & Include.imports) != 0
304330
val buf = new mutable.ListBuffer[SourceTree]
305331

306332
def traverser(source: SourceFile) = {
307333
new untpd.TreeTraverser {
308334
override def traverse(tree: untpd.Tree)(implicit ctx: Context) = {
309335
tree match {
310-
case imp: untpd.Import if includeImports && tree.hasType =>
336+
case imp: untpd.Import if include.isImports && tree.hasType =>
311337
val tree = imp.asInstanceOf[tpd.Import]
312338
val selections = tpd.importSelections(tree)
313339
traverse(imp.expr)
@@ -318,7 +344,7 @@ object Interactive {
318344
&& !tree.symbol.is(Synthetic)
319345
&& tree.pos.exists
320346
&& !tree.pos.isZeroExtent
321-
&& (includeReferences || isDefinition(tree))
347+
&& (include.isReferences || isDefinition(tree))
322348
&& treePredicate(tree))
323349
buf += SourceTree(tree, source)
324350
traverseChildren(tree)
@@ -350,13 +376,11 @@ object Interactive {
350376
predicate: NameTree => Boolean = util.common.alwaysTrue
351377
)(implicit ctx: Context): List[SourceTree] = {
352378
val linkedSym = symbol.linkedClass
353-
val includeDeclaration = (includes & Include.definitions) != 0
354-
val includeLinkedClass = (includes & Include.linkedClass) != 0
355379
val fullPredicate: NameTree => Boolean = tree =>
356380
( !tree.symbol.isPrimaryConstructor
357-
&& (includeDeclaration || !Interactive.isDefinition(tree))
381+
&& (includes.isDefinitions || !Interactive.isDefinition(tree))
358382
&& ( Interactive.matchSymbol(tree, symbol, includes)
359-
|| ( includeLinkedClass
383+
|| ( includes.isLinkedClass
360384
&& linkedSym.exists
361385
&& Interactive.matchSymbol(tree, linkedSym, includes)
362386
)
@@ -469,7 +493,7 @@ object Interactive {
469493
}
470494
(trees, Include.definitions | Include.overriding)
471495
case _ =>
472-
(Nil, 0)
496+
(Nil, Include.empty)
473497
}
474498

475499
findTreesMatching(trees, include, sym)

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,8 @@ class DottyLanguageServer extends LanguageServer
309309

310310
val includes = {
311311
val includeDeclaration = params.getContext.isIncludeDeclaration
312-
Include.references | Include.overriding | Include.imports | (if (includeDeclaration) Include.definitions else 0)
312+
Include.references | Include.overriding | Include.imports |
313+
(if (includeDeclaration) Include.definitions else Include.empty)
313314
}
314315

315316
val uriTrees = driver.openedTrees(uri)
@@ -440,7 +441,7 @@ class DottyLanguageServer extends LanguageServer
440441

441442
val uriTrees = driver.openedTrees(uri)
442443

443-
val defs = Interactive.namedTrees(uriTrees, 0, _ => true)
444+
val defs = Interactive.namedTrees(uriTrees, Include.empty, _ => true)
444445
(for {
445446
d <- defs if !isWorksheetWrapper(d)
446447
info <- symbolInfo(d.tree.symbol, d.namePos, positionMapperFor(d.source))
@@ -482,7 +483,7 @@ class DottyLanguageServer extends LanguageServer
482483
val predicates = definitions.map(Interactive.implementationFilter(_)(ctx))
483484
tree => predicates.exists(_(tree))
484485
}
485-
val matches = Interactive.namedTrees(trees, 0, predicate)(ctx)
486+
val matches = Interactive.namedTrees(trees, Include.empty, predicate)(ctx)
486487
matches.map(tree => location(tree.namePos(ctx), positionMapperFor(tree.source)))
487488
}
488489
}.toList

0 commit comments

Comments
 (0)