@@ -21,14 +21,42 @@ import StdNames.nme
21
21
object Interactive {
22
22
import ast .tpd ._
23
23
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 )
32
60
}
33
61
34
62
/** Does this tree define a symbol ? */
@@ -112,9 +140,9 @@ object Interactive {
112
140
113
141
( sym == tree.symbol
114
142
|| 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)
118
146
)
119
147
)
120
148
}
@@ -290,7 +318,7 @@ object Interactive {
290
318
def namedTrees (trees : List [SourceTree ], nameSubstring : String )
291
319
(implicit ctx : Context ): List [SourceTree ] = {
292
320
val predicate : NameTree => Boolean = _.name.toString.contains(nameSubstring)
293
- namedTrees(trees, 0 , predicate)
321
+ namedTrees(trees, Include .empty , predicate)
294
322
}
295
323
296
324
/** Find named trees with a non-empty position satisfying `treePredicate` in `trees`.
@@ -299,15 +327,13 @@ object Interactive {
299
327
*/
300
328
def namedTrees (trees : List [SourceTree ], include : Include .Set , treePredicate : NameTree => Boolean )
301
329
(implicit ctx : Context ): List [SourceTree ] = safely {
302
- val includeReferences = (include & Include .references) != 0
303
- val includeImports = (include & Include .imports) != 0
304
330
val buf = new mutable.ListBuffer [SourceTree ]
305
331
306
332
def traverser (source : SourceFile ) = {
307
333
new untpd.TreeTraverser {
308
334
override def traverse (tree : untpd.Tree )(implicit ctx : Context ) = {
309
335
tree match {
310
- case imp : untpd.Import if includeImports && tree.hasType =>
336
+ case imp : untpd.Import if include.isImports && tree.hasType =>
311
337
val tree = imp.asInstanceOf [tpd.Import ]
312
338
val selections = tpd.importSelections(tree)
313
339
traverse(imp.expr)
@@ -318,7 +344,7 @@ object Interactive {
318
344
&& ! tree.symbol.is(Synthetic )
319
345
&& tree.pos.exists
320
346
&& ! tree.pos.isZeroExtent
321
- && (includeReferences || isDefinition(tree))
347
+ && (include.isReferences || isDefinition(tree))
322
348
&& treePredicate(tree))
323
349
buf += SourceTree (tree, source)
324
350
traverseChildren(tree)
@@ -350,13 +376,11 @@ object Interactive {
350
376
predicate : NameTree => Boolean = util.common.alwaysTrue
351
377
)(implicit ctx : Context ): List [SourceTree ] = {
352
378
val linkedSym = symbol.linkedClass
353
- val includeDeclaration = (includes & Include .definitions) != 0
354
- val includeLinkedClass = (includes & Include .linkedClass) != 0
355
379
val fullPredicate : NameTree => Boolean = tree =>
356
380
( ! tree.symbol.isPrimaryConstructor
357
- && (includeDeclaration || ! Interactive .isDefinition(tree))
381
+ && (includes.isDefinitions || ! Interactive .isDefinition(tree))
358
382
&& ( Interactive .matchSymbol(tree, symbol, includes)
359
- || ( includeLinkedClass
383
+ || ( includes.isLinkedClass
360
384
&& linkedSym.exists
361
385
&& Interactive .matchSymbol(tree, linkedSym, includes)
362
386
)
@@ -469,7 +493,7 @@ object Interactive {
469
493
}
470
494
(trees, Include .definitions | Include .overriding)
471
495
case _ =>
472
- (Nil , 0 )
496
+ (Nil , Include .empty )
473
497
}
474
498
475
499
findTreesMatching(trees, include, sym)
0 commit comments